react-instagram-stories 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +364 -308
- package/dist/index.cjs +9 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +67 -5
- package/dist/index.d.ts +67 -5
- package/dist/index.js +9 -8
- package/dist/index.js.map +1 -1
- package/dist/styles.css +59 -388
- package/package.json +4 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Avatar.tsx","../src/components/AvatarList.tsx","../src/hooks/useTimer.ts","../src/hooks/useKeyboard.ts","../src/hooks/useFocusTrap.ts","../src/hooks/usePageVisibility.ts","../src/hooks/usePreloader.ts","../src/components/ProgressBar.tsx","../src/components/StoryProgressBars.tsx","../src/components/StoryItem.tsx","../src/components/StoryViewer.tsx","../src/utils/storyHelpers.ts","../src/components/Stories.tsx","../src/utils/demoData.tsx"],"names":["Avatar","memo","avatarUrl","username","hasUnreadStories","onClick","imageLoaded","setImageLoaded","useState","imageError","setImageError","jsxs","jsx","AVATAR_WIDTH","OVERSCAN_COUNT","AvatarList","users","onAvatarClick","containerRef","useRef","scrollLeft","setScrollLeft","containerWidth","setContainerWidth","handleScroll","useCallback","useEffect","updateWidth","startIndex","endIndex","React","start","visibleCount","totalWidth","virtualItems","user","idx","index","useTimer","duration","onComplete","autoStart","progress","setProgress","isPaused","setIsPaused","currentDuration","setCurrentDuration","startTimeRef","accumulatedTimeRef","rafRef","updateProgressRef","updateProgress","elapsed","newProgress","pause","resume","reset","setDuration","ms","useKeyboard","onLeft","onRight","onSpace","onEscape","enabled","handleKeyDown","e","useFocusTrap","previousFocusRef","container","focusableElements","firstFocusable","lastFocusable","handleTabKey","usePageVisibility","isVisible","setIsVisible","handleVisibilityChange","usePreloader","cacheRef","loadingRef","preloadImage","src","resolve","reject","checkInterval","img","preloadVideo","video","handleCanPlay","cleanup","handleError","preloadStoryItem","item","error","preloadMultiple","items","chunks","i","chunk","isPreloaded","clearCache","ProgressBar","isActive","progressPercent","StoryProgressBars","total","currentIndex","_","StoryItem","onDurationDetected","onLoadError","onBufferingChange","controls","videoRef","hasError","setHasError","isLoading","setIsLoading","handleLoadedMetadata","handleWaiting","handlePlaying","handleStalled","rafId","syncProgress","handleImageLoad","Component","DEFAULT_DURATION","StoryViewer","initialUserIndex","initialStoryIndex","isOpen","onClose","onStoryChange","currentUserIndex","setCurrentUserIndex","currentStoryIndex","setCurrentStoryIndex","isTransitioning","setIsTransitioning","transitionDirection","setTransitionDirection","isUserLoading","setIsUserLoading","timerRef","scrollPositionRef","currentDurationRef","hasStartedLoadingRef","currentUser","currentStory","totalStories","focusTrapRef","isPageVisible","handlePause","handleResume","handleNextRef","timer","handleBufferingChange","buffering","handleNext","nextIndex","nextUserIndex","handlePrevious","prevIndex","prevUserIndex","prevUser","lastStoryIndex","handleClose","storyControls","useMemo","handleTap","event","target","rect","touchStartRef","isDraggingRef","handlePointerDown","handlePointerMove","deltaX","deltaY","itemsToPreload","preloadPromises","handleLoadError","content","createPortal","findStoryIndices","storyId","userIndex","storyIndex","story","Stories","closeNavigateTo","useParams","navigate","useNavigate","viewerState","setViewerState","indices","handleAvatarClick","firstStoryId","handleCloseViewer","handleStoryChange","Fragment","PollComponent","next","selected","setSelected","votes","setVotes","handleVote","option","newVotes","a","b","percentage","isSelected","QuizComponent","answered","setAnswered","correctAnswer","handleAnswer","isCorrect","bgColor","CountdownComponent","timeLeft","setTimeLeft","prev","days","hours","minutes","seconds","TimeBox","value","label","ProductShowcaseComponent","SliderComponent","setValue","submitted","setSubmitted","handleSubmit","sampleVideos","sampleImages","avatarImages","demoUsers","generateDemoUsers","count","hasUnread","storyCount","storyIdx","typeRandom","backgrounds","components"],"mappings":"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","file":"index.js","sourcesContent":["import { memo, useState } from 'react';\n\ninterface AvatarProps {\n avatarUrl: string;\n username: string;\n hasUnreadStories?: boolean;\n onClick: () => void;\n}\n\nexport const Avatar = memo<AvatarProps>(\n ({ avatarUrl, username, hasUnreadStories = false, onClick }) => {\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageError, setImageError] = useState(false);\n\n return (\n <button\n className={`story-avatar ${hasUnreadStories ? 'story-avatar-unread' : 'story-avatar-read'}`}\n onClick={onClick}\n aria-label={`View ${username}'s story`}\n >\n <div className=\"story-avatar-ring\">\n <div className=\"story-avatar-image-wrapper\">\n {!imageError ? (\n <img\n src={avatarUrl}\n alt={username}\n className={`story-avatar-image ${imageLoaded ? 'story-avatar-image-loaded' : ''}`}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageError(true)}\n />\n ) : (\n <div className=\"story-avatar-placeholder\">\n {username.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n </div>\n <span className=\"story-avatar-username\">{username}</span>\n </button>\n );\n }\n);\n\nAvatar.displayName = 'Avatar';\n","import React, { useRef, useEffect, useState, useCallback, memo } from 'react';\nimport { User } from '../types';\nimport { Avatar } from './Avatar';\n\ninterface AvatarListProps {\n users: User[];\n onAvatarClick: (userIndex: number) => void;\n}\n\nconst AVATAR_WIDTH = 90; // Approximate width including margin\nconst OVERSCAN_COUNT = 3; // Render extra items outside viewport\n\nexport const AvatarList = memo<AvatarListProps>(({ users, onAvatarClick }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [scrollLeft, setScrollLeft] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n\n // Update scroll position\n const handleScroll = useCallback(() => {\n if (containerRef.current) {\n setScrollLeft(containerRef.current.scrollLeft);\n }\n }, []);\n\n // Update container width on resize\n useEffect(() => {\n const updateWidth = () => {\n if (containerRef.current) {\n setContainerWidth(containerRef.current.clientWidth);\n }\n };\n\n updateWidth();\n window.addEventListener('resize', updateWidth);\n\n return () => {\n window.removeEventListener('resize', updateWidth);\n };\n }, []);\n\n // Calculate visible range\n const { startIndex, endIndex } = React.useMemo(() => {\n const start = Math.floor(scrollLeft / AVATAR_WIDTH);\n const visibleCount = Math.ceil(containerWidth / AVATAR_WIDTH);\n \n return {\n startIndex: Math.max(0, start - OVERSCAN_COUNT),\n endIndex: Math.min(users.length, start + visibleCount + OVERSCAN_COUNT),\n };\n }, [scrollLeft, containerWidth, users.length]);\n\n // Calculate total width\n const totalWidth = users.length * AVATAR_WIDTH;\n\n // Virtual items to render\n const virtualItems = users.slice(startIndex, endIndex).map((user, idx) => ({\n user,\n index: startIndex + idx,\n }));\n\n return (\n <div\n ref={containerRef}\n className=\"story-avatar-list\"\n onScroll={handleScroll}\n role=\"list\"\n aria-label=\"Stories\"\n >\n <div\n className=\"story-avatar-list-inner\"\n style={{\n width: `${totalWidth}px`,\n position: 'relative',\n }}\n >\n {virtualItems.map(({ user, index }) => (\n <div\n key={user.id}\n className=\"story-avatar-item\"\n style={{\n position: 'absolute',\n left: `${index * AVATAR_WIDTH}px`,\n width: `${AVATAR_WIDTH}px`,\n }}\n role=\"listitem\"\n >\n <Avatar\n avatarUrl={user.avatarUrl}\n username={user.username}\n hasUnreadStories={user.hasUnreadStories}\n onClick={() => onAvatarClick(index)}\n />\n </div>\n ))}\n </div>\n </div>\n );\n});\n\nAvatarList.displayName = 'AvatarList';\n","import { useEffect, useRef, useState, useCallback } from \"react\";\n\nexport interface UseTimerOptions {\n duration: number;\n onComplete?: () => void;\n autoStart?: boolean;\n}\n\nexport interface UseTimerReturn {\n progress: number; // 0 to 1\n isPaused: boolean;\n pause: () => void;\n resume: () => void;\n reset: () => void;\n setDuration: (ms: number) => void;\n}\n\nexport const useTimer = ({\n duration,\n onComplete,\n autoStart = true,\n}: UseTimerOptions): UseTimerReturn => {\n const [progress, setProgress] = useState(0);\n const [isPaused, setIsPaused] = useState(!autoStart);\n const [currentDuration, setCurrentDuration] = useState(duration);\n\n const startTimeRef = useRef<number | null>(null);\n const accumulatedTimeRef = useRef(0);\n const rafRef = useRef<number | null>(null);\n const updateProgressRef = useRef<() => void>();\n\n const updateProgress = useCallback(() => {\n if (!startTimeRef.current || isPaused) return;\n\n const elapsed =\n Date.now() - startTimeRef.current + accumulatedTimeRef.current;\n const newProgress = Math.min(elapsed / currentDuration, 1);\n\n setProgress(newProgress);\n\n if (newProgress >= 1) {\n onComplete?.();\n return;\n }\n\n rafRef.current = requestAnimationFrame(updateProgressRef.current!);\n }, [currentDuration, isPaused, onComplete]);\n\n // Keep the ref updated with the latest function\n updateProgressRef.current = updateProgress;\n\n const pause = useCallback(() => {\n if (isPaused) return;\n\n if (startTimeRef.current) {\n accumulatedTimeRef.current += Date.now() - startTimeRef.current;\n }\n\n setIsPaused(true);\n\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, [isPaused]);\n\n const resume = useCallback(() => {\n if (!isPaused) return;\n\n startTimeRef.current = Date.now();\n setIsPaused(false);\n }, [isPaused]);\n\n const reset = useCallback(() => {\n // Cancel any existing animation frame\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n startTimeRef.current = Date.now();\n accumulatedTimeRef.current = 0;\n setProgress(0);\n setIsPaused(false);\n\n // Force start animation frame\n rafRef.current = requestAnimationFrame(updateProgressRef.current!);\n }, []);\n\n const setDuration = useCallback((ms: number) => {\n setCurrentDuration(ms);\n }, []);\n\n // Start/restart animation loop when paused state changes\n useEffect(() => {\n if (!isPaused) {\n startTimeRef.current = Date.now();\n rafRef.current = requestAnimationFrame(updateProgressRef.current!);\n }\n\n return () => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [isPaused]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, []);\n\n return {\n progress,\n isPaused,\n pause,\n resume,\n reset,\n setDuration,\n };\n};\n","import { useEffect } from 'react';\n\nexport interface UseKeyboardOptions {\n onLeft?: () => void;\n onRight?: () => void;\n onSpace?: () => void;\n onEscape?: () => void;\n enabled?: boolean;\n}\n\nexport const useKeyboard = ({\n onLeft,\n onRight,\n onSpace,\n onEscape,\n enabled = true,\n}: UseKeyboardOptions) => {\n useEffect(() => {\n if (!enabled) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n onLeft?.();\n break;\n case 'ArrowRight':\n e.preventDefault();\n onRight?.();\n break;\n case ' ':\n e.preventDefault();\n onSpace?.();\n break;\n case 'Escape':\n e.preventDefault();\n onEscape?.();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [onLeft, onRight, onSpace, onEscape, enabled]);\n};\n","import { useEffect, useRef } from 'react';\n\nexport const useFocusTrap = (enabled: boolean) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!enabled || !containerRef.current) return;\n\n // Store the currently focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n const container = containerRef.current;\n const focusableElements = container.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n const firstFocusable = focusableElements[0];\n const lastFocusable = focusableElements[focusableElements.length - 1];\n\n // Focus first element\n firstFocusable?.focus();\n\n const handleTabKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey) {\n if (document.activeElement === firstFocusable) {\n e.preventDefault();\n lastFocusable?.focus();\n }\n } else {\n if (document.activeElement === lastFocusable) {\n e.preventDefault();\n firstFocusable?.focus();\n }\n }\n };\n\n container.addEventListener('keydown', handleTabKey);\n\n return () => {\n container.removeEventListener('keydown', handleTabKey);\n \n // Restore focus to the previously focused element\n previousFocusRef.current?.focus();\n };\n }, [enabled]);\n\n return containerRef;\n};\n","import { useEffect, useState } from 'react';\n\nexport const usePageVisibility = () => {\n const [isVisible, setIsVisible] = useState(!document.hidden);\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n setIsVisible(!document.hidden);\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return isVisible;\n};\n","import { useEffect, useRef, useCallback } from 'react';\nimport { StoryItem } from '../types';\n\ninterface PreloadCache {\n [key: string]: boolean;\n}\n\nexport const usePreloader = () => {\n const cacheRef = useRef<PreloadCache>({});\n const loadingRef = useRef<Set<string>>(new Set());\n\n const preloadImage = useCallback((src: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (cacheRef.current[src]) {\n resolve();\n return;\n }\n\n if (loadingRef.current.has(src)) {\n // Already loading, wait for it\n const checkInterval = setInterval(() => {\n if (cacheRef.current[src] || !loadingRef.current.has(src)) {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n return;\n }\n\n loadingRef.current.add(src);\n\n const img = new Image();\n img.onload = () => {\n cacheRef.current[src] = true;\n loadingRef.current.delete(src);\n resolve();\n };\n img.onerror = () => {\n loadingRef.current.delete(src);\n reject(new Error(`Failed to load image: ${src}`));\n };\n img.src = src;\n });\n }, []);\n\n const preloadVideo = useCallback((src: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (cacheRef.current[src]) {\n resolve();\n return;\n }\n\n if (loadingRef.current.has(src)) {\n const checkInterval = setInterval(() => {\n if (cacheRef.current[src] || !loadingRef.current.has(src)) {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n return;\n }\n\n loadingRef.current.add(src);\n\n const video = document.createElement('video');\n video.preload = 'auto';\n \n const handleCanPlay = () => {\n cacheRef.current[src] = true;\n loadingRef.current.delete(src);\n cleanup();\n resolve();\n };\n\n const handleError = () => {\n loadingRef.current.delete(src);\n cleanup();\n reject(new Error(`Failed to load video: ${src}`));\n };\n\n const cleanup = () => {\n video.removeEventListener('canplaythrough', handleCanPlay);\n video.removeEventListener('error', handleError);\n video.src = '';\n };\n\n video.addEventListener('canplaythrough', handleCanPlay);\n video.addEventListener('error', handleError);\n video.src = src;\n video.load();\n });\n }, []);\n\n const preloadStoryItem = useCallback(async (item: StoryItem): Promise<void> => {\n try {\n if (item.type === 'image' && 'src' in item) {\n await preloadImage(item.src);\n } else if (item.type === 'video' && 'src' in item) {\n await preloadVideo(item.src);\n }\n // Text and component types don't need preloading\n } catch (error) {\n console.warn('Failed to preload story item:', error);\n }\n }, [preloadImage, preloadVideo]);\n\n const preloadMultiple = useCallback(async (items: StoryItem[]): Promise<void> => {\n // Preload in parallel but limit concurrent loads\n const CONCURRENT_LIMIT = 3;\n const chunks: StoryItem[][] = [];\n \n for (let i = 0; i < items.length; i += CONCURRENT_LIMIT) {\n chunks.push(items.slice(i, i + CONCURRENT_LIMIT));\n }\n\n for (const chunk of chunks) {\n await Promise.allSettled(chunk.map(preloadStoryItem));\n }\n }, [preloadStoryItem]);\n\n const isPreloaded = useCallback((src: string): boolean => {\n return cacheRef.current[src] || false;\n }, []);\n\n const clearCache = useCallback(() => {\n cacheRef.current = {};\n loadingRef.current.clear();\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n clearCache();\n };\n }, [clearCache]);\n\n return {\n preloadImage,\n preloadVideo,\n preloadStoryItem,\n preloadMultiple,\n isPreloaded,\n clearCache,\n };\n};\n","import { memo } from \"react\";\n\ninterface ProgressBarProps {\n progress: number; // 0 to 1\n isActive: boolean;\n}\n\nexport const ProgressBar = memo<ProgressBarProps>(({ progress, isActive }) => {\n const progressPercent = Math.round(progress * 100);\n\n return (\n <div\n className=\"story-progress-bar\"\n role=\"progressbar\"\n aria-valuenow={isActive ? progressPercent : progress === 1 ? 100 : 0}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Story progress: ${progressPercent}%`}\n >\n <div\n className=\"story-progress-bar-fill\"\n style={{\n transform: `scaleX(${isActive ? progress : progress === 1 ? 1 : 0})`,\n }}\n />\n </div>\n );\n});\n\nProgressBar.displayName = \"ProgressBar\";\n","import { memo } from \"react\";\nimport { ProgressBar } from \"./ProgressBar\";\n\ninterface StoryProgressBarsProps {\n total: number;\n currentIndex: number;\n progress: number;\n}\n\nexport const StoryProgressBars = memo<StoryProgressBarsProps>(\n ({ total, currentIndex, progress }) => {\n return (\n <div className=\"story-progress-bars-container\">\n {Array.from({ length: total }).map((_, index) => (\n <ProgressBar\n key={index}\n progress={\n index < currentIndex ? 1 : index === currentIndex ? progress : 0\n }\n isActive={index === currentIndex}\n />\n ))}\n </div>\n );\n }\n);\n\nStoryProgressBars.displayName = \"StoryProgressBars\";\n","import { memo, useEffect, useRef, useState, useCallback } from \"react\";\nimport { StoryItem as StoryItemType, StoryItemControls } from \"../types\";\n\ninterface StoryItemProps {\n item: StoryItemType;\n isActive: boolean;\n isPaused: boolean;\n onDurationDetected?: (duration: number) => void;\n onLoadError?: () => void;\n onBufferingChange?: (isBuffering: boolean) => void;\n controls: StoryItemControls;\n}\n\nexport const StoryItem = memo<StoryItemProps>(\n ({ item, isActive, isPaused, onDurationDetected, onLoadError, onBufferingChange, controls }) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const [hasError, setHasError] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n // Handle video playback\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current || !isActive) return;\n\n const video = videoRef.current;\n\n const playVideo = async () => {\n try {\n if (isPaused) {\n video.pause();\n } else {\n await video.play();\n }\n } catch (error) {\n console.warn(\"Video play failed:\", error);\n }\n };\n\n playVideo();\n }, [item.type, isActive, isPaused]);\n\n // Detect video duration\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current) return;\n\n const video = videoRef.current;\n\n const handleLoadedMetadata = () => {\n if (video.duration && isFinite(video.duration)) {\n onDurationDetected?.(video.duration * 1000);\n }\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n };\n\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"canplay\", handleCanPlay);\n\n // Check if metadata already loaded\n if (video.readyState >= 1) {\n handleLoadedMetadata();\n }\n\n // Check if can play\n if (video.readyState >= 3) {\n handleCanPlay();\n }\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"canplay\", handleCanPlay);\n };\n }, [item.type, onDurationDetected]);\n\n // Handle video buffering states\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current || !isActive) return;\n\n const video = videoRef.current;\n\n const handleWaiting = () => {\n // Video is buffering\n onBufferingChange?.(true);\n };\n\n const handlePlaying = () => {\n // Video resumed after buffering\n onBufferingChange?.(false);\n };\n\n const handleStalled = () => {\n // Video stalled due to network issues\n onBufferingChange?.(true);\n };\n\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"stalled\", handleStalled);\n\n return () => {\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"stalled\", handleStalled);\n };\n }, [item.type, isActive, onBufferingChange]);\n\n // Sync video progress with timer for more accurate progress bar\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current || !isActive) return;\n\n const video = videoRef.current;\n let rafId: number;\n\n const syncProgress = () => {\n if (video.duration && isFinite(video.duration)) {\n // This allows the progress bar to sync with video playhead\n // The timer in StoryViewer will handle the actual progress\n }\n rafId = requestAnimationFrame(syncProgress);\n };\n\n rafId = requestAnimationFrame(syncProgress);\n\n return () => {\n cancelAnimationFrame(rafId);\n };\n }, [item.type, isActive]);\n\n const handleError = useCallback(() => {\n setHasError(true);\n setIsLoading(false);\n onLoadError?.();\n }, [onLoadError]);\n\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n }, []);\n\n if (hasError) {\n return (\n <div className=\"story-item story-item-error\">\n <div className=\"story-item-error-message\">Failed to load content</div>\n </div>\n );\n }\n\n switch (item.type) {\n case \"image\":\n return (\n <div className=\"story-item story-item-image\">\n {isLoading && (\n <div className=\"story-item-loader\">\n <div className=\"story-item-spinner\"></div>\n </div>\n )}\n <img\n src={item.src}\n alt={item.alt || \"Story image\"}\n onError={handleError}\n onLoad={handleImageLoad}\n draggable={false}\n style={{ opacity: isLoading ? 0 : 1 }}\n />\n </div>\n );\n\n case \"video\":\n return (\n <div className=\"story-item story-item-video\">\n {isLoading && (\n <div className=\"story-item-loader\">\n <div className=\"story-item-spinner\"></div>\n </div>\n )}\n <video\n ref={videoRef}\n src={item.src}\n playsInline\n loop={false}\n onError={handleError}\n preload=\"auto\"\n style={{ opacity: isLoading ? 0 : 1 }}\n />\n </div>\n );\n\n case \"text\":\n return (\n <div\n className=\"story-item story-item-text\"\n style={{\n backgroundColor: item.backgroundColor || \"#000\",\n color: item.textColor || \"#fff\",\n }}\n >\n <div className=\"story-item-text-content\">{item.text}</div>\n </div>\n );\n\n case \"custom_component\":\n const Component = item.component;\n return (\n <div className=\"story-item story-item-component\">\n <Component {...controls} />\n </div>\n );\n\n default:\n return null;\n }\n }\n);\n\nStoryItem.displayName = \"StoryItem\";\n","import React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { User, StoryItem as StoryItemType, StoryItemControls } from \"../types\";\nimport { useTimer } from \"../hooks/useTimer\";\nimport { useKeyboard } from \"../hooks/useKeyboard\";\nimport { useFocusTrap } from \"../hooks/useFocusTrap\";\nimport { usePageVisibility } from \"../hooks/usePageVisibility\";\nimport { usePreloader } from \"../hooks/usePreloader\";\nimport { StoryProgressBars } from \"./StoryProgressBars\";\nimport { StoryItem } from \"./StoryItem\";\n\ninterface StoryViewerProps {\n users: User[];\n initialUserIndex: number;\n initialStoryIndex?: number;\n isOpen: boolean;\n onClose: () => void;\n onStoryChange?: (userIndex: number, storyIndex: number) => void;\n}\n\nconst DEFAULT_DURATION = 5000;\n\nexport const StoryViewer: React.FC<StoryViewerProps> = React.memo(\n ({ users, initialUserIndex, initialStoryIndex, isOpen, onClose, onStoryChange }) => {\n // State\n const [currentUserIndex, setCurrentUserIndex] = useState(initialUserIndex);\n const [currentStoryIndex, setCurrentStoryIndex] = useState(initialStoryIndex ?? 0);\n const [isPaused, setIsPaused] = useState(false);\n\n // Update indices when initial props change\n useEffect(() => {\n setCurrentUserIndex(initialUserIndex);\n }, [initialUserIndex]);\n\n useEffect(() => {\n setCurrentStoryIndex(initialStoryIndex ?? 0);\n }, [initialStoryIndex]);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [transitionDirection, setTransitionDirection] = useState<\n \"left\" | \"right\" | null\n >(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isUserLoading, setIsUserLoading] = useState(false);\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const timerRef = useRef<any>(null);\n const scrollPositionRef = useRef(0);\n const currentDurationRef = useRef(DEFAULT_DURATION);\n const hasStartedLoadingRef = useRef(false);\n\n // Current data\n const currentUser = users[currentUserIndex];\n const currentStory = currentUser?.stories[currentStoryIndex];\n const totalStories = currentUser?.stories.length || 0;\n\n // Update duration ref when story changes\n useEffect(() => {\n currentDurationRef.current = currentStory?.duration || DEFAULT_DURATION;\n }, [currentStory?.duration]);\n\n // Hooks\n const focusTrapRef = useFocusTrap(isOpen);\n const isPageVisible = usePageVisibility();\n const { preloadStoryItem } = usePreloader();\n\n // Pause/Resume\n const handlePause = useCallback(() => setIsPaused(true), []);\n const handleResume = useCallback(() => setIsPaused(false), []);\n\n // Placeholder for handleNext - will be defined after timer\n const handleNextRef = useRef<() => void>();\n\n const timer = useTimer({\n duration: currentDurationRef.current || DEFAULT_DURATION,\n onComplete: () => handleNextRef.current?.(),\n autoStart: false,\n });\n\n // Handle video buffering\n const handleBufferingChange = useCallback((buffering: boolean) => {\n if (buffering) {\n timer.pause();\n } else if (!isPaused) {\n // Only resume if not manually paused\n timer.resume();\n }\n }, [timer, isPaused]);\n\n // Update timer duration when story changes\n useEffect(() => {\n const duration = currentStory?.duration || DEFAULT_DURATION;\n timer.setDuration(duration);\n }, [timer, currentStory?.duration]);\n\n // Navigation functions\n const handleNext = useCallback(() => {\n if (!currentUser) return;\n\n if (currentStoryIndex < totalStories - 1) {\n const nextIndex = currentStoryIndex + 1;\n const nextStory = currentUser.stories[nextIndex];\n const duration = nextStory?.duration || DEFAULT_DURATION;\n\n setCurrentStoryIndex(nextIndex);\n timer.setDuration(duration);\n timer.reset();\n } else if (currentUserIndex < users.length - 1) {\n // Show loading for next user\n setIsUserLoading(true);\n setTimeout(() => {\n // Transition to next user with slide animation\n setIsTransitioning(true);\n setTransitionDirection(\"left\");\n setTimeout(() => {\n const nextUserIndex = currentUserIndex + 1;\n const nextUser = users[nextUserIndex];\n const firstStory = nextUser.stories[0];\n const duration = firstStory?.duration || DEFAULT_DURATION;\n\n setCurrentUserIndex(nextUserIndex);\n setCurrentStoryIndex(0);\n setIsTransitioning(false);\n setTransitionDirection(null);\n setIsUserLoading(false); // Hide loading after indices are updated\n\n timer.setDuration(duration);\n timer.reset();\n }, 150); // Match CSS transition duration\n }, 1000); // Simulate 1s loading for user data\n } else {\n onClose();\n }\n }, [\n currentUser,\n currentStoryIndex,\n totalStories,\n currentUserIndex,\n users,\n timer,\n onClose,\n ]);\n\n const handlePrevious = useCallback(() => {\n if (!currentUser) return;\n\n if (currentStoryIndex > 0) {\n const prevIndex = currentStoryIndex - 1;\n const prevStory = currentUser.stories[prevIndex];\n const duration = prevStory?.duration || DEFAULT_DURATION;\n\n setCurrentStoryIndex(prevIndex);\n timer.setDuration(duration);\n timer.reset();\n } else if (currentUserIndex > 0) {\n // Show loading for previous user\n setIsUserLoading(true);\n setTimeout(() => {\n // Transition to previous user with slide animation\n setIsTransitioning(true);\n setTransitionDirection(\"right\");\n setTimeout(() => {\n const prevUserIndex = currentUserIndex - 1;\n const prevUser = users[prevUserIndex];\n const lastStoryIndex = prevUser.stories.length - 1;\n const lastStory = prevUser.stories[lastStoryIndex];\n const duration = lastStory?.duration || DEFAULT_DURATION;\n\n setCurrentUserIndex(prevUserIndex);\n setCurrentStoryIndex(lastStoryIndex);\n setIsTransitioning(false);\n setTransitionDirection(null);\n setIsUserLoading(false); // Hide loading after indices are updated\n\n timer.setDuration(duration);\n timer.reset();\n }, 150); // Match CSS transition duration\n }, 1000); // Simulate 1s loading for user data\n }\n }, [currentUser, currentStoryIndex, currentUserIndex, users, timer]);\n\n const handleClose = useCallback(() => {\n // Restore scroll position\n window.scrollTo(0, scrollPositionRef.current);\n onClose();\n }, [onClose]);\n\n // Update the ref when handleNext changes\n useEffect(() => {\n handleNextRef.current = handleNext;\n }, [handleNext]);\n\n // Story controls for custom components\n const storyControls: StoryItemControls = useMemo(\n () => ({\n pause: handlePause,\n resume: handleResume,\n next: handleNext,\n prev: handlePrevious,\n setDuration: (ms: number) => timerRef.current?.setDuration(ms),\n }),\n [handlePause, handleResume, handleNext, handlePrevious]\n );\n\n // Handle taps for story navigation\n const handleTap = useCallback(\n (event: React.MouseEvent) => {\n // Don't handle taps on interactive elements\n const target = event.target as HTMLElement;\n if (\n target.closest(\".story-viewer-close\") ||\n target.closest(\"button\") ||\n target.closest(\"input\") ||\n target.closest(\"select\") ||\n target.closest(\"textarea\")\n ) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n const relativeX = event.clientX - rect.left;\n const isLeftSide = relativeX < rect.width / 2;\n\n if (isLeftSide) {\n handlePrevious();\n } else {\n handleNext();\n }\n },\n [handlePrevious, handleNext]\n );\n\n // Touch/mouse gesture handling\n const touchStartRef = useRef<{ x: number; y: number } | null>(null);\n const isDraggingRef = useRef(false);\n\n const handlePointerDown = useCallback(\n (event: React.PointerEvent) => {\n isDraggingRef.current = false;\n touchStartRef.current = {\n x: event.clientX,\n y: event.clientY,\n };\n handlePause();\n },\n [handlePause]\n );\n\n const handlePointerMove = useCallback((event: React.PointerEvent) => {\n if (!touchStartRef.current) return;\n\n const deltaX = event.clientX - touchStartRef.current.x;\n const deltaY = event.clientY - touchStartRef.current.y;\n\n // Check if this is a drag (moved more than 10px)\n if (Math.abs(deltaX) > 10 || Math.abs(deltaY) > 10) {\n isDraggingRef.current = true;\n }\n }, []);\n\n // Keyboard support\n useKeyboard({\n onLeft: handlePrevious,\n onRight: handleNext,\n onSpace: () => (isPaused ? handleResume() : handlePause()),\n onEscape: handleClose,\n enabled: isOpen,\n });\n\n // Pause on page visibility change\n useEffect(() => {\n if (!isPageVisible) {\n handlePause();\n } else if (isPageVisible && !isPaused) {\n handleResume();\n }\n }, [isPageVisible, handlePause, handleResume, isPaused]);\n\n // Preload adjacent stories\n useEffect(() => {\n if (!isOpen || !currentUser) return;\n\n const itemsToPreload: StoryItemType[] = [];\n\n // Current user's adjacent stories\n if (currentStoryIndex < totalStories - 1) {\n itemsToPreload.push(currentUser.stories[currentStoryIndex + 1]);\n }\n if (currentStoryIndex > 0) {\n itemsToPreload.push(currentUser.stories[currentStoryIndex - 1]);\n }\n\n // Adjacent users' first stories\n if (currentUserIndex < users.length - 1) {\n itemsToPreload.push(users[currentUserIndex + 1].stories[0]);\n }\n if (currentUserIndex > 0) {\n itemsToPreload.push(users[currentUserIndex - 1].stories[0]);\n }\n\n // Limit concurrent preloads\n const preloadPromises = itemsToPreload\n .slice(0, 3)\n .map((item) => preloadStoryItem(item).catch(() => { }));\n\n Promise.all(preloadPromises);\n }, [\n isOpen,\n currentUser,\n currentUserIndex,\n currentStoryIndex,\n totalStories,\n users,\n preloadStoryItem,\n ]);\n\n // Handle initial loading when opening story viewer\n useEffect(() => {\n if (isOpen && !hasStartedLoadingRef.current) {\n hasStartedLoadingRef.current = true;\n setIsLoading(true);\n // Preload current story\n if (currentStory) {\n preloadStoryItem(currentStory);\n }\n // Simulate API call to fetch user stories\n setTimeout(() => {\n setIsLoading(false);\n scrollPositionRef.current = window.scrollY;\n document.body.style.overflow = \"hidden\";\n // Start timer when opening story viewer\n timer.resume();\n }, 1500); // Simulate 1.5s loading time\n } else if (!isOpen) {\n hasStartedLoadingRef.current = false;\n document.body.style.overflow = \"\";\n setIsLoading(false);\n setIsUserLoading(false);\n }\n\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [isOpen, timer]);\n\n // Notify parent of story changes\n useEffect(() => {\n if (onStoryChange && isOpen) {\n onStoryChange(currentUserIndex, currentStoryIndex);\n }\n }, [currentUserIndex, currentStoryIndex, onStoryChange, isOpen]);\n\n // Handle load errors\n const handleLoadError = useCallback(() => {\n console.warn(\"Story item failed to load, skipping...\");\n setTimeout(handleNext, 500);\n }, [handleNext]);\n\n // Early return\n if (!isOpen) {\n return null;\n }\n\n if (!currentUser || !currentStory) {\n return null;\n }\n\n const content = (\n <div\n ref={containerRef}\n className=\"story-viewer\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Stories by ${currentUser?.username || \"user\"}`}\n aria-describedby=\"story-viewer-description\"\n >\n <div className=\"story-viewer-overlay\" onClick={handleClose} />\n\n {/* Hidden description for screen readers */}\n <div id=\"story-viewer-description\" className=\"sr-only\">\n Instagram-style stories viewer. Tap left side to go to previous story,\n right side to go to next story. Swipe left or right to navigate\n between users. Press Escape to close.\n </div>\n\n {/* Live region for announcements */}\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n Viewing story {currentStoryIndex + 1} of {totalStories} by{\" \"}\n {currentUser?.username}\n </div>\n\n <div\n ref={focusTrapRef}\n className={`story-viewer-content ${isTransitioning\n ? `story-viewer-transitioning story-viewer-transition-${transitionDirection}`\n : \"\"\n }`}\n onClick={handleTap}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onMouseEnter={handlePause}\n onMouseLeave={handleResume}\n >\n <div className=\"story-viewer-header\">\n <StoryProgressBars\n total={totalStories}\n currentIndex={currentStoryIndex}\n progress={timer.progress}\n />\n\n <div className=\"story-viewer-user-info\">\n <img\n src={currentUser.avatarUrl}\n alt={`${currentUser.username} avatar`}\n className=\"story-viewer-avatar\"\n />\n <span className=\"story-viewer-username\">\n {currentUser.username}\n </span>\n </div>\n\n <button\n className=\"story-viewer-close\"\n onClick={handleClose}\n aria-label=\"Close story viewer\"\n type=\"button\"\n >\n ×\n </button>\n </div>\n\n <div className=\"story-viewer-items\">\n {isLoading || isUserLoading ? (\n <div className=\"story-item-loader\">\n <div className=\"story-item-spinner\" />\n </div>\n ) : (\n <StoryItem\n item={currentStory}\n isActive={true}\n isPaused={isPaused || isDraggingRef.current}\n onDurationDetected={(duration) =>\n timerRef.current?.setDuration(duration)\n }\n onLoadError={handleLoadError}\n onBufferingChange={handleBufferingChange}\n controls={storyControls}\n />\n )}\n </div>\n\n <div className=\"story-viewer-nav-hints\">\n <div className=\"story-viewer-nav-hint story-viewer-nav-hint-left\" />\n <div className=\"story-viewer-nav-hint story-viewer-nav-hint-right\" />\n </div>\n </div>\n </div>\n );\n\n return createPortal(content, document.body);\n }\n);\n","import { User } from '../types';\n\nexport interface StoryIndices {\n userIndex: number;\n storyIndex: number;\n}\n\n/**\n * Finds the user index and story index for a given story ID\n * @param users - Array of users\n * @param storyId - The story ID to find\n * @returns Object with userIndex and storyIndex, or null if not found\n */\nexport function findStoryIndices(users: User[], storyId: string): StoryIndices | null {\n for (let userIndex = 0; userIndex < users.length; userIndex++) {\n const user = users[userIndex];\n const storyIndex = user.stories.findIndex(story => story.id === storyId);\n if (storyIndex !== -1) {\n return { userIndex, storyIndex };\n }\n }\n return null;\n}\n\n/**\n * Gets the story ID for given user and story indices\n * @param users - Array of users\n * @param userIndex - Index of the user\n * @param storyIndex - Index of the story\n * @returns The story ID, or null if indices are invalid\n */\nexport function getStoryId(users: User[], userIndex: number, storyIndex: number): string | null {\n const user = users[userIndex];\n if (!user) return null;\n const story = user.stories[storyIndex];\n return story ? story.id : null;\n}","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { User } from '../types';\nimport { AvatarList } from './AvatarList';\nimport { StoryViewer } from './StoryViewer';\nimport { findStoryIndices } from '../utils/storyHelpers';\n\ninterface StoriesProps {\n users: User[];\n closeNavigateTo?: string;\n}\n\nexport const Stories: React.FC<StoriesProps> = ({ users, closeNavigateTo = '/' }) => {\n const { storyId } = useParams<{ storyId?: string }>();\n const navigate = useNavigate();\n\n const [viewerState, setViewerState] = useState<{\n isOpen: boolean;\n userIndex: number;\n storyIndex: number;\n }>({\n isOpen: false,\n userIndex: 0,\n storyIndex: 0,\n });\n\n const scrollPositionRef = useRef(0);\n\n // Handle initial story from URL\n useEffect(() => {\n if (storyId) {\n const indices = findStoryIndices(users, storyId);\n if (indices) {\n setViewerState({\n isOpen: true,\n userIndex: indices.userIndex,\n storyIndex: indices.storyIndex,\n });\n }\n }\n }, [storyId, users]);\n\n const handleAvatarClick = useCallback((userIndex: number) => {\n // Save scroll position\n scrollPositionRef.current = window.scrollY;\n\n setViewerState({\n isOpen: true,\n userIndex,\n storyIndex: 0,\n });\n\n // Update URL with first story ID of the user\n const user = users[userIndex];\n if (user && user.stories.length > 0) {\n const firstStoryId = user.stories[0].id;\n navigate(`/story/${firstStoryId}`, { replace: true });\n }\n }, [users, navigate]);\n\n const handleCloseViewer = useCallback(() => {\n setViewerState({\n isOpen: false,\n userIndex: 0,\n storyIndex: 0,\n });\n\n // Restore scroll position\n requestAnimationFrame(() => {\n window.scrollTo(0, scrollPositionRef.current);\n });\n\n // Clear URL\n navigate(closeNavigateTo, { replace: true });\n }, [navigate, closeNavigateTo]);\n\n const handleStoryChange = useCallback((userIndex: number, storyIndex: number) => {\n const user = users[userIndex];\n if (user && user.stories[storyIndex]) {\n const storyId = user.stories[storyIndex].id;\n navigate(`/story/${storyId}`, { replace: true });\n }\n }, [users, navigate]);\n\n return (\n <>\n <AvatarList users={users} onAvatarClick={handleAvatarClick} />\n\n <StoryViewer\n users={users}\n initialUserIndex={viewerState.userIndex}\n initialStoryIndex={viewerState.storyIndex}\n isOpen={viewerState.isOpen}\n onClose={handleCloseViewer}\n onStoryChange={handleStoryChange}\n />\n </>\n );\n};\n","import { User, StoryItemControls } from \"../types\";\nimport React from \"react\";\n\n// ============================================\n// CUSTOM STORY COMPONENTS\n// ============================================\n\n// Interactive Poll Component\nexport const PollComponent: React.FC<StoryItemControls> = ({\n pause,\n resume,\n next,\n}) => {\n const [selected, setSelected] = React.useState<number | null>(null);\n const [votes, setVotes] = React.useState([42, 28, 18, 12]);\n\n React.useEffect(() => {\n pause();\n return () => resume();\n }, [pause, resume]);\n\n const handleVote = (option: number) => {\n setSelected(option);\n const newVotes = [...votes];\n newVotes[option] += 1;\n setVotes(newVotes);\n setTimeout(() => {\n resume();\n next();\n }, 2000);\n };\n\n const total = votes.reduce((a, b) => a + b, 0);\n const options = [\"React\", \"Vue\", \"Angular\", \"Svelte\"];\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #667eea 0%, #764ba2 100%)\",\n }}\n >\n <h2 style={{ color: \"white\", marginBottom: \"10px\", fontSize: \"28px\", fontWeight: \"bold\" }}>\n Poll\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.9)\", marginBottom: \"30px\", fontSize: \"18px\" }}>\n What's your favorite framework?\n </p>\n\n <div style={{ width: \"100%\" }}>\n {options.map((option, idx) => {\n const percentage = Math.round((votes[idx] / total) * 100);\n const isSelected = selected === idx;\n\n return (\n <button\n key={idx}\n onClick={() => selected === null && handleVote(idx)}\n disabled={selected !== null}\n style={{\n width: \"100%\",\n padding: \"16px 20px\",\n margin: \"8px 0\",\n border: \"none\",\n borderRadius: \"12px\",\n background: selected !== null\n ? `linear-gradient(90deg, rgba(255,255,255,0.4) ${percentage}%, rgba(255,255,255,0.15) ${percentage}%)`\n : \"rgba(255,255,255,0.2)\",\n color: \"white\",\n fontSize: \"16px\",\n fontWeight: \"600\",\n cursor: selected === null ? \"pointer\" : \"default\",\n transition: \"all 0.3s ease\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n backdropFilter: \"blur(10px)\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"10px\" }}>\n {isSelected && \"✓ \"}\n {option}\n </span>\n {selected !== null && <span>{percentage}%</span>}\n </button>\n );\n })}\n </div>\n\n {selected !== null && (\n <p style={{ color: \"rgba(255,255,255,0.8)\", marginTop: \"20px\", fontSize: \"14px\" }}>\n {total} votes • Thanks for voting!\n </p>\n )}\n </div>\n );\n};\n\n// Quiz Component\nexport const QuizComponent: React.FC<StoryItemControls> = ({\n pause,\n resume,\n next,\n}) => {\n const [answered, setAnswered] = React.useState(false);\n const [selected, setSelected] = React.useState<number | null>(null);\n const correctAnswer = 2;\n\n React.useEffect(() => {\n pause();\n return () => resume();\n }, [pause, resume]);\n\n const handleAnswer = (idx: number) => {\n setSelected(idx);\n setAnswered(true);\n setTimeout(() => {\n resume();\n next();\n }, 2500);\n };\n\n const options = [\"Mars\", \"Venus\", \"Jupiter\", \"Saturn\"];\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #f093fb 0%, #f5576c 100%)\",\n }}\n >\n <div style={{\n fontSize: \"48px\",\n marginBottom: \"20px\",\n animation: \"bounce 1s infinite\"\n }}>\n 🪐\n </div>\n <h2 style={{ color: \"white\", marginBottom: \"10px\", fontSize: \"24px\", fontWeight: \"bold\", textAlign: \"center\" }}>\n Quiz Time!\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.9)\", marginBottom: \"30px\", fontSize: \"18px\", textAlign: \"center\" }}>\n Which is the largest planet in our solar system?\n </p>\n\n <div style={{ width: \"100%\" }}>\n {options.map((option, idx) => {\n const isCorrect = idx === correctAnswer;\n const isSelected = selected === idx;\n\n let bgColor = \"rgba(255,255,255,0.2)\";\n if (answered) {\n if (isCorrect) bgColor = \"rgba(34, 197, 94, 0.6)\";\n else if (isSelected) bgColor = \"rgba(239, 68, 68, 0.6)\";\n }\n\n return (\n <button\n key={idx}\n onClick={() => !answered && handleAnswer(idx)}\n disabled={answered}\n style={{\n width: \"100%\",\n padding: \"16px 20px\",\n margin: \"8px 0\",\n border: \"none\",\n borderRadius: \"12px\",\n background: bgColor,\n color: \"white\",\n fontSize: \"16px\",\n fontWeight: \"600\",\n cursor: answered ? \"default\" : \"pointer\",\n transition: \"all 0.3s ease\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span>{option}</span>\n {answered && isCorrect && <span>✓</span>}\n {answered && isSelected && !isCorrect && <span>✗</span>}\n </button>\n );\n })}\n </div>\n\n {answered && (\n <p style={{\n color: \"white\",\n marginTop: \"20px\",\n fontSize: \"16px\",\n fontWeight: \"bold\"\n }}>\n {selected === correctAnswer ? \"🎉 Correct!\" : \"❌ Wrong! Jupiter is the largest.\"}\n </p>\n )}\n </div>\n );\n};\n\n// Countdown/Announcement Component\nexport const CountdownComponent: React.FC<StoryItemControls> = () => {\n const [timeLeft, setTimeLeft] = React.useState({\n days: 12,\n hours: 8,\n minutes: 45,\n seconds: 30,\n });\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeLeft((prev) => {\n let { days, hours, minutes, seconds } = prev;\n seconds--;\n if (seconds < 0) {\n seconds = 59;\n minutes--;\n }\n if (minutes < 0) {\n minutes = 59;\n hours--;\n }\n if (hours < 0) {\n hours = 23;\n days--;\n }\n return { days, hours, minutes, seconds };\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, []);\n\n const TimeBox = ({ value, label }: { value: number; label: string }) => (\n <div style={{ textAlign: \"center\" }}>\n <div\n style={{\n background: \"rgba(255,255,255,0.2)\",\n backdropFilter: \"blur(10px)\",\n borderRadius: \"12px\",\n padding: \"15px 20px\",\n minWidth: \"70px\",\n }}\n >\n <div style={{ fontSize: \"32px\", fontWeight: \"bold\", color: \"white\" }}>\n {String(value).padStart(2, \"0\")}\n </div>\n </div>\n <div style={{ color: \"rgba(255,255,255,0.8)\", fontSize: \"12px\", marginTop: \"8px\", textTransform: \"uppercase\" }}>\n {label}\n </div>\n </div>\n );\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)\",\n }}\n >\n <div style={{ fontSize: \"48px\", marginBottom: \"15px\" }}>🚀</div>\n <h2 style={{ color: \"white\", marginBottom: \"8px\", fontSize: \"24px\", fontWeight: \"bold\" }}>\n Product Launch\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.7)\", marginBottom: \"30px\", fontSize: \"14px\" }}>\n Something amazing is coming...\n </p>\n\n <div style={{ display: \"flex\", gap: \"12px\", marginBottom: \"30px\" }}>\n <TimeBox value={timeLeft.days} label=\"Days\" />\n <TimeBox value={timeLeft.hours} label=\"Hours\" />\n <TimeBox value={timeLeft.minutes} label=\"Mins\" />\n <TimeBox value={timeLeft.seconds} label=\"Secs\" />\n </div>\n\n <button\n style={{\n padding: \"14px 40px\",\n background: \"linear-gradient(135deg, #667eea 0%, #764ba2 100%)\",\n border: \"none\",\n borderRadius: \"30px\",\n color: \"white\",\n fontSize: \"16px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n Notify Me\n </button>\n </div>\n );\n};\n\n// Product Showcase Component\nexport const ProductShowcaseComponent: React.FC<StoryItemControls> = () => {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"linear-gradient(180deg, #1a1a2e 0%, #16213e 100%)\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n {/* Product Image */}\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", padding: \"20px\" }}>\n <img\n src=\"https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop\"\n alt=\"Product\"\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n borderRadius: \"20px\",\n boxShadow: \"0 20px 60px rgba(0,0,0,0.5)\",\n }}\n />\n </div>\n\n {/* Product Info */}\n <div\n style={{\n padding: \"30px\",\n background: \"linear-gradient(180deg, transparent 0%, rgba(0,0,0,0.8) 100%)\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\", marginBottom: \"10px\" }}>\n <span style={{ background: \"#ef4444\", color: \"white\", padding: \"4px 10px\", borderRadius: \"20px\", fontSize: \"12px\", fontWeight: \"bold\" }}>\n NEW\n </span>\n <span style={{ color: \"rgba(255,255,255,0.6)\", fontSize: \"12px\" }}>Limited Edition</span>\n </div>\n <h2 style={{ color: \"white\", fontSize: \"24px\", fontWeight: \"bold\", marginBottom: \"8px\" }}>\n Premium Watch Collection\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.7)\", fontSize: \"14px\", marginBottom: \"15px\" }}>\n Elegant design meets modern technology\n </p>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"15px\" }}>\n <span style={{ color: \"white\", fontSize: \"28px\", fontWeight: \"bold\" }}>$299</span>\n <span style={{ color: \"rgba(255,255,255,0.5)\", fontSize: \"18px\", textDecoration: \"line-through\" }}>$399</span>\n </div>\n <button\n style={{\n width: \"100%\",\n marginTop: \"20px\",\n padding: \"16px\",\n background: \"white\",\n border: \"none\",\n borderRadius: \"12px\",\n color: \"#1a1a2e\",\n fontSize: \"16px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n Shop Now →\n </button>\n </div>\n </div>\n );\n};\n\n// Slider/Rating Component\nexport const SliderComponent: React.FC<StoryItemControls> = ({\n pause,\n resume,\n next,\n}) => {\n const [value, setValue] = React.useState(5);\n const [submitted, setSubmitted] = React.useState(false);\n\n React.useEffect(() => {\n pause();\n return () => resume();\n }, [pause, resume]);\n\n const handleSubmit = () => {\n setSubmitted(true);\n setTimeout(() => {\n resume();\n next();\n }, 1500);\n };\n\n const emojis = [\"😢\", \"😕\", \"😐\", \"🙂\", \"😊\", \"😃\", \"😄\", \"😁\", \"🤩\", \"🥳\"];\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #11998e 0%, #38ef7d 100%)\",\n }}\n >\n <div style={{ fontSize: \"80px\", marginBottom: \"20px\", transition: \"all 0.3s\" }}>\n {emojis[value - 1]}\n </div>\n\n <h2 style={{ color: \"white\", marginBottom: \"10px\", fontSize: \"24px\", fontWeight: \"bold\" }}>\n Rate Your Experience\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.9)\", marginBottom: \"30px\", fontSize: \"16px\" }}>\n How was your visit today?\n </p>\n\n {!submitted ? (\n <>\n <div style={{ width: \"100%\", marginBottom: \"20px\" }}>\n <input\n type=\"range\"\n min=\"1\"\n max=\"10\"\n value={value}\n onChange={(e) => setValue(parseInt(e.target.value))}\n style={{\n width: \"100%\",\n height: \"8px\",\n borderRadius: \"4px\",\n appearance: \"none\",\n background: \"rgba(255,255,255,0.3)\",\n cursor: \"pointer\",\n }}\n />\n <div style={{ display: \"flex\", justifyContent: \"space-between\", color: \"rgba(255,255,255,0.7)\", fontSize: \"12px\", marginTop: \"8px\" }}>\n <span>1</span>\n <span>10</span>\n </div>\n </div>\n\n <button\n onClick={handleSubmit}\n style={{\n padding: \"14px 50px\",\n background: \"white\",\n border: \"none\",\n borderRadius: \"30px\",\n color: \"#11998e\",\n fontSize: \"16px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n Submit ({value}/10)\n </button>\n </>\n ) : (\n <div style={{ textAlign: \"center\" }}>\n <div style={{ fontSize: \"48px\", marginBottom: \"10px\" }}>🎉</div>\n <p style={{ color: \"white\", fontSize: \"18px\", fontWeight: \"bold\" }}>\n Thanks for your feedback!\n </p>\n </div>\n )}\n </div>\n );\n};\n\n// ============================================\n// DEMO DATA\n// ============================================\n\n// Sample working video URLs\nconst sampleVideos = [\n \"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4\",\n \"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4\",\n \"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4\",\n];\n\n// Sample working image URLs from Unsplash\nconst sampleImages = [\n \"https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1472214103451-9374bd1c798e?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1517841905240-472988babdf9?w=1080&h=1920&fit=crop\",\n];\n\n// Avatar URLs\nconst avatarImages = [\n \"https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1517841905240-472988babdf9?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1539571696357-5a69c17a67c6?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150&h=150&fit=crop\",\n];\n\n// Main demo users with diverse story types\nexport const demoUsers: User[] = [\n {\n id: \"user-travel\",\n username: \"Travel\",\n avatarUrl: avatarImages[0],\n hasUnreadStories: true,\n stories: [\n {\n id: \"travel-1\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Beautiful mountain landscape\",\n },\n {\n id: \"travel-2\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Scenic ocean view\",\n },\n {\n id: \"travel-3\",\n type: \"text\",\n text: \"Adventure awaits! 🌍\\n\\nSwipe to explore more destinations →\",\n backgroundColor: \"#FF6B6B\",\n textColor: \"#FFFFFF\",\n duration: 4000,\n },\n {\n id: \"travel-4\",\n type: \"video\",\n src: sampleVideos[0],\n duration: 15000,\n },\n ],\n },\n {\n id: \"user-polls\",\n username: \"Interactive\",\n avatarUrl: avatarImages[1],\n hasUnreadStories: true,\n stories: [\n {\n id: \"poll-intro\",\n type: \"text\",\n text: \"Let's have some fun! 🎮\\n\\nInteractive stories ahead →\",\n backgroundColor: \"#667eea\",\n textColor: \"#FFFFFF\",\n duration: 3000,\n },\n {\n id: \"poll-1\",\n type: \"custom_component\",\n component: PollComponent,\n duration: 30000,\n },\n {\n id: \"quiz-1\",\n type: \"custom_component\",\n component: QuizComponent,\n duration: 30000,\n },\n {\n id: \"slider-1\",\n type: \"custom_component\",\n component: SliderComponent,\n duration: 30000,\n },\n ],\n },\n {\n id: \"user-product\",\n username: \"Shop\",\n avatarUrl: avatarImages[2],\n hasUnreadStories: true,\n stories: [\n {\n id: \"product-1\",\n type: \"custom_component\",\n component: ProductShowcaseComponent,\n duration: 8000,\n },\n {\n id: \"product-2\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Product showcase\",\n },\n {\n id: \"product-3\",\n type: \"text\",\n text: \"Limited Time Offer! 🔥\\n\\n50% OFF\\n\\nUse code: STORY50\",\n backgroundColor: \"#000000\",\n textColor: \"#FFFFFF\",\n duration: 5000,\n },\n ],\n },\n {\n id: \"user-launch\",\n username: \"Events\",\n avatarUrl: avatarImages[3],\n hasUnreadStories: true,\n stories: [\n {\n id: \"launch-1\",\n type: \"custom_component\",\n component: CountdownComponent,\n duration: 10000,\n },\n {\n id: \"launch-2\",\n type: \"text\",\n text: \"Mark your calendars! 📅\\n\\nBig announcement coming soon...\",\n backgroundColor: \"#302b63\",\n textColor: \"#FFFFFF\",\n duration: 4000,\n },\n {\n id: \"launch-3\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1492684223066-81342ee5ff30?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Event teaser\",\n },\n ],\n },\n {\n id: \"user-video\",\n username: \"Videos\",\n avatarUrl: avatarImages[4],\n hasUnreadStories: true,\n stories: [\n {\n id: \"video-1\",\n type: \"video\",\n src: sampleVideos[1],\n duration: 15000,\n },\n {\n id: \"video-2\",\n type: \"video\",\n src: sampleVideos[2],\n duration: 15000,\n },\n {\n id: \"video-3\",\n type: \"text\",\n text: \"More videos coming soon! 🎬\\n\\nStay tuned →\",\n backgroundColor: \"#4ECDC4\",\n textColor: \"#FFFFFF\",\n duration: 3000,\n },\n ],\n },\n {\n id: \"user-lifestyle\",\n username: \"Lifestyle\",\n avatarUrl: avatarImages[5],\n hasUnreadStories: false,\n stories: [\n {\n id: \"lifestyle-1\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Nature scene\",\n },\n {\n id: \"lifestyle-2\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Peaceful landscape\",\n },\n {\n id: \"lifestyle-3\",\n type: \"text\",\n text: \"Find your peace 🧘\\n\\nNature heals everything\",\n backgroundColor: \"#45B7D1\",\n textColor: \"#FFFFFF\",\n duration: 4000,\n },\n ],\n },\n];\n\n// Generate demo users for performance testing\nexport const generateDemoUsers = (count: number = 50): User[] => {\n const users: User[] = [...demoUsers];\n\n for (let i = demoUsers.length; i < count; i++) {\n const hasUnread = Math.random() > 0.3;\n const storyCount = Math.floor(Math.random() * 5) + 2;\n\n users.push({\n id: `user-${i}`,\n username: `User ${i}`,\n avatarUrl: `https://i.pravatar.cc/150?img=${i % 70}`,\n hasUnreadStories: hasUnread,\n stories: Array.from({ length: storyCount }, (_, storyIdx) => {\n const typeRandom = Math.random();\n\n // 50% images, 20% videos, 20% text, 10% custom\n if (typeRandom < 0.5) {\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"image\" as const,\n src: sampleImages[Math.floor(Math.random() * sampleImages.length)],\n duration: 5000,\n alt: `Story from User ${i}`,\n };\n }\n\n if (typeRandom < 0.7) {\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"video\" as const,\n src: sampleVideos[Math.floor(Math.random() * sampleVideos.length)],\n duration: 15000,\n };\n }\n\n if (typeRandom < 0.9) {\n const backgrounds = [\"#FF6B6B\", \"#4ECDC4\", \"#45B7D1\", \"#FFA07A\", \"#98D8C8\", \"#667eea\", \"#764ba2\"];\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"text\" as const,\n text: `Hello from User ${i}! 👋\\n\\nThis is story ${storyIdx + 1}`,\n backgroundColor: backgrounds[Math.floor(Math.random() * backgrounds.length)],\n textColor: \"#FFFFFF\",\n duration: 4000,\n };\n }\n\n // Custom component\n const components = [PollComponent, QuizComponent, SliderComponent];\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"custom_component\" as const,\n component: components[Math.floor(Math.random() * components.length)],\n duration: 30000,\n };\n }),\n });\n }\n\n return users;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/storyHelpers.ts","../src/components/Avatar.tsx","../src/components/AvatarList.tsx","../src/hooks/useTimer.ts","../src/hooks/useKeyboard.ts","../src/hooks/useFocusTrap.ts","../src/hooks/usePageVisibility.ts","../src/hooks/usePreloader.ts","../src/hooks/useQueryParams.ts","../src/components/ProgressBar.tsx","../src/components/StoryProgressBars.tsx","../src/components/StoryItem.tsx","../src/components/StoryViewer.tsx","../src/components/Stories.tsx","../src/utils/demoData.tsx"],"names":["cn","classes","resolveUserIndex","users","value","num","u","resolveStoryIndex","user","s","Avatar","memo","avatarUrl","username","hasUnreadStories","onClick","classNames","imageLoaded","setImageLoaded","useState","imageError","setImageError","jsxs","jsx","AVATAR_WIDTH","OVERSCAN_COUNT","AvatarList","onAvatarClick","containerRef","useRef","scrollLeft","setScrollLeft","containerWidth","setContainerWidth","handleScroll","useCallback","useEffect","updateWidth","startIndex","endIndex","React","start","visibleCount","totalWidth","virtualItems","idx","index","useTimer","duration","onComplete","autoStart","progress","setProgress","isPaused","setIsPaused","currentDuration","setCurrentDuration","startTimeRef","accumulatedTimeRef","rafRef","updateProgressRef","updateProgress","elapsed","newProgress","pause","resume","reset","setDuration","ms","useKeyboard","onLeft","onRight","onSpace","onEscape","enabled","handleKeyDown","e","useFocusTrap","previousFocusRef","container","focusableElements","firstFocusable","lastFocusable","handleTabKey","usePageVisibility","isVisible","setIsVisible","handleVisibilityChange","usePreloader","cacheRef","loadingRef","preloadImage","src","resolve","reject","checkInterval","img","preloadVideo","video","handleCanPlay","cleanup","handleError","preloadStoryItem","item","error","preloadMultiple","items","chunks","chunk","isPreloaded","clearCache","useQueryParams","searchParams","setSearchParamsState","handlePopState","setQueryParams","params","options","newParams","searchString","newUrl","navigateWithParams","clearQueryParams","ProgressBar","isActive","progressPercent","StoryProgressBars","total","currentIndex","_","StoryItem","onDurationDetected","onLoadError","onBufferingChange","controls","videoRef","hasError","setHasError","isLoading","setIsLoading","handleLoadedMetadata","handleWaiting","handlePlaying","handleStalled","handleImageLoad","Component","DEFAULT_DURATION","CUBE_SNAP_MS","DRAG_THRESHOLD_PX","SNAP_THRESHOLD","cubeTransform","depth","percentage","StoryViewer","initialUserIndex","initialStoryIndex","isOpenProp","onCloseProp","onStoryChange","isQueryParamMode","setSearchParams","queryIndices","useMemo","currentParams","userParam","storyParam","userIndex","storyIndex","effectiveInitialUserIndex","effectiveInitialStoryIndex","isOpen","onClose","currentUserIndex","setCurrentUserIndex","currentStoryIndex","setCurrentStoryIndex","cubeState","setCubeState","isUserLoading","setIsUserLoading","scrollPositionRef","currentDurationRef","hasStartedLoadingRef","isInitialMountRef","cubeWrapperRef","cubeDragRef","faceWidthRef","isSnappingRef","lastViewedStoryRef","currentUser","currentStory","totalStories","focusTrapRef","isPageVisible","handlePause","handleResume","handleNextRef","timer","handleBufferingChange","buffering","buildCubeState","finalizeCube","targetUserIndex","targetStoryIndex","wrapper","viewport","animateCubeTo","direction","cube","storyIdx","width","targetPct","handleNext","nextIndex","nextStory","handlePrevious","prevIndex","prevStory","handleClose","storyControls","handlePointerDown","event","handlePointerMove","drag","deltaX","deltaY","viewportEl","dismissY","scale","opacity","overlayEl","fw","pct","handlePointerUp","resumeIdx","w","vp","target","contentEl","rect","useLayoutEffect","itemsToPreload","curU","curS","handleLoadError","leftUser","rightUser","leftStoryIdx","rightStoryIdx","renderFaceContent","faceUser","faceStory","faceStoryIndex","faceProgress","isLive","Fragment","d","content","isCube","adjacentFaceStyle","rotateY","createPortal","Stories","handleAvatarClick","PollComponent","next","selected","setSelected","votes","setVotes","handleVote","option","newVotes","a","b","isSelected","QuizComponent","answered","setAnswered","correctAnswer","handleAnswer","isCorrect","bgColor","CountdownComponent","timeLeft","setTimeLeft","prev","days","hours","minutes","seconds","TimeBox","label","ProductShowcaseComponent","SliderComponent","setValue","submitted","setSubmitted","handleSubmit","sampleVideos","sampleImages","avatarImages","demoUsers","generateDemoUsers","count","i","hasUnread","storyCount","typeRandom","backgrounds","components"],"mappings":"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","file":"index.js","sourcesContent":["import { User } from '../types';\n\n/** Merge CSS class names, filtering out falsy values */\nexport function cn(...classes: (string | undefined | false | null)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\n/**\n * Resolves a user value (index or ID) to an index\n * @param users - Array of users\n * @param value - Either a numeric index or user ID string\n * @returns The user index, or -1 if not found\n */\nexport function resolveUserIndex(users: User[], value: string): number {\n const num = parseInt(value, 10);\n if (!isNaN(num) && num >= 0 && num < users.length) {\n return num;\n }\n // Try to find by user ID\n return users.findIndex(u => u.id === value);\n}\n\n/**\n * Resolves a story value (index or ID) to an index\n * @param user - The user object\n * @param value - Either a numeric index or story ID string\n * @returns The story index, or -1 if not found\n */\nexport function resolveStoryIndex(user: User, value: string): number {\n const num = parseInt(value, 10);\n if (!isNaN(num) && num >= 0 && num < user.stories.length) {\n return num;\n }\n // Try to find by story ID\n return user.stories.findIndex(s => s.id === value);\n}","import { memo, useState } from 'react';\nimport { AvatarClassNames } from '../types';\nimport { cn } from '../utils/storyHelpers';\n\ninterface AvatarProps {\n avatarUrl: string;\n username: string;\n hasUnreadStories?: boolean;\n onClick: () => void;\n classNames?: AvatarClassNames;\n}\n\nexport const Avatar = memo<AvatarProps>(\n ({ avatarUrl, username, hasUnreadStories = false, onClick, classNames }) => {\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageError, setImageError] = useState(false);\n\n return (\n <button\n className={cn(\n 'story-avatar',\n hasUnreadStories ? 'story-avatar-unread' : 'story-avatar-read',\n classNames?.root,\n )}\n onClick={onClick}\n aria-label={`View ${username}'s story`}\n >\n <div className={cn('story-avatar-ring', classNames?.ring)}>\n <div className={cn('story-avatar-image-wrapper', classNames?.imageWrapper)}>\n {!imageError ? (\n <img\n src={avatarUrl}\n alt={username}\n className={cn(\n 'story-avatar-image',\n imageLoaded && 'story-avatar-image-loaded',\n classNames?.image,\n )}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageError(true)}\n />\n ) : (\n <div className={cn('story-avatar-placeholder', classNames?.placeholder)}>\n {username.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n </div>\n <span className={cn('story-avatar-username', classNames?.username)}>{username}</span>\n </button>\n );\n }\n);\n\nAvatar.displayName = 'Avatar';\n","import React, { useRef, useEffect, useState, useCallback, memo } from 'react';\nimport { User, AvatarListClassNames } from '../types';\nimport { cn } from '../utils/storyHelpers';\nimport { Avatar } from './Avatar';\n\ninterface AvatarListProps {\n users: User[];\n onAvatarClick: (userIndex: number) => void;\n classNames?: AvatarListClassNames;\n}\n\nconst AVATAR_WIDTH = 90; // Approximate width including margin\nconst OVERSCAN_COUNT = 3; // Render extra items outside viewport\n\nexport const AvatarList = memo<AvatarListProps>(({ users, onAvatarClick, classNames }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [scrollLeft, setScrollLeft] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n\n // Update scroll position\n const handleScroll = useCallback(() => {\n if (containerRef.current) {\n setScrollLeft(containerRef.current.scrollLeft);\n }\n }, []);\n\n // Update container width on resize\n useEffect(() => {\n const updateWidth = () => {\n if (containerRef.current) {\n setContainerWidth(containerRef.current.clientWidth);\n }\n };\n\n updateWidth();\n window.addEventListener('resize', updateWidth);\n\n return () => {\n window.removeEventListener('resize', updateWidth);\n };\n }, []);\n\n // Calculate visible range\n const { startIndex, endIndex } = React.useMemo(() => {\n const start = Math.floor(scrollLeft / AVATAR_WIDTH);\n const visibleCount = Math.ceil(containerWidth / AVATAR_WIDTH);\n \n return {\n startIndex: Math.max(0, start - OVERSCAN_COUNT),\n endIndex: Math.min(users.length, start + visibleCount + OVERSCAN_COUNT),\n };\n }, [scrollLeft, containerWidth, users.length]);\n\n // Calculate total width\n const totalWidth = users.length * AVATAR_WIDTH;\n\n // Virtual items to render\n const virtualItems = users.slice(startIndex, endIndex).map((user, idx) => ({\n user,\n index: startIndex + idx,\n }));\n\n return (\n <div\n ref={containerRef}\n className={cn('story-avatar-list', classNames?.root)}\n onScroll={handleScroll}\n role=\"list\"\n aria-label=\"Stories\"\n >\n <div\n className=\"story-avatar-list-inner\"\n style={{\n width: `${totalWidth}px`,\n position: 'relative',\n }}\n >\n {virtualItems.map(({ user, index }) => (\n <div\n key={user.id}\n className=\"story-avatar-item\"\n style={{\n position: 'absolute',\n left: `${index * AVATAR_WIDTH}px`,\n width: `${AVATAR_WIDTH}px`,\n }}\n role=\"listitem\"\n >\n <Avatar\n avatarUrl={user.avatarUrl}\n username={user.username}\n hasUnreadStories={user.hasUnreadStories}\n onClick={() => onAvatarClick(index)}\n classNames={classNames?.avatar}\n />\n </div>\n ))}\n </div>\n </div>\n );\n});\n\nAvatarList.displayName = 'AvatarList';\n","import { useEffect, useRef, useState, useCallback } from \"react\";\n\nexport interface UseTimerOptions {\n duration: number;\n onComplete?: () => void;\n autoStart?: boolean;\n}\n\nexport interface UseTimerReturn {\n progress: number; // 0 to 1\n isPaused: boolean;\n pause: () => void;\n resume: () => void;\n reset: () => void;\n setDuration: (ms: number) => void;\n}\n\nexport const useTimer = ({\n duration,\n onComplete,\n autoStart = true,\n}: UseTimerOptions): UseTimerReturn => {\n const [progress, setProgress] = useState(0);\n const [isPaused, setIsPaused] = useState(!autoStart);\n const [currentDuration, setCurrentDuration] = useState(duration);\n\n const startTimeRef = useRef<number | null>(null);\n const accumulatedTimeRef = useRef(0);\n const rafRef = useRef<number | null>(null);\n const updateProgressRef = useRef<() => void>();\n\n const updateProgress = useCallback(() => {\n if (!startTimeRef.current || isPaused) return;\n\n const elapsed =\n Date.now() - startTimeRef.current + accumulatedTimeRef.current;\n const newProgress = Math.min(elapsed / currentDuration, 1);\n\n setProgress(newProgress);\n\n if (newProgress >= 1) {\n onComplete?.();\n return;\n }\n\n rafRef.current = requestAnimationFrame(updateProgressRef.current!);\n }, [currentDuration, isPaused, onComplete]);\n\n // Keep the ref updated with the latest function\n updateProgressRef.current = updateProgress;\n\n const pause = useCallback(() => {\n if (isPaused) return;\n\n if (startTimeRef.current) {\n accumulatedTimeRef.current += Date.now() - startTimeRef.current;\n }\n\n setIsPaused(true);\n\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, [isPaused]);\n\n const resume = useCallback(() => {\n if (!isPaused) return;\n\n startTimeRef.current = Date.now();\n setIsPaused(false);\n }, [isPaused]);\n\n const reset = useCallback(() => {\n // Cancel any existing animation frame\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n startTimeRef.current = Date.now();\n accumulatedTimeRef.current = 0;\n setProgress(0);\n setIsPaused(false);\n\n // Force start animation frame\n rafRef.current = requestAnimationFrame(updateProgressRef.current!);\n }, []);\n\n const setDuration = useCallback((ms: number) => {\n setCurrentDuration(ms);\n }, []);\n\n // Start/restart animation loop when paused state changes\n useEffect(() => {\n if (!isPaused) {\n startTimeRef.current = Date.now();\n rafRef.current = requestAnimationFrame(updateProgressRef.current!);\n }\n\n return () => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [isPaused]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, []);\n\n return {\n progress,\n isPaused,\n pause,\n resume,\n reset,\n setDuration,\n };\n};\n","import { useEffect } from 'react';\n\nexport interface UseKeyboardOptions {\n onLeft?: () => void;\n onRight?: () => void;\n onSpace?: () => void;\n onEscape?: () => void;\n enabled?: boolean;\n}\n\nexport const useKeyboard = ({\n onLeft,\n onRight,\n onSpace,\n onEscape,\n enabled = true,\n}: UseKeyboardOptions) => {\n useEffect(() => {\n if (!enabled) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n onLeft?.();\n break;\n case 'ArrowRight':\n e.preventDefault();\n onRight?.();\n break;\n case ' ':\n e.preventDefault();\n onSpace?.();\n break;\n case 'Escape':\n e.preventDefault();\n onEscape?.();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [onLeft, onRight, onSpace, onEscape, enabled]);\n};\n","import { useEffect, useRef } from 'react';\n\nexport const useFocusTrap = (enabled: boolean) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!enabled || !containerRef.current) return;\n\n // Store the currently focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n const container = containerRef.current;\n const focusableElements = container.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n const firstFocusable = focusableElements[0];\n const lastFocusable = focusableElements[focusableElements.length - 1];\n\n // Focus first element\n firstFocusable?.focus();\n\n const handleTabKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey) {\n if (document.activeElement === firstFocusable) {\n e.preventDefault();\n lastFocusable?.focus();\n }\n } else {\n if (document.activeElement === lastFocusable) {\n e.preventDefault();\n firstFocusable?.focus();\n }\n }\n };\n\n container.addEventListener('keydown', handleTabKey);\n\n return () => {\n container.removeEventListener('keydown', handleTabKey);\n \n // Restore focus to the previously focused element\n previousFocusRef.current?.focus();\n };\n }, [enabled]);\n\n return containerRef;\n};\n","import { useEffect, useState } from 'react';\n\nexport const usePageVisibility = () => {\n const [isVisible, setIsVisible] = useState(!document.hidden);\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n setIsVisible(!document.hidden);\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return isVisible;\n};\n","import { useEffect, useRef, useCallback } from 'react';\nimport { StoryItem } from '../types';\n\ninterface PreloadCache {\n [key: string]: 'loaded' | 'failed';\n}\n\nexport const usePreloader = () => {\n const cacheRef = useRef<PreloadCache>({});\n const loadingRef = useRef<Set<string>>(new Set());\n\n const preloadImage = useCallback((src: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (cacheRef.current[src] === 'loaded') {\n resolve();\n return;\n }\n if (cacheRef.current[src] === 'failed') {\n reject(new Error(`Previously failed to load image: ${src}`));\n return;\n }\n\n if (loadingRef.current.has(src)) {\n // Already loading, wait for it\n const checkInterval = setInterval(() => {\n if (cacheRef.current[src] != null || !loadingRef.current.has(src)) {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n return;\n }\n\n loadingRef.current.add(src);\n\n const img = new Image();\n img.onload = () => {\n cacheRef.current[src] = 'loaded';\n loadingRef.current.delete(src);\n resolve();\n };\n img.onerror = () => {\n cacheRef.current[src] = 'failed';\n loadingRef.current.delete(src);\n reject(new Error(`Failed to load image: ${src}`));\n };\n img.src = src;\n });\n }, []);\n\n const preloadVideo = useCallback((src: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (cacheRef.current[src] === 'loaded') {\n resolve();\n return;\n }\n if (cacheRef.current[src] === 'failed') {\n reject(new Error(`Previously failed to load video: ${src}`));\n return;\n }\n\n if (loadingRef.current.has(src)) {\n const checkInterval = setInterval(() => {\n if (cacheRef.current[src] != null || !loadingRef.current.has(src)) {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n return;\n }\n\n loadingRef.current.add(src);\n\n const video = document.createElement('video');\n video.preload = 'auto';\n \n const handleCanPlay = () => {\n cacheRef.current[src] = 'loaded';\n loadingRef.current.delete(src);\n cleanup();\n resolve();\n };\n\n const handleError = () => {\n cacheRef.current[src] = 'failed';\n loadingRef.current.delete(src);\n cleanup();\n reject(new Error(`Failed to load video: ${src}`));\n };\n\n const cleanup = () => {\n video.removeEventListener('canplaythrough', handleCanPlay);\n video.removeEventListener('error', handleError);\n video.src = '';\n };\n\n video.addEventListener('canplaythrough', handleCanPlay);\n video.addEventListener('error', handleError);\n video.src = src;\n video.load();\n });\n }, []);\n\n const preloadStoryItem = useCallback(async (item: StoryItem): Promise<void> => {\n try {\n if (item.type === 'image' && 'src' in item) {\n await preloadImage(item.src);\n } else if (item.type === 'video' && 'src' in item) {\n await preloadVideo(item.src);\n }\n // Text and component types don't need preloading\n } catch (error) {\n console.warn('Failed to preload story item:', error);\n }\n }, [preloadImage, preloadVideo]);\n\n const preloadMultiple = useCallback(async (items: StoryItem[]): Promise<void> => {\n // Preload in parallel but limit concurrent loads\n const CONCURRENT_LIMIT = 3;\n const chunks: StoryItem[][] = [];\n \n for (let i = 0; i < items.length; i += CONCURRENT_LIMIT) {\n chunks.push(items.slice(i, i + CONCURRENT_LIMIT));\n }\n\n for (const chunk of chunks) {\n await Promise.allSettled(chunk.map(preloadStoryItem));\n }\n }, [preloadStoryItem]);\n\n const isPreloaded = useCallback((src: string): boolean => {\n return cacheRef.current[src] === 'loaded';\n }, []);\n\n const clearCache = useCallback(() => {\n cacheRef.current = {};\n loadingRef.current.clear();\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n clearCache();\n };\n }, [clearCache]);\n\n return {\n preloadImage,\n preloadVideo,\n preloadStoryItem,\n preloadMultiple,\n isPreloaded,\n clearCache,\n };\n};\n","import { useState, useCallback, useEffect } from 'react';\n\ninterface QueryParams {\n get: (key: string) => string | null;\n toString: () => string;\n}\n\ntype SetQueryParams = (\n params: Record<string, string> | ((prev: URLSearchParams) => Record<string, string>),\n options?: { replace?: boolean }\n) => void;\n\n/**\n * Custom hook to manage URL query parameters without react-router-dom\n * @returns [queryParams, setQueryParams] - Similar to useSearchParams from react-router-dom\n */\nexport function useQueryParams(): [QueryParams, SetQueryParams] {\n const [searchParams, setSearchParamsState] = useState<URLSearchParams>(\n () => new URLSearchParams(window.location.search)\n );\n\n // Listen for popstate events (browser back/forward)\n useEffect(() => {\n const handlePopState = () => {\n setSearchParamsState(new URLSearchParams(window.location.search));\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, []);\n\n const setQueryParams: SetQueryParams = useCallback((params, options = {}) => {\n const newParams = typeof params === 'function'\n ? params(new URLSearchParams(window.location.search))\n : params;\n\n const searchString = new URLSearchParams(newParams).toString();\n const newUrl = searchString\n ? `${window.location.pathname}?${searchString}`\n : window.location.pathname;\n\n if (options.replace) {\n window.history.replaceState({}, '', newUrl);\n } else {\n window.history.pushState({}, '', newUrl);\n }\n\n setSearchParamsState(new URLSearchParams(searchString));\n }, []);\n\n return [searchParams, setQueryParams];\n}\n\n/**\n * Navigate to a URL with query params\n */\nexport function navigateWithParams(params: Record<string, string>, options?: { replace?: boolean }) {\n const searchString = new URLSearchParams(params).toString();\n const newUrl = searchString\n ? `${window.location.pathname}?${searchString}`\n : window.location.pathname;\n\n if (options?.replace) {\n window.history.replaceState({}, '', newUrl);\n } else {\n window.history.pushState({}, '', newUrl);\n }\n\n // Dispatch a custom event so components can react\n window.dispatchEvent(new PopStateEvent('popstate'));\n}\n\n/**\n * Clear all query params\n */\nexport function clearQueryParams(options?: { replace?: boolean }) {\n const newUrl = window.location.pathname;\n\n if (options?.replace) {\n window.history.replaceState({}, '', newUrl);\n } else {\n window.history.pushState({}, '', newUrl);\n }\n\n window.dispatchEvent(new PopStateEvent('popstate'));\n}\n","import { memo } from \"react\";\nimport { ProgressBarClassNames } from \"../types\";\nimport { cn } from \"../utils/storyHelpers\";\n\ninterface ProgressBarProps {\n progress: number; // 0 to 1\n isActive: boolean;\n classNames?: ProgressBarClassNames;\n}\n\nexport const ProgressBar = memo<ProgressBarProps>(({ progress, isActive, classNames }) => {\n const progressPercent = Math.round(progress * 100);\n\n return (\n <div\n className={cn(\"story-progress-bar\", classNames?.root)}\n role=\"progressbar\"\n aria-valuenow={isActive ? progressPercent : progress === 1 ? 100 : 0}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Story progress: ${progressPercent}%`}\n >\n <div\n className={cn(\"story-progress-bar-fill\", classNames?.fill)}\n style={{\n transform: `scaleX(${isActive ? progress : progress === 1 ? 1 : 0})`,\n }}\n />\n </div>\n );\n});\n\nProgressBar.displayName = \"ProgressBar\";\n","import { memo } from \"react\";\nimport { StoryProgressBarsClassNames } from \"../types\";\nimport { cn } from \"../utils/storyHelpers\";\nimport { ProgressBar } from \"./ProgressBar\";\n\ninterface StoryProgressBarsProps {\n total: number;\n currentIndex: number;\n progress: number;\n classNames?: StoryProgressBarsClassNames;\n}\n\nexport const StoryProgressBars = memo<StoryProgressBarsProps>(\n ({ total, currentIndex, progress, classNames }) => {\n return (\n <div className={cn(\"story-progress-bars-container\", classNames?.root)}>\n {Array.from({ length: total }).map((_, index) => (\n <ProgressBar\n key={index}\n progress={\n index < currentIndex ? 1 : index === currentIndex ? progress : 0\n }\n isActive={index === currentIndex}\n classNames={classNames?.bar}\n />\n ))}\n </div>\n );\n }\n);\n\nStoryProgressBars.displayName = \"StoryProgressBars\";\n","import { memo, useEffect, useRef, useState, useCallback } from \"react\";\nimport { StoryItem as StoryItemType, StoryItemControls, StoryItemClassNames } from \"../types\";\nimport { cn } from \"../utils/storyHelpers\";\n\ninterface StoryItemProps {\n item: StoryItemType;\n isActive: boolean;\n isPaused: boolean;\n onDurationDetected?: (duration: number) => void;\n onLoadError?: () => void;\n onBufferingChange?: (isBuffering: boolean) => void;\n controls: StoryItemControls;\n classNames?: StoryItemClassNames;\n}\n\nexport const StoryItem = memo<StoryItemProps>(\n ({ item, isActive, isPaused, onDurationDetected, onLoadError, onBufferingChange, controls, classNames }) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const [hasError, setHasError] = useState(false);\n const [isLoading, setIsLoading] = useState(() => item.type === 'image' || item.type === 'video');\n\n // Reset state when story changes — smart per-type to avoid flicker\n useEffect(() => {\n setHasError(false);\n\n if (item.type === 'image' && 'src' in item) {\n const img = new Image();\n img.src = item.src;\n setIsLoading(!(img.complete && img.naturalWidth > 0));\n } else if (item.type === 'video') {\n setIsLoading(true);\n } else {\n setIsLoading(false);\n }\n }, [item.id, item.type]);\n\n // Handle video playback\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current || !isActive) return;\n\n const video = videoRef.current;\n\n const playVideo = async () => {\n try {\n if (isPaused) {\n video.pause();\n } else {\n await video.play();\n }\n } catch (error) {\n console.warn(\"Video play failed:\", error);\n }\n };\n\n playVideo();\n }, [item.type, isActive, isPaused]);\n\n // Reset video currentTime and detect duration when story item changes\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current) return;\n\n const video = videoRef.current;\n\n // Reset playhead to start for the new video\n video.currentTime = 0;\n\n const handleLoadedMetadata = () => {\n if (video.duration && isFinite(video.duration)) {\n onDurationDetected?.(video.duration * 1000);\n }\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n };\n\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"canplay\", handleCanPlay);\n\n // Check if metadata already loaded\n if (video.readyState >= 1) {\n handleLoadedMetadata();\n }\n\n // Check if can play\n if (video.readyState >= 3) {\n handleCanPlay();\n }\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"canplay\", handleCanPlay);\n };\n }, [item.id, item.type, onDurationDetected]);\n\n // Handle video buffering states\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current || !isActive) return;\n\n const video = videoRef.current;\n\n const handleWaiting = () => {\n onBufferingChange?.(true);\n };\n\n const handlePlaying = () => {\n onBufferingChange?.(false);\n };\n\n const handleStalled = () => {\n onBufferingChange?.(true);\n };\n\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"stalled\", handleStalled);\n\n return () => {\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"stalled\", handleStalled);\n };\n }, [item.type, isActive, onBufferingChange]);\n\n // Cleanup video on unmount or when story changes\n useEffect(() => {\n const video = videoRef.current;\n if (item.type !== \"video\" || !video) return;\n\n return () => {\n video.pause();\n video.removeAttribute('src');\n video.load();\n };\n }, [item.id, item.type]);\n\n const handleError = useCallback(() => {\n setHasError(true);\n setIsLoading(false);\n onLoadError?.();\n }, [onLoadError]);\n\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n }, []);\n\n if (hasError) {\n return (\n <div className={cn(\"story-item story-item-error\", classNames?.error)}>\n <div className=\"story-item-error-message\">Failed to load content</div>\n </div>\n );\n }\n\n switch (item.type) {\n case \"image\":\n return (\n <div className={cn(\"story-item story-item-image\", classNames?.root)}>\n {isLoading && (\n <div className={cn(\"story-item-loader\", classNames?.loader)}>\n <div className=\"story-item-spinner\"></div>\n </div>\n )}\n <img\n src={item.src}\n alt={item.alt || \"Story image\"}\n onError={handleError}\n onLoad={handleImageLoad}\n draggable={false}\n style={{ opacity: isLoading ? 0 : 1 }}\n />\n </div>\n );\n\n case \"video\":\n return (\n <div className={cn(\"story-item story-item-video\", classNames?.root)}>\n {isLoading && (\n <div className={cn(\"story-item-loader\", classNames?.loader)}>\n <div className=\"story-item-spinner\"></div>\n </div>\n )}\n <video\n ref={videoRef}\n src={item.src}\n muted\n playsInline\n loop={false}\n onError={handleError}\n preload=\"auto\"\n style={{ opacity: isLoading ? 0 : 1 }}\n />\n </div>\n );\n\n case \"text\":\n return (\n <div\n className={cn(\"story-item story-item-text\", classNames?.root)}\n style={{\n backgroundColor: item.backgroundColor || \"#000\",\n color: item.textColor || \"#fff\",\n }}\n >\n <div className={cn(\"story-item-text-content\", classNames?.textContent)}>{item.text}</div>\n </div>\n );\n\n case \"custom_component\":\n const Component = item.component;\n return (\n <div className={cn(\"story-item story-item-component\", classNames?.root)}>\n <Component {...controls} />\n </div>\n );\n\n default:\n return null;\n }\n }\n);\n\nStoryItem.displayName = \"StoryItem\";\n","import React, {\n useState,\n useEffect,\n useLayoutEffect,\n useCallback,\n useRef,\n useMemo,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { User, StoryItem as StoryItemType, StoryItemControls, StoryViewerClassNames } from \"../types\";\nimport { useTimer } from \"../hooks/useTimer\";\nimport { useKeyboard } from \"../hooks/useKeyboard\";\nimport { useFocusTrap } from \"../hooks/useFocusTrap\";\nimport { usePageVisibility } from \"../hooks/usePageVisibility\";\nimport { usePreloader } from \"../hooks/usePreloader\";\nimport { useQueryParams } from \"../hooks/useQueryParams\";\nimport { resolveUserIndex, resolveStoryIndex, cn } from \"../utils/storyHelpers\";\nimport { StoryProgressBars } from \"./StoryProgressBars\";\nimport { StoryItem } from \"./StoryItem\";\n\ninterface StoryViewerProps {\n users: User[];\n initialUserIndex?: number;\n initialStoryIndex?: number;\n isOpen?: boolean;\n onClose?: () => void;\n onStoryChange?: (userIndex: number, storyIndex: number) => void;\n classNames?: StoryViewerClassNames;\n}\n\nconst DEFAULT_DURATION = 5000;\nconst CUBE_SNAP_MS = 350;\nconst DRAG_THRESHOLD_PX = 12;\nconst SNAP_THRESHOLD = 0.3; // 30% of face width\n\n// ── Cube state ──\n// Stores the user indices for the three cube faces.\ninterface CubeState {\n leftUserIndex: number; // previous (or same at edge)\n rightUserIndex: number; // next (or same at edge)\n}\n\ninterface DragInfo {\n startX: number;\n startY: number;\n currentX: number;\n isDragging: boolean; // horizontal cube drag\n isDismissing: boolean; // vertical drag-down-to-close\n pointerId: number;\n target: EventTarget | null; // original pointerDown target (for tap detection)\n}\n\n// ── Cube geometry helpers ──\n// Faces: left = rotateY(-90°), front = rotateY(0°), right = rotateY(90°).\n// Wrapper default = rotateY(0°) → front face visible.\n// percentage > 0 (drag right) → rotateY(+90°) → left/prev face visible.\n// percentage < 0 (drag left) → rotateY(-90°) → right/next face visible.\nfunction cubeTransform(depth: number, percentage: number): string {\n return `translateZ(${-depth}px) rotateY(${percentage * 90}deg)`;\n}\n\nexport const StoryViewer: React.FC<StoryViewerProps> = React.memo(\n ({ users, initialUserIndex, initialStoryIndex, isOpen: isOpenProp, onClose: onCloseProp, onStoryChange, classNames }) => {\n // ── Query param mode ──\n const isQueryParamMode = isOpenProp === undefined;\n const [searchParams, setSearchParams] = useQueryParams();\n\n const queryIndices = useMemo(() => {\n if (!isQueryParamMode || users.length === 0) return null;\n const currentParams = new URLSearchParams(window.location.search);\n const userParam = currentParams.get('user');\n const storyParam = currentParams.get('story');\n if (!userParam) return null;\n const userIndex = resolveUserIndex(users, userParam);\n if (userIndex === -1) return null;\n const user = users[userIndex];\n const storyIndex = storyParam ? resolveStoryIndex(user, storyParam) : 0;\n return { userIndex, storyIndex: storyIndex === -1 ? 0 : storyIndex };\n }, [isQueryParamMode, searchParams, users]);\n\n useEffect(() => {\n if (isQueryParamMode && searchParams.get('user') && users.length > 0 && !queryIndices && process.env.NODE_ENV === 'development') {\n console.warn(\n `[react-instagram-stories] User not found: \"${searchParams.get('user')}\"\\n` +\n `Available user IDs: ${users.map(u => u.id).join(', ')}`\n );\n }\n }, [isQueryParamMode, searchParams, users, queryIndices]);\n\n const effectiveInitialUserIndex = isQueryParamMode ? (queryIndices?.userIndex ?? 0) : (initialUserIndex ?? 0);\n const effectiveInitialStoryIndex = isQueryParamMode ? (queryIndices?.storyIndex ?? 0) : (initialStoryIndex ?? 0);\n const isOpen = isQueryParamMode ? (queryIndices !== null) : (isOpenProp ?? false);\n\n const onClose = useCallback(() => {\n if (isQueryParamMode) {\n setSearchParams({}, { replace: true });\n } else if (onCloseProp) {\n onCloseProp();\n }\n }, [isQueryParamMode, setSearchParams, onCloseProp]);\n\n // ── Core state ──\n const [currentUserIndex, setCurrentUserIndex] = useState(effectiveInitialUserIndex);\n const [currentStoryIndex, setCurrentStoryIndex] = useState(effectiveInitialStoryIndex);\n const [isPaused, setIsPaused] = useState(false);\n\n useEffect(() => { setCurrentUserIndex(effectiveInitialUserIndex); }, [effectiveInitialUserIndex]);\n useEffect(() => { setCurrentStoryIndex(effectiveInitialStoryIndex); }, [effectiveInitialStoryIndex]);\n\n const [cubeState, setCubeState] = useState<CubeState | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isUserLoading, setIsUserLoading] = useState(false);\n\n // ── Refs ──\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollPositionRef = useRef(0);\n const currentDurationRef = useRef(DEFAULT_DURATION);\n const hasStartedLoadingRef = useRef(false);\n const isInitialMountRef = useRef(true);\n\n // Cube refs (imperative for 60 fps drag)\n const cubeWrapperRef = useRef<HTMLDivElement>(null);\n const cubeDragRef = useRef<DragInfo | null>(null);\n const faceWidthRef = useRef(0);\n const isSnappingRef = useRef(false);\n\n // Track last viewed story index per user (for resuming on back-navigation)\n const lastViewedStoryRef = useRef<Map<number, number>>(new Map());\n\n // Current data\n const currentUser = users[currentUserIndex];\n const currentStory = currentUser?.stories[currentStoryIndex];\n const totalStories = currentUser?.stories.length || 0;\n\n useEffect(() => { currentDurationRef.current = currentStory?.duration || DEFAULT_DURATION; }, [currentStory?.duration]);\n\n // Track last viewed story per user (so we can resume on back-navigation)\n useEffect(() => {\n lastViewedStoryRef.current.set(currentUserIndex, currentStoryIndex);\n }, [currentUserIndex, currentStoryIndex]);\n\n // ── Hooks ──\n const focusTrapRef = useFocusTrap(isOpen);\n const isPageVisible = usePageVisibility();\n const { preloadStoryItem } = usePreloader();\n\n const handlePause = useCallback(() => setIsPaused(true), []);\n const handleResume = useCallback(() => setIsPaused(false), []);\n\n const handleNextRef = useRef<() => void>();\n\n const timer = useTimer({\n duration: currentDurationRef.current || DEFAULT_DURATION,\n onComplete: () => handleNextRef.current?.(),\n autoStart: false,\n });\n\n const handleBufferingChange = useCallback((buffering: boolean) => {\n if (buffering) { timer.pause(); }\n else if (!isPaused) { timer.resume(); }\n }, [timer, isPaused]);\n\n useEffect(() => { timer.setDuration(currentStory?.duration || DEFAULT_DURATION); }, [timer, currentStory?.duration]);\n\n // ── Cube helpers ──\n\n /** Build CubeState from current indices */\n const buildCubeState = useCallback((): CubeState => ({\n leftUserIndex: Math.max(0, currentUserIndex - 1),\n rightUserIndex: Math.min(users.length - 1, currentUserIndex + 1),\n }), [currentUserIndex, users.length]);\n\n /** Finalize cube: update indices, teardown.\n * CRITICAL: clear imperative styles BEFORE setting state, otherwise the\n * stale wrapper.style.transform (e.g. rotateY(-90deg)) persists for one\n * frame after React removes the inline cube styles, causing a visible spin. */\n const finalizeCube = useCallback((targetUserIndex: number, targetStoryIndex: number) => {\n const targetUser = users[targetUserIndex];\n const targetStory = targetUser.stories[targetStoryIndex];\n const duration = targetStory?.duration || DEFAULT_DURATION;\n\n // Wipe every imperative style we touched during drag / snap\n const wrapper = cubeWrapperRef.current;\n if (wrapper) {\n wrapper.style.transition = '';\n wrapper.style.transform = '';\n wrapper.style.transformStyle = '';\n }\n const viewport = wrapper?.parentElement;\n if (viewport) {\n viewport.style.perspective = '';\n }\n\n setCurrentUserIndex(targetUserIndex);\n setCurrentStoryIndex(targetStoryIndex);\n setCubeState(null);\n isSnappingRef.current = false;\n faceWidthRef.current = 0;\n\n timer.setDuration(duration);\n timer.reset();\n }, [users, timer]);\n\n /** Programmatic cube animation (auto-advance on timer complete) */\n const animateCubeTo = useCallback((direction: 'next' | 'prev') => {\n const cube = buildCubeState();\n setCubeState(cube);\n isSnappingRef.current = true;\n\n // Two rAFs: first to render DOM, second to apply transition\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const wrapper = cubeWrapperRef.current;\n if (!wrapper) {\n const idx = direction === 'next' ? cube.rightUserIndex : cube.leftUserIndex;\n const storyIdx = direction === 'next' ? 0 : (lastViewedStoryRef.current.get(idx) ?? 0);\n finalizeCube(idx, storyIdx);\n return;\n }\n\n const width = wrapper.offsetWidth;\n const depth = width / 2;\n faceWidthRef.current = width;\n wrapper.style.setProperty('--face-depth', `${depth}px`);\n const viewport = wrapper.parentElement;\n if (viewport) viewport.style.perspective = `${depth * 16}px`;\n\n // Start at front face\n wrapper.style.transition = 'none';\n wrapper.style.transform = cubeTransform(depth, 0);\n\n // Next frame: animate to target\n requestAnimationFrame(() => {\n wrapper.style.transition = `transform ${CUBE_SNAP_MS}ms cubic-bezier(0.32, 0.72, 0.37, 0.98)`;\n const targetPct = direction === 'next' ? -1 : 1;\n wrapper.style.transform = cubeTransform(depth, targetPct);\n\n const idx = direction === 'next' ? cube.rightUserIndex : cube.leftUserIndex;\n const storyIdx = direction === 'next'\n ? 0\n : (lastViewedStoryRef.current.get(idx) ?? 0);\n setTimeout(() => finalizeCube(idx, storyIdx), CUBE_SNAP_MS);\n });\n });\n });\n }, [buildCubeState, finalizeCube, users]);\n\n // ── Navigation ──\n\n const handleNext = useCallback(() => {\n if (!currentUser || cubeState || isSnappingRef.current) return;\n\n if (currentStoryIndex < totalStories - 1) {\n // Next story within same user\n const nextIndex = currentStoryIndex + 1;\n const nextStory = currentUser.stories[nextIndex];\n setCurrentStoryIndex(nextIndex);\n timer.setDuration(nextStory?.duration || DEFAULT_DURATION);\n timer.reset();\n } else if (currentUserIndex < users.length - 1) {\n // Last story → auto-advance to next user via cube transition\n animateCubeTo('next');\n } else {\n onClose();\n }\n }, [currentUser, cubeState, currentStoryIndex, totalStories, currentUserIndex, users, timer, onClose, animateCubeTo]);\n\n const handlePrevious = useCallback(() => {\n if (!currentUser || cubeState || isSnappingRef.current) return;\n\n if (currentStoryIndex > 0) {\n const prevIndex = currentStoryIndex - 1;\n const prevStory = currentUser.stories[prevIndex];\n setCurrentStoryIndex(prevIndex);\n timer.setDuration(prevStory?.duration || DEFAULT_DURATION);\n timer.reset();\n } else if (currentUserIndex > 0) {\n animateCubeTo('prev');\n }\n }, [currentUser, cubeState, currentStoryIndex, currentUserIndex, users, timer, animateCubeTo]);\n\n const handleClose = useCallback(() => {\n window.scrollTo(0, scrollPositionRef.current);\n onClose();\n }, [onClose]);\n\n useEffect(() => { handleNextRef.current = handleNext; }, [handleNext]);\n\n const storyControls: StoryItemControls = useMemo(() => ({\n pause: handlePause,\n resume: handleResume,\n next: handleNext,\n prev: handlePrevious,\n setDuration: (ms: number) => timer.setDuration(ms),\n }), [handlePause, handleResume, handleNext, handlePrevious, timer]);\n\n // ── Pointer / drag events ──\n // Placed on the story-viewer container so they survive DOM swaps.\n\n const handlePointerDown = useCallback((event: React.PointerEvent) => {\n if ((event.target as HTMLElement).closest('.story-viewer-overlay')) return;\n if (isSnappingRef.current) return;\n\n cubeDragRef.current = {\n startX: event.clientX,\n startY: event.clientY,\n currentX: event.clientX,\n isDragging: false,\n isDismissing: false,\n pointerId: event.pointerId,\n target: event.target,\n };\n\n containerRef.current?.setPointerCapture(event.pointerId);\n handlePause();\n }, [handlePause]);\n\n const handlePointerMove = useCallback((event: React.PointerEvent) => {\n const drag = cubeDragRef.current;\n if (!drag || isSnappingRef.current) return;\n\n drag.currentX = event.clientX;\n const deltaX = event.clientX - drag.startX;\n const deltaY = event.clientY - drag.startY;\n\n // ── Detect drag direction (once) ──\n if (!drag.isDragging && !drag.isDismissing) {\n // Horizontal → cube transition\n if (Math.abs(deltaX) > DRAG_THRESHOLD_PX && Math.abs(deltaX) > Math.abs(deltaY) * 1.2) {\n drag.isDragging = true;\n setCubeState(buildCubeState());\n }\n // Vertical downward → dismiss\n else if (deltaY > DRAG_THRESHOLD_PX && deltaY > Math.abs(deltaX) * 1.5) {\n drag.isDismissing = true;\n }\n return;\n }\n\n // ── Dismiss drag: translate down + scale + fade ──\n if (drag.isDismissing) {\n const viewportEl = containerRef.current?.querySelector('.story-viewer-cube-viewport') as HTMLElement;\n if (!viewportEl) return;\n\n const dismissY = Math.max(0, deltaY);\n const scale = Math.max(0.85, 1 - dismissY / 1500);\n const opacity = Math.max(0.2, 1 - dismissY / 600);\n\n viewportEl.style.transition = 'none';\n viewportEl.style.transform = `translateY(${dismissY}px) scale(${scale})`;\n viewportEl.style.borderRadius = `${Math.min(24, dismissY / 5)}px`;\n viewportEl.style.overflow = 'hidden';\n\n const overlayEl = containerRef.current?.querySelector('.story-viewer-overlay') as HTMLElement;\n if (overlayEl) overlayEl.style.opacity = String(opacity);\n return;\n }\n\n // ── Cube drag: real-time rotation (imperative for 60 fps) ──\n const wrapper = cubeWrapperRef.current;\n if (!wrapper) return;\n\n if (!faceWidthRef.current) {\n faceWidthRef.current = wrapper.offsetWidth;\n wrapper.style.setProperty('--face-depth', `${faceWidthRef.current / 2}px`);\n }\n\n const fw = faceWidthRef.current;\n let pct = deltaX / fw;\n pct = Math.max(-0.95, Math.min(0.95, pct));\n\n if (currentUserIndex === 0 && pct > 0) pct = 0;\n if (currentUserIndex === users.length - 1 && pct < 0) pct = 0;\n\n wrapper.style.transition = 'none';\n wrapper.style.transform = cubeTransform(fw / 2, pct);\n }, [currentUserIndex, users.length, buildCubeState]);\n\n const handlePointerUp = useCallback((event: React.PointerEvent) => {\n const drag = cubeDragRef.current;\n cubeDragRef.current = null;\n if (!drag) return;\n\n try { containerRef.current?.releasePointerCapture(drag.pointerId); } catch { /* ok */ }\n\n // ── Dismiss release ──\n if (drag.isDismissing) {\n const deltaY = event.clientY - drag.startY;\n const viewportEl = containerRef.current?.querySelector('.story-viewer-cube-viewport') as HTMLElement;\n const overlayEl = containerRef.current?.querySelector('.story-viewer-overlay') as HTMLElement;\n\n if (deltaY > 120) {\n // Past threshold → close with slide-down animation\n if (viewportEl) {\n viewportEl.style.transition = 'transform 250ms ease-in, opacity 250ms ease-in';\n viewportEl.style.transform = `translateY(${window.innerHeight}px) scale(0.85)`;\n viewportEl.style.opacity = '0';\n }\n if (overlayEl) {\n overlayEl.style.transition = 'opacity 250ms ease-in';\n overlayEl.style.opacity = '0';\n }\n setTimeout(handleClose, 250);\n } else {\n // Under threshold → snap back\n if (viewportEl) {\n viewportEl.style.transition = 'transform 300ms ease-out, border-radius 300ms ease-out';\n viewportEl.style.transform = '';\n viewportEl.style.borderRadius = '';\n }\n if (overlayEl) {\n overlayEl.style.transition = 'opacity 300ms ease-out';\n overlayEl.style.opacity = '';\n }\n // Clean up overflow after transition\n setTimeout(() => {\n if (viewportEl) viewportEl.style.overflow = '';\n }, 300);\n handleResume();\n }\n return;\n }\n\n // ── Cube drag release ──\n if (drag.isDragging && cubeState) {\n const fw = faceWidthRef.current || 400;\n const depth = fw / 2;\n let pct = (event.clientX - drag.startX) / fw;\n pct = Math.max(-1, Math.min(1, pct));\n\n // Edge clamping\n if (currentUserIndex === 0 && pct > 0) pct = 0;\n if (currentUserIndex === users.length - 1 && pct < 0) pct = 0;\n\n // Determine snap target\n let targetPct: number;\n if (Math.abs(pct) > SNAP_THRESHOLD) {\n targetPct = pct > 0 ? 1 : -1;\n } else {\n targetPct = 0;\n }\n\n const wrapper = cubeWrapperRef.current;\n if (!wrapper) { setCubeState(null); handleResume(); return; }\n\n isSnappingRef.current = true;\n wrapper.style.transition = `transform ${CUBE_SNAP_MS}ms cubic-bezier(0.25, 1, 0.5, 1)`;\n wrapper.style.transform = cubeTransform(depth, targetPct);\n\n setTimeout(() => {\n if (targetPct === -1) {\n // Snapped to next user (right face)\n finalizeCube(cubeState.rightUserIndex, 0);\n } else if (targetPct === 1) {\n // Snapped to prev user — resume where they left off\n const resumeIdx = lastViewedStoryRef.current.get(cubeState.leftUserIndex) ?? 0;\n finalizeCube(cubeState.leftUserIndex, resumeIdx);\n } else {\n // Snapped back to current — clear imperative styles\n const w = cubeWrapperRef.current;\n if (w) { w.style.transition = ''; w.style.transform = ''; w.style.transformStyle = ''; }\n const vp = w?.parentElement;\n if (vp) { vp.style.perspective = ''; }\n setCubeState(null);\n isSnappingRef.current = false;\n faceWidthRef.current = 0;\n handleResume();\n }\n }, CUBE_SNAP_MS);\n } else {\n // ── Tap — navigate stories ──\n handleResume();\n\n // Use the ORIGINAL pointerDown target, not event.target\n // (pointer capture retargets pointerUp to the capturing element)\n const target = (drag.target as HTMLElement) || (event.target as HTMLElement);\n if (\n target.closest(\".story-viewer-close\") ||\n target.closest(\"button\") ||\n target.closest(\"input\") ||\n target.closest(\"select\") ||\n target.closest(\"textarea\")\n ) return;\n\n const contentEl =\n containerRef.current?.querySelector('.story-viewer-content') ||\n containerRef.current?.querySelector('.story-viewer-cube-viewport');\n if (!contentEl) return;\n\n const rect = contentEl.getBoundingClientRect();\n if (\n event.clientX < rect.left || event.clientX > rect.right ||\n event.clientY < rect.top || event.clientY > rect.bottom\n ) return;\n\n const relativeX = event.clientX - rect.left;\n if (relativeX < rect.width / 2) {\n handlePrevious();\n } else {\n handleNext();\n }\n }\n }, [cubeState, currentUserIndex, users, finalizeCube, handleResume, handlePrevious, handleNext]);\n\n // ── Sync cube rotation when cube first mounts from drag ──\n useLayoutEffect(() => {\n const wrapper = cubeWrapperRef.current;\n if (!cubeState || !wrapper) return;\n\n const width = wrapper.offsetWidth;\n faceWidthRef.current = width;\n const depth = width / 2;\n wrapper.style.setProperty('--face-depth', `${depth}px`);\n\n // Also set perspective on the viewport element explicitly\n const viewport = wrapper.parentElement;\n if (viewport) viewport.style.perspective = `${depth * 16}px`;\n\n // If mounting from a drag, sync rotation to current finger position\n const drag = cubeDragRef.current;\n if (drag?.isDragging) {\n let pct = (drag.currentX - drag.startX) / width;\n pct = Math.max(-0.95, Math.min(0.95, pct));\n if (currentUserIndex === 0 && pct > 0) pct = 0;\n if (currentUserIndex === users.length - 1 && pct < 0) pct = 0;\n\n wrapper.style.transition = 'none';\n wrapper.style.transform = cubeTransform(depth, pct);\n }\n }, [cubeState, currentUserIndex, users.length]);\n\n // ── Keyboard ──\n useKeyboard({\n onLeft: handlePrevious,\n onRight: handleNext,\n onSpace: () => (isPaused ? handleResume() : handlePause()),\n onEscape: handleClose,\n enabled: isOpen,\n });\n\n // ── Page visibility ──\n useEffect(() => {\n if (!isPageVisible) handlePause();\n else if (isPageVisible && !isPaused) handleResume();\n }, [isPageVisible, handlePause, handleResume, isPaused]);\n\n // ── Preload adjacent stories ──\n useEffect(() => {\n if (!isOpen || !currentUser) return;\n const itemsToPreload: StoryItemType[] = [];\n if (currentStoryIndex < totalStories - 1) itemsToPreload.push(currentUser.stories[currentStoryIndex + 1]);\n if (currentStoryIndex > 0) itemsToPreload.push(currentUser.stories[currentStoryIndex - 1]);\n if (currentUserIndex < users.length - 1) itemsToPreload.push(users[currentUserIndex + 1].stories[0]);\n if (currentUserIndex > 0) itemsToPreload.push(users[currentUserIndex - 1].stories[0]);\n itemsToPreload.slice(0, 3).forEach((item) => preloadStoryItem(item).catch(() => {}));\n }, [isOpen, currentUser, currentUserIndex, currentStoryIndex, totalStories, users, preloadStoryItem]);\n\n // ── Initial loading ──\n useEffect(() => {\n if (isOpen && !hasStartedLoadingRef.current) {\n hasStartedLoadingRef.current = true;\n setIsLoading(true);\n if (currentStory) preloadStoryItem(currentStory);\n setTimeout(() => {\n setIsLoading(false);\n scrollPositionRef.current = window.scrollY;\n document.body.style.overflow = \"hidden\";\n timer.resume();\n }, 1500);\n } else if (!isOpen) {\n hasStartedLoadingRef.current = false;\n isInitialMountRef.current = true;\n document.body.style.overflow = \"\";\n setIsLoading(false);\n setIsUserLoading(false);\n setCubeState(null);\n isSnappingRef.current = false;\n faceWidthRef.current = 0;\n }\n return () => { document.body.style.overflow = \"\"; };\n }, [isOpen, timer]);\n\n // ── Notify parent / update URL ──\n useEffect(() => {\n if (!isOpen) return;\n if (isInitialMountRef.current) {\n isInitialMountRef.current = false;\n onStoryChange?.(currentUserIndex, currentStoryIndex);\n return;\n }\n if (isQueryParamMode && currentUser && currentStory) {\n const curU = searchParams.get('user');\n const curS = searchParams.get('story');\n if (curU !== currentUser.id || curS !== currentStory.id) {\n setSearchParams({ user: currentUser.id, story: currentStory.id }, { replace: true });\n }\n }\n onStoryChange?.(currentUserIndex, currentStoryIndex);\n }, [currentUserIndex, currentStoryIndex, onStoryChange, isOpen, isQueryParamMode, searchParams, setSearchParams]);\n\n const handleLoadError = useCallback(() => {\n console.warn(\"Story item failed to load, skipping...\");\n setTimeout(handleNext, 500);\n }, [handleNext]);\n\n // ── Render ──\n\n if (!isOpen) return null;\n if (!currentUser || !currentStory) return null;\n\n // Resolve the three cube faces\n const leftUser = cubeState ? users[cubeState.leftUserIndex] : null;\n const rightUser = cubeState ? users[cubeState.rightUserIndex] : null;\n // Left face: resume where the user left off (or story 0 if never viewed)\n const leftStoryIdx = cubeState && cubeState.leftUserIndex < currentUserIndex\n ? (lastViewedStoryRef.current.get(cubeState.leftUserIndex) ?? 0)\n : currentStoryIndex;\n // Right face: always show first story for next user\n const rightStoryIdx = cubeState && cubeState.rightUserIndex > currentUserIndex\n ? 0 : currentStoryIndex;\n\n const renderFaceContent = (\n faceUser: User,\n faceStory: StoryItemType,\n faceStoryIndex: number,\n faceProgress: number,\n isLive: boolean,\n ) => (\n <>\n {/* key={faceUser.id} forces remount on user switch → no CSS transition on progress bars */}\n <div key={faceUser.id} className={cn(\"story-viewer-header\", classNames?.header)}>\n <StoryProgressBars\n total={faceUser.stories.length}\n currentIndex={faceStoryIndex}\n progress={faceProgress}\n classNames={classNames?.progressBars}\n />\n <div className={cn(\"story-viewer-user-info\", classNames?.userInfo)}>\n <img\n src={faceUser.avatarUrl}\n alt={`${faceUser.username} avatar`}\n className={cn(\"story-viewer-avatar\", classNames?.avatar)}\n />\n <span className={cn(\"story-viewer-username\", classNames?.username)}>\n {faceUser.username}\n </span>\n </div>\n <button\n className={cn(\"story-viewer-close\", classNames?.closeButton)}\n onClick={handleClose}\n aria-label=\"Close story viewer\"\n type=\"button\"\n >\n ×\n </button>\n </div>\n <div className={cn(\"story-viewer-items\", classNames?.items)}>\n {(isLoading || isUserLoading) && isLive ? (\n <div className=\"story-item-loader\">\n <div className=\"story-item-spinner\" />\n </div>\n ) : (\n <StoryItem\n item={faceStory}\n isActive={isLive}\n isPaused={isLive ? (isPaused || !!cubeDragRef.current?.isDragging) : true}\n onDurationDetected={isLive ? (d) => timer.setDuration(d) : undefined}\n onLoadError={isLive ? handleLoadError : undefined}\n onBufferingChange={isLive ? handleBufferingChange : undefined}\n controls={storyControls}\n classNames={classNames?.storyItem}\n />\n )}\n </div>\n {isLive && (\n <div className=\"story-viewer-nav-hints\">\n <div className=\"story-viewer-nav-hint story-viewer-nav-hint-left\" />\n <div className=\"story-viewer-nav-hint story-viewer-nav-hint-right\" />\n </div>\n )}\n </>\n );\n\n const content = (\n <div\n ref={containerRef}\n className={cn(\"story-viewer\", classNames?.root)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Stories by ${currentUser?.username || \"user\"}`}\n aria-describedby=\"story-viewer-description\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n >\n <div className={cn(\"story-viewer-overlay\", classNames?.overlay)} onClick={handleClose} />\n\n <div id=\"story-viewer-description\" className=\"sr-only\">\n Instagram-style stories viewer. Tap left side to go to previous story,\n right side to go to next story. Swipe left or right to navigate\n between users. Press Escape to close.\n </div>\n\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n Viewing story {currentStoryIndex + 1} of {totalStories} by{\" \"}\n {currentUser?.username}\n </div>\n\n {/* Always-mounted structure — no DOM swap on drag, eliminating layout shift.\n Normal mode: viewport/wrapper are transparent passthroughs.\n Cube mode: viewport gains perspective, wrapper gains 3D, adjacent faces appear. */}\n {(() => {\n const isCube = !!(cubeState && leftUser && rightUser);\n const d = isCube\n ? (faceWidthRef.current ? faceWidthRef.current / 2 : Math.min(typeof window !== 'undefined' ? window.innerWidth : 500, 500) / 2)\n : 0;\n\n const adjacentFaceStyle = (rotateY: string): React.CSSProperties => ({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n background: '#000',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n backfaceVisibility: 'hidden',\n transform: `rotateY(${rotateY}) translateZ(${d}px)`,\n });\n\n return (\n <div\n className=\"story-viewer-cube-viewport\"\n style={isCube ? { perspective: `${d * 16}px` } : undefined}\n >\n <div\n ref={cubeWrapperRef}\n className=\"story-viewer-cube-wrapper\"\n style={isCube ? { transformStyle: 'preserve-3d' as const, transform: cubeTransform(d, 0) } : undefined}\n >\n {/* Main content — ALWAYS mounted, never unmounted.\n Only transform/backfaceVisibility are added for cube — NO position/size\n changes, so there is zero layout shift. */}\n <div\n ref={focusTrapRef}\n className={cn(\"story-viewer-content\", classNames?.content)}\n style={isCube ? {\n willChange: 'auto' as const,\n backfaceVisibility: 'hidden' as const,\n transform: `translateZ(${d}px)`,\n } : undefined}\n onMouseEnter={handlePause}\n onMouseLeave={handleResume}\n >\n {renderFaceContent(currentUser, currentStory, currentStoryIndex, timer.progress, !isCube)}\n </div>\n\n {/* Adjacent faces — only during cube */}\n {isCube && leftUser && (\n <div style={adjacentFaceStyle('-90deg')}>\n {renderFaceContent(leftUser, leftUser.stories[leftStoryIdx], leftStoryIdx, 0, false)}\n </div>\n )}\n {isCube && rightUser && (\n <div style={adjacentFaceStyle('90deg')}>\n {renderFaceContent(rightUser, rightUser.stories[rightStoryIdx], rightStoryIdx, 0, false)}\n </div>\n )}\n </div>\n </div>\n );\n })()}\n </div>\n );\n\n return createPortal(content, document.body);\n }\n);\n","import React, { useCallback } from 'react';\nimport { User, StoriesClassNames } from '../types';\nimport { AvatarList } from './AvatarList';\nimport { StoryViewer } from './StoryViewer';\nimport { navigateWithParams } from '../hooks/useQueryParams';\n\ninterface StoriesProps {\n users: User[];\n classNames?: StoriesClassNames;\n}\n\n/**\n * Combined Stories component with AvatarList and StoryViewer.\n * Uses URL query params for navigation: ?user={userId}&story={storyId}\n */\nexport const Stories: React.FC<StoriesProps> = ({ users, classNames }) => {\n const handleAvatarClick = useCallback((userIndex: number) => {\n // Navigate using user ID and story ID\n const user = users[userIndex];\n if (user && user.stories.length > 0) {\n navigateWithParams({ user: user.id, story: user.stories[0].id });\n }\n }, [users]);\n\n return (\n <>\n <AvatarList users={users} onAvatarClick={handleAvatarClick} classNames={classNames?.avatarList} />\n <StoryViewer users={users} classNames={classNames?.storyViewer} />\n </>\n );\n};\n","import { User, StoryItemControls } from \"../types\";\nimport React from \"react\";\n\n// ============================================\n// CUSTOM STORY COMPONENTS\n// ============================================\n\n// Interactive Poll Component\nexport const PollComponent: React.FC<StoryItemControls> = ({\n pause,\n resume,\n next,\n}) => {\n const [selected, setSelected] = React.useState<number | null>(null);\n const [votes, setVotes] = React.useState([42, 28, 18, 12]);\n\n React.useEffect(() => {\n pause();\n return () => resume();\n }, [pause, resume]);\n\n const handleVote = (option: number) => {\n setSelected(option);\n const newVotes = [...votes];\n newVotes[option] += 1;\n setVotes(newVotes);\n setTimeout(() => {\n resume();\n next();\n }, 2000);\n };\n\n const total = votes.reduce((a, b) => a + b, 0);\n const options = [\"React\", \"Vue\", \"Angular\", \"Svelte\"];\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #667eea 0%, #764ba2 100%)\",\n }}\n >\n <h2 style={{ color: \"white\", marginBottom: \"10px\", fontSize: \"28px\", fontWeight: \"bold\" }}>\n Poll\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.9)\", marginBottom: \"30px\", fontSize: \"18px\" }}>\n What's your favorite framework?\n </p>\n\n <div style={{ width: \"100%\" }}>\n {options.map((option, idx) => {\n const percentage = Math.round((votes[idx] / total) * 100);\n const isSelected = selected === idx;\n\n return (\n <button\n key={idx}\n onClick={() => selected === null && handleVote(idx)}\n disabled={selected !== null}\n style={{\n width: \"100%\",\n padding: \"16px 20px\",\n margin: \"8px 0\",\n border: \"none\",\n borderRadius: \"12px\",\n background: selected !== null\n ? `linear-gradient(90deg, rgba(255,255,255,0.4) ${percentage}%, rgba(255,255,255,0.15) ${percentage}%)`\n : \"rgba(255,255,255,0.2)\",\n color: \"white\",\n fontSize: \"16px\",\n fontWeight: \"600\",\n cursor: selected === null ? \"pointer\" : \"default\",\n transition: \"all 0.3s ease\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n backdropFilter: \"blur(10px)\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"10px\" }}>\n {isSelected && \"✓ \"}\n {option}\n </span>\n {selected !== null && <span>{percentage}%</span>}\n </button>\n );\n })}\n </div>\n\n {selected !== null && (\n <p style={{ color: \"rgba(255,255,255,0.8)\", marginTop: \"20px\", fontSize: \"14px\" }}>\n {total} votes • Thanks for voting!\n </p>\n )}\n </div>\n );\n};\n\n// Quiz Component\nexport const QuizComponent: React.FC<StoryItemControls> = ({\n pause,\n resume,\n next,\n}) => {\n const [answered, setAnswered] = React.useState(false);\n const [selected, setSelected] = React.useState<number | null>(null);\n const correctAnswer = 2;\n\n React.useEffect(() => {\n pause();\n return () => resume();\n }, [pause, resume]);\n\n const handleAnswer = (idx: number) => {\n setSelected(idx);\n setAnswered(true);\n setTimeout(() => {\n resume();\n next();\n }, 2500);\n };\n\n const options = [\"Mars\", \"Venus\", \"Jupiter\", \"Saturn\"];\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #f093fb 0%, #f5576c 100%)\",\n }}\n >\n <div style={{\n fontSize: \"48px\",\n marginBottom: \"20px\",\n animation: \"bounce 1s infinite\"\n }}>\n 🪐\n </div>\n <h2 style={{ color: \"white\", marginBottom: \"10px\", fontSize: \"24px\", fontWeight: \"bold\", textAlign: \"center\" }}>\n Quiz Time!\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.9)\", marginBottom: \"30px\", fontSize: \"18px\", textAlign: \"center\" }}>\n Which is the largest planet in our solar system?\n </p>\n\n <div style={{ width: \"100%\" }}>\n {options.map((option, idx) => {\n const isCorrect = idx === correctAnswer;\n const isSelected = selected === idx;\n\n let bgColor = \"rgba(255,255,255,0.2)\";\n if (answered) {\n if (isCorrect) bgColor = \"rgba(34, 197, 94, 0.6)\";\n else if (isSelected) bgColor = \"rgba(239, 68, 68, 0.6)\";\n }\n\n return (\n <button\n key={idx}\n onClick={() => !answered && handleAnswer(idx)}\n disabled={answered}\n style={{\n width: \"100%\",\n padding: \"16px 20px\",\n margin: \"8px 0\",\n border: \"none\",\n borderRadius: \"12px\",\n background: bgColor,\n color: \"white\",\n fontSize: \"16px\",\n fontWeight: \"600\",\n cursor: answered ? \"default\" : \"pointer\",\n transition: \"all 0.3s ease\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span>{option}</span>\n {answered && isCorrect && <span>✓</span>}\n {answered && isSelected && !isCorrect && <span>✗</span>}\n </button>\n );\n })}\n </div>\n\n {answered && (\n <p style={{\n color: \"white\",\n marginTop: \"20px\",\n fontSize: \"16px\",\n fontWeight: \"bold\"\n }}>\n {selected === correctAnswer ? \"🎉 Correct!\" : \"❌ Wrong! Jupiter is the largest.\"}\n </p>\n )}\n </div>\n );\n};\n\n// Countdown/Announcement Component\nexport const CountdownComponent: React.FC<StoryItemControls> = () => {\n const [timeLeft, setTimeLeft] = React.useState({\n days: 12,\n hours: 8,\n minutes: 45,\n seconds: 30,\n });\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeLeft((prev) => {\n let { days, hours, minutes, seconds } = prev;\n seconds--;\n if (seconds < 0) {\n seconds = 59;\n minutes--;\n }\n if (minutes < 0) {\n minutes = 59;\n hours--;\n }\n if (hours < 0) {\n hours = 23;\n days--;\n }\n return { days, hours, minutes, seconds };\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, []);\n\n const TimeBox = ({ value, label }: { value: number; label: string }) => (\n <div style={{ textAlign: \"center\" }}>\n <div\n style={{\n background: \"rgba(255,255,255,0.2)\",\n backdropFilter: \"blur(10px)\",\n borderRadius: \"12px\",\n padding: \"15px 20px\",\n minWidth: \"70px\",\n }}\n >\n <div style={{ fontSize: \"32px\", fontWeight: \"bold\", color: \"white\" }}>\n {String(value).padStart(2, \"0\")}\n </div>\n </div>\n <div style={{ color: \"rgba(255,255,255,0.8)\", fontSize: \"12px\", marginTop: \"8px\", textTransform: \"uppercase\" }}>\n {label}\n </div>\n </div>\n );\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)\",\n }}\n >\n <div style={{ fontSize: \"48px\", marginBottom: \"15px\" }}>🚀</div>\n <h2 style={{ color: \"white\", marginBottom: \"8px\", fontSize: \"24px\", fontWeight: \"bold\" }}>\n Product Launch\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.7)\", marginBottom: \"30px\", fontSize: \"14px\" }}>\n Something amazing is coming...\n </p>\n\n <div style={{ display: \"flex\", gap: \"12px\", marginBottom: \"30px\" }}>\n <TimeBox value={timeLeft.days} label=\"Days\" />\n <TimeBox value={timeLeft.hours} label=\"Hours\" />\n <TimeBox value={timeLeft.minutes} label=\"Mins\" />\n <TimeBox value={timeLeft.seconds} label=\"Secs\" />\n </div>\n\n <button\n style={{\n padding: \"14px 40px\",\n background: \"linear-gradient(135deg, #667eea 0%, #764ba2 100%)\",\n border: \"none\",\n borderRadius: \"30px\",\n color: \"white\",\n fontSize: \"16px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n Notify Me\n </button>\n </div>\n );\n};\n\n// Product Showcase Component\nexport const ProductShowcaseComponent: React.FC<StoryItemControls> = () => {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"linear-gradient(180deg, #1a1a2e 0%, #16213e 100%)\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n {/* Product Image */}\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", padding: \"20px\" }}>\n <img\n src=\"https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop\"\n alt=\"Product\"\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n borderRadius: \"20px\",\n boxShadow: \"0 20px 60px rgba(0,0,0,0.5)\",\n }}\n />\n </div>\n\n {/* Product Info */}\n <div\n style={{\n padding: \"30px\",\n background: \"linear-gradient(180deg, transparent 0%, rgba(0,0,0,0.8) 100%)\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\", marginBottom: \"10px\" }}>\n <span style={{ background: \"#ef4444\", color: \"white\", padding: \"4px 10px\", borderRadius: \"20px\", fontSize: \"12px\", fontWeight: \"bold\" }}>\n NEW\n </span>\n <span style={{ color: \"rgba(255,255,255,0.6)\", fontSize: \"12px\" }}>Limited Edition</span>\n </div>\n <h2 style={{ color: \"white\", fontSize: \"24px\", fontWeight: \"bold\", marginBottom: \"8px\" }}>\n Premium Watch Collection\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.7)\", fontSize: \"14px\", marginBottom: \"15px\" }}>\n Elegant design meets modern technology\n </p>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"15px\" }}>\n <span style={{ color: \"white\", fontSize: \"28px\", fontWeight: \"bold\" }}>$299</span>\n <span style={{ color: \"rgba(255,255,255,0.5)\", fontSize: \"18px\", textDecoration: \"line-through\" }}>$399</span>\n </div>\n <button\n style={{\n width: \"100%\",\n marginTop: \"20px\",\n padding: \"16px\",\n background: \"white\",\n border: \"none\",\n borderRadius: \"12px\",\n color: \"#1a1a2e\",\n fontSize: \"16px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n Shop Now →\n </button>\n </div>\n </div>\n );\n};\n\n// Slider/Rating Component\nexport const SliderComponent: React.FC<StoryItemControls> = ({\n pause,\n resume,\n next,\n}) => {\n const [value, setValue] = React.useState(5);\n const [submitted, setSubmitted] = React.useState(false);\n\n React.useEffect(() => {\n pause();\n return () => resume();\n }, [pause, resume]);\n\n const handleSubmit = () => {\n setSubmitted(true);\n setTimeout(() => {\n resume();\n next();\n }, 1500);\n };\n\n const emojis = [\"😢\", \"😕\", \"😐\", \"🙂\", \"😊\", \"😃\", \"😄\", \"😁\", \"🤩\", \"🥳\"];\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #11998e 0%, #38ef7d 100%)\",\n }}\n >\n <div style={{ fontSize: \"80px\", marginBottom: \"20px\", transition: \"all 0.3s\" }}>\n {emojis[value - 1]}\n </div>\n\n <h2 style={{ color: \"white\", marginBottom: \"10px\", fontSize: \"24px\", fontWeight: \"bold\" }}>\n Rate Your Experience\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.9)\", marginBottom: \"30px\", fontSize: \"16px\" }}>\n How was your visit today?\n </p>\n\n {!submitted ? (\n <>\n <div style={{ width: \"100%\", marginBottom: \"20px\" }}>\n <input\n type=\"range\"\n min=\"1\"\n max=\"10\"\n value={value}\n onChange={(e) => setValue(parseInt(e.target.value))}\n style={{\n width: \"100%\",\n height: \"8px\",\n borderRadius: \"4px\",\n appearance: \"none\",\n background: \"rgba(255,255,255,0.3)\",\n cursor: \"pointer\",\n }}\n />\n <div style={{ display: \"flex\", justifyContent: \"space-between\", color: \"rgba(255,255,255,0.7)\", fontSize: \"12px\", marginTop: \"8px\" }}>\n <span>1</span>\n <span>10</span>\n </div>\n </div>\n\n <button\n onClick={handleSubmit}\n style={{\n padding: \"14px 50px\",\n background: \"white\",\n border: \"none\",\n borderRadius: \"30px\",\n color: \"#11998e\",\n fontSize: \"16px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n Submit ({value}/10)\n </button>\n </>\n ) : (\n <div style={{ textAlign: \"center\" }}>\n <div style={{ fontSize: \"48px\", marginBottom: \"10px\" }}>🎉</div>\n <p style={{ color: \"white\", fontSize: \"18px\", fontWeight: \"bold\" }}>\n Thanks for your feedback!\n </p>\n </div>\n )}\n </div>\n );\n};\n\n// ============================================\n// DEMO DATA\n// ============================================\n\n// Sample working video URLs\nconst sampleVideos = [\n \"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4\",\n \"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4\",\n \"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4\",\n];\n\n// Sample working image URLs from Unsplash\nconst sampleImages = [\n \"https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1472214103451-9374bd1c798e?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1517841905240-472988babdf9?w=1080&h=1920&fit=crop\",\n];\n\n// Avatar URLs\nconst avatarImages = [\n \"https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1517841905240-472988babdf9?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1539571696357-5a69c17a67c6?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150&h=150&fit=crop\",\n];\n\n// Main demo users with diverse story types\nexport const demoUsers: User[] = [\n {\n id: \"user-travel\",\n username: \"Travel\",\n avatarUrl: avatarImages[0],\n hasUnreadStories: true,\n stories: [\n {\n id: \"travel-1\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Beautiful mountain landscape\",\n },\n {\n id: \"travel-2\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Scenic ocean view\",\n },\n {\n id: \"travel-3\",\n type: \"text\",\n text: \"Adventure awaits! 🌍\\n\\nSwipe to explore more destinations →\",\n backgroundColor: \"#FF6B6B\",\n textColor: \"#FFFFFF\",\n duration: 4000,\n },\n {\n id: \"travel-4\",\n type: \"video\",\n src: sampleVideos[0],\n duration: 15000,\n },\n ],\n },\n {\n id: \"user-polls\",\n username: \"Interactive\",\n avatarUrl: avatarImages[1],\n hasUnreadStories: true,\n stories: [\n {\n id: \"poll-intro\",\n type: \"text\",\n text: \"Let's have some fun! 🎮\\n\\nInteractive stories ahead →\",\n backgroundColor: \"#667eea\",\n textColor: \"#FFFFFF\",\n duration: 3000,\n },\n {\n id: \"poll-1\",\n type: \"custom_component\",\n component: PollComponent,\n duration: 30000,\n },\n {\n id: \"quiz-1\",\n type: \"custom_component\",\n component: QuizComponent,\n duration: 30000,\n },\n {\n id: \"slider-1\",\n type: \"custom_component\",\n component: SliderComponent,\n duration: 30000,\n },\n ],\n },\n {\n id: \"user-product\",\n username: \"Shop\",\n avatarUrl: avatarImages[2],\n hasUnreadStories: true,\n stories: [\n {\n id: \"product-1\",\n type: \"custom_component\",\n component: ProductShowcaseComponent,\n duration: 8000,\n },\n {\n id: \"product-2\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Product showcase\",\n },\n {\n id: \"product-3\",\n type: \"text\",\n text: \"Limited Time Offer! 🔥\\n\\n50% OFF\\n\\nUse code: STORY50\",\n backgroundColor: \"#000000\",\n textColor: \"#FFFFFF\",\n duration: 5000,\n },\n ],\n },\n {\n id: \"user-launch\",\n username: \"Events\",\n avatarUrl: avatarImages[3],\n hasUnreadStories: true,\n stories: [\n {\n id: \"launch-1\",\n type: \"custom_component\",\n component: CountdownComponent,\n duration: 10000,\n },\n {\n id: \"launch-2\",\n type: \"text\",\n text: \"Mark your calendars! 📅\\n\\nBig announcement coming soon...\",\n backgroundColor: \"#302b63\",\n textColor: \"#FFFFFF\",\n duration: 4000,\n },\n {\n id: \"launch-3\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1492684223066-81342ee5ff30?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Event teaser\",\n },\n ],\n },\n {\n id: \"user-video\",\n username: \"Videos\",\n avatarUrl: avatarImages[4],\n hasUnreadStories: true,\n stories: [\n {\n id: \"video-1\",\n type: \"video\",\n src: sampleVideos[1],\n duration: 15000,\n },\n {\n id: \"video-2\",\n type: \"video\",\n src: sampleVideos[2],\n duration: 15000,\n },\n {\n id: \"video-3\",\n type: \"text\",\n text: \"More videos coming soon! 🎬\\n\\nStay tuned →\",\n backgroundColor: \"#4ECDC4\",\n textColor: \"#FFFFFF\",\n duration: 3000,\n },\n ],\n },\n {\n id: \"user-lifestyle\",\n username: \"Lifestyle\",\n avatarUrl: avatarImages[5],\n hasUnreadStories: false,\n stories: [\n {\n id: \"lifestyle-1\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Nature scene\",\n },\n {\n id: \"lifestyle-2\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Peaceful landscape\",\n },\n {\n id: \"lifestyle-3\",\n type: \"text\",\n text: \"Find your peace 🧘\\n\\nNature heals everything\",\n backgroundColor: \"#45B7D1\",\n textColor: \"#FFFFFF\",\n duration: 4000,\n },\n ],\n },\n];\n\n// Generate demo users for performance testing\nexport const generateDemoUsers = (count: number = 50): User[] => {\n const users: User[] = [...demoUsers];\n\n for (let i = demoUsers.length; i < count; i++) {\n const hasUnread = Math.random() > 0.3;\n const storyCount = Math.floor(Math.random() * 5) + 2;\n\n users.push({\n id: `user-${i}`,\n username: `User ${i}`,\n avatarUrl: `https://i.pravatar.cc/150?img=${i % 70}`,\n hasUnreadStories: hasUnread,\n stories: Array.from({ length: storyCount }, (_, storyIdx) => {\n const typeRandom = Math.random();\n\n // 50% images, 20% videos, 20% text, 10% custom\n if (typeRandom < 0.5) {\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"image\" as const,\n src: sampleImages[Math.floor(Math.random() * sampleImages.length)],\n duration: 5000,\n alt: `Story from User ${i}`,\n };\n }\n\n if (typeRandom < 0.7) {\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"video\" as const,\n src: sampleVideos[Math.floor(Math.random() * sampleVideos.length)],\n duration: 15000,\n };\n }\n\n if (typeRandom < 0.9) {\n const backgrounds = [\"#FF6B6B\", \"#4ECDC4\", \"#45B7D1\", \"#FFA07A\", \"#98D8C8\", \"#667eea\", \"#764ba2\"];\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"text\" as const,\n text: `Hello from User ${i}! 👋\\n\\nThis is story ${storyIdx + 1}`,\n backgroundColor: backgrounds[Math.floor(Math.random() * backgrounds.length)],\n textColor: \"#FFFFFF\",\n duration: 4000,\n };\n }\n\n // Custom component\n const components = [PollComponent, QuizComponent, SliderComponent];\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"custom_component\" as const,\n component: components[Math.floor(Math.random() * components.length)],\n duration: 30000,\n };\n }),\n });\n }\n\n return users;\n};\n"]}
|