react-instagram-stories 1.0.2 → 1.0.3
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/dist/index.cjs +5 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/styles.css +907 -0
- package/package.json +1 -1
package/dist/index.cjs.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.cjs","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/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.cjs","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"]}
|