markdown-flow-ui 0.1.115-beta.4 → 0.1.115-beta.5
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/components/Slide/Player.cjs.js +1 -1
- package/dist/components/Slide/Player.cjs.js.map +1 -1
- package/dist/components/Slide/Player.es.js +291 -280
- package/dist/components/Slide/Player.es.js.map +1 -1
- package/dist/components/Slide/Slide.cjs.js +1 -1
- package/dist/components/Slide/Slide.cjs.js.map +1 -1
- package/dist/components/Slide/Slide.es.js +478 -481
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/dist/components/Slide/utils/audioCompletion.cjs.js +2 -0
- package/dist/components/Slide/utils/audioCompletion.cjs.js.map +1 -0
- package/dist/components/Slide/utils/audioCompletion.d.ts +7 -0
- package/dist/components/Slide/utils/audioCompletion.es.js +9 -0
- package/dist/components/Slide/utils/audioCompletion.es.js.map +1 -0
- package/dist/components/Slide/utils/audioCompletion.test.d.ts +1 -0
- package/dist/components/Slide/utils/playbackSequence.cjs.js +1 -1
- package/dist/components/Slide/utils/playbackSequence.cjs.js.map +1 -1
- package/dist/components/Slide/utils/playbackSequence.d.ts +0 -4
- package/dist/components/Slide/utils/playbackSequence.es.js +7 -20
- package/dist/components/Slide/utils/playbackSequence.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Captions,\n CaptionsOff,\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n ScanLine,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport MobilePlayerSettingsSheet from \"./MobilePlayerSettingsSheet\";\nimport { DEFAULT_SLIDE_PLAYER_TEXTS } from \"./constants\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport type {\n SlidePlayerCustomActionContext,\n SlidePlayerCustomActions,\n} from \"./types\";\nimport {\n DEFAULT_MOBILE_VIEW_MODE,\n type MobileViewMode,\n} from \"./utils/mobileScreenMode\";\nimport { toPlayerCustomActionList } from \"./utils/playerCustomActions\";\nimport \"./player.css\";\n\nconst audioPreloadElementCache = new Map<string, HTMLAudioElement>();\n\nexport interface SlidePlayerTexts {\n settingsTitle?: string;\n subtitleLabel?: string;\n subtitleToggleAriaLabel?: string;\n screenLabel?: string;\n nonFullscreenLabel?: string;\n fullscreenLabel?: string;\n fullscreenHintText?: string;\n}\n\nexport type SlidePlayerLoadingReason = \"loadingAudio\" | \"waitingForMoreAudio\";\n\nconst preloadAudioUrl = (url?: string) => {\n if (typeof window === \"undefined\" || !url) {\n return;\n }\n\n if (audioPreloadElementCache.has(url)) {\n return;\n }\n\n // Use a detached audio element so warm-up follows the same media loading\n // path as the visible player instead of relying on link preload hints.\n const audio = window.document.createElement(\"audio\");\n audio.preload = \"auto\";\n audio.setAttribute(\"playsinline\", \"true\");\n audio.src = url;\n audio.load();\n\n audioPreloadElementCache.set(url, audio);\n};\n\nexport type PlayerProps = Omit<React.ComponentProps<\"div\">, \"onEnded\"> & {\n audioList?: SlideAudioItem[];\n currentAudioIndex?: number;\n defaultPlaying?: boolean;\n isPlaybackPaused?: boolean;\n isAutoAdvanceEnabled?: boolean;\n useAutoAdvanceToggle?: boolean;\n onLoadingChange?: (state: {\n loading: boolean;\n reason: SlidePlayerLoadingReason | null;\n }) => void;\n onPlaybackStarted?: () => void;\n onPlaybackTimeChange?: (timeMs: number) => void;\n onSubtitleToggle?: () => void;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n isFullscreen?: boolean;\n mobileViewMode?: MobileViewMode;\n settingsPortalContainer?: HTMLElement | null;\n onMobileViewModeChange?: (viewMode: MobileViewMode) => void;\n onEnded?: (audioIndex: number) => void;\n onAutoAdvanceToggle?: (enabled: boolean) => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n isSubtitleEnabled?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\n customActions?: SlidePlayerCustomActions;\n customActionContext?: SlidePlayerCustomActionContext;\n texts?: SlidePlayerTexts;\n};\n\nconst PauseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M12 10H16V24H12V10ZM18 10H22V24H18V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M13.3333 10L23.3333 16.6667L13.3333 23.3333V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst Player = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n isPlaybackPaused = false,\n isAutoAdvanceEnabled = true,\n useAutoAdvanceToggle = false,\n onLoadingChange,\n onPlaybackStarted,\n onPlaybackTimeChange,\n onSubtitleToggle,\n onPrev,\n onNext,\n onFullscreen,\n isFullscreen = false,\n mobileViewMode = DEFAULT_MOBILE_VIEW_MODE,\n settingsPortalContainer,\n onMobileViewModeChange,\n onEnded,\n onAutoAdvanceToggle,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n isSubtitleEnabled = true,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n customActions,\n customActionContext,\n texts,\n ...props\n}: PlayerProps) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const previousInteractionOpenRef = useRef(isInteractionOpen);\n const audioSrcRef = useRef<string | null>(null);\n const currentAudioKeyRef = useRef<string | null>(null);\n const currentSegmentIndexRef = useRef(0);\n const waitingSegmentIndexRef = useRef<number | null>(null);\n const currentAudioRef = useRef<SlideAudioItem | undefined>(undefined);\n const currentAudioSegmentsRef = useRef<\n NonNullable<SlideAudioItem[\"audioSegments\"]>\n >([]);\n const wasPlayingBeforeExternalPauseRef = useRef(false);\n const isLoadingRef = useRef(false);\n const isPausedByUserRef = useRef(false);\n const activeSourceTypeRef = useRef<\"url\" | \"segment\" | null>(null);\n const isWaitingForSegmentRef = useRef(false);\n const pendingAutoPlayRef = useRef(false);\n const pendingSeekTimeRef = useRef<number | null>(null);\n const isSwitchingSegmentRef = useRef(false);\n const playbackAnimationFrameRef = useRef<number | null>(null);\n const playbackTimeMsRef = useRef(0);\n const playbackAccessModeRef = useRef<\n \"unknown\" | \"auto\" | \"manual\" | \"blocked\"\n >(\"unknown\");\n const [isPlaying, setIsPlaying] = useState(defaultPlaying);\n const [isMobileMoreOpen, setIsMobileMoreOpen] = useState(false);\n const currentAudio =\n currentAudioIndex >= 0 ? audioList[currentAudioIndex] : undefined;\n const currentAudioUrl = currentAudio?.audioUrl;\n const currentAudioSegments = useMemo(\n () =>\n [...(currentAudio?.audioSegments ?? [])].sort(\n (prevSegment, nextSegment) =>\n prevSegment.segment_index - nextSegment.segment_index\n ),\n [currentAudio?.audioSegments]\n );\n const customActionList = useMemo(\n () => toPlayerCustomActionList(customActions, customActionContext),\n [customActionContext, customActions]\n );\n const mobileVisibleActionCount = customActionList.length + 5;\n const controlsStyle = useMemo(\n () =>\n ({\n \"--slide-player-mobile-control-count\": String(mobileVisibleActionCount),\n }) as React.CSSProperties,\n [mobileVisibleActionCount]\n );\n const playerTexts = useMemo(\n () => ({\n ...DEFAULT_SLIDE_PLAYER_TEXTS,\n ...texts,\n }),\n [texts]\n );\n const currentAudioKey = useMemo(() => {\n if (!currentAudio) {\n return \"none\";\n }\n\n return (\n currentAudio.audioKey ??\n `${String(currentAudio.sequenceNumber ?? \"none\")}:${String(currentAudio.audioUrl ?? \"\")}`\n );\n }, [currentAudio]);\n const isTogglePlaying = useAutoAdvanceToggle\n ? isAutoAdvanceEnabled\n : isPlaying;\n const toggleAriaLabel = useAutoAdvanceToggle\n ? isAutoAdvanceEnabled\n ? \"Pause autoplay\"\n : \"Play autoplay\"\n : isPlaying\n ? \"Pause\"\n : \"Play\";\n\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\n\n useEffect(() => {\n if (showControls) {\n return;\n }\n\n setIsMobileMoreOpen(false);\n }, [showControls]);\n\n useEffect(() => {\n if (!previousInteractionOpenRef.current && isInteractionOpen) {\n setIsMobileMoreOpen(false);\n }\n\n previousInteractionOpenRef.current = isInteractionOpen;\n }, [isInteractionOpen]);\n\n useEffect(() => {\n currentAudioSegmentsRef.current = currentAudioSegments;\n }, [currentAudioSegments]);\n\n useEffect(() => {\n const currentUrl = currentAudio?.audioUrl;\n const nextUrl =\n currentAudioIndex >= 0\n ? audioList[currentAudioIndex + 1]?.audioUrl\n : undefined;\n\n preloadAudioUrl(currentUrl);\n preloadAudioUrl(nextUrl);\n }, [audioList, currentAudio?.audioUrl, currentAudioIndex]);\n\n const updateLoading = useCallback(\n (loading: boolean, reason: SlidePlayerLoadingReason | null = null) => {\n if (isLoadingRef.current === loading && (!loading || reason === null)) {\n return;\n }\n\n isLoadingRef.current = loading;\n onLoadingChange?.({\n loading,\n reason: loading ? reason : null,\n });\n },\n [onLoadingChange]\n );\n\n const isAutoplayBlockedError = useCallback((error: unknown) => {\n if (!(error instanceof DOMException)) {\n return false;\n }\n\n return error.name === \"NotAllowedError\" || error.name === \"SecurityError\";\n }, []);\n\n const canStartPlaybackAutomatically = useCallback(() => {\n return (\n defaultPlaying &&\n !isPlaybackPaused &&\n !isPausedByUserRef.current &&\n playbackAccessModeRef.current !== \"blocked\"\n );\n }, [defaultPlaying, isPlaybackPaused]);\n\n const getSegmentSrc = useCallback((audioData: string) => {\n if (!audioData) {\n return \"\";\n }\n\n if (audioData.startsWith(\"data:\")) {\n return audioData;\n }\n\n return `data:audio/mpeg;base64,${audioData}`;\n }, []);\n\n const getWaitingSegmentSeekTime = useCallback(() => {\n const waitingSegmentIndex = waitingSegmentIndexRef.current;\n\n if (waitingSegmentIndex == null || waitingSegmentIndex <= 0) {\n return 0;\n }\n\n return (\n currentAudioSegmentsRef.current\n .slice(0, waitingSegmentIndex)\n .reduce(\n (totalDurationMs, segment) =>\n totalDurationMs + Math.max(Number(segment.duration_ms ?? 0), 0),\n 0\n ) / 1000\n );\n }, []);\n\n const getSegmentStartTimeMs = useCallback((segmentIndex: number) => {\n if (segmentIndex <= 0) {\n return 0;\n }\n\n return currentAudioSegmentsRef.current\n .slice(0, segmentIndex)\n .reduce(\n (totalDurationMs, segment) =>\n totalDurationMs + Math.max(Number(segment.duration_ms ?? 0), 0),\n 0\n );\n }, []);\n\n const getCurrentPlaybackTimeMs = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return waitingSegmentIndexRef.current != null\n ? getSegmentStartTimeMs(waitingSegmentIndexRef.current)\n : 0;\n }\n\n if (activeSourceTypeRef.current === \"segment\") {\n return (\n getSegmentStartTimeMs(currentSegmentIndexRef.current) +\n Math.max(audioElement.currentTime, 0) * 1000\n );\n }\n\n if (pendingSeekTimeRef.current !== null && audioElement.readyState === 0) {\n return pendingSeekTimeRef.current * 1000;\n }\n\n return Math.max(audioElement.currentTime, 0) * 1000;\n }, [getSegmentStartTimeMs]);\n\n const publishPlaybackTime = useCallback(\n (timeMs: number) => {\n const nextPlaybackTimeMs = Math.max(timeMs, 0);\n\n if (playbackTimeMsRef.current === nextPlaybackTimeMs) {\n return;\n }\n\n playbackTimeMsRef.current = nextPlaybackTimeMs;\n onPlaybackTimeChange?.(nextPlaybackTimeMs);\n },\n [onPlaybackTimeChange]\n );\n\n const syncPlaybackTime = useCallback(() => {\n publishPlaybackTime(getCurrentPlaybackTimeMs());\n }, [getCurrentPlaybackTimeMs, publishPlaybackTime]);\n\n const stopPlaybackTimeLoop = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n playbackAnimationFrameRef.current === null\n ) {\n return;\n }\n\n window.cancelAnimationFrame(playbackAnimationFrameRef.current);\n playbackAnimationFrameRef.current = null;\n }, []);\n\n const startPlaybackTimeLoop = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n playbackAnimationFrameRef.current !== null\n ) {\n return;\n }\n\n const updateFrame = () => {\n syncPlaybackTime();\n\n const audioElement = audioRef.current;\n\n if (!audioElement || audioElement.paused || audioElement.ended) {\n playbackAnimationFrameRef.current = null;\n return;\n }\n\n playbackAnimationFrameRef.current =\n window.requestAnimationFrame(updateFrame);\n };\n\n playbackAnimationFrameRef.current =\n window.requestAnimationFrame(updateFrame);\n }, [syncPlaybackTime]);\n\n const resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n stopPlaybackTimeLoop();\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = false;\n wasPlayingBeforeExternalPauseRef.current = false;\n activeSourceTypeRef.current = null;\n pendingSeekTimeRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = null;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n publishPlaybackTime(0);\n setIsPlaying(false);\n updateLoading(false);\n }, [publishPlaybackTime, stopPlaybackTimeLoop, updateLoading]);\n\n const tryPlayCurrentAudio = useCallback(\n (_reason: string) => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return false;\n }\n\n const playPromise = audioElement.play();\n\n if (playPromise && typeof playPromise.then === \"function\") {\n void playPromise\n .then(() => {\n if (playbackAccessModeRef.current === \"unknown\") {\n playbackAccessModeRef.current = \"auto\";\n }\n\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n })\n .catch((error: unknown) => {\n if (\n playbackAccessModeRef.current === \"unknown\" &&\n isAutoplayBlockedError(error)\n ) {\n // Lock autoplay after the first browser rejection.\n playbackAccessModeRef.current = \"blocked\";\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n }\n\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n });\n }\n\n return true;\n },\n [isAutoplayBlockedError, updateLoading]\n );\n\n const startSegmentPlayback = useCallback(\n (segmentIndex: number, _reason: string) => {\n const audioElement = audioRef.current;\n const segment = currentAudioSegmentsRef.current[segmentIndex];\n\n if (!audioElement || !segment) {\n return false;\n }\n\n const nextAudioSrc = getSegmentSrc(segment.audio_data);\n\n currentSegmentIndexRef.current = segmentIndex;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = true;\n publishPlaybackTime(getSegmentStartTimeMs(segmentIndex));\n const shouldAutoResume = canStartPlaybackAutomatically();\n\n pendingAutoPlayRef.current = shouldAutoResume;\n updateLoading(false);\n\n const hasNewSrc = audioSrcRef.current !== nextAudioSrc;\n\n activeSourceTypeRef.current = \"segment\";\n\n if (hasNewSrc) {\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = nextAudioSrc;\n audioElement.src = nextAudioSrc;\n audioElement.load();\n }\n\n pendingSeekTimeRef.current = 0;\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = 0;\n pendingSeekTimeRef.current = null;\n }\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [\n canStartPlaybackAutomatically,\n getSegmentSrc,\n getSegmentStartTimeMs,\n publishPlaybackTime,\n tryPlayCurrentAudio,\n updateLoading,\n ]\n );\n\n const finishAudioItem = useCallback(\n (_reason?: string) => {\n stopPlaybackTimeLoop();\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n syncPlaybackTime();\n setIsPlaying(false);\n updateLoading(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n },\n [\n currentAudioIndex,\n onEnded,\n stopPlaybackTimeLoop,\n syncPlaybackTime,\n updateLoading,\n ]\n );\n\n const handleSegmentEnded = useCallback(() => {\n const nextSegmentIndex = currentSegmentIndexRef.current + 1;\n const segments = currentAudioSegmentsRef.current;\n const nextSegment = segments[nextSegmentIndex];\n const activeAudio = currentAudioRef.current;\n const hasFinal = segments.some((segment) => segment.is_final);\n\n if (nextSegment) {\n startSegmentPlayback(nextSegmentIndex, \"ended\");\n return;\n }\n\n if (activeAudio?.isAudioStreaming || !hasFinal) {\n currentSegmentIndexRef.current = nextSegmentIndex;\n waitingSegmentIndexRef.current = nextSegmentIndex;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n publishPlaybackTime(getSegmentStartTimeMs(nextSegmentIndex));\n setIsPlaying(false);\n updateLoading(true, \"waitingForMoreAudio\");\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [\n defaultPlaying,\n finishAudioItem,\n getSegmentStartTimeMs,\n publishPlaybackTime,\n startSegmentPlayback,\n updateLoading,\n ]);\n\n useEffect(() => {\n if (currentAudioKeyRef.current === currentAudioKey) {\n return;\n }\n\n currentAudioKeyRef.current = currentAudioKey;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isPausedByUserRef.current = false;\n wasPlayingBeforeExternalPauseRef.current = false;\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n activeSourceTypeRef.current = null;\n audioSrcRef.current = null;\n stopPlaybackTimeLoop();\n publishPlaybackTime(0);\n updateLoading(false);\n\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n setIsPlaying(false);\n }, [\n currentAudioIndex,\n currentAudioKey,\n currentAudioSegments.length,\n currentAudioUrl,\n publishPlaybackTime,\n stopPlaybackTimeLoop,\n updateLoading,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (isPlaybackPaused) {\n wasPlayingBeforeExternalPauseRef.current = Boolean(\n currentAudioRef.current &&\n !isPausedByUserRef.current &&\n (!audioElement.paused ||\n pendingAutoPlayRef.current ||\n waitingSegmentIndexRef.current !== null)\n );\n\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (\n !wasPlayingBeforeExternalPauseRef.current ||\n !currentAudioRef.current ||\n isPausedByUserRef.current\n ) {\n return;\n }\n\n wasPlayingBeforeExternalPauseRef.current = false;\n\n if (waitingSegmentIndexRef.current !== null) {\n if (\n waitingSegmentIndexRef.current < currentAudioSegmentsRef.current.length\n ) {\n startSegmentPlayback(waitingSegmentIndexRef.current, \"external-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = true;\n updateLoading(true, \"waitingForMoreAudio\");\n return;\n }\n\n if (!audioSrcRef.current && currentAudioSegmentsRef.current.length > 0) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegmentsRef.current.length - 1\n ),\n \"external-resume-init\"\n );\n return;\n }\n\n if (!audioElement.paused) {\n return;\n }\n\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"external-resume\");\n }, [\n isPlaybackPaused,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n updateLoading,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (!currentAudio) {\n resetAudio();\n return;\n }\n\n if (isPlaybackPaused) {\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (currentAudioUrl) {\n const hasNewSrc = audioSrcRef.current !== currentAudioUrl;\n const shouldAutoResume = canStartPlaybackAutomatically();\n const shouldKeepSegmentSource =\n activeSourceTypeRef.current === \"segment\" &&\n Boolean(audioSrcRef.current) &&\n waitingSegmentIndexRef.current === null;\n\n if (shouldKeepSegmentSource) {\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"keep-segment-source\");\n }\n\n return;\n }\n\n if (hasNewSrc) {\n const nextSeekTime =\n waitingSegmentIndexRef.current !== null\n ? getWaitingSegmentSeekTime()\n : 0;\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = currentAudioUrl;\n activeSourceTypeRef.current = \"url\";\n audioElement.src = currentAudioUrl;\n audioElement.load();\n pendingSeekTimeRef.current = nextSeekTime;\n publishPlaybackTime(nextSeekTime * 1000);\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = nextSeekTime;\n pendingSeekTimeRef.current = null;\n }\n }\n\n pendingAutoPlayRef.current = shouldAutoResume;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n updateLoading(false);\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n tryPlayCurrentAudio(hasNewSrc ? \"sync-url-init\" : \"sync-url\");\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (waitingSegmentIndexRef.current < currentAudioSegments.length) {\n if (isPausedByUserRef.current) {\n setIsPlaying(false);\n updateLoading(false);\n return;\n }\n\n startSegmentPlayback(waitingSegmentIndexRef.current, \"wait-resume\");\n return;\n }\n\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n resetAudio();\n return;\n }\n\n if (!audioSrcRef.current) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"effect-init\"\n );\n return;\n }\n\n if (!defaultPlaying || isPausedByUserRef.current) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"sync-paused-retry\");\n }\n }, [\n currentAudio,\n currentAudioIndex,\n currentAudioSegments,\n currentAudioUrl,\n defaultPlaying,\n isPlaybackPaused,\n canStartPlaybackAutomatically,\n publishPlaybackTime,\n resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n getWaitingSegmentSeekTime,\n updateLoading,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n useEffect(() => stopPlaybackTimeLoop, [stopPlaybackTimeLoop]);\n\n const handleAudioPlay = useCallback(() => {\n syncPlaybackTime();\n startPlaybackTimeLoop();\n setIsPlaying(true);\n updateLoading(false);\n onPlaybackStarted?.();\n }, [\n onPlaybackStarted,\n startPlaybackTimeLoop,\n syncPlaybackTime,\n updateLoading,\n ]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n stopPlaybackTimeLoop();\n syncPlaybackTime();\n setIsPlaying(false);\n }, [currentAudioIndex, stopPlaybackTimeLoop, syncPlaybackTime]);\n\n const handleAudioCanPlay = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n syncPlaybackTime();\n\n if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [\n currentAudioIndex,\n defaultPlaying,\n syncPlaybackTime,\n tryPlayCurrentAudio,\n ]);\n\n const handleLoadedMetadata = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n syncPlaybackTime();\n }, [currentAudioIndex, syncPlaybackTime]);\n\n const handleAudioTimeUpdate = useCallback(() => {\n syncPlaybackTime();\n }, [syncPlaybackTime]);\n\n const handleAudioLoadStart = useCallback(() => {\n if (isWaitingForSegmentRef.current) {\n return;\n }\n\n updateLoading(true, \"loadingAudio\");\n }, [updateLoading]);\n\n const handleAudioWaiting = useCallback(() => {\n if (isWaitingForSegmentRef.current) {\n updateLoading(true, \"waitingForMoreAudio\");\n return;\n }\n\n updateLoading(true, \"loadingAudio\");\n }, [updateLoading]);\n\n const handleAudioSeeking = useCallback(() => {\n syncPlaybackTime();\n }, [syncPlaybackTime]);\n\n const handleAudioEnded = useCallback(() => {\n const shouldFinishAsUrl =\n activeSourceTypeRef.current === \"url\" ||\n currentAudioSegmentsRef.current.length === 0;\n\n stopPlaybackTimeLoop();\n isSwitchingSegmentRef.current = false;\n\n if (shouldFinishAsUrl) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [finishAudioItem, handleSegmentEnded, stopPlaybackTimeLoop]);\n\n const handleAudioError = useCallback(() => {\n stopPlaybackTimeLoop();\n syncPlaybackTime();\n setIsPlaying(false);\n updateLoading(false);\n }, [stopPlaybackTimeLoop, syncPlaybackTime, updateLoading]);\n const handleMobileViewModeChange = useCallback(\n (nextViewMode: MobileViewMode) => {\n onMobileViewModeChange?.(nextViewMode);\n setIsMobileMoreOpen(false);\n },\n [onMobileViewModeChange]\n );\n\n useEffect(() => {\n onPlaybackTimeChange?.(playbackTimeMsRef.current);\n }, [onPlaybackTimeChange]);\n\n return (\n <div className={cn(\"slide-player\", className)} {...props}>\n <audio\n ref={audioRef}\n preload=\"auto\"\n playsInline\n onLoadStart={handleAudioLoadStart}\n onLoadedMetadata={handleLoadedMetadata}\n onCanPlay={handleAudioCanPlay}\n onPlay={handleAudioPlay}\n onPause={handleAudioPause}\n onWaiting={handleAudioWaiting}\n onSeeking={handleAudioSeeking}\n onSeeked={handleAudioSeeking}\n onTimeUpdate={handleAudioTimeUpdate}\n onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <>\n <MobilePlayerSettingsSheet\n container={settingsPortalContainer}\n labels={{\n fullscreen: playerTexts.fullscreenLabel,\n nonFullscreen: playerTexts.nonFullscreenLabel,\n screen: playerTexts.screenLabel,\n subtitle: playerTexts.subtitleLabel,\n subtitleToggle: playerTexts.subtitleToggleAriaLabel,\n title: playerTexts.settingsTitle,\n }}\n isSubtitleEnabled={isSubtitleEnabled}\n onClose={() => setIsMobileMoreOpen(false)}\n onOpenChange={setIsMobileMoreOpen}\n onSubtitleToggle={onSubtitleToggle ?? (() => {})}\n onViewModeChange={handleMobileViewModeChange}\n open={isMobileMoreOpen}\n viewMode={mobileViewMode}\n />\n\n <div className=\"slide-player__controls\" style={controlsStyle}>\n <div className=\"slide-player__group\">\n <button\n aria-expanded={isMobileMoreOpen}\n aria-haspopup=\"dialog\"\n aria-label=\"More options\"\n className=\"slide-player__action slide-player__action--mobile-more\"\n onClick={() => {\n setIsMobileMoreOpen((prevOpen) => !prevOpen);\n }}\n type=\"button\"\n >\n <EllipsisVertical\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n <button aria-label=\"Volume\" className=\"hidden\" type=\"button\">\n <Volume2 className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={playerTexts.subtitleToggleAriaLabel}\n aria-pressed={isSubtitleEnabled}\n className=\"slide-player__action slide-player__action--subtitle\"\n onClick={onSubtitleToggle}\n type=\"button\"\n >\n {isSubtitleEnabled ? (\n <Captions className=\"slide-player__icon\" strokeWidth={2.25} />\n ) : (\n <CaptionsOff\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n )}\n </button>\n <button\n aria-label=\"Rewind\"\n className=\"slide-player__action slide-player__action--prev\"\n disabled={prevDisabled}\n onClick={onPrev}\n type=\"button\"\n >\n <RotateCcw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={toggleAriaLabel}\n className=\"slide-player__toggle slide-player__toggle--playback\"\n onClick={() => {\n if (useAutoAdvanceToggle) {\n onAutoAdvanceToggle?.(!isAutoAdvanceEnabled);\n return;\n }\n\n const audioElement = audioRef.current;\n\n if (isPlaybackPaused || !audioElement || !currentAudio) {\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (isPlaying) {\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n setIsPlaying(false);\n updateLoading(false);\n audioElement.pause();\n return;\n }\n\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n updateLoading(true, \"waitingForMoreAudio\");\n return;\n }\n\n if (!audioElement.src && currentAudioSegments.length > 0) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"toggle\"\n );\n return;\n }\n\n if (audioElement.paused) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"toggle-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n audioElement.pause();\n }}\n type=\"button\"\n >\n {isTogglePlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action slide-player__action--next\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n {onFullscreen ? (\n <button\n aria-label={\n isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"\n }\n className=\"slide-player__action slide-player__action--fullscreen\"\n onClick={onFullscreen}\n type=\"button\"\n >\n {isFullscreen ? (\n <ScanLine\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n ) : (\n <Maximize\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n )}\n </button>\n ) : null}\n </div>\n\n <div className=\"slide-player__separator\" />\n\n <div className=\"slide-player__group\">\n {customActionList.map((customAction, customActionIndex) => (\n <React.Fragment key={`custom-action-${customActionIndex}`}>\n {customAction}\n </React.Fragment>\n ))}\n <button\n aria-label=\"Notes\"\n className={cn(\n \"slide-player__action slide-player__action--notes\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n </div>\n </div>\n </>\n ) : null}\n </div>\n );\n};\n\nconst MemoizedPlayer = memo(Player);\n\nMemoizedPlayer.displayName = \"Player\";\n\nexport default MemoizedPlayer;\n"],"names":["audioPreloadElementCache","preloadAudioUrl","url","audio","PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","isPlaybackPaused","isAutoAdvanceEnabled","useAutoAdvanceToggle","onLoadingChange","onPlaybackStarted","onPlaybackTimeChange","onSubtitleToggle","onPrev","onNext","onFullscreen","isFullscreen","mobileViewMode","DEFAULT_MOBILE_VIEW_MODE","settingsPortalContainer","onMobileViewModeChange","onEnded","onAutoAdvanceToggle","onInteractionToggle","hasInteraction","isInteractionOpen","isSubtitleEnabled","prevDisabled","nextDisabled","showControls","customActions","customActionContext","texts","props","audioRef","useRef","previousInteractionOpenRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","wasPlayingBeforeExternalPauseRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","playbackAnimationFrameRef","playbackTimeMsRef","playbackAccessModeRef","isPlaying","setIsPlaying","useState","isMobileMoreOpen","setIsMobileMoreOpen","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","customActionList","toPlayerCustomActionList","mobileVisibleActionCount","controlsStyle","playerTexts","DEFAULT_SLIDE_PLAYER_TEXTS","currentAudioKey","isTogglePlaying","toggleAriaLabel","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","reason","isAutoplayBlockedError","error","canStartPlaybackAutomatically","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","getSegmentStartTimeMs","segmentIndex","getCurrentPlaybackTimeMs","audioElement","publishPlaybackTime","timeMs","nextPlaybackTimeMs","syncPlaybackTime","stopPlaybackTimeLoop","startPlaybackTimeLoop","updateFrame","resetAudio","tryPlayCurrentAudio","_reason","playPromise","startSegmentPlayback","nextAudioSrc","shouldAutoResume","hasNewSrc","finishAudioItem","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","nextSeekTime","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioTimeUpdate","handleAudioLoadStart","handleAudioWaiting","handleAudioSeeking","handleAudioEnded","shouldFinishAsUrl","handleAudioError","handleMobileViewModeChange","nextViewMode","cn","Fragment","MobilePlayerSettingsSheet","prevOpen","EllipsisVertical","Volume2","Captions","CaptionsOff","RotateCcw","RotateCw","ScanLine","Maximize","customAction","customActionIndex","React","FilePenLine","MemoizedPlayer","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Captions,\n CaptionsOff,\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n ScanLine,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport MobilePlayerSettingsSheet from \"./MobilePlayerSettingsSheet\";\nimport { DEFAULT_SLIDE_PLAYER_TEXTS } from \"./constants\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport type {\n SlidePlayerCustomActionContext,\n SlidePlayerCustomActions,\n} from \"./types\";\nimport {\n DEFAULT_MOBILE_VIEW_MODE,\n type MobileViewMode,\n} from \"./utils/mobileScreenMode\";\nimport { hasReachedAudioEnd } from \"./utils/audioCompletion\";\nimport { toPlayerCustomActionList } from \"./utils/playerCustomActions\";\nimport \"./player.css\";\n\nconst audioPreloadElementCache = new Map<string, HTMLAudioElement>();\n\nexport interface SlidePlayerTexts {\n settingsTitle?: string;\n subtitleLabel?: string;\n subtitleToggleAriaLabel?: string;\n screenLabel?: string;\n nonFullscreenLabel?: string;\n fullscreenLabel?: string;\n fullscreenHintText?: string;\n}\n\nexport type SlidePlayerLoadingReason = \"loadingAudio\" | \"waitingForMoreAudio\";\n\nconst preloadAudioUrl = (url?: string) => {\n if (typeof window === \"undefined\" || !url) {\n return;\n }\n\n if (audioPreloadElementCache.has(url)) {\n return;\n }\n\n // Use a detached audio element so warm-up follows the same media loading\n // path as the visible player instead of relying on link preload hints.\n const audio = window.document.createElement(\"audio\");\n audio.preload = \"auto\";\n audio.setAttribute(\"playsinline\", \"true\");\n audio.src = url;\n audio.load();\n\n audioPreloadElementCache.set(url, audio);\n};\n\nexport type PlayerProps = Omit<React.ComponentProps<\"div\">, \"onEnded\"> & {\n audioList?: SlideAudioItem[];\n currentAudioIndex?: number;\n defaultPlaying?: boolean;\n isPlaybackPaused?: boolean;\n isAutoAdvanceEnabled?: boolean;\n useAutoAdvanceToggle?: boolean;\n onLoadingChange?: (state: {\n loading: boolean;\n reason: SlidePlayerLoadingReason | null;\n }) => void;\n onPlaybackStarted?: () => void;\n onPlaybackTimeChange?: (timeMs: number) => void;\n onSubtitleToggle?: () => void;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n isFullscreen?: boolean;\n mobileViewMode?: MobileViewMode;\n settingsPortalContainer?: HTMLElement | null;\n onMobileViewModeChange?: (viewMode: MobileViewMode) => void;\n onEnded?: (audioIndex: number) => void;\n onAutoAdvanceToggle?: (enabled: boolean) => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n isSubtitleEnabled?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\n customActions?: SlidePlayerCustomActions;\n customActionContext?: SlidePlayerCustomActionContext;\n texts?: SlidePlayerTexts;\n};\n\nconst PauseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M12 10H16V24H12V10ZM18 10H22V24H18V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M13.3333 10L23.3333 16.6667L13.3333 23.3333V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst Player = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n isPlaybackPaused = false,\n isAutoAdvanceEnabled = true,\n useAutoAdvanceToggle = false,\n onLoadingChange,\n onPlaybackStarted,\n onPlaybackTimeChange,\n onSubtitleToggle,\n onPrev,\n onNext,\n onFullscreen,\n isFullscreen = false,\n mobileViewMode = DEFAULT_MOBILE_VIEW_MODE,\n settingsPortalContainer,\n onMobileViewModeChange,\n onEnded,\n onAutoAdvanceToggle,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n isSubtitleEnabled = true,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n customActions,\n customActionContext,\n texts,\n ...props\n}: PlayerProps) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const previousInteractionOpenRef = useRef(isInteractionOpen);\n const audioSrcRef = useRef<string | null>(null);\n const currentAudioKeyRef = useRef<string | null>(null);\n const currentSegmentIndexRef = useRef(0);\n const waitingSegmentIndexRef = useRef<number | null>(null);\n const currentAudioRef = useRef<SlideAudioItem | undefined>(undefined);\n const currentAudioSegmentsRef = useRef<\n NonNullable<SlideAudioItem[\"audioSegments\"]>\n >([]);\n const wasPlayingBeforeExternalPauseRef = useRef(false);\n const isLoadingRef = useRef(false);\n const isPausedByUserRef = useRef(false);\n const activeSourceTypeRef = useRef<\"url\" | \"segment\" | null>(null);\n const isWaitingForSegmentRef = useRef(false);\n const pendingAutoPlayRef = useRef(false);\n const pendingSeekTimeRef = useRef<number | null>(null);\n const isSwitchingSegmentRef = useRef(false);\n const playbackAnimationFrameRef = useRef<number | null>(null);\n const playbackTimeMsRef = useRef(0);\n const playbackAccessModeRef = useRef<\n \"unknown\" | \"auto\" | \"manual\" | \"blocked\"\n >(\"unknown\");\n const [isPlaying, setIsPlaying] = useState(defaultPlaying);\n const [isMobileMoreOpen, setIsMobileMoreOpen] = useState(false);\n const currentAudio =\n currentAudioIndex >= 0 ? audioList[currentAudioIndex] : undefined;\n const currentAudioUrl = currentAudio?.audioUrl;\n const currentAudioSegments = useMemo(\n () =>\n [...(currentAudio?.audioSegments ?? [])].sort(\n (prevSegment, nextSegment) =>\n prevSegment.segment_index - nextSegment.segment_index\n ),\n [currentAudio?.audioSegments]\n );\n const customActionList = useMemo(\n () => toPlayerCustomActionList(customActions, customActionContext),\n [customActionContext, customActions]\n );\n const mobileVisibleActionCount = customActionList.length + 5;\n const controlsStyle = useMemo(\n () =>\n ({\n \"--slide-player-mobile-control-count\": String(mobileVisibleActionCount),\n }) as React.CSSProperties,\n [mobileVisibleActionCount]\n );\n const playerTexts = useMemo(\n () => ({\n ...DEFAULT_SLIDE_PLAYER_TEXTS,\n ...texts,\n }),\n [texts]\n );\n const currentAudioKey = useMemo(() => {\n if (!currentAudio) {\n return \"none\";\n }\n\n return (\n currentAudio.audioKey ??\n `${String(currentAudio.sequenceNumber ?? \"none\")}:${String(currentAudio.audioUrl ?? \"\")}`\n );\n }, [currentAudio]);\n const isTogglePlaying = useAutoAdvanceToggle\n ? isAutoAdvanceEnabled\n : isPlaying;\n const toggleAriaLabel = useAutoAdvanceToggle\n ? isAutoAdvanceEnabled\n ? \"Pause autoplay\"\n : \"Play autoplay\"\n : isPlaying\n ? \"Pause\"\n : \"Play\";\n\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\n\n useEffect(() => {\n if (showControls) {\n return;\n }\n\n setIsMobileMoreOpen(false);\n }, [showControls]);\n\n useEffect(() => {\n if (!previousInteractionOpenRef.current && isInteractionOpen) {\n setIsMobileMoreOpen(false);\n }\n\n previousInteractionOpenRef.current = isInteractionOpen;\n }, [isInteractionOpen]);\n\n useEffect(() => {\n currentAudioSegmentsRef.current = currentAudioSegments;\n }, [currentAudioSegments]);\n\n useEffect(() => {\n const currentUrl = currentAudio?.audioUrl;\n const nextUrl =\n currentAudioIndex >= 0\n ? audioList[currentAudioIndex + 1]?.audioUrl\n : undefined;\n\n preloadAudioUrl(currentUrl);\n preloadAudioUrl(nextUrl);\n }, [audioList, currentAudio?.audioUrl, currentAudioIndex]);\n\n const updateLoading = useCallback(\n (loading: boolean, reason: SlidePlayerLoadingReason | null = null) => {\n if (isLoadingRef.current === loading && (!loading || reason === null)) {\n return;\n }\n\n isLoadingRef.current = loading;\n onLoadingChange?.({\n loading,\n reason: loading ? reason : null,\n });\n },\n [onLoadingChange]\n );\n\n const isAutoplayBlockedError = useCallback((error: unknown) => {\n if (!(error instanceof DOMException)) {\n return false;\n }\n\n return error.name === \"NotAllowedError\" || error.name === \"SecurityError\";\n }, []);\n\n const canStartPlaybackAutomatically = useCallback(() => {\n return (\n defaultPlaying &&\n !isPlaybackPaused &&\n !isPausedByUserRef.current &&\n playbackAccessModeRef.current !== \"blocked\"\n );\n }, [defaultPlaying, isPlaybackPaused]);\n\n const getSegmentSrc = useCallback((audioData: string) => {\n if (!audioData) {\n return \"\";\n }\n\n if (audioData.startsWith(\"data:\")) {\n return audioData;\n }\n\n return `data:audio/mpeg;base64,${audioData}`;\n }, []);\n\n const getWaitingSegmentSeekTime = useCallback(() => {\n const waitingSegmentIndex = waitingSegmentIndexRef.current;\n\n if (waitingSegmentIndex == null || waitingSegmentIndex <= 0) {\n return 0;\n }\n\n return (\n currentAudioSegmentsRef.current\n .slice(0, waitingSegmentIndex)\n .reduce(\n (totalDurationMs, segment) =>\n totalDurationMs + Math.max(Number(segment.duration_ms ?? 0), 0),\n 0\n ) / 1000\n );\n }, []);\n\n const getSegmentStartTimeMs = useCallback((segmentIndex: number) => {\n if (segmentIndex <= 0) {\n return 0;\n }\n\n return currentAudioSegmentsRef.current\n .slice(0, segmentIndex)\n .reduce(\n (totalDurationMs, segment) =>\n totalDurationMs + Math.max(Number(segment.duration_ms ?? 0), 0),\n 0\n );\n }, []);\n\n const getCurrentPlaybackTimeMs = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return waitingSegmentIndexRef.current != null\n ? getSegmentStartTimeMs(waitingSegmentIndexRef.current)\n : 0;\n }\n\n if (activeSourceTypeRef.current === \"segment\") {\n return (\n getSegmentStartTimeMs(currentSegmentIndexRef.current) +\n Math.max(audioElement.currentTime, 0) * 1000\n );\n }\n\n if (pendingSeekTimeRef.current !== null && audioElement.readyState === 0) {\n return pendingSeekTimeRef.current * 1000;\n }\n\n return Math.max(audioElement.currentTime, 0) * 1000;\n }, [getSegmentStartTimeMs]);\n\n const publishPlaybackTime = useCallback(\n (timeMs: number) => {\n const nextPlaybackTimeMs = Math.max(timeMs, 0);\n\n if (playbackTimeMsRef.current === nextPlaybackTimeMs) {\n return;\n }\n\n playbackTimeMsRef.current = nextPlaybackTimeMs;\n onPlaybackTimeChange?.(nextPlaybackTimeMs);\n },\n [onPlaybackTimeChange]\n );\n\n const syncPlaybackTime = useCallback(() => {\n publishPlaybackTime(getCurrentPlaybackTimeMs());\n }, [getCurrentPlaybackTimeMs, publishPlaybackTime]);\n\n const stopPlaybackTimeLoop = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n playbackAnimationFrameRef.current === null\n ) {\n return;\n }\n\n window.cancelAnimationFrame(playbackAnimationFrameRef.current);\n playbackAnimationFrameRef.current = null;\n }, []);\n\n const startPlaybackTimeLoop = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n playbackAnimationFrameRef.current !== null\n ) {\n return;\n }\n\n const updateFrame = () => {\n syncPlaybackTime();\n\n const audioElement = audioRef.current;\n\n if (!audioElement || audioElement.paused || audioElement.ended) {\n playbackAnimationFrameRef.current = null;\n return;\n }\n\n playbackAnimationFrameRef.current =\n window.requestAnimationFrame(updateFrame);\n };\n\n playbackAnimationFrameRef.current =\n window.requestAnimationFrame(updateFrame);\n }, [syncPlaybackTime]);\n\n const resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n stopPlaybackTimeLoop();\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = false;\n wasPlayingBeforeExternalPauseRef.current = false;\n activeSourceTypeRef.current = null;\n pendingSeekTimeRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = null;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n publishPlaybackTime(0);\n setIsPlaying(false);\n updateLoading(false);\n }, [publishPlaybackTime, stopPlaybackTimeLoop, updateLoading]);\n\n const tryPlayCurrentAudio = useCallback(\n (_reason: string) => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return false;\n }\n\n const playPromise = audioElement.play();\n\n if (playPromise && typeof playPromise.then === \"function\") {\n void playPromise\n .then(() => {\n if (playbackAccessModeRef.current === \"unknown\") {\n playbackAccessModeRef.current = \"auto\";\n }\n\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n })\n .catch((error: unknown) => {\n if (\n playbackAccessModeRef.current === \"unknown\" &&\n isAutoplayBlockedError(error)\n ) {\n // Lock autoplay after the first browser rejection.\n playbackAccessModeRef.current = \"blocked\";\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n }\n\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n });\n }\n\n return true;\n },\n [isAutoplayBlockedError, updateLoading]\n );\n\n const startSegmentPlayback = useCallback(\n (segmentIndex: number, _reason: string) => {\n const audioElement = audioRef.current;\n const segment = currentAudioSegmentsRef.current[segmentIndex];\n\n if (!audioElement || !segment) {\n return false;\n }\n\n const nextAudioSrc = getSegmentSrc(segment.audio_data);\n\n currentSegmentIndexRef.current = segmentIndex;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = true;\n publishPlaybackTime(getSegmentStartTimeMs(segmentIndex));\n const shouldAutoResume = canStartPlaybackAutomatically();\n\n pendingAutoPlayRef.current = shouldAutoResume;\n updateLoading(false);\n\n const hasNewSrc = audioSrcRef.current !== nextAudioSrc;\n\n activeSourceTypeRef.current = \"segment\";\n\n if (hasNewSrc) {\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = nextAudioSrc;\n audioElement.src = nextAudioSrc;\n audioElement.load();\n }\n\n pendingSeekTimeRef.current = 0;\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = 0;\n pendingSeekTimeRef.current = null;\n }\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [\n canStartPlaybackAutomatically,\n getSegmentSrc,\n getSegmentStartTimeMs,\n publishPlaybackTime,\n tryPlayCurrentAudio,\n updateLoading,\n ]\n );\n\n const finishAudioItem = useCallback(\n (_reason?: string) => {\n stopPlaybackTimeLoop();\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n syncPlaybackTime();\n setIsPlaying(false);\n updateLoading(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n },\n [\n currentAudioIndex,\n onEnded,\n stopPlaybackTimeLoop,\n syncPlaybackTime,\n updateLoading,\n ]\n );\n\n const finishUrlAudioIfSeekedToEnd = useCallback(\n (_reason: string) => {\n const audioElement = audioRef.current;\n\n if (!audioElement || activeSourceTypeRef.current !== \"url\") {\n return false;\n }\n\n if (\n !hasReachedAudioEnd({\n currentTimeSeconds: Math.max(audioElement.currentTime, 0),\n durationSeconds: audioElement.duration,\n })\n ) {\n return false;\n }\n\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n finishAudioItem(_reason);\n return true;\n },\n [finishAudioItem]\n );\n\n const handleSegmentEnded = useCallback(() => {\n const nextSegmentIndex = currentSegmentIndexRef.current + 1;\n const segments = currentAudioSegmentsRef.current;\n const nextSegment = segments[nextSegmentIndex];\n const activeAudio = currentAudioRef.current;\n const hasFinal = segments.some((segment) => segment.is_final);\n\n if (nextSegment) {\n startSegmentPlayback(nextSegmentIndex, \"ended\");\n return;\n }\n\n if (activeAudio?.isAudioStreaming || !hasFinal) {\n currentSegmentIndexRef.current = nextSegmentIndex;\n waitingSegmentIndexRef.current = nextSegmentIndex;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n publishPlaybackTime(getSegmentStartTimeMs(nextSegmentIndex));\n setIsPlaying(false);\n updateLoading(true, \"waitingForMoreAudio\");\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [\n defaultPlaying,\n finishAudioItem,\n getSegmentStartTimeMs,\n publishPlaybackTime,\n startSegmentPlayback,\n updateLoading,\n ]);\n\n useEffect(() => {\n if (currentAudioKeyRef.current === currentAudioKey) {\n return;\n }\n\n currentAudioKeyRef.current = currentAudioKey;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isPausedByUserRef.current = false;\n wasPlayingBeforeExternalPauseRef.current = false;\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n activeSourceTypeRef.current = null;\n audioSrcRef.current = null;\n stopPlaybackTimeLoop();\n publishPlaybackTime(0);\n updateLoading(false);\n\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n setIsPlaying(false);\n }, [\n currentAudioIndex,\n currentAudioKey,\n currentAudioSegments.length,\n currentAudioUrl,\n publishPlaybackTime,\n stopPlaybackTimeLoop,\n updateLoading,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (isPlaybackPaused) {\n wasPlayingBeforeExternalPauseRef.current = Boolean(\n currentAudioRef.current &&\n !isPausedByUserRef.current &&\n (!audioElement.paused ||\n pendingAutoPlayRef.current ||\n waitingSegmentIndexRef.current !== null)\n );\n\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (\n !wasPlayingBeforeExternalPauseRef.current ||\n !currentAudioRef.current ||\n isPausedByUserRef.current\n ) {\n return;\n }\n\n wasPlayingBeforeExternalPauseRef.current = false;\n\n if (waitingSegmentIndexRef.current !== null) {\n if (\n waitingSegmentIndexRef.current < currentAudioSegmentsRef.current.length\n ) {\n startSegmentPlayback(waitingSegmentIndexRef.current, \"external-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = true;\n updateLoading(true, \"waitingForMoreAudio\");\n return;\n }\n\n if (!audioSrcRef.current && currentAudioSegmentsRef.current.length > 0) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegmentsRef.current.length - 1\n ),\n \"external-resume-init\"\n );\n return;\n }\n\n if (!audioElement.paused) {\n return;\n }\n\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"external-resume\");\n }, [\n isPlaybackPaused,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n updateLoading,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (!currentAudio) {\n resetAudio();\n return;\n }\n\n if (isPlaybackPaused) {\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (currentAudioUrl) {\n const hasNewSrc = audioSrcRef.current !== currentAudioUrl;\n const shouldAutoResume = canStartPlaybackAutomatically();\n const shouldKeepSegmentSource =\n activeSourceTypeRef.current === \"segment\" &&\n Boolean(audioSrcRef.current) &&\n waitingSegmentIndexRef.current === null;\n\n if (shouldKeepSegmentSource) {\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"keep-segment-source\");\n }\n\n return;\n }\n\n if (hasNewSrc) {\n const nextSeekTime =\n waitingSegmentIndexRef.current !== null\n ? getWaitingSegmentSeekTime()\n : 0;\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = currentAudioUrl;\n activeSourceTypeRef.current = \"url\";\n audioElement.src = currentAudioUrl;\n audioElement.load();\n pendingSeekTimeRef.current = nextSeekTime;\n publishPlaybackTime(nextSeekTime * 1000);\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = nextSeekTime;\n pendingSeekTimeRef.current = null;\n }\n }\n\n pendingAutoPlayRef.current = shouldAutoResume;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n updateLoading(false);\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n tryPlayCurrentAudio(hasNewSrc ? \"sync-url-init\" : \"sync-url\");\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (waitingSegmentIndexRef.current < currentAudioSegments.length) {\n if (isPausedByUserRef.current) {\n setIsPlaying(false);\n updateLoading(false);\n return;\n }\n\n startSegmentPlayback(waitingSegmentIndexRef.current, \"wait-resume\");\n return;\n }\n\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n resetAudio();\n return;\n }\n\n if (!audioSrcRef.current) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"effect-init\"\n );\n return;\n }\n\n if (!defaultPlaying || isPausedByUserRef.current) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"sync-paused-retry\");\n }\n }, [\n currentAudio,\n currentAudioIndex,\n currentAudioSegments,\n currentAudioUrl,\n defaultPlaying,\n isPlaybackPaused,\n canStartPlaybackAutomatically,\n publishPlaybackTime,\n resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n getWaitingSegmentSeekTime,\n updateLoading,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n useEffect(() => stopPlaybackTimeLoop, [stopPlaybackTimeLoop]);\n\n const handleAudioPlay = useCallback(() => {\n syncPlaybackTime();\n startPlaybackTimeLoop();\n setIsPlaying(true);\n updateLoading(false);\n onPlaybackStarted?.();\n }, [\n onPlaybackStarted,\n startPlaybackTimeLoop,\n syncPlaybackTime,\n updateLoading,\n ]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n stopPlaybackTimeLoop();\n syncPlaybackTime();\n setIsPlaying(false);\n }, [currentAudioIndex, stopPlaybackTimeLoop, syncPlaybackTime]);\n\n const handleAudioCanPlay = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n syncPlaybackTime();\n\n if (finishUrlAudioIfSeekedToEnd(\"canplay-seek-finished\")) {\n return;\n }\n\n if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [\n currentAudioIndex,\n defaultPlaying,\n finishUrlAudioIfSeekedToEnd,\n syncPlaybackTime,\n tryPlayCurrentAudio,\n ]);\n\n const handleLoadedMetadata = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n syncPlaybackTime();\n\n finishUrlAudioIfSeekedToEnd(\"metadata-seek-finished\");\n }, [currentAudioIndex, finishUrlAudioIfSeekedToEnd, syncPlaybackTime]);\n\n const handleAudioTimeUpdate = useCallback(() => {\n syncPlaybackTime();\n }, [syncPlaybackTime]);\n\n const handleAudioLoadStart = useCallback(() => {\n if (isWaitingForSegmentRef.current) {\n return;\n }\n\n updateLoading(true, \"loadingAudio\");\n }, [updateLoading]);\n\n const handleAudioWaiting = useCallback(() => {\n if (isWaitingForSegmentRef.current) {\n updateLoading(true, \"waitingForMoreAudio\");\n return;\n }\n\n updateLoading(true, \"loadingAudio\");\n }, [updateLoading]);\n\n const handleAudioSeeking = useCallback(() => {\n syncPlaybackTime();\n }, [syncPlaybackTime]);\n\n const handleAudioEnded = useCallback(() => {\n const shouldFinishAsUrl =\n activeSourceTypeRef.current === \"url\" ||\n currentAudioSegmentsRef.current.length === 0;\n\n stopPlaybackTimeLoop();\n isSwitchingSegmentRef.current = false;\n\n if (shouldFinishAsUrl) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [finishAudioItem, handleSegmentEnded, stopPlaybackTimeLoop]);\n\n const handleAudioError = useCallback(() => {\n stopPlaybackTimeLoop();\n syncPlaybackTime();\n setIsPlaying(false);\n updateLoading(false);\n }, [stopPlaybackTimeLoop, syncPlaybackTime, updateLoading]);\n const handleMobileViewModeChange = useCallback(\n (nextViewMode: MobileViewMode) => {\n onMobileViewModeChange?.(nextViewMode);\n setIsMobileMoreOpen(false);\n },\n [onMobileViewModeChange]\n );\n\n useEffect(() => {\n onPlaybackTimeChange?.(playbackTimeMsRef.current);\n }, [onPlaybackTimeChange]);\n\n return (\n <div className={cn(\"slide-player\", className)} {...props}>\n <audio\n ref={audioRef}\n preload=\"auto\"\n playsInline\n onLoadStart={handleAudioLoadStart}\n onLoadedMetadata={handleLoadedMetadata}\n onCanPlay={handleAudioCanPlay}\n onPlay={handleAudioPlay}\n onPause={handleAudioPause}\n onWaiting={handleAudioWaiting}\n onSeeking={handleAudioSeeking}\n onSeeked={handleAudioSeeking}\n onTimeUpdate={handleAudioTimeUpdate}\n onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <>\n <MobilePlayerSettingsSheet\n container={settingsPortalContainer}\n labels={{\n fullscreen: playerTexts.fullscreenLabel,\n nonFullscreen: playerTexts.nonFullscreenLabel,\n screen: playerTexts.screenLabel,\n subtitle: playerTexts.subtitleLabel,\n subtitleToggle: playerTexts.subtitleToggleAriaLabel,\n title: playerTexts.settingsTitle,\n }}\n isSubtitleEnabled={isSubtitleEnabled}\n onClose={() => setIsMobileMoreOpen(false)}\n onOpenChange={setIsMobileMoreOpen}\n onSubtitleToggle={onSubtitleToggle ?? (() => {})}\n onViewModeChange={handleMobileViewModeChange}\n open={isMobileMoreOpen}\n viewMode={mobileViewMode}\n />\n\n <div className=\"slide-player__controls\" style={controlsStyle}>\n <div className=\"slide-player__group\">\n <button\n aria-expanded={isMobileMoreOpen}\n aria-haspopup=\"dialog\"\n aria-label=\"More options\"\n className=\"slide-player__action slide-player__action--mobile-more\"\n onClick={() => {\n setIsMobileMoreOpen((prevOpen) => !prevOpen);\n }}\n type=\"button\"\n >\n <EllipsisVertical\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n <button aria-label=\"Volume\" className=\"hidden\" type=\"button\">\n <Volume2 className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={playerTexts.subtitleToggleAriaLabel}\n aria-pressed={isSubtitleEnabled}\n className=\"slide-player__action slide-player__action--subtitle\"\n onClick={onSubtitleToggle}\n type=\"button\"\n >\n {isSubtitleEnabled ? (\n <Captions className=\"slide-player__icon\" strokeWidth={2.25} />\n ) : (\n <CaptionsOff\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n )}\n </button>\n <button\n aria-label=\"Rewind\"\n className=\"slide-player__action slide-player__action--prev\"\n disabled={prevDisabled}\n onClick={onPrev}\n type=\"button\"\n >\n <RotateCcw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={toggleAriaLabel}\n className=\"slide-player__toggle slide-player__toggle--playback\"\n onClick={() => {\n if (useAutoAdvanceToggle) {\n onAutoAdvanceToggle?.(!isAutoAdvanceEnabled);\n return;\n }\n\n const audioElement = audioRef.current;\n\n if (isPlaybackPaused || !audioElement || !currentAudio) {\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (isPlaying) {\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n setIsPlaying(false);\n updateLoading(false);\n audioElement.pause();\n return;\n }\n\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n updateLoading(true, \"waitingForMoreAudio\");\n return;\n }\n\n if (!audioElement.src && currentAudioSegments.length > 0) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"toggle\"\n );\n return;\n }\n\n if (audioElement.paused) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"toggle-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n audioElement.pause();\n }}\n type=\"button\"\n >\n {isTogglePlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action slide-player__action--next\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n {onFullscreen ? (\n <button\n aria-label={\n isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"\n }\n className=\"slide-player__action slide-player__action--fullscreen\"\n onClick={onFullscreen}\n type=\"button\"\n >\n {isFullscreen ? (\n <ScanLine\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n ) : (\n <Maximize\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n )}\n </button>\n ) : null}\n </div>\n\n <div className=\"slide-player__separator\" />\n\n <div className=\"slide-player__group\">\n {customActionList.map((customAction, customActionIndex) => (\n <React.Fragment key={`custom-action-${customActionIndex}`}>\n {customAction}\n </React.Fragment>\n ))}\n <button\n aria-label=\"Notes\"\n className={cn(\n \"slide-player__action slide-player__action--notes\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n </div>\n </div>\n </>\n ) : null}\n </div>\n );\n};\n\nconst MemoizedPlayer = memo(Player);\n\nMemoizedPlayer.displayName = \"Player\";\n\nexport default MemoizedPlayer;\n"],"names":["audioPreloadElementCache","preloadAudioUrl","url","audio","PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","isPlaybackPaused","isAutoAdvanceEnabled","useAutoAdvanceToggle","onLoadingChange","onPlaybackStarted","onPlaybackTimeChange","onSubtitleToggle","onPrev","onNext","onFullscreen","isFullscreen","mobileViewMode","DEFAULT_MOBILE_VIEW_MODE","settingsPortalContainer","onMobileViewModeChange","onEnded","onAutoAdvanceToggle","onInteractionToggle","hasInteraction","isInteractionOpen","isSubtitleEnabled","prevDisabled","nextDisabled","showControls","customActions","customActionContext","texts","props","audioRef","useRef","previousInteractionOpenRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","wasPlayingBeforeExternalPauseRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","playbackAnimationFrameRef","playbackTimeMsRef","playbackAccessModeRef","isPlaying","setIsPlaying","useState","isMobileMoreOpen","setIsMobileMoreOpen","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","customActionList","toPlayerCustomActionList","mobileVisibleActionCount","controlsStyle","playerTexts","DEFAULT_SLIDE_PLAYER_TEXTS","currentAudioKey","isTogglePlaying","toggleAriaLabel","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","reason","isAutoplayBlockedError","error","canStartPlaybackAutomatically","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","getSegmentStartTimeMs","segmentIndex","getCurrentPlaybackTimeMs","audioElement","publishPlaybackTime","timeMs","nextPlaybackTimeMs","syncPlaybackTime","stopPlaybackTimeLoop","startPlaybackTimeLoop","updateFrame","resetAudio","tryPlayCurrentAudio","_reason","playPromise","startSegmentPlayback","nextAudioSrc","shouldAutoResume","hasNewSrc","finishAudioItem","finishUrlAudioIfSeekedToEnd","hasReachedAudioEnd","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","nextSeekTime","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioTimeUpdate","handleAudioLoadStart","handleAudioWaiting","handleAudioSeeking","handleAudioEnded","shouldFinishAsUrl","handleAudioError","handleMobileViewModeChange","nextViewMode","cn","Fragment","MobilePlayerSettingsSheet","prevOpen","EllipsisVertical","Volume2","Captions","CaptionsOff","RotateCcw","RotateCw","ScanLine","Maximize","customAction","customActionIndex","React","FilePenLine","MemoizedPlayer","memo"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../_virtual/jsx-runtime.cjs.js"),e=require("react"),xn=require("../../lib/sandboxInteraction.cjs.js"),$=require("../../lib/utils.cjs.js"),bn=require("../ui/loading-overlay-card.cjs.js"),vn=require("../ContentRender/ContentRender.cjs.js"),At=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const Rt=require("../../lib/interaction-defaults.cjs.js"),ye=require("../../lib/mobileDevice.cjs.js"),Sn=require("./Player.cjs.js"),En=require("./SubtitleOverlay.cjs.js"),yn=require("./useSlide.cjs.js"),gn=require("./useWakePlayerFromIframe.cjs.js"),ie=require("./utils/mobileScreenMode.cjs.js"),An=require("./utils/interactionPlayback.cjs.js"),Rn=require("./utils/appendedMarkerAdvance.cjs.js"),It=require("./utils/playbackSequence.cjs.js"),wt=require("./utils/playerCustomActions.cjs.js"),In=require("./utils/playbackTimeStore.cjs.js"),wn=require("./utils/playerToggleMode.cjs.js");;/* empty css */const Cn=require("../../markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/chevron-left.cjs.js"),_n=2e3,Mn=300,kn=160,Tn=16,Le="waitingForAudio",Ct={waitingForAudio:"Waiting for current slide audio...",loadingAudio:"Loading current slide audio...",waitingForMoreAudio:"Waiting for more current slide audio..."},Pn=(h,S)=>typeof h=="string"?h:h[S]??h[Le]??Ct[S],jn=(h,S)=>S?h!=="loadingAudio":!1,_t=e.memo(({content:h,title:S,defaultButtonText:E,defaultInputText:Y,defaultSelectedValues:y,confirmButtonText:q,copyButtonText:X,copiedButtonText:ge,onSend:Ae,readonly:O=!1})=>r.jsxRuntimeExports.jsxs("div",{className:"slide-player__interaction-card",children:[r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-header",children:r.jsxRuntimeExports.jsx("p",{className:"slide-player__interaction-title",children:S})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(vn.default,{content:h,defaultButtonText:E,defaultInputText:Y,defaultSelectedValues:y,confirmButtonText:q,copyButtonText:X,copiedButtonText:ge,onSend:Ae,readonly:O,enableTypewriter:!1,sandboxMode:"content"})})]}));_t.displayName="InteractionOverlayCard";const Fn=(h,S)=>h.length===S.length&&h.every((E,Y)=>{const y=S[Y];return E.sequence_number===y?.sequence_number&&E.type===y?.type&&E.content===y?.content}),Bn=({elementList:h=[],showPlayer:S=!0,playerAlwaysVisible:E=!1,playerClassName:Y,fullscreenHeader:y,playerCustomActions:q,playerCustomActionPauseOnActive:X=!0,bufferingText:ge=Ct,interactionTitle:Ae,interactionTexts:O,playerTexts:Mt,playerAutoHideDelay:Re=3e3,markerAutoAdvanceDelay:Ke=_n,interactionDefaultValueOptions:ce,onSend:Ve,onPlayerVisibilityChange:Ie,onMobileViewModeChange:De,onStepChange:Ue,enableIframeScaling:kt=!0,disableLoadingOverlay:R=!1,className:Tt,onPointerDown:We,...Pt})=>{const ae=e.useRef(null),Ge=e.useRef(null),we=e.useRef(null),He=e.useRef(null),J=e.useRef(null),Q=e.useRef(null),Z=e.useRef(null),ee=e.useRef(null),ze=e.useRef(null),$e=e.useRef([]),de=e.useRef(!1),L=e.useRef(null),Ye=e.useRef(null),Xe=e.useRef({markerCount:0,currentIndex:-1,canGoNext:!1}),{currentElementList:_,stepElementLists:Je,slideElementList:M,currentIndex:c,audioList:d,currentAudioSequenceIndexes:fe,currentStepHasSpeakableElement:x,currentInteractionElement:i,canGoPrev:jt,canGoNext:v,handlePrev:Qe,handleNext:I}=yn.default(h),te=e.useMemo(()=>{if(!(c<0))return M[c]},[c,M]),Ft=M.filter(t=>t.is_renderable!==!1).length===1,g=S&&(M.length>0||d.length>0||!!i),P=e.useMemo(()=>fe.map(t=>d[t]?.audioKey).filter(t=>!!t),[d,fe]),[Ze,me]=e.useState(!0),[pe,ne]=e.useState(!1),[re,et]=e.useState(!0),[f,K]=e.useState(null),[Bt,m]=e.useState(!1),[Nt,Ce]=e.useState(Le),[j,_e]=e.useState(!1),[tt,nt]=e.useState(null),[qt,Me]=e.useState(!1),[rt,Ot]=e.useState(!0),[ke,Te]=e.useState(!1),[s,Pe]=e.useState(),[he,xe]=e.useState(!1),[Lt,se]=e.useState(0),[st,Kt]=e.useState(!1),k=e.useMemo(()=>ye.isMobileDevice(),[]),[be,je]=e.useState(ie.DEFAULT_MOBILE_VIEW_MODE),[ot,Fe]=e.useState(!1),[Vt,ut]=e.useState(()=>k?ye.isLandscapeViewport():!1),V=e.useMemo(()=>In.createPlaybackTimeStore(),[]),{effectiveMobileViewMode:D,isImmersiveMobileFullscreen:U,isNativeMobileFullscreen:lt,shouldRotateFullscreenViewport:Dt}=e.useMemo(()=>ie.resolveMobileViewModeState({hasManualMobileViewMode:ot,isMobileDevice:k,mobileViewMode:be}),[ot,k,Vt,be]),Ut=e.useRef(D),w=g&&(E||Ze),Wt=U&&w,Gt=U&&w,Ht=U||lt,it=st&&!k,zt=e.useCallback(t=>{Fe(!0),je(t)},[]),ct=e.useCallback(()=>{Fe(!1),je(ie.DEFAULT_MOBILE_VIEW_MODE)},[]),$t=e.useCallback(()=>{ct(),y?.onBack?.()},[y,ct]),at=e.useCallback(t=>{Te(t)},[]),dt=e.useCallback(()=>{Te(t=>!t)},[]),{mountedStepStates:Yt,currentMountedStateIndex:Xt}=e.useMemo(()=>{const t=[],n=new Map;return Je.forEach((u,a)=>{const o=t.findIndex(l=>Fn(l.elementList,u));if(o>=0){t[o]?.sourceStepIndexes.push(a),n.set(a,o);return}t.push({elementList:u,sourceStepIndexes:[a]}),n.set(a,t.length-1)}),{mountedStepStates:t,currentMountedStateIndex:c>=0?n.get(c)??-1:-1}},[c,Je]),ft=e.useMemo(()=>String(c),[c]),p=e.useMemo(()=>f?d.findIndex(t=>(t.audioKey??"")===f):-1,[d,f]),Be=e.useMemo(()=>p>=0?d[p]:void 0,[d,p]),Jt=Be?.element?.subtitle_cues??[],ve=e.useMemo(()=>P[0]??"none",[P]),F=e.useMemo(()=>It.resolveNextPendingAudioKey({audioSequenceKeys:P,lastCompletedAudioKey:tt}),[P,tt]),Ne=e.useMemo(()=>({currentElement:wt.resolvePlayerCustomActionElement({currentAudioIndex:p,currentAudioSequenceIndexes:fe,audioList:d,currentInteractionElement:s,currentStepElement:te}),currentIndex:c,currentStepElement:te,isActive:ke,setActive:at,toggleActive:dt}),[s,d,p,fe,c,te,ke,at,dt]),qe=e.useMemo(()=>wt.getPlayerCustomActionCount(q,Ne),[Ne,q]),Qt=e.useMemo(()=>({"--slide-player-custom-action-count":String(qe),"--slide-player-mobile-control-count":String(qe+4)}),[qe]),mt=P.length>0,pt=e.useMemo(()=>i?`${i.sequence_number??"none"}:${String(i.content??"")}`:"none",[i]),oe=e.useMemo(()=>[ft,pt].join("|"),[pt,ft]),Zt=e.useMemo(()=>[oe,Be?.audioKey??"none",String(p)].join("|"),[p,Be?.audioKey,oe]),ht=!!e.useMemo(()=>!ve||ve==="none"?"":d.find(n=>n.audioKey===ve)?.audioUrl?.trim()??"",[d,ve]),B=X&&!!q&&ke,ue=e.useMemo(()=>wn.shouldUseAutoAdvanceToggle({canGoNext:v,currentAudioIndex:p,currentStepHasSpeakableElement:x,hasInteraction:!!i}),[v,p,i,x]),N=e.useCallback(()=>{J.current!==null&&(window.clearTimeout(J.current),J.current=null)},[]),T=e.useCallback(()=>{Z.current!==null&&(window.clearTimeout(Z.current),Z.current=null)},[]),C=e.useCallback(()=>{ee.current!==null&&(window.clearTimeout(ee.current),ee.current=null)},[]),W=e.useCallback(()=>{Q.current!==null&&(window.clearTimeout(Q.current),Q.current=null)},[]),G=e.useCallback(()=>{W(),T(),C(),K(null),V.reset(),m(!1),Ce(Le),_e(!1),nt(null),Me(!1),Pe(void 0),xe(!1),se(0)},[W,T,C,V]),H=e.useCallback(()=>F?(_e(!1),K(F),!0):!1,[F]),Se=e.useCallback(()=>{T(),C(),xe(!1),se(0),!H()&&v&&I()},[v,T,C,I,H]),xt=e.useCallback(t=>{if(C(),!t)return;const n=()=>{ee.current=null,se(kn),xe(!0),L.current=null};ee.current=window.setTimeout(n,Mn)},[C]),b=e.useCallback((t=pe)=>{g&&(me(!0),N(),!(E||!t||Re<=0)&&(J.current=window.setTimeout(()=>{me(!1),J.current=null},Re)))},[N,pe,E,Re,g]),le=!!(i?.readonly||i?.user_input?.trim()),z=!!i&&!le;e.useEffect(()=>{et(!0),X&&Te(!1)},[c,X]),e.useEffect(()=>()=>{W(),N(),T(),C()},[W,T,C,N]),e.useEffect(()=>(Ie?.(w),()=>{Ie?.(!1)}),[Ie,w]),e.useEffect(()=>{k||be===ie.DEFAULT_MOBILE_VIEW_MODE||(Fe(!1),je(ie.DEFAULT_MOBILE_VIEW_MODE))},[k,be]),e.useEffect(()=>{if(!k){ut(!1);return}const t=()=>{ut(ye.isLandscapeViewport())};return t(),ye.subscribeMobileDeviceChange(t)},[k]),e.useEffect(()=>{De?.(D)},[D,De]),e.useEffect(()=>{Ut.current=D},[D]),e.useEffect(()=>{Ue?.(te,c)},[c,te,Ue]),e.useEffect(()=>{const t=Xe.current,n=Rn.shouldAutoAdvanceIntoAppendedMarker({previousMarkerCount:t.markerCount,nextMarkerCount:M.length,previousIndex:t.currentIndex,previousCanGoNext:t.canGoNext,nextCanGoNext:v,currentAudioKey:f,hasCompletedCurrentStepAudio:j,hasResolvedCurrentInteraction:le,currentStepHasSpeakableElement:x,currentInteractionElement:i,isAutoAdvanceEnabled:re,shouldUseSilentStepAutoAdvanceToggle:ue});Xe.current={markerCount:M.length,currentIndex:c,canGoNext:v},n&&I()},[v,f,c,i,x,I,j,le,re,ue,M.length]),e.useEffect(()=>{if(!g){N(),me(!1);return}if(E){N(),me(!0);return}pe||b(!0)},[N,pe,E,g,b]),e.useEffect(()=>{if(typeof window>"u")return;const t=n=>{n.origin===window.location.origin&&xn.isSandboxInteractionMessage(n.data)&&n.data.eventType==="click"&&g&&(ne(!0),b(!0))};return window.addEventListener("message",t),()=>{window.removeEventListener("message",t)}},[g,b]),gn.default({sectionRef:ae,enabled:g,onWake:()=>{ne(!0),b(!0)}}),e.useEffect(()=>{const{hasPlaybackContextChanged:t,shouldInitializeAudioSequence:n}=It.getPlaybackSequenceTransition({previousResetKey:Ye.current,nextResetKey:oe,currentAudioKey:f,hasCompletedCurrentStepAudio:j});Ye.current=oe;const u=L.current===c&&!!i,a=An.shouldPresentInteractionOverlay({hasInteraction:!!i,shouldBlockPlaybackForInteraction:z,shouldOpenInteractionOverlayAfterAudio:u,hasPlaybackContextChanged:t,hasResolvedCurrentInteraction:le,currentStepHasSpeakableElement:x});if(t&&G(),!(_.length===0&&!i)&&!B){if(i&&Pe(i),a){xt(i);return}if(C(),L.current=null,!!n&&!H()){if(x){if(R){m(!1);return}m(!0);return}if(v&&!(ue&&!re))return Q.current=window.setTimeout(()=>{Q.current=null,I()},Ke),()=>{W()}}}},[v,W,_.length,i,f,oe,x,Ke,I,j,R,re,le,z,C,G,xt,H,B,ue]),e.useEffect(()=>{if(R||B||!x||z){m(!1);return}if(j&&!F){m(!1);return}if(mt){m(!1);return}Ce("waitingForAudio"),m(!0)},[mt,x,j,F,R,B,z]),e.useEffect(()=>{f||!F||B||!x||z||H()},[f,F,x,B,z,H]),e.useEffect(()=>{!f||p>=0||K(null)},[p,f]),e.useEffect(()=>{p>=0||V.reset()},[p,V]),e.useEffect(()=>{Me(!1)},[Zt]);const bt=e.useMemo(()=>{if(!s)return{};const t=!!s.user_input?.trim();return Rt.getInteractionDefaultValues(typeof s.content=="string"?s.content:void 0,s.user_input,t?void 0:ce)},[s,ce]),en=e.useMemo(()=>{if(!s)return;const t=!!s.user_input?.trim();return Rt.getInteractionDefaultSelectedValues(typeof s.content=="string"?s.content:void 0,s.user_input,t?void 0:ce)},[s,ce]),vt=!!s?.user_input?.trim(),St=!!s?.readonly||vt,Et=St||vt,Oe=!!s&&he,tn=e.useCallback(t=>{const u=[...t.selectedValues??[],t.inputText?.trim()??"",t.buttonText?.trim()??""].filter(Boolean).join(", ");Pe(a=>!a||!u?a:{...a,user_input:u}),Ve?.(t,s),Se()},[s,Se,Ve]);e.useEffect(()=>{const t=()=>{Kt(document.fullscreenElement===ae.current)};return t(),document.addEventListener("fullscreenchange",t),()=>{document.removeEventListener("fullscreenchange",t)}},[]),e.useEffect(()=>{if(!Oe){se(0);return}const t=ze.current;if(!t)return;const n=()=>{const a=Math.ceil(t.getBoundingClientRect().height);se(a+Tn)};if(n(),typeof ResizeObserver>"u")return;const u=new ResizeObserver(()=>{n()});return u.observe(t),()=>{u.disconnect()}},[Oe]),e.useEffect(()=>{if(T(),!(!he||!Et))return Z.current=window.setTimeout(()=>{Z.current=null,Se()},2e3),()=>{T()}},[T,Se,he,Et]);const nn=(t,n={})=>t?t.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:t.content}):t.type==="html"?r.jsxRuntimeExports.jsx(At.default,{className:"content-render-iframe",disableLoadingOverlay:R,hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:t.content,enableScaling:kt}):r.jsxRuntimeExports.jsx(At.default,{className:"content-render-iframe",disableLoadingOverlay:R,hideFullScreen:!0,mode:"blackboard",type:"markdown",content:t.content}):null,rn=(t=[],n=!1)=>{if(t.length===0)return null;const u=t.filter(o=>o.is_renderable!==!1).length,a=t.reduce((o,l,A)=>l.is_renderable!==!1?A:o,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:t.map((o,l)=>{const A=o.type==="html"&&o.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&l===a?He:null,"aria-hidden":A||void 0,className:$.cn("w-full shrink-0",u===1&&o.is_renderable!==!1&&"slide-element--single",A?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":o.is_renderable===!1&&"hidden"),children:nn(o,{replaceRootScreenHeightWithFull:u===1&&o.type==="html"&&o.is_renderable!==!1})},o.sequence_number??`${o.type}-${l}`)})})},sn=e.useCallback(()=>{const t=ae.current;if(t){if(document.fullscreenElement===t){document.exitFullscreen().catch(()=>{});return}t.requestFullscreen?.().catch(()=>{})}},[]),yt=e.useCallback(()=>{const t=we.current;t&&t.scrollTo({top:t.scrollHeight,behavior:"smooth"})},[]),on=e.useCallback(()=>{de.current=!0,L.current=null,ne(!0),m(!1),b(!0),G(),Qe()},[Qe,G,b]),un=e.useCallback(()=>{de.current=!0,L.current=null,ne(!0),m(!1),b(!0),G(),I()},[I,G,b]),ln=e.useCallback(({loading:t,reason:n})=>{if(R){m(!1);return}if(!x||j){m(!1);return}t&&n&&Ce(n),m(jn(n,t))},[x,j,R]);e.useEffect(()=>{R&&m(!1)},[R]);const cn=e.useCallback(t=>{const n=d[t]?.audioKey;if(!n||!f||n!==f)return;const u=P.findIndex(l=>l===n);if(u<0){K(null);return}const a=u+1,o=P[a];if(o){K(o);return}if(K(null),nt(n),_e(!0),m(!1),v){const l=c+1,A=M[l];ht&&A?.type==="interaction"&&(L.current=l),I();return}},[d,v,c,f,P,I,ht,M]),an=e.useCallback(()=>{s&&xe(t=>!t)},[s]),gt=e.useCallback(t=>{t.stopPropagation(),w&&b(!0)},[Ze,b]),dn=e.useCallback(t=>{We?.(t)},[We]),fn=e.useCallback(()=>{ne(!0),b(!0)},[b]),Ee=e.useMemo(()=>_.map((t,n)=>`${t.sequence_number??`${t.type}-${n}`}:${String(t.is_new??"")}`),[_]);return e.useEffect(()=>{const t=$e.current,a=(t.length>0&&t.length<Ee.length&&t.every((l,A)=>l===Ee[A])?_.slice(t.length):[]).some(l=>l.is_new===!1);if($e.current=Ee,!a)return;const o=window.requestAnimationFrame(()=>{const l=we.current,A=He.current;if(!l||!A)return;const mn=l.getBoundingClientRect(),pn=A.getBoundingClientRect(),hn=l.scrollTop+(pn.top-mn.top);l.scrollTo({top:Math.max(hn,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(o)}},[_,Ee]),e.useEffect(()=>{if(!de.current||(de.current=!1,_.length===0))return;const t=window.requestAnimationFrame(()=>{yt()});return()=>{window.cancelAnimationFrame(t)}},[_,yt]),r.jsxRuntimeExports.jsxs("section",{ref:ae,className:$.cn("relative h-full w-full",k&&"slide--mobile-device",it&&"slide--browser-fullscreen",U&&"slide--mobile-landscape",lt&&"slide--mobile-landscape-native",Tt),onClick:fn,onPointerDown:dn,...Pt,children:[Ht?r.jsxRuntimeExports.jsx("div",{"aria-hidden":"true",className:"pointer-events-none fixed left-0 top-0 z-[9999] h-[100vh] max-h-[100vh] w-[100vw]"}):null,r.jsxRuntimeExports.jsxs("div",{ref:Ge,className:$.cn("slide__viewport relative h-full min-h-0 w-full",U&&"slide__viewport--mobile-landscape",U&&!Dt&&"slide__viewport--mobile-landscape-native"),children:[Wt?r.jsxRuntimeExports.jsxs("div",{className:"slide-landscape-header",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":y?.backAriaLabel??"Back",className:"slide-landscape-header__back",onClick:$t,type:"button",children:r.jsxRuntimeExports.jsx(Cn.default,{className:"slide-landscape-header__icon h-6 w-6",strokeWidth:2.25})}),y?.content?r.jsxRuntimeExports.jsx("div",{className:"min-w-0 flex-1 overflow-hidden",children:y.content}):null]}):null,r.jsxRuntimeExports.jsx("div",{className:$.cn("h-full min-h-0 w-full",Gt&&"slide__viewport-content--with-header",Ft?"slide-content--single":"grid gap-4"),children:_.length>0?r.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:r.jsxRuntimeExports.jsx("div",{ref:we,className:"slide-stage__layer w-full",children:Yt.map((t,n)=>{const u=n===Xt;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!u||void 0,className:"w-full h-full",style:{display:u?void 0:"none"},children:rn(t.elementList,u)},t.sourceStepIndexes[0]??n)})})}):null}),Bt?r.jsxRuntimeExports.jsx(bn.default,{message:Pn(ge,Nt),className:"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2"}):null,r.jsxRuntimeExports.jsx(En.default,{extraBottomOffset:Lt,hasPlayerGap:w,isEnabled:rt&&qt,isPlayerHidden:g&&!w,playbackTimeStore:V,subtitleCues:Jt}),Oe?r.jsxRuntimeExports.jsx("div",{ref:ze,className:$.cn("slide-interaction-overlay",w&&g?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:gt,onPointerDown:gt,style:Qt,children:r.jsxRuntimeExports.jsx(_t,{content:String(s?.content??""),defaultButtonText:bt.buttonText??"",defaultInputText:bt.inputText??"",defaultSelectedValues:en,confirmButtonText:O?.confirmButtonText,copyButtonText:O?.copyButtonText,copiedButtonText:O?.copiedButtonText,onSend:tn,readonly:St,title:O?.title??Ae??"Submit the content below to continue."})}):null,g?r.jsxRuntimeExports.jsx(Sn.default,{audioList:d,className:$.cn("absolute left-1/2 z-[2] -translate-x-1/2",it?"bottom-3":"-bottom-3",Y,!w&&"pointer-events-none opacity-0"),currentAudioIndex:p,defaultPlaying:!0,isPlaybackPaused:B,isAutoAdvanceEnabled:re,hasInteraction:!!s,isInteractionOpen:he,isSubtitleEnabled:rt,onAutoAdvanceToggle:et,onLoadingChange:ln,onPlaybackStarted:()=>{Me(!0)},onPlaybackTimeChange:V.setTime,onSubtitleToggle:()=>{Ot(t=>!t)},nextDisabled:!v,onEnded:cn,onFullscreen:sn,isFullscreen:st,mobileViewMode:D,settingsPortalContainer:Ge.current,onMobileViewModeChange:zt,onInteractionToggle:an,onNext:un,onPrev:on,prevDisabled:!jt,showControls:w,texts:Mt,customActionContext:Ne,customActions:q,useAutoAdvanceToggle:ue}):null]})]})};exports.default=Bn;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../_virtual/jsx-runtime.cjs.js"),t=require("react"),fn=require("../../lib/sandboxInteraction.cjs.js"),z=require("../../lib/utils.cjs.js"),mn=require("../ui/loading-overlay-card.cjs.js"),pn=require("../ContentRender/ContentRender.cjs.js"),St=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const yt=require("../../lib/interaction-defaults.cjs.js"),Se=require("../../lib/mobileDevice.cjs.js"),hn=require("./Player.cjs.js"),xn=require("./SubtitleOverlay.cjs.js"),bn=require("./useSlide.cjs.js"),vn=require("./useWakePlayerFromIframe.cjs.js"),le=require("./utils/mobileScreenMode.cjs.js"),En=require("./utils/interactionPlayback.cjs.js"),Sn=require("./utils/appendedMarkerAdvance.cjs.js"),yn=require("./utils/playbackSequence.cjs.js"),gt=require("./utils/playerCustomActions.cjs.js"),gn=require("./utils/playbackTimeStore.cjs.js"),An=require("./utils/playerToggleMode.cjs.js");;/* empty css */const Rn=require("../../markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/chevron-left.cjs.js"),In=2e3,wn=300,_n=160,Cn=16,qe="waitingForAudio",At={waitingForAudio:"Waiting for current slide audio...",loadingAudio:"Loading current slide audio...",waitingForMoreAudio:"Waiting for more current slide audio..."},Mn=(h,E)=>typeof h=="string"?h:h[E]??h[qe]??At[E],kn=(h,E)=>E?h!=="loadingAudio":!1,Rt=t.memo(({content:h,title:E,defaultButtonText:S,defaultInputText:$,defaultSelectedValues:y,confirmButtonText:N,copyButtonText:Y,copiedButtonText:ye,onSend:ge,readonly:q=!1})=>r.jsxRuntimeExports.jsxs("div",{className:"slide-player__interaction-card",children:[r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-header",children:r.jsxRuntimeExports.jsx("p",{className:"slide-player__interaction-title",children:E})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(pn.default,{content:h,defaultButtonText:S,defaultInputText:$,defaultSelectedValues:y,confirmButtonText:N,copyButtonText:Y,copiedButtonText:ye,onSend:ge,readonly:q,enableTypewriter:!1,sandboxMode:"content"})})]}));Rt.displayName="InteractionOverlayCard";const Tn=(h,E)=>h.length===E.length&&h.every((S,$)=>{const y=E[$];return S.sequence_number===y?.sequence_number&&S.type===y?.type&&S.content===y?.content}),Pn=({elementList:h=[],showPlayer:E=!0,playerAlwaysVisible:S=!1,playerClassName:$,fullscreenHeader:y,playerCustomActions:N,playerCustomActionPauseOnActive:Y=!0,bufferingText:ye=At,interactionTitle:ge,interactionTexts:q,playerTexts:It,playerAutoHideDelay:Ae=3e3,markerAutoAdvanceDelay:Oe=In,interactionDefaultValueOptions:ie,onSend:Le,onPlayerVisibilityChange:Re,onMobileViewModeChange:Ve,onStepChange:De,enableIframeScaling:wt=!0,disableLoadingOverlay:R=!1,className:_t,onPointerDown:Ke,...Ct})=>{const ce=t.useRef(null),Ue=t.useRef(null),Ie=t.useRef(null),We=t.useRef(null),X=t.useRef(null),J=t.useRef(null),Q=t.useRef(null),Z=t.useRef(null),Ge=t.useRef(null),He=t.useRef([]),ae=t.useRef(!1),O=t.useRef(null),ze=t.useRef(null),$e=t.useRef({markerCount:0,currentIndex:-1,canGoNext:!1}),{currentElementList:k,stepElementLists:Ye,slideElementList:T,currentIndex:c,audioList:d,currentAudioSequenceIndexes:de,currentStepHasSpeakableElement:x,currentInteractionElement:i,canGoPrev:Mt,canGoNext:v,handlePrev:Xe,handleNext:I}=bn.default(h),ee=t.useMemo(()=>{if(!(c<0))return T[c]},[c,T]),kt=T.filter(e=>e.is_renderable!==!1).length===1,g=E&&(T.length>0||d.length>0||!!i),w=t.useMemo(()=>de.map(e=>d[e]?.audioKey).filter(e=>!!e),[d,de]),[Je,fe]=t.useState(!0),[me,te]=t.useState(!1),[ne,Qe]=t.useState(!0),[f,L]=t.useState(null),[Tt,m]=t.useState(!1),[Pt,we]=t.useState(qe),[_,Ze]=t.useState(!1),[jt,_e]=t.useState(!1),[et,Ft]=t.useState(!0),[Ce,Me]=t.useState(!1),[s,ke]=t.useState(),[pe,he]=t.useState(!1),[Bt,re]=t.useState(0),[tt,Nt]=t.useState(!1),P=t.useMemo(()=>Se.isMobileDevice(),[]),[xe,Te]=t.useState(le.DEFAULT_MOBILE_VIEW_MODE),[nt,Pe]=t.useState(!1),[qt,rt]=t.useState(()=>P?Se.isLandscapeViewport():!1),V=t.useMemo(()=>gn.createPlaybackTimeStore(),[]),{effectiveMobileViewMode:D,isImmersiveMobileFullscreen:K,isNativeMobileFullscreen:st,shouldRotateFullscreenViewport:Ot}=t.useMemo(()=>le.resolveMobileViewModeState({hasManualMobileViewMode:nt,isMobileDevice:P,mobileViewMode:xe}),[nt,P,qt,xe]),Lt=t.useRef(D),C=g&&(S||Je),Vt=K&&C,Dt=K&&C,Kt=K||st,ot=tt&&!P,Ut=t.useCallback(e=>{Pe(!0),Te(e)},[]),ut=t.useCallback(()=>{Pe(!1),Te(le.DEFAULT_MOBILE_VIEW_MODE)},[]),Wt=t.useCallback(()=>{ut(),y?.onBack?.()},[y,ut]),lt=t.useCallback(e=>{Me(e)},[]),it=t.useCallback(()=>{Me(e=>!e)},[]),{mountedStepStates:Gt,currentMountedStateIndex:Ht}=t.useMemo(()=>{const e=[],n=new Map;return Ye.forEach((u,a)=>{const o=e.findIndex(l=>Tn(l.elementList,u));if(o>=0){e[o]?.sourceStepIndexes.push(a),n.set(a,o);return}e.push({elementList:u,sourceStepIndexes:[a]}),n.set(a,e.length-1)}),{mountedStepStates:e,currentMountedStateIndex:c>=0?n.get(c)??-1:-1}},[c,Ye]),ct=t.useMemo(()=>String(c),[c]),p=t.useMemo(()=>f?d.findIndex(e=>(e.audioKey??"")===f):-1,[d,f]),je=t.useMemo(()=>p>=0?d[p]:void 0,[d,p]),zt=je?.element?.subtitle_cues??[],be=t.useMemo(()=>w[0]??"none",[w]),Fe=t.useMemo(()=>({currentElement:gt.resolvePlayerCustomActionElement({currentAudioIndex:p,currentAudioSequenceIndexes:de,audioList:d,currentInteractionElement:s,currentStepElement:ee}),currentIndex:c,currentStepElement:ee,isActive:Ce,setActive:lt,toggleActive:it}),[s,d,p,de,c,ee,Ce,lt,it]),Be=t.useMemo(()=>gt.getPlayerCustomActionCount(N,Fe),[Fe,N]),$t=t.useMemo(()=>({"--slide-player-custom-action-count":String(Be),"--slide-player-mobile-control-count":String(Be+4)}),[Be]),at=w.length>0,dt=t.useMemo(()=>i?`${i.sequence_number??"none"}:${String(i.content??"")}`:"none",[i]),se=t.useMemo(()=>[ct,dt].join("|"),[dt,ct]),Yt=t.useMemo(()=>[se,je?.audioKey??"none",String(p)].join("|"),[p,je?.audioKey,se]),ft=!!t.useMemo(()=>!be||be==="none"?"":d.find(n=>n.audioKey===be)?.audioUrl?.trim()??"",[d,be]),F=Y&&!!N&&Ce,oe=t.useMemo(()=>An.shouldUseAutoAdvanceToggle({canGoNext:v,currentAudioIndex:p,currentStepHasSpeakableElement:x,hasInteraction:!!i}),[v,p,i,x]),B=t.useCallback(()=>{X.current!==null&&(window.clearTimeout(X.current),X.current=null)},[]),j=t.useCallback(()=>{Q.current!==null&&(window.clearTimeout(Q.current),Q.current=null)},[]),M=t.useCallback(()=>{Z.current!==null&&(window.clearTimeout(Z.current),Z.current=null)},[]),U=t.useCallback(()=>{J.current!==null&&(window.clearTimeout(J.current),J.current=null)},[]),W=t.useCallback(()=>{U(),j(),M(),L(null),V.reset(),m(!1),we(qe),Ze(!1),_e(!1),ke(void 0),he(!1),re(0)},[U,j,M,V]),G=t.useCallback(()=>{const e=w[0];return e?(L(e),!0):!1},[w]),ve=t.useCallback(()=>{j(),M(),he(!1),re(0),!G()&&v&&I()},[v,j,M,I,G]),mt=t.useCallback(e=>{if(M(),!e)return;const n=()=>{Z.current=null,re(_n),he(!0),O.current=null};Z.current=window.setTimeout(n,wn)},[M]),b=t.useCallback((e=me)=>{g&&(fe(!0),B(),!(S||!e||Ae<=0)&&(X.current=window.setTimeout(()=>{fe(!1),X.current=null},Ae)))},[B,me,S,Ae,g]),ue=!!(i?.readonly||i?.user_input?.trim()),H=!!i&&!ue;t.useEffect(()=>{Qe(!0),Y&&Me(!1)},[c,Y]),t.useEffect(()=>()=>{U(),B(),j(),M()},[U,j,M,B]),t.useEffect(()=>(Re?.(C),()=>{Re?.(!1)}),[Re,C]),t.useEffect(()=>{P||xe===le.DEFAULT_MOBILE_VIEW_MODE||(Pe(!1),Te(le.DEFAULT_MOBILE_VIEW_MODE))},[P,xe]),t.useEffect(()=>{if(!P){rt(!1);return}const e=()=>{rt(Se.isLandscapeViewport())};return e(),Se.subscribeMobileDeviceChange(e)},[P]),t.useEffect(()=>{Ve?.(D)},[D,Ve]),t.useEffect(()=>{Lt.current=D},[D]),t.useEffect(()=>{De?.(ee,c)},[c,ee,De]),t.useEffect(()=>{const e=$e.current,n=Sn.shouldAutoAdvanceIntoAppendedMarker({previousMarkerCount:e.markerCount,nextMarkerCount:T.length,previousIndex:e.currentIndex,previousCanGoNext:e.canGoNext,nextCanGoNext:v,currentAudioKey:f,hasCompletedCurrentStepAudio:_,hasResolvedCurrentInteraction:ue,currentStepHasSpeakableElement:x,currentInteractionElement:i,isAutoAdvanceEnabled:ne,shouldUseSilentStepAutoAdvanceToggle:oe});$e.current={markerCount:T.length,currentIndex:c,canGoNext:v},n&&I()},[v,f,c,i,x,I,_,ue,ne,oe,T.length]),t.useEffect(()=>{if(!g){B(),fe(!1);return}if(S){B(),fe(!0);return}me||b(!0)},[B,me,S,g,b]),t.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.origin===window.location.origin&&fn.isSandboxInteractionMessage(n.data)&&n.data.eventType==="click"&&g&&(te(!0),b(!0))};return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}},[g,b]),vn.default({sectionRef:ce,enabled:g,onWake:()=>{te(!0),b(!0)}}),t.useEffect(()=>{const{hasPlaybackContextChanged:e,shouldInitializeAudioSequence:n}=yn.getPlaybackSequenceTransition({previousResetKey:ze.current,nextResetKey:se,currentAudioKey:f,hasCompletedCurrentStepAudio:_});ze.current=se;const u=O.current===c&&!!i,a=En.shouldPresentInteractionOverlay({hasInteraction:!!i,shouldBlockPlaybackForInteraction:H,shouldOpenInteractionOverlayAfterAudio:u,hasPlaybackContextChanged:e,hasResolvedCurrentInteraction:ue,currentStepHasSpeakableElement:x});if(e&&W(),!(k.length===0&&!i)&&!F){if(i&&ke(i),a){mt(i);return}if(M(),O.current=null,!!n&&!G()){if(x){if(R){m(!1);return}m(!0);return}if(v&&!(oe&&!ne))return J.current=window.setTimeout(()=>{J.current=null,I()},Oe),()=>{U()}}}},[v,U,k.length,i,f,se,x,Oe,I,_,R,ne,ue,H,M,W,mt,G,F,oe]),t.useEffect(()=>{if(R||F||!x||H){m(!1);return}if(_){m(!1);return}if(at){m(!1);return}we("waitingForAudio"),m(!0)},[at,x,_,R,F,H]),t.useEffect(()=>{f||w.length===0||F||!x||H||_||G()},[f,w,x,_,F,H,G]),t.useEffect(()=>{!f||p>=0||L(null)},[p,f]),t.useEffect(()=>{p>=0||V.reset()},[p,V]),t.useEffect(()=>{_e(!1)},[Yt]);const pt=t.useMemo(()=>{if(!s)return{};const e=!!s.user_input?.trim();return yt.getInteractionDefaultValues(typeof s.content=="string"?s.content:void 0,s.user_input,e?void 0:ie)},[s,ie]),Xt=t.useMemo(()=>{if(!s)return;const e=!!s.user_input?.trim();return yt.getInteractionDefaultSelectedValues(typeof s.content=="string"?s.content:void 0,s.user_input,e?void 0:ie)},[s,ie]),ht=!!s?.user_input?.trim(),xt=!!s?.readonly||ht,bt=xt||ht,Ne=!!s&&pe,Jt=t.useCallback(e=>{const u=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");ke(a=>!a||!u?a:{...a,user_input:u}),Le?.(e,s),ve()},[s,ve,Le]);t.useEffect(()=>{const e=()=>{Nt(document.fullscreenElement===ce.current)};return e(),document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]),t.useEffect(()=>{if(!Ne){re(0);return}const e=Ge.current;if(!e)return;const n=()=>{const a=Math.ceil(e.getBoundingClientRect().height);re(a+Cn)};if(n(),typeof ResizeObserver>"u")return;const u=new ResizeObserver(()=>{n()});return u.observe(e),()=>{u.disconnect()}},[Ne]),t.useEffect(()=>{if(j(),!(!pe||!bt))return Q.current=window.setTimeout(()=>{Q.current=null,ve()},2e3),()=>{j()}},[j,ve,pe,bt]);const Qt=(e,n={})=>e?e.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?r.jsxRuntimeExports.jsx(St.default,{className:"content-render-iframe",disableLoadingOverlay:R,hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:e.content,enableScaling:wt}):r.jsxRuntimeExports.jsx(St.default,{className:"content-render-iframe",disableLoadingOverlay:R,hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,Zt=(e=[],n=!1)=>{if(e.length===0)return null;const u=e.filter(o=>o.is_renderable!==!1).length,a=e.reduce((o,l,A)=>l.is_renderable!==!1?A:o,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((o,l)=>{const A=o.type==="html"&&o.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&l===a?We:null,"aria-hidden":A||void 0,className:z.cn("w-full shrink-0",u===1&&o.is_renderable!==!1&&"slide-element--single",A?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":o.is_renderable===!1&&"hidden"),children:Qt(o,{replaceRootScreenHeightWithFull:u===1&&o.type==="html"&&o.is_renderable!==!1})},o.sequence_number??`${o.type}-${l}`)})})},en=t.useCallback(()=>{const e=ce.current;if(e){if(document.fullscreenElement===e){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},[]),vt=t.useCallback(()=>{const e=Ie.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),tn=t.useCallback(()=>{ae.current=!0,O.current=null,te(!0),m(!1),b(!0),W(),Xe()},[Xe,W,b]),nn=t.useCallback(()=>{ae.current=!0,O.current=null,te(!0),m(!1),b(!0),W(),I()},[I,W,b]),rn=t.useCallback(({loading:e,reason:n})=>{if(R){m(!1);return}if(!x||_){m(!1);return}e&&n&&we(n),m(kn(n,e))},[x,_,R]);t.useEffect(()=>{R&&m(!1)},[R]);const sn=t.useCallback(e=>{const n=d[e]?.audioKey;if(!n||!f||n!==f)return;const u=w.findIndex(l=>l===n);if(u<0){L(null);return}const a=u+1,o=w[a];if(o){L(o);return}if(L(null),Ze(!0),m(!1),v){const l=c+1,A=T[l];ft&&A?.type==="interaction"&&(O.current=l),I();return}},[d,v,c,f,w,I,ft,T]),on=t.useCallback(()=>{s&&he(e=>!e)},[s]),Et=t.useCallback(e=>{e.stopPropagation(),C&&b(!0)},[Je,b]),un=t.useCallback(e=>{Ke?.(e)},[Ke]),ln=t.useCallback(()=>{te(!0),b(!0)},[b]),Ee=t.useMemo(()=>k.map((e,n)=>`${e.sequence_number??`${e.type}-${n}`}:${String(e.is_new??"")}`),[k]);return t.useEffect(()=>{const e=He.current,a=(e.length>0&&e.length<Ee.length&&e.every((l,A)=>l===Ee[A])?k.slice(e.length):[]).some(l=>l.is_new===!1);if(He.current=Ee,!a)return;const o=window.requestAnimationFrame(()=>{const l=Ie.current,A=We.current;if(!l||!A)return;const cn=l.getBoundingClientRect(),an=A.getBoundingClientRect(),dn=l.scrollTop+(an.top-cn.top);l.scrollTo({top:Math.max(dn,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(o)}},[k,Ee]),t.useEffect(()=>{if(!ae.current||(ae.current=!1,k.length===0))return;const e=window.requestAnimationFrame(()=>{vt()});return()=>{window.cancelAnimationFrame(e)}},[k,vt]),r.jsxRuntimeExports.jsxs("section",{ref:ce,className:z.cn("relative h-full w-full",P&&"slide--mobile-device",ot&&"slide--browser-fullscreen",K&&"slide--mobile-landscape",st&&"slide--mobile-landscape-native",_t),onClick:ln,onPointerDown:un,...Ct,children:[Kt?r.jsxRuntimeExports.jsx("div",{"aria-hidden":"true",className:"pointer-events-none fixed left-0 top-0 z-[9999] h-[100vh] max-h-[100vh] w-[100vw]"}):null,r.jsxRuntimeExports.jsxs("div",{ref:Ue,className:z.cn("slide__viewport relative h-full min-h-0 w-full",K&&"slide__viewport--mobile-landscape",K&&!Ot&&"slide__viewport--mobile-landscape-native"),children:[Vt?r.jsxRuntimeExports.jsxs("div",{className:"slide-landscape-header",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":y?.backAriaLabel??"Back",className:"slide-landscape-header__back",onClick:Wt,type:"button",children:r.jsxRuntimeExports.jsx(Rn.default,{className:"slide-landscape-header__icon h-6 w-6",strokeWidth:2.25})}),y?.content?r.jsxRuntimeExports.jsx("div",{className:"min-w-0 flex-1 overflow-hidden",children:y.content}):null]}):null,r.jsxRuntimeExports.jsx("div",{className:z.cn("h-full min-h-0 w-full",Dt&&"slide__viewport-content--with-header",kt?"slide-content--single":"grid gap-4"),children:k.length>0?r.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:r.jsxRuntimeExports.jsx("div",{ref:Ie,className:"slide-stage__layer w-full",children:Gt.map((e,n)=>{const u=n===Ht;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!u||void 0,className:"w-full h-full",style:{display:u?void 0:"none"},children:Zt(e.elementList,u)},e.sourceStepIndexes[0]??n)})})}):null}),Tt?r.jsxRuntimeExports.jsx(mn.default,{message:Mn(ye,Pt),className:"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2"}):null,r.jsxRuntimeExports.jsx(xn.default,{extraBottomOffset:Bt,hasPlayerGap:C,isEnabled:et&&jt,isPlayerHidden:g&&!C,playbackTimeStore:V,subtitleCues:zt}),Ne?r.jsxRuntimeExports.jsx("div",{ref:Ge,className:z.cn("slide-interaction-overlay",C&&g?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:Et,onPointerDown:Et,style:$t,children:r.jsxRuntimeExports.jsx(Rt,{content:String(s?.content??""),defaultButtonText:pt.buttonText??"",defaultInputText:pt.inputText??"",defaultSelectedValues:Xt,confirmButtonText:q?.confirmButtonText,copyButtonText:q?.copyButtonText,copiedButtonText:q?.copiedButtonText,onSend:Jt,readonly:xt,title:q?.title??ge??"Submit the content below to continue."})}):null,g?r.jsxRuntimeExports.jsx(hn.default,{audioList:d,className:z.cn("absolute left-1/2 z-[2] -translate-x-1/2",ot?"bottom-3":"-bottom-3",$,!C&&"pointer-events-none opacity-0"),currentAudioIndex:p,defaultPlaying:!0,isPlaybackPaused:F,isAutoAdvanceEnabled:ne,hasInteraction:!!s,isInteractionOpen:pe,isSubtitleEnabled:et,onAutoAdvanceToggle:Qe,onLoadingChange:rn,onPlaybackStarted:()=>{_e(!0)},onPlaybackTimeChange:V.setTime,onSubtitleToggle:()=>{Ft(e=>!e)},nextDisabled:!v,onEnded:sn,onFullscreen:en,isFullscreen:tt,mobileViewMode:D,settingsPortalContainer:Ue.current,onMobileViewModeChange:Ut,onInteractionToggle:on,onNext:nn,onPrev:tn,prevDisabled:!Mt,showControls:C,texts:It,customActionContext:Fe,customActions:N,useAutoAdvanceToggle:oe}):null]})]})};exports.default=Pn;
|
|
2
2
|
//# sourceMappingURL=Slide.cjs.js.map
|