"use client"; import React, { memo } from "react"; import MediaContent from "@/components/shared/MediaContent"; import CardStackTextBox from "../../CardStackTextBox"; import { usePhoneAnimations, type TimelinePhoneViewItem } from "../../hooks/usePhoneAnimations"; import { cls } from "@/lib/utils"; import type { LucideIcon } from "lucide-react"; import type { ButtonConfig } from "../../types"; import type { TitleSegment } from "../../types"; import type { TextboxLayout, InvertedBackground } from "@/providers/themeProvider/config/constants"; interface PhoneFrameProps { imageSrc?: string; videoSrc?: string; imageAlt?: string; videoAriaLabel?: string; phoneRef: (el: HTMLDivElement | null) => void; className?: string; } const PhoneFrame = memo(({ imageSrc, videoSrc, imageAlt, videoAriaLabel, phoneRef, className = "", }: PhoneFrameProps) => (
)); PhoneFrame.displayName = "PhoneFrame"; interface TimelinePhoneViewProps { items: TimelinePhoneViewItem[]; showTextBox?: boolean; showDivider?: boolean; title: string; titleSegments?: TitleSegment[]; description: string; tag?: string; tagIcon?: LucideIcon; buttons?: ButtonConfig[]; textboxLayout: TextboxLayout; useInvertedBackground?: InvertedBackground; className?: string; containerClassName?: string; textBoxClassName?: string; titleClassName?: string; descriptionClassName?: string; tagClassName?: string; buttonContainerClassName?: string; buttonClassName?: string; buttonTextClassName?: string; desktopContainerClassName?: string; mobileContainerClassName?: string; desktopContentClassName?: string; desktopWrapperClassName?: string; mobileWrapperClassName?: string; phoneFrameClassName?: string; mobilePhoneFrameClassName?: string; titleImageWrapperClassName?: string; titleImageClassName?: string; ariaLabel?: string; } const TimelinePhoneView = ({ items, showTextBox = true, showDivider = false, title, titleSegments, description, tag, tagIcon, buttons, textboxLayout, useInvertedBackground, className = "", containerClassName = "", textBoxClassName = "", titleClassName = "", descriptionClassName = "", tagClassName = "", buttonContainerClassName = "", buttonClassName = "", buttonTextClassName = "", desktopContainerClassName = "", mobileContainerClassName = "", desktopContentClassName = "", desktopWrapperClassName = "", mobileWrapperClassName = "", phoneFrameClassName = "", mobilePhoneFrameClassName = "", titleImageWrapperClassName = "", titleImageClassName = "", ariaLabel = "Timeline phone view section", }: TimelinePhoneViewProps) => { const { imageRefs, mobileImageRefs } = usePhoneAnimations(items); const sectionHeightStyle = { height: `${items.length * 100}vh` }; return (
{showTextBox && (
)} {showDivider && (
)}
{items.map((item, index) => (
{item.content}
))}
{items.map((item, itemIndex) => (
{ if (imageRefs.current) { imageRefs.current[itemIndex * 2] = el; } }} className={cls("w-20 2xl:w-25 h-[70vh]", phoneFrameClassName)} /> { if (imageRefs.current) { imageRefs.current[itemIndex * 2 + 1] = el; } }} className={cls("w-20 2xl:w-25 h-[70vh]", phoneFrameClassName)} />
))}
{items.map((item, itemIndex) => (
{item.content}
{ if (mobileImageRefs.current) { mobileImageRefs.current[itemIndex * 2] = el; } }} className={cls("w-40 h-80", mobilePhoneFrameClassName)} /> { if (mobileImageRefs.current) { mobileImageRefs.current[itemIndex * 2 + 1] = el; } }} className={cls("w-40 h-80", mobilePhoneFrameClassName)} />
))}
); }; TimelinePhoneView.displayName = "TimelinePhoneView"; export default memo(TimelinePhoneView);