markdown-flow-ui 0.1.100-beta.4 → 0.1.100-beta.40
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/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-custom-variable.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-custom-variable.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-interaction.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-interaction.es.js +1 -1
- package/dist/_virtual/index.cjs3.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.es3.js +4 -5
- package/dist/_virtual/index.es3.js.map +1 -1
- package/dist/_virtual/index.es4.js +5 -4
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/assets/markdown-flow-ui.css +1 -1
- package/dist/components/ContentRender/ContentRender.cjs.js +2 -2
- package/dist/components/ContentRender/ContentRender.cjs.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.d.ts +13 -10
- package/dist/components/ContentRender/ContentRender.es.js +184 -160
- package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.cjs.js +5 -4
- package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.d.ts +1 -0
- package/dist/components/ContentRender/IframeSandbox.es.js +307 -210
- package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.cjs.js +3 -3
- package/dist/components/ContentRender/SandboxApp.cjs.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.d.ts +4 -0
- package/dist/components/ContentRender/SandboxApp.es.js +87 -80
- package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
- package/dist/components/ContentRender/index.cjs.js +1 -1
- package/dist/components/ContentRender/index.es.js +5 -6
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.js +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.js.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.es.js +68 -64
- package/dist/components/ContentRender/plugins/CustomVariable.es.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.d.ts +3 -0
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js +21 -18
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js.map +1 -1
- package/dist/components/Slide/Player.cjs.js +1 -1
- package/dist/components/Slide/Player.cjs.js.map +1 -1
- package/dist/components/Slide/Player.d.ts +3 -2
- package/dist/components/Slide/Player.es.js +228 -170
- 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.d.ts +10 -0
- package/dist/components/Slide/Slide.es.js +422 -270
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/dist/components/Slide/Slide.stories.d.ts +27 -1
- package/dist/components/Slide/index.d.ts +3 -3
- package/dist/components/Slide/types.d.ts +5 -6
- package/dist/components/Slide/useSlide.cjs.js +1 -1
- package/dist/components/Slide/useSlide.cjs.js.map +1 -1
- package/dist/components/Slide/useSlide.d.ts +4 -1
- package/dist/components/Slide/useSlide.es.js +125 -83
- package/dist/components/Slide/useSlide.es.js.map +1 -1
- package/dist/components/Slide/useWakePlayerFromIframe.cjs.js +2 -0
- package/dist/components/Slide/useWakePlayerFromIframe.cjs.js.map +1 -0
- package/dist/components/Slide/useWakePlayerFromIframe.d.ts +7 -0
- package/dist/components/Slide/useWakePlayerFromIframe.es.js +89 -0
- package/dist/components/Slide/useWakePlayerFromIframe.es.js.map +1 -0
- package/dist/components/Slide/utils/playerCustomActions.cjs.js +2 -0
- package/dist/components/Slide/utils/playerCustomActions.cjs.js.map +1 -0
- package/dist/components/Slide/utils/playerCustomActions.d.ts +3 -0
- package/dist/components/Slide/utils/playerCustomActions.es.js +7 -0
- package/dist/components/Slide/utils/playerCustomActions.es.js.map +1 -0
- package/dist/components/index.d.ts +4 -2
- package/dist/components/ui/inputGroup/textarea.cjs.js +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +24 -22
- package/dist/lib/interaction-defaults.cjs.js +2 -0
- package/dist/lib/interaction-defaults.cjs.js.map +1 -0
- package/dist/lib/interaction-defaults.es.js +106 -0
- package/dist/lib/interaction-defaults.es.js.map +1 -0
- package/dist/lib/sandboxInteraction.cjs.js +2 -0
- package/dist/lib/sandboxInteraction.cjs.js.map +1 -0
- package/dist/lib/sandboxInteraction.d.ts +8 -0
- package/dist/lib/sandboxInteraction.es.js +12 -0
- package/dist/lib/sandboxInteraction.es.js.map +1 -0
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/dist/renderer.cjs.js +1 -1
- package/dist/renderer.d.ts +5 -3
- package/dist/renderer.es.js +18 -16
- package/package.json +17 -2
- package/dist/components/Slide/interaction-defaults.cjs.js +0 -2
- package/dist/components/Slide/interaction-defaults.cjs.js.map +0 -1
- package/dist/components/Slide/interaction-defaults.es.js +0 -85
- package/dist/components/Slide/interaction-defaults.es.js.map +0 -1
- package/dist/lib/browserUserActivation.cjs.js +0 -2
- package/dist/lib/browserUserActivation.cjs.js.map +0 -1
- package/dist/lib/browserUserActivation.es.js +0 -13
- package/dist/lib/browserUserActivation.es.js.map +0 -1
- /package/dist/{components/Slide → lib}/interaction-defaults.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport \"./player.css\";\n\nexport type PlayerProps = React.ComponentProps<\"div\"> & {\n audioList?: SlideAudioItem[];\n currentAudioIndex?: number;\n defaultPlaying?: boolean;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n onEnded?: (audioIndex: number) => void;\n onPlayRequest?: () => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\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: React.FC<PlayerProps> = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n onPrev,\n onNext,\n onFullscreen,\n onEnded,\n onPlayRequest,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n ...props\n}) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\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 isWaitingForSegmentRef = useRef(false);\n const pendingAutoPlayRef = useRef(false);\n const pendingSeekTimeRef = useRef<number | null>(null);\n const isSwitchingSegmentRef = useRef(false);\n const [isPlaying, setIsPlaying] = useState(defaultPlaying);\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 currentAudioKey = `${currentAudioIndex}:${currentAudio?.serialNumber ?? \"none\"}:${currentAudioUrl ?? \"\"}`;\n\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\n\n useEffect(() => {\n currentAudioSegmentsRef.current = currentAudioSegments;\n }, [currentAudioSegments]);\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 resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n pendingAutoPlayRef.current = false;\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 setIsPlaying(false);\n }, [currentAudioIndex]);\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 pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n })\n .catch((_error: unknown) => {\n setIsPlaying(false);\n });\n }\n\n return true;\n },\n [currentAudioIndex]\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 pendingAutoPlayRef.current = defaultPlaying;\n\n const hasNewSrc = audioSrcRef.current !== nextAudioSrc;\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 (!defaultPlaying) {\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return true;\n }\n\n if (hasNewSrc) {\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [currentAudioIndex, defaultPlaying, getSegmentSrc, tryPlayCurrentAudio]\n );\n\n const finishAudioItem = useCallback(() => {\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n }, [currentAudioIndex, onEnded]);\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 setIsPlaying(defaultPlaying);\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [\n currentAudioIndex,\n defaultPlaying,\n finishAudioItem,\n startSegmentPlayback,\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 pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioSrcRef.current = null;\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 ]);\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 (currentAudioUrl) {\n const hasNewSrc = audioSrcRef.current !== currentAudioUrl;\n\n if (hasNewSrc) {\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = currentAudioUrl;\n audioElement.src = currentAudioUrl;\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 pendingAutoPlayRef.current = defaultPlaying;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n\n if (!defaultPlaying) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (!hasNewSrc) {\n tryPlayCurrentAudio(\"sync-url\");\n }\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (waitingSegmentIndexRef.current < currentAudioSegments.length) {\n startSegmentPlayback(waitingSegmentIndexRef.current, \"wait-resume\");\n return;\n }\n\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n setIsPlaying(defaultPlaying);\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n setIsPlaying(defaultPlaying);\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) {\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 resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n const handleAudioPlay = useCallback(() => {\n setIsPlaying(true);\n }, [currentAudioIndex]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n setIsPlaying(false);\n }, [currentAudioIndex]);\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 if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [currentAudioIndex, defaultPlaying, tryPlayCurrentAudio]);\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 }, [currentAudioIndex]);\n\n const handleAudioEnded = useCallback(() => {\n isSwitchingSegmentRef.current = false;\n\n if (\n currentAudioRef.current?.audioUrl ||\n currentAudioSegmentsRef.current.length === 0\n ) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [currentAudioIndex, finishAudioItem, handleSegmentEnded]);\n\n const handleAudioError = useCallback(() => {\n setIsPlaying(false);\n }, [currentAudioIndex]);\n\n return (\n <div className={cn(\"slide-player\", className)} {...props}>\n <audio\n ref={audioRef}\n preload=\"metadata\"\n playsInline\n onLoadedMetadata={handleLoadedMetadata}\n onCanPlay={handleAudioCanPlay}\n onPlay={handleAudioPlay}\n onPause={handleAudioPause}\n onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <div className=\"slide-player__controls\">\n <div className=\"slide-player__group\">\n <button aria-label=\"More options\" className=\"hidden\" type=\"button\">\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=\"Rewind\"\n className=\"slide-player__action\"\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={isPlaying ? \"Pause\" : \"Play\"}\n className=\"slide-player__toggle\"\n onClick={() => {\n const audioElement = audioRef.current;\n\n if (!audioElement || !currentAudio) {\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (isPlaying) {\n pendingAutoPlayRef.current = false;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n setIsPlaying(false);\n audioElement.pause();\n return;\n }\n\n onPlayRequest?.();\n pendingAutoPlayRef.current = true;\n setIsPlaying(true);\n return;\n }\n\n if (!audioElement.src && currentAudioSegments.length > 0) {\n // Only the player play button can unlock playback when autoplay is unavailable.\n onPlayRequest?.();\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 onPlayRequest?.();\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"toggle-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n }}\n type=\"button\"\n >\n {isPlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label=\"Fullscreen\"\n className=\"hidden\"\n onClick={onFullscreen}\n type=\"button\"\n >\n <Maximize className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n\n <div className=\"slide-player__separator\" />\n\n <div className=\"slide-player__group\">\n <button\n aria-label=\"Notes\"\n className={cn(\n \"slide-player__action\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default Player;\n"],"names":["PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","onPrev","onNext","onFullscreen","onEnded","onPlayRequest","onInteractionToggle","hasInteraction","isInteractionOpen","prevDisabled","nextDisabled","showControls","props","audioRef","useRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","isPlaying","setIsPlaying","useState","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","currentAudioKey","useEffect","getSegmentSrc","useCallback","audioData","resetAudio","audioElement","tryPlayCurrentAudio","_reason","playPromise","_error","startSegmentPlayback","segmentIndex","segment","nextAudioSrc","hasNewSrc","finishAudioItem","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioEnded","handleAudioError","cn","EllipsisVertical","Volume2","RotateCcw","RotateCw","Maximize","FilePenLine"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport { toPlayerCustomActionList } from \"./utils/playerCustomActions\";\nimport \"./player.css\";\n\nconst audioPreloadElementCache = new Map<string, HTMLAudioElement>();\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 onLoadingChange?: (loading: boolean) => void;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n onEnded?: (audioIndex: number) => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\n customActions?: React.ReactNode;\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: React.FC<PlayerProps> = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n onLoadingChange,\n onPrev,\n onNext,\n onFullscreen,\n onEnded,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n customActions,\n ...props\n}) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\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 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 playbackAccessModeRef = useRef<\n \"unknown\" | \"auto\" | \"manual\" | \"blocked\"\n >(\"unknown\");\n const [isPlaying, setIsPlaying] = useState(defaultPlaying);\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),\n [customActions]\n );\n const mobileVisibleActionCount = customActionList.length + 4;\n const controlsStyle = useMemo(\n () =>\n ({\n \"--slide-player-mobile-control-count\": String(mobileVisibleActionCount),\n }) as React.CSSProperties,\n [mobileVisibleActionCount]\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\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\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) => {\n if (isLoadingRef.current === loading) {\n return;\n }\n\n isLoadingRef.current = loading;\n onLoadingChange?.(loading);\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 !isPausedByUserRef.current &&\n playbackAccessModeRef.current !== \"blocked\"\n );\n }, [defaultPlaying]);\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 resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.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 setIsPlaying(false);\n updateLoading(false);\n }, [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 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 tryPlayCurrentAudio,\n updateLoading,\n ]\n );\n\n const finishAudioItem = useCallback(\n (_reason?: string) => {\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n updateLoading(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n },\n [currentAudioIndex, onEnded, updateLoading]\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 setIsPlaying(false);\n updateLoading(true);\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [defaultPlaying, finishAudioItem, startSegmentPlayback, updateLoading]);\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 pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n activeSourceTypeRef.current = null;\n audioSrcRef.current = null;\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 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 (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\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 canStartPlaybackAutomatically,\n resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n getWaitingSegmentSeekTime,\n updateLoading,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n const handleAudioPlay = useCallback(() => {\n setIsPlaying(true);\n updateLoading(false);\n }, [updateLoading]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n setIsPlaying(false);\n }, [currentAudioIndex]);\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 if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [currentAudioIndex, defaultPlaying, tryPlayCurrentAudio]);\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 }, [currentAudioIndex]);\n\n const handleAudioEnded = useCallback(() => {\n const shouldFinishAsUrl =\n activeSourceTypeRef.current === \"url\" ||\n currentAudioSegmentsRef.current.length === 0;\n\n isSwitchingSegmentRef.current = false;\n\n if (shouldFinishAsUrl) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [finishAudioItem, handleSegmentEnded]);\n\n const handleAudioError = useCallback(() => {\n setIsPlaying(false);\n updateLoading(false);\n }, [updateLoading]);\n\n return (\n <div className={cn(\"slide-player\", className)} {...props}>\n <audio\n ref={audioRef}\n preload=\"auto\"\n playsInline\n onLoadedMetadata={handleLoadedMetadata}\n onCanPlay={handleAudioCanPlay}\n onPlay={handleAudioPlay}\n onPause={handleAudioPause}\n onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <div className=\"slide-player__controls\" style={controlsStyle}>\n <div className=\"slide-player__group\">\n <button aria-label=\"More options\" className=\"hidden\" type=\"button\">\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=\"Rewind\"\n className=\"slide-player__action\"\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={isPlaying ? \"Pause\" : \"Play\"}\n className=\"slide-player__toggle\"\n onClick={() => {\n const audioElement = audioRef.current;\n\n if (!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);\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 {isPlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label=\"Fullscreen\"\n className=\"hidden\"\n onClick={onFullscreen}\n type=\"button\"\n >\n <Maximize className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\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\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default Player;\n"],"names":["audioPreloadElementCache","preloadAudioUrl","url","audio","PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","onLoadingChange","onPrev","onNext","onFullscreen","onEnded","onInteractionToggle","hasInteraction","isInteractionOpen","prevDisabled","nextDisabled","showControls","customActions","props","audioRef","useRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","playbackAccessModeRef","isPlaying","setIsPlaying","useState","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","customActionList","toPlayerCustomActionList","mobileVisibleActionCount","controlsStyle","currentAudioKey","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","isAutoplayBlockedError","error","canStartPlaybackAutomatically","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","resetAudio","audioElement","tryPlayCurrentAudio","_reason","playPromise","startSegmentPlayback","segmentIndex","nextAudioSrc","shouldAutoResume","hasNewSrc","finishAudioItem","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","nextSeekTime","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioEnded","shouldFinishAsUrl","handleAudioError","cn","EllipsisVertical","Volume2","RotateCcw","RotateCw","Maximize","customAction","customActionIndex","React","FilePenLine"],"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"),t=require("react"),Me=require("../../lib/browserUserActivation.cjs.js"),P=require("../../lib/utils.cjs.js"),Oe=require("../ContentRender/ContentRender.cjs.js"),ce=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const de=require("./interaction-defaults.cjs.js"),De=require("./Player.cjs.js"),He=require("./useSlide.cjs.js");;/* empty css */const Le=1e3,fe=t.memo(({content:$,title:V,defaultButtonText:f,defaultInputText:K,defaultSelectedValues:U,onSend:w,readonly:T=!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:V})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(Oe.default,{content:$,defaultButtonText:f,defaultInputText:K,defaultSelectedValues:U,onSend:w,readonly:T,enableTypewriter:!1,sandboxMode:"content"})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-arrow"})]}));fe.displayName="InteractionOverlayCard";const $e=({elementList:$=[],showPlayer:V=!0,playerAlwaysVisible:f=!1,playerClassName:K,interactionTitle:U,playerAutoHideDelay:w=3e3,onSend:T,onPlayerVisibilityChange:z,onStepChange:W,className:me,onPointerDown:X,...xe})=>{const Z=t.useRef(null),G=t.useRef(null),ee=t.useRef(null),j=t.useRef(null),S=t.useRef(null),I=t.useRef(null),te=t.useRef([]),N=t.useRef(!1),{currentElementList:o,slideElementList:_,currentIndex:m,audioList:ne,currentAudioSequenceIndexes:v,currentInteractionElement:b,canGoPrev:pe,canGoNext:x,handlePrev:re,handleNext:d}=He.default($),se=t.useMemo(()=>{if(!(m<0))return _[m]},[m,_]),oe=_.filter(e=>e.is_show!==!1).length===1,i=V&&(oe||ne.length>0||!!b),[Y,A]=t.useState(!0),[k,he]=t.useState(!1),[ve,be]=t.useState(!1),[Ee]=t.useState(()=>Me.hasBrowserUserActivation()),Re=Ee||ve,[ye,q]=t.useState(-1),[F,B]=t.useState(-1),[n,J]=t.useState(),[C,M]=t.useState(!1),p=i&&(f||Y),h=t.useCallback(()=>{j.current!==null&&(window.clearTimeout(j.current),j.current=null)},[]),a=t.useCallback(()=>{I.current!==null&&(window.clearTimeout(I.current),I.current=null)},[]),E=t.useCallback(()=>{S.current!==null&&(window.clearTimeout(S.current),S.current=null)},[]),R=t.useCallback(()=>{E(),a(),q(-1),B(-1),J(void 0),M(!1)},[E,a]),O=t.useCallback(()=>{const e=v[0];return typeof e!="number"?!1:(B(0),q(e),!0)},[v]),D=t.useCallback(()=>{a(),M(!1),!O()&&x&&d()},[x,a,d,O]),y=t.useCallback((e=k)=>{i&&(A(!0),h(),!(f||!e||w<=0)&&(j.current=window.setTimeout(()=>{A(!1),j.current=null},w)))},[h,k,f,w,i]);t.useEffect(()=>()=>{E(),h(),a()},[E,a,h]),t.useEffect(()=>(z?.(p),()=>{z?.(!1)}),[z,p]),t.useEffect(()=>{W?.(se,m)},[m,se,W]),t.useEffect(()=>{if(!i){h(),A(!1);return}if(f){h(),A(!0);return}k||y(!0)},[h,k,f,i,y]),t.useEffect(()=>{if(R(),!(o.length===0&&!b)){if(b){J(b),M(!0);return}if(!O()&&x)return S.current=window.setTimeout(()=>{S.current=null,d()},Le),()=>{E()}}},[x,E,o,b,d,R,O]);const le=t.useMemo(()=>n?de.getInteractionDefaultValues(typeof n.content=="string"?n.content:void 0,n.user_input):{},[n]),ge=t.useMemo(()=>{if(n)return de.getInteractionDefaultSelectedValues(typeof n.content=="string"?n.content:void 0,n.user_input)},[n]),Q=!!n?.user_input?.trim(),we=!!n?.readonly||Q,je=t.useCallback(e=>{const u=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");J(s=>!s||!u?s:{...s,user_input:u}),T?.(e,n),D()},[n,D,T]);t.useEffect(()=>{if(a(),!(!C||!Q))return I.current=window.setTimeout(()=>{I.current=null,D()},2e3),()=>{a()}},[a,D,Q,C]);const Se=e=>e?e.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?r.jsxRuntimeExports.jsx(ce.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",type:"sandbox",content:e.content}):r.jsxRuntimeExports.jsx(ce.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,Ie=(e=[])=>{if(e.length===0)return null;const c=e.filter(s=>s.is_show!==!1).length,u=e.reduce((s,g,l)=>g.is_show!==!1?l:s,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((s,g)=>{const l=s.type==="html"&&s.is_show===!1;return r.jsxRuntimeExports.jsx("div",{ref:g===u?ee:null,"aria-hidden":l||void 0,className:P.cn("w-full shrink-0",c===1&&s.is_show!==!1&&"slide-element--single",l?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":s.is_show===!1&&"hidden"),children:Se(s)},s.serial_number??`${s.type}-${g}`)})})},_e=()=>{const e=Z.current;if(e){if(document.fullscreenElement){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},ue=t.useCallback(()=>{const e=G.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),Ce=t.useCallback(()=>{N.current=!0,R(),re()},[re,R]),Pe=t.useCallback(()=>{N.current=!0,R(),d()},[d,R]),Te=t.useCallback(e=>{if(F<0||v[F]!==e)return;const c=F+1,u=v[c];if(typeof u=="number"){B(c),q(u);return}q(-1),B(-1),x&&d()},[x,v,F,d]),Ne=t.useCallback(()=>{n&&M(e=>!e)},[n]),ie=t.useCallback(e=>{e.stopPropagation(),p&&y(!0)},[Y,y]),ae=t.useCallback(e=>{X?.(e),he(!0),y(!0)},[X,y]),Ae=!!n&&C,H=t.useMemo(()=>o.map((e,c)=>`${e.serial_number??`${e.type}-${c}`}:${e.operation??""}`),[o]),ke=t.useMemo(()=>{const e=_.slice(m+1).find(u=>u.type==="html");return!e||o.some(u=>u.serial_number===e.serial_number)?o:[...o,{...e,is_show:!1}]},[o,m,_]);return t.useEffect(()=>{const e=te.current,s=(e.length>0&&e.length<H.length&&e.every((l,L)=>l===H[L])?o.slice(e.length):[]).some(l=>l.operation==="append");if(te.current=H,!s)return;const g=window.requestAnimationFrame(()=>{const l=G.current,L=ee.current;if(!l||!L)return;const qe=l.getBoundingClientRect(),Fe=L.getBoundingClientRect(),Be=l.scrollTop+(Fe.top-qe.top);l.scrollTo({top:Math.max(Be,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(g)}},[o,H]),t.useEffect(()=>{if(!N.current||(N.current=!1,o.length===0))return;const e=window.requestAnimationFrame(()=>{ue()});return()=>{window.cancelAnimationFrame(e)}},[o,ue]),console.log("currentElement",o.at(-1),o,i,Y,v,b,n,C),r.jsxRuntimeExports.jsxs("section",{ref:Z,className:P.cn("relative h-full w-full",me),onPointerDown:ae,...xe,children:[r.jsxRuntimeExports.jsxs("div",{className:P.cn("h-full min-h-0 w-full",oe?"slide-content--single":"grid gap-4"),children:[i&&!p?r.jsxRuntimeExports.jsx("button",{"aria-label":"Show player controls",className:"slide-player-hit-area",onPointerDown:ae,type:"button"}):null,o.length>0?r.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:r.jsxRuntimeExports.jsx("div",{ref:G,className:"slide-stage__layer w-full",children:Ie(ke)})}):null]}),Ae?r.jsxRuntimeExports.jsx("div",{className:P.cn("slide-interaction-overlay",p&&i?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:ie,onPointerDown:ie,children:r.jsxRuntimeExports.jsx(fe,{content:String(n?.content??""),defaultButtonText:le.buttonText??"",defaultInputText:le.inputText??"",defaultSelectedValues:ge,onSend:je,readonly:we,title:U??"Submit the content below to continue."})}):null,i?r.jsxRuntimeExports.jsx(De.default,{audioList:ne,className:P.cn("absolute left-1/2 bottom-6 z-[2] -translate-x-1/2",K,!p&&"pointer-events-none opacity-0"),currentAudioIndex:ye,defaultPlaying:Re,hasInteraction:!!n,isInteractionOpen:C,nextDisabled:!x,onEnded:Te,onFullscreen:_e,onInteractionToggle:Ne,onPlayRequest:()=>be(!0),onNext:Pe,onPrev:Ce,prevDisabled:!pe,showControls:p}):null]})};exports.default=$e;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../_virtual/jsx-runtime.cjs.js"),t=require("react"),nt=require("../../lib/sandboxInteraction.cjs.js"),W=require("../../lib/utils.cjs.js"),rt=require("../ContentRender/ContentRender.cjs.js"),_e=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const Ae=require("../../lib/interaction-defaults.cjs.js"),st=require("./Player.cjs.js"),ot=require("./useSlide.cjs.js"),ut=require("./useWakePlayerFromIframe.cjs.js"),lt=require("./utils/playerCustomActions.cjs.js");;/* empty css */const it=require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/loader-circle.cjs.js"),at=1e3,Te=t.memo(({content:w,title:C,defaultButtonText:m,defaultInputText:O,defaultSelectedValues:S,confirmButtonText:ne,copyButtonText:re,copiedButtonText:_,onSend:H,readonly:A=!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:C})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(rt.default,{content:w,defaultButtonText:m,defaultInputText:O,defaultSelectedValues:S,confirmButtonText:ne,copyButtonText:re,copiedButtonText:_,onSend:H,readonly:A,enableTypewriter:!1,sandboxMode:"content"})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-arrow"})]}));Te.displayName="InteractionOverlayCard";const ct=(w,C)=>w.length===C.length&&w.every((m,O)=>{const S=C[O];return m.sequence_number===S?.sequence_number&&m.type===S?.type&&m.content===S?.content}),dt=({elementList:w=[],showPlayer:C=!0,playerAlwaysVisible:m=!1,playerClassName:O,playerCustomActions:S,bufferingText:ne="Buffering...",interactionTitle:re,interactionTexts:_,playerAutoHideDelay:H=3e3,interactionDefaultValueOptions:A,onSend:ie,onPlayerVisibilityChange:se,onStepChange:ae,className:ke,onPointerDown:ce,...qe})=>{const oe=t.useRef(null),ue=t.useRef(null),de=t.useRef(null),$=t.useRef(null),D=t.useRef(null),U=t.useRef(null),fe=t.useRef([]),G=t.useRef(!1),T=t.useRef(null),{currentElementList:b,stepElementLists:me,slideElementList:k,currentIndex:c,audioList:h,currentAudioSequenceIndexes:xe,currentStepHasSpeakableElement:E,currentInteractionElement:i,canGoPrev:Pe,canGoNext:I,handlePrev:pe,handleNext:R}=ot.default(w),he=t.useMemo(()=>{if(!(c<0))return k[c]},[c,k]),Me=k.filter(e=>e.is_renderable!==!1).length===1,g=C&&(k.length>0||h.length>0||!!i),x=t.useMemo(()=>xe.map(e=>h[e]?.audioKey).filter(e=>!!e),[h,xe]),[ge,Y]=t.useState(!0),[J,z]=t.useState(!1),[y,q]=t.useState(null),[Ne,f]=t.useState(!1),[P,ye]=t.useState(!1),[u,Q]=t.useState(),[X,V]=t.useState(!1),M=g&&(m||ge),Se=t.useMemo(()=>lt.getPlayerCustomActionCount(S),[S]),Be=t.useMemo(()=>({"--slide-player-custom-action-count":String(Se)}),[Se]),{mountedStepStates:Fe,currentMountedStateIndex:Ke}=t.useMemo(()=>{const e=[],n=new Map;return me.forEach((l,a)=>{const s=e.findIndex(o=>ct(o.elementList,l));if(s>=0){e[s]?.sourceStepIndexes.push(a),n.set(a,s);return}e.push({elementList:l,sourceStepIndexes:[a]}),n.set(a,e.length-1)}),{mountedStepStates:e,currentMountedStateIndex:c>=0?n.get(c)??-1:-1}},[c,me]),be=t.useMemo(()=>String(c),[c]),le=t.useMemo(()=>y?h.findIndex(e=>(e.audioKey??"")===y):-1,[h,y]),Z=t.useMemo(()=>x[0]??"none",[x]),ve=t.useMemo(()=>i?`${i.sequence_number??"none"}:${String(i.content??"")}`:"none",[i]),Le=t.useMemo(()=>[be,ve].join("|"),[ve,be]),N=!!t.useMemo(()=>!Z||Z==="none"?"":h.find(n=>n.audioKey===Z)?.audioUrl?.trim()??"",[h,Z]),j=t.useCallback(()=>{$.current!==null&&(window.clearTimeout($.current),$.current=null)},[]),v=t.useCallback(()=>{U.current!==null&&(window.clearTimeout(U.current),U.current=null)},[]),B=t.useCallback(()=>{D.current!==null&&(window.clearTimeout(D.current),D.current=null)},[]),F=t.useCallback(()=>{B(),v(),q(null),f(!1),ye(!1),Q(void 0),V(!1)},[B,v]),K=t.useCallback(()=>{const e=x[0];return e?(q(e),!0):!1},[x]),ee=t.useCallback(()=>{v(),V(!1),!K()&&I&&R()},[I,v,R,K]),d=t.useCallback((e=J)=>{g&&(Y(!0),j(),!(m||!e||H<=0)&&($.current=window.setTimeout(()=>{Y(!1),$.current=null},H)))},[j,J,m,H,g]),Oe=!!(i?.readonly||i?.user_input?.trim()),L=!!i&&!Oe;t.useEffect(()=>()=>{B(),j(),v()},[B,v,j]),t.useEffect(()=>(se?.(M),()=>{se?.(!1)}),[se,M]),t.useEffect(()=>{ae?.(he,c)},[c,he,ae]),t.useEffect(()=>{if(!g){j(),Y(!1);return}if(m){j(),Y(!0);return}J||d(!0)},[j,J,m,g,d]),t.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.origin===window.location.origin&&nt.isSandboxInteractionMessage(n.data)&&g&&(z(!0),d(!0))};return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}},[g,d]),ut.default({sectionRef:oe,enabled:g,onWake:()=>{z(!0),d(!0)}}),t.useEffect(()=>{const e=T.current===c&&!!i;if(F(),!(b.length===0&&!i)){if(L||e){Q(i),V(!0),T.current=null;return}if(i&&(Q(i),V(!1),T.current=null),!K()){if(E){f(!0);return}if(I)return D.current=window.setTimeout(()=>{D.current=null,R()},at),()=>{B()}}}},[I,B,b.length,i,Le,E,R,L,F,K]),t.useEffect(()=>{if(!E||L){f(!1);return}if(P){f(!1);return}x.length===0&&f(!0)},[x.length,E,P,L]),t.useEffect(()=>{y||x.length===0||!E||L||P||K()},[y,x,E,P,L,K]),t.useEffect(()=>{!y||le>=0||q(null)},[le,y]),t.useEffect(()=>{N&&f(!1)},[N]);const Ee=t.useMemo(()=>u?Ae.getInteractionDefaultValues(typeof u.content=="string"?u.content:void 0,u.user_input,A):{},[u,A]),He=t.useMemo(()=>{if(u)return Ae.getInteractionDefaultSelectedValues(typeof u.content=="string"?u.content:void 0,u.user_input,A)},[u,A]),Re=!!u?.user_input?.trim(),Ie=!!u?.readonly||Re,je=Ie||Re,$e=t.useCallback(e=>{const l=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");Q(a=>!a||!l?a:{...a,user_input:l}),ie?.(e,u),ee()},[u,ee,ie]);t.useEffect(()=>{if(v(),!(!X||!je))return U.current=window.setTimeout(()=>{U.current=null,ee()},2e3),()=>{v()}},[v,ee,X,je]);const De=(e,n={})=>e?e.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?r.jsxRuntimeExports.jsx(_e.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:e.content}):r.jsxRuntimeExports.jsx(_e.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,Ue=(e=[],n=!1)=>{if(e.length===0)return null;const l=e.filter(s=>s.is_renderable!==!1).length,a=e.reduce((s,o,p)=>o.is_renderable!==!1?p:s,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((s,o)=>{const p=s.type==="html"&&s.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&o===a?de:null,"aria-hidden":p||void 0,className:W.cn("w-full shrink-0",l===1&&s.is_renderable!==!1&&"slide-element--single",p?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":s.is_renderable===!1&&"hidden"),children:De(s,{replaceRootScreenHeightWithFull:l===1&&s.type==="html"&&s.is_renderable!==!1})},s.sequence_number??`${s.type}-${o}`)})})},ze=()=>{const e=oe.current;if(e){if(document.fullscreenElement){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},we=t.useCallback(()=>{const e=ue.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),Ve=t.useCallback(()=>{G.current=!0,T.current=null,z(!0),f(!1),d(!0),F(),pe()},[pe,F,d]),We=t.useCallback(()=>{G.current=!0,T.current=null,z(!0),f(!1),d(!0),F(),R()},[R,F,d]),Ge=t.useCallback(e=>{if(N){f(!1);return}if(!E||P){f(!1);return}f(e)},[E,P,N]),Ye=t.useCallback(e=>{const n=h[e]?.audioKey;if(!n||!y||n!==y)return;const l=x.findIndex(o=>o===n);if(l<0){q(null);return}const a=l+1,s=x[a];if(s){q(s);return}if(q(null),ye(!0),f(!1),I){const o=c+1,p=k[o];N&&p?.type==="interaction"&&(T.current=o),R()}},[h,I,c,y,x,R,N,k]),Je=t.useCallback(()=>{u&&V(e=>!e)},[u]),Ce=t.useCallback(e=>{e.stopPropagation(),M&&d(!0)},[ge,d]),Qe=t.useCallback(e=>{ce?.(e),z(!0),d(!0)},[ce,d]),Xe=!!u&&X,te=t.useMemo(()=>b.map((e,n)=>`${e.sequence_number??`${e.type}-${n}`}:${String(e.is_new??"")}`),[b]);return t.useEffect(()=>{const e=fe.current,a=(e.length>0&&e.length<te.length&&e.every((o,p)=>o===te[p])?b.slice(e.length):[]).some(o=>o.is_new===!1);if(fe.current=te,!a)return;const s=window.requestAnimationFrame(()=>{const o=ue.current,p=de.current;if(!o||!p)return;const Ze=o.getBoundingClientRect(),et=p.getBoundingClientRect(),tt=o.scrollTop+(et.top-Ze.top);o.scrollTo({top:Math.max(tt,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(s)}},[b,te]),t.useEffect(()=>{if(!G.current||(G.current=!1,b.length===0))return;const e=window.requestAnimationFrame(()=>{we()});return()=>{window.cancelAnimationFrame(e)}},[b,we]),r.jsxRuntimeExports.jsxs("section",{ref:oe,className:W.cn("relative h-full w-full",ke),onPointerDown:Qe,...qe,children:[r.jsxRuntimeExports.jsx("div",{className:W.cn("h-full min-h-0 w-full",Me?"slide-content--single":"grid gap-4"),children:b.length>0?r.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:r.jsxRuntimeExports.jsx("div",{ref:ue,className:"slide-stage__layer w-full",children:Fe.map((e,n)=>{const l=n===Ke;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!l||void 0,className:"w-full h-full",style:{display:l?void 0:"none"},children:Ue(e.elementList,l)},e.sourceStepIndexes[0]??n)})})}):null}),Ne?r.jsxRuntimeExports.jsxs("div",{className:"pointer-events-none absolute left-1/2 top-1/2 z-[3] flex size-28 -translate-x-1/2 -translate-y-1/2 flex-col items-center justify-center gap-2 rounded-2xl bg-foreground/65 px-3 py-4 text-center text-xs leading-4 font-medium text-background shadow-lg backdrop-blur-sm",children:[r.jsxRuntimeExports.jsx(it.default,{className:"size-5 animate-spin text-background"}),r.jsxRuntimeExports.jsx("span",{children:ne})]}):null,Xe?r.jsxRuntimeExports.jsx("div",{className:W.cn("slide-interaction-overlay",M&&g?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:Ce,onPointerDown:Ce,style:Be,children:r.jsxRuntimeExports.jsx(Te,{content:String(u?.content??""),defaultButtonText:Ee.buttonText??"",defaultInputText:Ee.inputText??"",defaultSelectedValues:He,confirmButtonText:_?.confirmButtonText,copyButtonText:_?.copyButtonText,copiedButtonText:_?.copiedButtonText,onSend:$e,readonly:Ie,title:_?.title??re??"Submit the content below to continue."})}):null,g?r.jsxRuntimeExports.jsx(st.default,{audioList:h,className:W.cn("absolute left-1/2 bottom-6 z-[2] -translate-x-1/2",O,!M&&"pointer-events-none opacity-0"),currentAudioIndex:le,defaultPlaying:!0,hasInteraction:!!u,isInteractionOpen:X,onLoadingChange:Ge,nextDisabled:!I,onEnded:Ye,onFullscreen:ze,onInteractionToggle:Je,onNext:We,onPrev:Ve,prevDisabled:!Pe,showControls:M,customActions:S}):null]})};exports.default=dt;
|
|
2
2
|
//# sourceMappingURL=Slide.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Slide.cjs.js","sources":["../../../src/components/Slide/Slide.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { hasBrowserUserActivation } from \"../../lib/browserUserActivation\";\nimport { cn } from \"../../lib/utils\";\nimport ContentRender from \"../ContentRender\";\nimport IframeSandbox from \"../ContentRender/IframeSandbox\";\nimport type { OnSendContentParams } from \"../types\";\nimport {\n getInteractionDefaultSelectedValues,\n getInteractionDefaultValues,\n} from \"./interaction-defaults\";\nimport Player from \"./Player\";\nimport type { Element } from \"./types\";\nimport useSlide from \"./useSlide\";\nimport \"./slide.css\";\nexport type { Element, ElementAudioSegment } from \"./types\";\n\nconst CHECKPOINT_AUTO_ADVANCE_DELAY_MS = 1000;\n\ninterface InteractionOverlayCardProps {\n content: string;\n title: string;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n onSend?: (content: OnSendContentParams) => void;\n readonly?: boolean;\n}\n\nconst InteractionOverlayCard = memo(\n ({\n content,\n title,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n onSend,\n readonly = false,\n }: InteractionOverlayCardProps) => (\n <div className=\"slide-player__interaction-card\">\n <div className=\"slide-player__interaction-header\">\n <p className=\"slide-player__interaction-title\">{title}</p>\n </div>\n <div className=\"slide-player__interaction-body\">\n <ContentRender\n content={content}\n defaultButtonText={defaultButtonText}\n defaultInputText={defaultInputText}\n defaultSelectedValues={defaultSelectedValues}\n onSend={onSend}\n readonly={readonly}\n enableTypewriter={false}\n sandboxMode=\"content\"\n />\n </div>\n <div className=\"slide-player__interaction-arrow\" />\n </div>\n )\n);\n\nInteractionOverlayCard.displayName = \"InteractionOverlayCard\";\n\nexport interface SlideProps extends React.ComponentProps<\"section\"> {\n elementList?: Element[];\n showPlayer?: boolean;\n playerAlwaysVisible?: boolean;\n playerClassName?: string;\n interactionTitle?: string;\n playerAutoHideDelay?: number;\n onSend?: (content: OnSendContentParams, element?: Element) => void;\n onPlayerVisibilityChange?: (visible: boolean) => void;\n onStepChange?: (element: Element | undefined, index: number) => void;\n}\n\nconst Slide: React.FC<SlideProps> = ({\n elementList = [],\n showPlayer = true,\n playerAlwaysVisible = false,\n playerClassName,\n interactionTitle,\n playerAutoHideDelay = 3000,\n onSend,\n onPlayerVisibilityChange,\n onStepChange,\n className,\n onPointerDown,\n ...props\n}) => {\n const sectionRef = useRef<HTMLElement | null>(null);\n const stageLayerRef = useRef<HTMLDivElement | null>(null);\n const lastElementRef = useRef<HTMLDivElement | null>(null);\n const playerHideTimerRef = useRef<number | null>(null);\n const autoAdvanceTimerRef = useRef<number | null>(null);\n const interactionAutoCloseTimerRef = useRef<number | null>(null);\n const prevRenderElementKeysRef = useRef<string[]>([]);\n const shouldScrollToBottomRef = useRef(false);\n const {\n currentElementList,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev: goPrev,\n handleNext: goNext,\n } = useSlide(elementList);\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n return slideElementList[currentIndex];\n }, [currentIndex, slideElementList]);\n const visibleCheckpointCount = slideElementList.filter(\n (element) => element.is_show !== false\n ).length;\n const isSingleSlide = visibleCheckpointCount === 1;\n const shouldRenderPlayer =\n showPlayer &&\n (isSingleSlide ||\n audioList.length > 0 ||\n Boolean(currentInteractionElement));\n const [isPlayerVisible, setIsPlayerVisible] = useState(true);\n const [hasPlayerInteracted, setHasPlayerInteracted] = useState(false);\n const [hasPlaybackInteracted, setHasPlaybackInteracted] = useState(false);\n const [shouldAutoPlay] = useState(() => hasBrowserUserActivation());\n const canAutoPlayAudio = shouldAutoPlay || hasPlaybackInteracted;\n const [currentAudioIndex, setCurrentAudioIndex] = useState(-1);\n const [currentAudioSequencePosition, setCurrentAudioSequencePosition] =\n useState(-1);\n const [activeInteractionElement, setActiveInteractionElement] = useState<\n Element | undefined\n >();\n const [isInteractionOverlayOpen, setIsInteractionOverlayOpen] =\n useState(false);\n const playerVisible =\n shouldRenderPlayer && (playerAlwaysVisible || isPlayerVisible);\n\n const clearPlayerHideTimer = useCallback(() => {\n if (playerHideTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(playerHideTimerRef.current);\n playerHideTimerRef.current = null;\n }, []);\n\n const clearInteractionAutoCloseTimer = useCallback(() => {\n if (interactionAutoCloseTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionAutoCloseTimerRef.current);\n interactionAutoCloseTimerRef.current = null;\n }, []);\n\n const clearAutoAdvanceTimer = useCallback(() => {\n if (autoAdvanceTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(autoAdvanceTimerRef.current);\n autoAdvanceTimerRef.current = null;\n }, []);\n\n const resetAudioSequence = useCallback(() => {\n clearAutoAdvanceTimer();\n clearInteractionAutoCloseTimer();\n setCurrentAudioIndex(-1);\n setCurrentAudioSequencePosition(-1);\n setActiveInteractionElement(undefined);\n setIsInteractionOverlayOpen(false);\n }, [clearAutoAdvanceTimer, clearInteractionAutoCloseTimer]);\n\n const startCurrentAudioSequence = useCallback(() => {\n const nextAudioIndex = currentAudioSequenceIndexes[0];\n\n if (typeof nextAudioIndex !== \"number\") {\n return false;\n }\n\n // Start the first audio segment for the current step immediately.\n setCurrentAudioSequencePosition(0);\n setCurrentAudioIndex(nextAudioIndex);\n return true;\n }, [currentAudioSequenceIndexes]);\n\n const continueAfterInteraction = useCallback(() => {\n clearInteractionAutoCloseTimer();\n setIsInteractionOverlayOpen(false);\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (canGoNext) {\n goNext();\n }\n }, [\n canGoNext,\n clearInteractionAutoCloseTimer,\n goNext,\n startCurrentAudioSequence,\n ]);\n\n const showPlayerControls = useCallback(\n (enableAutoHide = hasPlayerInteracted) => {\n if (!shouldRenderPlayer) {\n return;\n }\n\n setIsPlayerVisible(true);\n clearPlayerHideTimer();\n\n if (playerAlwaysVisible || !enableAutoHide || playerAutoHideDelay <= 0) {\n return;\n }\n\n playerHideTimerRef.current = window.setTimeout(() => {\n setIsPlayerVisible(false);\n playerHideTimerRef.current = null;\n }, playerAutoHideDelay);\n },\n [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n playerAutoHideDelay,\n shouldRenderPlayer,\n ]\n );\n\n useEffect(() => {\n return () => {\n clearAutoAdvanceTimer();\n clearPlayerHideTimer();\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearPlayerHideTimer,\n ]);\n\n useEffect(() => {\n onPlayerVisibilityChange?.(playerVisible);\n\n return () => {\n onPlayerVisibilityChange?.(false);\n };\n }, [onPlayerVisibilityChange, playerVisible]);\n\n useEffect(() => {\n onStepChange?.(currentStepElement, currentIndex);\n }, [currentIndex, currentStepElement, onStepChange]);\n\n useEffect(() => {\n if (!shouldRenderPlayer) {\n clearPlayerHideTimer();\n setIsPlayerVisible(false);\n return;\n }\n\n if (playerAlwaysVisible) {\n clearPlayerHideTimer();\n setIsPlayerVisible(true);\n return;\n }\n\n if (!hasPlayerInteracted) {\n // Keep the initial player visible briefly, then hide it automatically.\n showPlayerControls(true);\n }\n }, [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n shouldRenderPlayer,\n showPlayerControls,\n ]);\n\n useEffect(() => {\n resetAudioSequence();\n\n if (currentElementList.length === 0 && !currentInteractionElement) {\n return;\n }\n\n if (currentInteractionElement) {\n // Show the interaction gate before playing any follow-up audio.\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(true);\n return;\n }\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (!canGoNext) {\n return;\n }\n\n // Auto-advance silent checkpoint-only steps so playback flow does not stall.\n autoAdvanceTimerRef.current = window.setTimeout(() => {\n autoAdvanceTimerRef.current = null;\n goNext();\n }, CHECKPOINT_AUTO_ADVANCE_DELAY_MS);\n\n return () => {\n clearAutoAdvanceTimer();\n };\n }, [\n canGoNext,\n clearAutoAdvanceTimer,\n currentElementList,\n currentInteractionElement,\n goNext,\n resetAudioSequence,\n startCurrentAudioSequence,\n ]);\n\n const interactionDefaults = useMemo(() => {\n if (!activeInteractionElement) {\n return {};\n }\n\n return getInteractionDefaultValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input\n );\n }, [activeInteractionElement]);\n\n const interactionDefaultSelectedValues = useMemo(() => {\n if (!activeInteractionElement) {\n return undefined;\n }\n\n return getInteractionDefaultSelectedValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input\n );\n }, [activeInteractionElement]);\n\n const hasResolvedInteractionInput = Boolean(\n activeInteractionElement?.user_input?.trim()\n );\n const isInteractionReadonly =\n Boolean(activeInteractionElement?.readonly) || hasResolvedInteractionInput;\n\n const handleInteractionSend = useCallback(\n (content: OnSendContentParams) => {\n const submittedValues = [\n ...(content.selectedValues ?? []),\n content.inputText?.trim() ?? \"\",\n content.buttonText?.trim() ?? \"\",\n ].filter(Boolean);\n const resolvedUserInput = submittedValues.join(\", \");\n\n setActiveInteractionElement((prevElement) => {\n if (!prevElement || !resolvedUserInput) {\n return prevElement;\n }\n\n return {\n ...prevElement,\n user_input: resolvedUserInput,\n };\n });\n\n onSend?.(content, activeInteractionElement);\n continueAfterInteraction();\n },\n [activeInteractionElement, continueAfterInteraction, onSend]\n );\n\n useEffect(() => {\n clearInteractionAutoCloseTimer();\n\n if (!isInteractionOverlayOpen || !hasResolvedInteractionInput) {\n return;\n }\n\n interactionAutoCloseTimerRef.current = window.setTimeout(() => {\n interactionAutoCloseTimerRef.current = null;\n\n continueAfterInteraction();\n }, 2000);\n\n return () => {\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearInteractionAutoCloseTimer,\n continueAfterInteraction,\n hasResolvedInteractionInput,\n isInteractionOverlayOpen,\n ]);\n\n const renderSlideElement = (element?: Element) => {\n if (!element) {\n return null;\n }\n\n if (element.type === \"slot\") {\n return <>{element.content}</>;\n }\n\n if (element.type === \"html\") {\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n type=\"sandbox\"\n content={element.content as string}\n />\n );\n }\n\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n type=\"markdown\"\n content={element.content as string}\n />\n );\n };\n\n const renderSlideElementList = (elementList: Element[] = []) => {\n if (elementList.length === 0) {\n return null;\n }\n\n const visibleElementCount = elementList.filter(\n (element) => element.is_show !== false\n ).length;\n const lastVisibleElementIndex = elementList.reduce(\n (lastVisibleIndex, element, index) =>\n element.is_show !== false ? index : lastVisibleIndex,\n -1\n );\n\n return (\n <div className=\"slide-stage__content flex w-full flex-col gap-4\">\n {elementList.map((element, index) => {\n const isPreRenderedHtml =\n element.type === \"html\" && element.is_show === false;\n\n return (\n <div\n key={element.serial_number ?? `${element.type}-${index}`}\n ref={index === lastVisibleElementIndex ? lastElementRef : null}\n aria-hidden={isPreRenderedHtml || undefined}\n className={cn(\n \"w-full shrink-0\",\n visibleElementCount === 1 &&\n element.is_show !== false &&\n \"slide-element--single\",\n isPreRenderedHtml\n ? \"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0\"\n : element.is_show === false && \"hidden\"\n )}\n >\n {renderSlideElement(element)}\n </div>\n );\n })}\n </div>\n );\n };\n\n const handleFullscreen = () => {\n const target = sectionRef.current;\n if (!target) return;\n\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n\n target.requestFullscreen?.().catch(() => {});\n };\n\n const scrollStageToBottom = useCallback(() => {\n const stageLayerElement = stageLayerRef.current;\n\n if (!stageLayerElement) {\n return;\n }\n\n // Keep the latest content visible after manual player navigation.\n stageLayerElement.scrollTo({\n top: stageLayerElement.scrollHeight,\n behavior: \"smooth\",\n });\n }, []);\n\n const handlePrev = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n resetAudioSequence();\n goPrev();\n }, [goPrev, resetAudioSequence]);\n\n const handleNext = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n resetAudioSequence();\n goNext();\n }, [goNext, resetAudioSequence]);\n\n const handlePlayerEnded = useCallback(\n (audioIndex: number) => {\n if (currentAudioSequencePosition < 0) {\n return;\n }\n\n if (\n currentAudioSequenceIndexes[currentAudioSequencePosition] !== audioIndex\n ) {\n return;\n }\n\n const nextSequencePosition = currentAudioSequencePosition + 1;\n const nextAudioIndex = currentAudioSequenceIndexes[nextSequencePosition];\n\n if (typeof nextAudioIndex === \"number\") {\n setCurrentAudioSequencePosition(nextSequencePosition);\n setCurrentAudioIndex(nextAudioIndex);\n return;\n }\n\n setCurrentAudioIndex(-1);\n setCurrentAudioSequencePosition(-1);\n\n if (canGoNext) {\n goNext();\n }\n },\n [\n canGoNext,\n currentAudioSequenceIndexes,\n currentAudioSequencePosition,\n goNext,\n ]\n );\n\n const handleInteractionToggle = useCallback(() => {\n if (!activeInteractionElement) {\n return;\n }\n\n setIsInteractionOverlayOpen((prevOpen) => !prevOpen);\n }, [activeInteractionElement]);\n\n const stopOverlayPropagation = useCallback(\n (\n event:\n | React.PointerEvent<HTMLDivElement>\n | React.MouseEvent<HTMLDivElement>\n ) => {\n event.stopPropagation();\n\n // Keep the player visible a bit longer when users interact with the overlay.\n if (playerVisible) {\n showPlayerControls(true);\n }\n },\n [isPlayerVisible, showPlayerControls]\n );\n\n const handleSurfacePointerDown = useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n onPointerDown?.(event);\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n [onPointerDown, showPlayerControls]\n );\n\n const shouldShowInteractionOverlay =\n Boolean(activeInteractionElement) && isInteractionOverlayOpen;\n\n const currentRenderElementKeys = useMemo(\n () =>\n currentElementList.map(\n (element, index) =>\n `${element.serial_number ?? `${element.type}-${index}`}:${element.operation ?? \"\"}`\n ),\n [currentElementList]\n );\n\n const renderElementList = useMemo(() => {\n const nextHtmlElement = slideElementList\n .slice(currentIndex + 1)\n .find((element) => element.type === \"html\");\n\n if (!nextHtmlElement) {\n return currentElementList;\n }\n\n const hasMountedNextHtml = currentElementList.some(\n (element) => element.serial_number === nextHtmlElement.serial_number\n );\n\n if (hasMountedNextHtml) {\n return currentElementList;\n }\n\n // Keep the next html sandbox mounted offscreen so it is ready when revealed.\n return [...currentElementList, { ...nextHtmlElement, is_show: false }];\n }, [currentElementList, currentIndex, slideElementList]);\n\n useEffect(() => {\n const prevKeys = prevRenderElementKeysRef.current;\n const hasStablePrefix =\n prevKeys.length > 0 &&\n prevKeys.length < currentRenderElementKeys.length &&\n prevKeys.every((key, index) => key === currentRenderElementKeys[index]);\n const appendedElements = hasStablePrefix\n ? currentElementList.slice(prevKeys.length)\n : [];\n const shouldAutoScrollToAppend = appendedElements.some(\n (element) => element.operation === \"append\"\n );\n\n prevRenderElementKeysRef.current = currentRenderElementKeys;\n\n if (!shouldAutoScrollToAppend) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n const stageLayerElement = stageLayerRef.current;\n const targetElement = lastElementRef.current;\n\n if (!stageLayerElement || !targetElement) {\n return;\n }\n\n const stageLayerRect = stageLayerElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const nextScrollTop =\n stageLayerElement.scrollTop + (targetRect.top - stageLayerRect.top);\n\n // Keep newly appended content visible when the current slide grows downward.\n stageLayerElement.scrollTo({\n top: Math.max(nextScrollTop, 0),\n behavior: \"smooth\",\n });\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, currentRenderElementKeys]);\n\n useEffect(() => {\n if (!shouldScrollToBottomRef.current) {\n return;\n }\n\n shouldScrollToBottomRef.current = false;\n\n if (currentElementList.length === 0) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n scrollStageToBottom();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, scrollStageToBottom]);\n\n console.log(\n \"currentElement\",\n currentElementList.at(-1),\n currentElementList,\n shouldRenderPlayer,\n isPlayerVisible,\n currentAudioSequenceIndexes,\n currentInteractionElement,\n activeInteractionElement,\n isInteractionOverlayOpen\n );\n\n return (\n <section\n ref={sectionRef}\n className={cn(\"relative h-full w-full\", className)}\n onPointerDown={handleSurfacePointerDown}\n {...props}\n >\n <div\n className={cn(\n \"h-full min-h-0 w-full\",\n isSingleSlide ? \"slide-content--single\" : \"grid gap-4\"\n )}\n >\n {shouldRenderPlayer && !playerVisible ? (\n <button\n aria-label=\"Show player controls\"\n className=\"slide-player-hit-area\"\n onPointerDown={handleSurfacePointerDown}\n type=\"button\"\n />\n ) : null}\n {currentElementList.length > 0 ? (\n <div className=\"slide-stage\">\n <div ref={stageLayerRef} className=\"slide-stage__layer w-full\">\n {renderSlideElementList(renderElementList)}\n </div>\n </div>\n ) : null}\n </div>\n\n {shouldShowInteractionOverlay ? (\n <div\n className={cn(\n \"slide-interaction-overlay\",\n playerVisible && shouldRenderPlayer\n ? \"slide-interaction-overlay--with-player\"\n : \"slide-interaction-overlay--standalone\"\n )}\n onClick={stopOverlayPropagation}\n onPointerDown={stopOverlayPropagation}\n >\n <InteractionOverlayCard\n content={String(activeInteractionElement?.content ?? \"\")}\n defaultButtonText={interactionDefaults.buttonText ?? \"\"}\n defaultInputText={interactionDefaults.inputText ?? \"\"}\n defaultSelectedValues={interactionDefaultSelectedValues}\n onSend={handleInteractionSend}\n readonly={isInteractionReadonly}\n title={interactionTitle ?? \"Submit the content below to continue.\"}\n />\n </div>\n ) : null}\n\n {shouldRenderPlayer ? (\n <Player\n audioList={audioList}\n className={cn(\n \"absolute left-1/2 bottom-6 z-[2] -translate-x-1/2\",\n playerClassName,\n !playerVisible && \"pointer-events-none opacity-0\"\n )}\n currentAudioIndex={currentAudioIndex}\n defaultPlaying={canAutoPlayAudio}\n hasInteraction={Boolean(activeInteractionElement)}\n isInteractionOpen={isInteractionOverlayOpen}\n nextDisabled={!canGoNext}\n onEnded={handlePlayerEnded}\n onFullscreen={handleFullscreen}\n onInteractionToggle={handleInteractionToggle}\n onPlayRequest={() => setHasPlaybackInteracted(true)}\n onNext={handleNext}\n onPrev={handlePrev}\n prevDisabled={!canGoPrev}\n showControls={playerVisible}\n />\n ) : null}\n </section>\n );\n};\n\nexport default Slide;\n"],"names":["CHECKPOINT_AUTO_ADVANCE_DELAY_MS","InteractionOverlayCard","memo","content","title","defaultButtonText","defaultInputText","defaultSelectedValues","onSend","readonly","jsxs","jsx","ContentRender","Slide","elementList","showPlayer","playerAlwaysVisible","playerClassName","interactionTitle","playerAutoHideDelay","onPlayerVisibilityChange","onStepChange","className","onPointerDown","props","sectionRef","useRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","prevRenderElementKeysRef","shouldScrollToBottomRef","currentElementList","slideElementList","currentIndex","audioList","currentAudioSequenceIndexes","currentInteractionElement","canGoPrev","canGoNext","goPrev","goNext","useSlide","currentStepElement","useMemo","isSingleSlide","element","shouldRenderPlayer","isPlayerVisible","setIsPlayerVisible","useState","hasPlayerInteracted","setHasPlayerInteracted","hasPlaybackInteracted","setHasPlaybackInteracted","shouldAutoPlay","hasBrowserUserActivation","canAutoPlayAudio","currentAudioIndex","setCurrentAudioIndex","currentAudioSequencePosition","setCurrentAudioSequencePosition","activeInteractionElement","setActiveInteractionElement","isInteractionOverlayOpen","setIsInteractionOverlayOpen","playerVisible","clearPlayerHideTimer","useCallback","clearInteractionAutoCloseTimer","clearAutoAdvanceTimer","resetAudioSequence","startCurrentAudioSequence","nextAudioIndex","continueAfterInteraction","showPlayerControls","enableAutoHide","useEffect","interactionDefaults","getInteractionDefaultValues","interactionDefaultSelectedValues","getInteractionDefaultSelectedValues","hasResolvedInteractionInput","isInteractionReadonly","handleInteractionSend","resolvedUserInput","prevElement","renderSlideElement","Fragment","IframeSandbox","renderSlideElementList","visibleElementCount","lastVisibleElementIndex","lastVisibleIndex","index","isPreRenderedHtml","cn","handleFullscreen","target","scrollStageToBottom","stageLayerElement","handlePrev","handleNext","handlePlayerEnded","audioIndex","nextSequencePosition","handleInteractionToggle","prevOpen","stopOverlayPropagation","event","handleSurfacePointerDown","shouldShowInteractionOverlay","currentRenderElementKeys","renderElementList","nextHtmlElement","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","Player"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Slide.cjs.js","sources":["../../../src/components/Slide/Slide.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { LoaderCircle } from \"lucide-react\";\n\nimport { isSandboxInteractionMessage } from \"../../lib/sandboxInteraction\";\nimport { cn } from \"../../lib/utils\";\nimport ContentRender from \"../ContentRender\";\nimport type { ContentRenderProps } from \"../ContentRender/ContentRender\";\nimport IframeSandbox from \"../ContentRender/IframeSandbox\";\nimport type { OnSendContentParams } from \"../types\";\nimport {\n getInteractionDefaultSelectedValues,\n getInteractionDefaultValues,\n type InteractionDefaultValueOptions,\n} from \"../../lib/interaction-defaults\";\nimport Player from \"./Player\";\nimport type { PlayerProps } from \"./Player\";\nimport type { Element } from \"./types\";\nimport useSlide from \"./useSlide\";\nimport useWakePlayerFromIframe from \"./useWakePlayerFromIframe\";\nimport { getPlayerCustomActionCount } from \"./utils/playerCustomActions\";\nimport \"./slide.css\";\nexport type { Element, ElementAudioSegment } from \"./types\";\n\nconst CHECKPOINT_AUTO_ADVANCE_DELAY_MS = 1000;\n\ntype RenderSlideElementOptions = {\n replaceRootScreenHeightWithFull?: boolean;\n};\n\ninterface InteractionOverlayCardProps {\n content: string;\n title: string;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n confirmButtonText?: string;\n copyButtonText?: string;\n copiedButtonText?: string;\n onSend?: (content: OnSendContentParams) => void;\n readonly?: boolean;\n}\n\nexport interface SlideInteractionTexts\n extends Pick<\n ContentRenderProps,\n \"confirmButtonText\" | \"copyButtonText\" | \"copiedButtonText\"\n > {\n title?: string;\n}\n\nconst InteractionOverlayCard = memo(\n ({\n content,\n title,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n onSend,\n readonly = false,\n }: InteractionOverlayCardProps) => (\n <div className=\"slide-player__interaction-card\">\n <div className=\"slide-player__interaction-header\">\n <p className=\"slide-player__interaction-title\">{title}</p>\n </div>\n <div className=\"slide-player__interaction-body\">\n <ContentRender\n content={content}\n defaultButtonText={defaultButtonText}\n defaultInputText={defaultInputText}\n defaultSelectedValues={defaultSelectedValues}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n onSend={onSend}\n readonly={readonly}\n enableTypewriter={false}\n sandboxMode=\"content\"\n />\n </div>\n <div className=\"slide-player__interaction-arrow\" />\n </div>\n )\n);\n\nInteractionOverlayCard.displayName = \"InteractionOverlayCard\";\n\nconst areStepElementListsEqual = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => {\n const nextElement = nextElementList[index];\n\n return (\n element.sequence_number === nextElement?.sequence_number &&\n element.type === nextElement?.type &&\n element.content === nextElement?.content\n );\n });\n\nexport interface SlideProps extends React.ComponentProps<\"section\"> {\n elementList?: Element[];\n showPlayer?: boolean;\n playerAlwaysVisible?: boolean;\n playerClassName?: string;\n playerCustomActions?: PlayerProps[\"customActions\"];\n bufferingText?: string;\n interactionTitle?: string;\n interactionTexts?: SlideInteractionTexts;\n playerAutoHideDelay?: number;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n onSend?: (content: OnSendContentParams, element?: Element) => void;\n onPlayerVisibilityChange?: (visible: boolean) => void;\n onStepChange?: (element: Element | undefined, index: number) => void;\n}\n\nconst Slide: React.FC<SlideProps> = ({\n elementList = [],\n showPlayer = true,\n playerAlwaysVisible = false,\n playerClassName,\n playerCustomActions,\n bufferingText = \"Buffering...\",\n interactionTitle,\n interactionTexts,\n playerAutoHideDelay = 3000,\n interactionDefaultValueOptions,\n onSend,\n onPlayerVisibilityChange,\n onStepChange,\n className,\n onPointerDown,\n ...props\n}) => {\n const sectionRef = useRef<HTMLElement | null>(null);\n const stageLayerRef = useRef<HTMLDivElement | null>(null);\n const lastElementRef = useRef<HTMLDivElement | null>(null);\n const playerHideTimerRef = useRef<number | null>(null);\n const autoAdvanceTimerRef = useRef<number | null>(null);\n const interactionAutoCloseTimerRef = useRef<number | null>(null);\n const prevRenderElementKeysRef = useRef<string[]>([]);\n const shouldScrollToBottomRef = useRef(false);\n const pendingInteractionOverlayStepIndexRef = useRef<number | null>(null);\n const {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev: goPrev,\n handleNext: goNext,\n } = useSlide(elementList);\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n return slideElementList[currentIndex];\n }, [currentIndex, slideElementList]);\n const visibleMarkerCount = slideElementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const isSingleSlide = visibleMarkerCount === 1;\n const shouldRenderPlayer =\n showPlayer &&\n (slideElementList.length > 0 ||\n audioList.length > 0 ||\n Boolean(currentInteractionElement));\n const currentAudioSequenceKeys = useMemo(\n () =>\n currentAudioSequenceIndexes\n .map((audioIndex) => audioList[audioIndex]?.audioKey)\n .filter((audioKey): audioKey is string => Boolean(audioKey)),\n [audioList, currentAudioSequenceIndexes]\n );\n const [isPlayerVisible, setIsPlayerVisible] = useState(true);\n const [hasPlayerInteracted, setHasPlayerInteracted] = useState(false);\n const [currentAudioKey, setCurrentAudioKey] = useState<string | null>(null);\n const [isAudioLoadingVisible, setIsAudioLoadingVisible] = useState(false);\n const [hasCompletedCurrentStepAudio, setHasCompletedCurrentStepAudio] =\n useState(false);\n const [activeInteractionElement, setActiveInteractionElement] = useState<\n Element | undefined\n >();\n const [isInteractionOverlayOpen, setIsInteractionOverlayOpen] =\n useState(false);\n const playerVisible =\n shouldRenderPlayer && (playerAlwaysVisible || isPlayerVisible);\n const playerCustomActionCount = useMemo(\n () => getPlayerCustomActionCount(playerCustomActions),\n [playerCustomActions]\n );\n const interactionOverlayStyle = useMemo(\n () =>\n ({\n \"--slide-player-custom-action-count\": String(playerCustomActionCount),\n }) as React.CSSProperties,\n [playerCustomActionCount]\n );\n const { mountedStepStates, currentMountedStateIndex } = useMemo(() => {\n const nextMountedStepStates: Array<{\n elementList: Element[];\n sourceStepIndexes: number[];\n }> = [];\n const mountedStateIndexByStep = new Map<number, number>();\n\n stepElementLists.forEach((stepElementList, stepIndex) => {\n const existingMountedStateIndex = nextMountedStepStates.findIndex(\n (mountedStepState) =>\n areStepElementListsEqual(\n mountedStepState.elementList,\n stepElementList\n )\n );\n\n if (existingMountedStateIndex >= 0) {\n nextMountedStepStates[\n existingMountedStateIndex\n ]?.sourceStepIndexes.push(stepIndex);\n mountedStateIndexByStep.set(stepIndex, existingMountedStateIndex);\n return;\n }\n\n nextMountedStepStates.push({\n elementList: stepElementList,\n sourceStepIndexes: [stepIndex],\n });\n mountedStateIndexByStep.set(stepIndex, nextMountedStepStates.length - 1);\n });\n\n return {\n mountedStepStates: nextMountedStepStates,\n currentMountedStateIndex:\n currentIndex >= 0\n ? (mountedStateIndexByStep.get(currentIndex) ?? -1)\n : -1,\n };\n }, [currentIndex, stepElementLists]);\n const currentStepKey = useMemo(() => String(currentIndex), [currentIndex]);\n const currentAudioIndex = useMemo(() => {\n if (!currentAudioKey) {\n return -1;\n }\n\n return audioList.findIndex(\n (audioItem) => (audioItem.audioKey ?? \"\") === currentAudioKey\n );\n }, [audioList, currentAudioKey]);\n const currentAudioSequenceStartKey = useMemo(\n () => currentAudioSequenceKeys[0] ?? \"none\",\n [currentAudioSequenceKeys]\n );\n const currentInteractionResetKey = useMemo(() => {\n if (!currentInteractionElement) {\n return \"none\";\n }\n\n return `${currentInteractionElement.sequence_number ?? \"none\"}:${String(\n currentInteractionElement.content ?? \"\"\n )}`;\n }, [currentInteractionElement]);\n const currentPlaybackResetKey = useMemo(\n () => [currentStepKey, currentInteractionResetKey].join(\"|\"),\n [currentInteractionResetKey, currentStepKey]\n );\n const currentStepAudioUrl = useMemo(() => {\n if (\n !currentAudioSequenceStartKey ||\n currentAudioSequenceStartKey === \"none\"\n ) {\n return \"\";\n }\n\n const currentStepAudioItem = audioList.find(\n (audioItem) => audioItem.audioKey === currentAudioSequenceStartKey\n );\n\n return currentStepAudioItem?.audioUrl?.trim() ?? \"\";\n }, [audioList, currentAudioSequenceStartKey]);\n const hasCurrentStepAudioUrl = Boolean(currentStepAudioUrl);\n\n const clearPlayerHideTimer = useCallback(() => {\n if (playerHideTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(playerHideTimerRef.current);\n playerHideTimerRef.current = null;\n }, []);\n\n const clearInteractionAutoCloseTimer = useCallback(() => {\n if (interactionAutoCloseTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionAutoCloseTimerRef.current);\n interactionAutoCloseTimerRef.current = null;\n }, []);\n\n const clearAutoAdvanceTimer = useCallback(() => {\n if (autoAdvanceTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(autoAdvanceTimerRef.current);\n autoAdvanceTimerRef.current = null;\n }, []);\n\n const resetAudioSequence = useCallback(() => {\n clearAutoAdvanceTimer();\n clearInteractionAutoCloseTimer();\n setCurrentAudioKey(null);\n setIsAudioLoadingVisible(false);\n setHasCompletedCurrentStepAudio(false);\n setActiveInteractionElement(undefined);\n setIsInteractionOverlayOpen(false);\n }, [clearAutoAdvanceTimer, clearInteractionAutoCloseTimer]);\n\n const startCurrentAudioSequence = useCallback(() => {\n const nextAudioKey = currentAudioSequenceKeys[0];\n\n if (!nextAudioKey) {\n return false;\n }\n\n // Start the first audio segment for the current step immediately.\n setCurrentAudioKey(nextAudioKey);\n return true;\n }, [currentAudioSequenceKeys]);\n\n const continueAfterInteraction = useCallback(() => {\n clearInteractionAutoCloseTimer();\n setIsInteractionOverlayOpen(false);\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (canGoNext) {\n goNext();\n }\n }, [\n canGoNext,\n clearInteractionAutoCloseTimer,\n goNext,\n startCurrentAudioSequence,\n ]);\n\n const showPlayerControls = useCallback(\n (enableAutoHide = hasPlayerInteracted) => {\n if (!shouldRenderPlayer) {\n return;\n }\n\n setIsPlayerVisible(true);\n clearPlayerHideTimer();\n\n if (playerAlwaysVisible || !enableAutoHide || playerAutoHideDelay <= 0) {\n return;\n }\n\n playerHideTimerRef.current = window.setTimeout(() => {\n setIsPlayerVisible(false);\n playerHideTimerRef.current = null;\n }, playerAutoHideDelay);\n },\n [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n playerAutoHideDelay,\n shouldRenderPlayer,\n ]\n );\n\n const hasResolvedCurrentInteraction = Boolean(\n currentInteractionElement?.readonly ||\n currentInteractionElement?.user_input?.trim()\n );\n\n const shouldBlockPlaybackForInteraction =\n Boolean(currentInteractionElement) && !hasResolvedCurrentInteraction;\n\n useEffect(() => {\n return () => {\n clearAutoAdvanceTimer();\n clearPlayerHideTimer();\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearPlayerHideTimer,\n ]);\n\n useEffect(() => {\n onPlayerVisibilityChange?.(playerVisible);\n\n return () => {\n onPlayerVisibilityChange?.(false);\n };\n }, [onPlayerVisibilityChange, playerVisible]);\n\n useEffect(() => {\n onStepChange?.(currentStepElement, currentIndex);\n }, [currentIndex, currentStepElement, onStepChange]);\n\n useEffect(() => {\n if (!shouldRenderPlayer) {\n clearPlayerHideTimer();\n setIsPlayerVisible(false);\n return;\n }\n\n if (playerAlwaysVisible) {\n clearPlayerHideTimer();\n setIsPlayerVisible(true);\n return;\n }\n\n if (!hasPlayerInteracted) {\n // Keep the initial player visible briefly, then hide it automatically.\n showPlayerControls(true);\n }\n }, [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n shouldRenderPlayer,\n showPlayerControls,\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const handleSandboxInteraction = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) {\n return;\n }\n\n if (!isSandboxInteractionMessage(event.data)) {\n return;\n }\n\n if (!shouldRenderPlayer) {\n return;\n }\n\n // Restore player controls without blocking native iframe scrolling.\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n };\n\n window.addEventListener(\"message\", handleSandboxInteraction);\n\n return () => {\n window.removeEventListener(\"message\", handleSandboxInteraction);\n };\n }, [shouldRenderPlayer, showPlayerControls]);\n\n useWakePlayerFromIframe({\n sectionRef,\n enabled: shouldRenderPlayer,\n onWake: () => {\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n });\n\n useEffect(() => {\n const shouldOpenInteractionOverlayAfterAudio =\n pendingInteractionOverlayStepIndexRef.current === currentIndex &&\n Boolean(currentInteractionElement);\n\n resetAudioSequence();\n\n if (currentElementList.length === 0 && !currentInteractionElement) {\n return;\n }\n\n if (\n shouldBlockPlaybackForInteraction ||\n shouldOpenInteractionOverlayAfterAudio\n ) {\n // Show the interaction gate before playing any follow-up audio.\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(true);\n pendingInteractionOverlayStepIndexRef.current = null;\n return;\n }\n\n if (currentInteractionElement) {\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(false);\n pendingInteractionOverlayStepIndexRef.current = null;\n }\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (currentStepHasSpeakableElement) {\n setIsAudioLoadingVisible(true);\n return;\n }\n\n if (!canGoNext) {\n return;\n }\n\n // Auto-advance silent marker-only steps so playback flow does not stall.\n autoAdvanceTimerRef.current = window.setTimeout(() => {\n autoAdvanceTimerRef.current = null;\n goNext();\n }, CHECKPOINT_AUTO_ADVANCE_DELAY_MS);\n\n return () => {\n clearAutoAdvanceTimer();\n };\n }, [\n canGoNext,\n clearAutoAdvanceTimer,\n currentElementList.length,\n currentInteractionElement,\n currentPlaybackResetKey,\n currentStepHasSpeakableElement,\n goNext,\n shouldBlockPlaybackForInteraction,\n resetAudioSequence,\n startCurrentAudioSequence,\n ]);\n\n useEffect(() => {\n if (!currentStepHasSpeakableElement || shouldBlockPlaybackForInteraction) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (hasCompletedCurrentStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (currentAudioSequenceKeys.length === 0) {\n setIsAudioLoadingVisible(true);\n }\n }, [\n currentAudioSequenceKeys.length,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldBlockPlaybackForInteraction,\n ]);\n\n useEffect(() => {\n if (currentAudioKey || currentAudioSequenceKeys.length === 0) {\n return;\n }\n\n if (!currentStepHasSpeakableElement || shouldBlockPlaybackForInteraction) {\n return;\n }\n\n if (hasCompletedCurrentStepAudio) {\n return;\n }\n\n startCurrentAudioSequence();\n }, [\n currentAudioKey,\n currentAudioSequenceKeys,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldBlockPlaybackForInteraction,\n startCurrentAudioSequence,\n ]);\n\n useEffect(() => {\n if (!currentAudioKey || currentAudioIndex >= 0) {\n return;\n }\n\n setCurrentAudioKey(null);\n }, [currentAudioIndex, currentAudioKey]);\n\n useEffect(() => {\n if (!hasCurrentStepAudioUrl) {\n return;\n }\n\n // Treat the arrived audio URL as ready and hide the buffering overlay.\n setIsAudioLoadingVisible(false);\n }, [hasCurrentStepAudioUrl]);\n\n const interactionDefaults = useMemo(() => {\n if (!activeInteractionElement) {\n return {};\n }\n\n return getInteractionDefaultValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const interactionDefaultSelectedValues = useMemo(() => {\n if (!activeInteractionElement) {\n return undefined;\n }\n\n return getInteractionDefaultSelectedValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const hasResolvedInteractionInput = Boolean(\n activeInteractionElement?.user_input?.trim()\n );\n\n const isInteractionReadonly =\n Boolean(activeInteractionElement?.readonly) || hasResolvedInteractionInput;\n const shouldAutoContinueInteraction =\n isInteractionReadonly || hasResolvedInteractionInput;\n\n const handleInteractionSend = useCallback(\n (content: OnSendContentParams) => {\n const submittedValues = [\n ...(content.selectedValues ?? []),\n content.inputText?.trim() ?? \"\",\n content.buttonText?.trim() ?? \"\",\n ].filter(Boolean);\n const resolvedUserInput = submittedValues.join(\", \");\n\n setActiveInteractionElement((prevElement) => {\n if (!prevElement || !resolvedUserInput) {\n return prevElement;\n }\n\n return {\n ...prevElement,\n user_input: resolvedUserInput,\n };\n });\n\n onSend?.(content, activeInteractionElement);\n continueAfterInteraction();\n },\n [activeInteractionElement, continueAfterInteraction, onSend]\n );\n\n useEffect(() => {\n clearInteractionAutoCloseTimer();\n\n if (!isInteractionOverlayOpen || !shouldAutoContinueInteraction) {\n return;\n }\n\n // Auto-close passive interaction checkpoints to keep playback moving.\n interactionAutoCloseTimerRef.current = window.setTimeout(() => {\n interactionAutoCloseTimerRef.current = null;\n\n continueAfterInteraction();\n }, 2000);\n\n return () => {\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearInteractionAutoCloseTimer,\n continueAfterInteraction,\n isInteractionOverlayOpen,\n shouldAutoContinueInteraction,\n ]);\n\n const renderSlideElement = (\n element?: Element,\n options: RenderSlideElementOptions = {}\n ) => {\n if (!element) {\n return null;\n }\n\n if (element.type === \"slot\") {\n return <>{element.content}</>;\n }\n\n if (element.type === \"html\") {\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n replaceRootScreenHeightWithFull={\n options.replaceRootScreenHeightWithFull\n }\n type=\"sandbox\"\n content={element.content as string}\n />\n );\n }\n\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n type=\"markdown\"\n content={element.content as string}\n />\n );\n };\n\n const renderSlideElementList = (\n elementList: Element[] = [],\n isActiveStep = false\n ) => {\n if (elementList.length === 0) {\n return null;\n }\n\n const visibleElementCount = elementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const lastVisibleElementIndex = elementList.reduce(\n (lastVisibleIndex, element, index) =>\n element.is_renderable !== false ? index : lastVisibleIndex,\n -1\n );\n\n return (\n <div className=\"slide-stage__content flex w-full flex-col gap-4\">\n {elementList.map((element, index) => {\n const isPreRenderedHtml =\n element.type === \"html\" && element.is_renderable === false;\n\n return (\n <div\n key={element.sequence_number ?? `${element.type}-${index}`}\n ref={\n isActiveStep && index === lastVisibleElementIndex\n ? lastElementRef\n : null\n }\n aria-hidden={isPreRenderedHtml || undefined}\n className={cn(\n \"w-full shrink-0\",\n visibleElementCount === 1 &&\n element.is_renderable !== false &&\n \"slide-element--single\",\n isPreRenderedHtml\n ? \"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0\"\n : element.is_renderable === false && \"hidden\"\n )}\n >\n {renderSlideElement(element, {\n replaceRootScreenHeightWithFull:\n visibleElementCount === 1 &&\n element.type === \"html\" &&\n element.is_renderable !== false,\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n const handleFullscreen = () => {\n const target = sectionRef.current;\n if (!target) return;\n\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n\n target.requestFullscreen?.().catch(() => {});\n };\n\n const scrollStageToBottom = useCallback(() => {\n const stageLayerElement = stageLayerRef.current;\n\n if (!stageLayerElement) {\n return;\n }\n\n // Keep the latest content visible after manual player navigation.\n stageLayerElement.scrollTo({\n top: stageLayerElement.scrollHeight,\n behavior: \"smooth\",\n });\n }, []);\n\n const handlePrev = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n pendingInteractionOverlayStepIndexRef.current = null;\n setHasPlayerInteracted(true);\n setIsAudioLoadingVisible(false);\n showPlayerControls(true);\n resetAudioSequence();\n goPrev();\n }, [goPrev, resetAudioSequence, showPlayerControls]);\n\n const handleNext = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n pendingInteractionOverlayStepIndexRef.current = null;\n setHasPlayerInteracted(true);\n setIsAudioLoadingVisible(false);\n showPlayerControls(true);\n resetAudioSequence();\n goNext();\n }, [goNext, resetAudioSequence, showPlayerControls]);\n\n const handlePlayerLoadingChange = useCallback(\n (loading: boolean) => {\n if (hasCurrentStepAudioUrl) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (!currentStepHasSpeakableElement || hasCompletedCurrentStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n setIsAudioLoadingVisible(loading);\n },\n [\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n hasCurrentStepAudioUrl,\n ]\n );\n\n const handlePlayerEnded = useCallback(\n (audioIndex: number) => {\n const endedAudioKey = audioList[audioIndex]?.audioKey;\n\n if (!endedAudioKey || !currentAudioKey) {\n return;\n }\n\n if (endedAudioKey !== currentAudioKey) {\n return;\n }\n\n const activeSequencePosition = currentAudioSequenceKeys.findIndex(\n (audioSequenceKey) => audioSequenceKey === endedAudioKey\n );\n if (activeSequencePosition < 0) {\n setCurrentAudioKey(null);\n return;\n }\n\n const nextSequencePosition = activeSequencePosition + 1;\n const nextAudioKey = currentAudioSequenceKeys[nextSequencePosition];\n\n if (nextAudioKey) {\n setCurrentAudioKey(nextAudioKey);\n return;\n }\n\n setCurrentAudioKey(null);\n setHasCompletedCurrentStepAudio(true);\n setIsAudioLoadingVisible(false);\n\n if (canGoNext) {\n const nextStepIndex = currentIndex + 1;\n const nextStepElement = slideElementList[nextStepIndex];\n\n if (hasCurrentStepAudioUrl && nextStepElement?.type === \"interaction\") {\n pendingInteractionOverlayStepIndexRef.current = nextStepIndex;\n }\n\n goNext();\n }\n },\n [\n audioList,\n canGoNext,\n currentIndex,\n currentAudioKey,\n currentAudioSequenceKeys,\n goNext,\n hasCurrentStepAudioUrl,\n slideElementList,\n ]\n );\n\n const handleInteractionToggle = useCallback(() => {\n if (!activeInteractionElement) {\n return;\n }\n\n setIsInteractionOverlayOpen((prevOpen) => !prevOpen);\n }, [activeInteractionElement]);\n\n const stopOverlayPropagation = useCallback(\n (\n event:\n | React.PointerEvent<HTMLDivElement>\n | React.MouseEvent<HTMLDivElement>\n ) => {\n event.stopPropagation();\n\n // Keep the player visible a bit longer when users interact with the overlay.\n if (playerVisible) {\n showPlayerControls(true);\n }\n },\n [isPlayerVisible, showPlayerControls]\n );\n\n const handleSurfacePointerDown = useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n onPointerDown?.(event);\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n [onPointerDown, showPlayerControls]\n );\n\n const shouldShowInteractionOverlay =\n Boolean(activeInteractionElement) && isInteractionOverlayOpen;\n const currentRenderElementKeys = useMemo(\n () =>\n currentElementList.map(\n (element, index) =>\n `${element.sequence_number ?? `${element.type}-${index}`}:${String(element.is_new ?? \"\")}`\n ),\n [currentElementList]\n );\n\n useEffect(() => {\n const prevKeys = prevRenderElementKeysRef.current;\n const hasStablePrefix =\n prevKeys.length > 0 &&\n prevKeys.length < currentRenderElementKeys.length &&\n prevKeys.every((key, index) => key === currentRenderElementKeys[index]);\n const appendedElements = hasStablePrefix\n ? currentElementList.slice(prevKeys.length)\n : [];\n const shouldAutoScrollToAppend = appendedElements.some(\n (element) => element.is_new === false\n );\n\n prevRenderElementKeysRef.current = currentRenderElementKeys;\n\n if (!shouldAutoScrollToAppend) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n const stageLayerElement = stageLayerRef.current;\n const targetElement = lastElementRef.current;\n\n if (!stageLayerElement || !targetElement) {\n return;\n }\n\n const stageLayerRect = stageLayerElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const nextScrollTop =\n stageLayerElement.scrollTop + (targetRect.top - stageLayerRect.top);\n\n // Keep newly appended content visible when the current slide grows downward.\n stageLayerElement.scrollTo({\n top: Math.max(nextScrollTop, 0),\n behavior: \"smooth\",\n });\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, currentRenderElementKeys]);\n\n useEffect(() => {\n if (!shouldScrollToBottomRef.current) {\n return;\n }\n\n shouldScrollToBottomRef.current = false;\n\n if (currentElementList.length === 0) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n scrollStageToBottom();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, scrollStageToBottom]);\n\n return (\n <section\n ref={sectionRef}\n className={cn(\"relative h-full w-full\", className)}\n onPointerDown={handleSurfacePointerDown}\n {...props}\n >\n <div\n className={cn(\n \"h-full min-h-0 w-full\",\n isSingleSlide ? \"slide-content--single\" : \"grid gap-4\"\n )}\n >\n {currentElementList.length > 0 ? (\n <div className=\"slide-stage\">\n <div ref={stageLayerRef} className=\"slide-stage__layer w-full\">\n {mountedStepStates.map(\n (mountedStepState, mountedStepStateIndex) => {\n const isActiveStep =\n mountedStepStateIndex === currentMountedStateIndex;\n\n return (\n <div\n key={\n mountedStepState.sourceStepIndexes[0] ??\n mountedStepStateIndex\n }\n aria-hidden={!isActiveStep || undefined}\n className=\"w-full h-full\"\n style={{ display: isActiveStep ? undefined : \"none\" }}\n >\n {renderSlideElementList(\n mountedStepState.elementList,\n isActiveStep\n )}\n </div>\n );\n }\n )}\n </div>\n </div>\n ) : null}\n </div>\n\n {isAudioLoadingVisible ? (\n <div className=\"pointer-events-none absolute left-1/2 top-1/2 z-[3] flex size-28 -translate-x-1/2 -translate-y-1/2 flex-col items-center justify-center gap-2 rounded-2xl bg-foreground/65 px-3 py-4 text-center text-xs leading-4 font-medium text-background shadow-lg backdrop-blur-sm\">\n <LoaderCircle className=\"size-5 animate-spin text-background\" />\n <span>{bufferingText}</span>\n </div>\n ) : null}\n\n {shouldShowInteractionOverlay ? (\n <div\n className={cn(\n \"slide-interaction-overlay\",\n playerVisible && shouldRenderPlayer\n ? \"slide-interaction-overlay--with-player\"\n : \"slide-interaction-overlay--standalone\"\n )}\n onClick={stopOverlayPropagation}\n onPointerDown={stopOverlayPropagation}\n style={interactionOverlayStyle}\n >\n <InteractionOverlayCard\n content={String(activeInteractionElement?.content ?? \"\")}\n defaultButtonText={interactionDefaults.buttonText ?? \"\"}\n defaultInputText={interactionDefaults.inputText ?? \"\"}\n defaultSelectedValues={interactionDefaultSelectedValues}\n confirmButtonText={interactionTexts?.confirmButtonText}\n copyButtonText={interactionTexts?.copyButtonText}\n copiedButtonText={interactionTexts?.copiedButtonText}\n onSend={handleInteractionSend}\n readonly={isInteractionReadonly}\n title={\n interactionTexts?.title ??\n interactionTitle ??\n \"Submit the content below to continue.\"\n }\n />\n </div>\n ) : null}\n\n {shouldRenderPlayer ? (\n <Player\n audioList={audioList}\n className={cn(\n \"absolute left-1/2 bottom-6 z-[2] -translate-x-1/2\",\n playerClassName,\n !playerVisible && \"pointer-events-none opacity-0\"\n )}\n currentAudioIndex={currentAudioIndex}\n defaultPlaying\n hasInteraction={Boolean(activeInteractionElement)}\n isInteractionOpen={isInteractionOverlayOpen}\n onLoadingChange={handlePlayerLoadingChange}\n nextDisabled={!canGoNext}\n onEnded={handlePlayerEnded}\n onFullscreen={handleFullscreen}\n onInteractionToggle={handleInteractionToggle}\n onNext={handleNext}\n onPrev={handlePrev}\n prevDisabled={!canGoPrev}\n showControls={playerVisible}\n customActions={playerCustomActions}\n />\n ) : null}\n </section>\n );\n};\n\nexport default Slide;\n"],"names":["CHECKPOINT_AUTO_ADVANCE_DELAY_MS","InteractionOverlayCard","memo","content","title","defaultButtonText","defaultInputText","defaultSelectedValues","confirmButtonText","copyButtonText","copiedButtonText","onSend","readonly","jsxs","jsx","ContentRender","areStepElementListsEqual","prevElementList","nextElementList","element","index","nextElement","Slide","elementList","showPlayer","playerAlwaysVisible","playerClassName","playerCustomActions","bufferingText","interactionTitle","interactionTexts","playerAutoHideDelay","interactionDefaultValueOptions","onPlayerVisibilityChange","onStepChange","className","onPointerDown","props","sectionRef","useRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","prevRenderElementKeysRef","shouldScrollToBottomRef","pendingInteractionOverlayStepIndexRef","currentElementList","stepElementLists","slideElementList","currentIndex","audioList","currentAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement","canGoPrev","canGoNext","goPrev","goNext","useSlide","currentStepElement","useMemo","isSingleSlide","shouldRenderPlayer","currentAudioSequenceKeys","audioIndex","audioKey","isPlayerVisible","setIsPlayerVisible","useState","hasPlayerInteracted","setHasPlayerInteracted","currentAudioKey","setCurrentAudioKey","isAudioLoadingVisible","setIsAudioLoadingVisible","hasCompletedCurrentStepAudio","setHasCompletedCurrentStepAudio","activeInteractionElement","setActiveInteractionElement","isInteractionOverlayOpen","setIsInteractionOverlayOpen","playerVisible","playerCustomActionCount","getPlayerCustomActionCount","interactionOverlayStyle","mountedStepStates","currentMountedStateIndex","nextMountedStepStates","mountedStateIndexByStep","stepElementList","stepIndex","existingMountedStateIndex","mountedStepState","currentStepKey","currentAudioIndex","audioItem","currentAudioSequenceStartKey","currentInteractionResetKey","currentPlaybackResetKey","hasCurrentStepAudioUrl","clearPlayerHideTimer","useCallback","clearInteractionAutoCloseTimer","clearAutoAdvanceTimer","resetAudioSequence","startCurrentAudioSequence","nextAudioKey","continueAfterInteraction","showPlayerControls","enableAutoHide","hasResolvedCurrentInteraction","shouldBlockPlaybackForInteraction","useEffect","handleSandboxInteraction","event","isSandboxInteractionMessage","useWakePlayerFromIframe","shouldOpenInteractionOverlayAfterAudio","interactionDefaults","getInteractionDefaultValues","interactionDefaultSelectedValues","getInteractionDefaultSelectedValues","hasResolvedInteractionInput","isInteractionReadonly","shouldAutoContinueInteraction","handleInteractionSend","resolvedUserInput","prevElement","renderSlideElement","options","Fragment","IframeSandbox","renderSlideElementList","isActiveStep","visibleElementCount","lastVisibleElementIndex","lastVisibleIndex","isPreRenderedHtml","cn","handleFullscreen","target","scrollStageToBottom","stageLayerElement","handlePrev","handleNext","handlePlayerLoadingChange","loading","handlePlayerEnded","endedAudioKey","activeSequencePosition","audioSequenceKey","nextSequencePosition","nextStepIndex","nextStepElement","handleInteractionToggle","prevOpen","stopOverlayPropagation","handleSurfacePointerDown","shouldShowInteractionOverlay","currentRenderElementKeys","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","mountedStepStateIndex","LoaderCircle","Player"],"mappings":"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"}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
+
import { ContentRenderProps } from '../ContentRender/ContentRender';
|
|
2
3
|
import { OnSendContentParams } from '../types';
|
|
4
|
+
import { InteractionDefaultValueOptions } from '../../lib/interaction-defaults';
|
|
5
|
+
import { PlayerProps } from './Player';
|
|
3
6
|
import { Element } from './types';
|
|
4
7
|
export type { Element, ElementAudioSegment } from './types';
|
|
8
|
+
export interface SlideInteractionTexts extends Pick<ContentRenderProps, "confirmButtonText" | "copyButtonText" | "copiedButtonText"> {
|
|
9
|
+
title?: string;
|
|
10
|
+
}
|
|
5
11
|
export interface SlideProps extends React.ComponentProps<"section"> {
|
|
6
12
|
elementList?: Element[];
|
|
7
13
|
showPlayer?: boolean;
|
|
8
14
|
playerAlwaysVisible?: boolean;
|
|
9
15
|
playerClassName?: string;
|
|
16
|
+
playerCustomActions?: PlayerProps["customActions"];
|
|
17
|
+
bufferingText?: string;
|
|
10
18
|
interactionTitle?: string;
|
|
19
|
+
interactionTexts?: SlideInteractionTexts;
|
|
11
20
|
playerAutoHideDelay?: number;
|
|
21
|
+
interactionDefaultValueOptions?: InteractionDefaultValueOptions;
|
|
12
22
|
onSend?: (content: OnSendContentParams, element?: Element) => void;
|
|
13
23
|
onPlayerVisibilityChange?: (visible: boolean) => void;
|
|
14
24
|
onStepChange?: (element: Element | undefined, index: number) => void;
|