markdown-flow-ui 0.1.100-beta.21 → 0.1.100-beta.22
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/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/ref.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/ref.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.es.js +1 -1
- package/dist/_virtual/index.cjs10.js +1 -1
- package/dist/_virtual/index.cjs11.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.cjs9.js +1 -1
- package/dist/_virtual/index.es10.js +2 -3
- package/dist/_virtual/index.es10.js.map +1 -1
- package/dist/_virtual/index.es11.js +3 -2
- package/dist/_virtual/index.es11.js.map +1 -1
- package/dist/_virtual/index.es8.js +3 -2
- package/dist/_virtual/index.es8.js.map +1 -1
- package/dist/_virtual/index.es9.js +2 -3
- package/dist/_virtual/index.es9.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.es.js +86 -86
- package/dist/components/Slide/Player.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n 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\nconst audioPreloadLinkCache = new Set<string>();\n\nconst preloadAudioUrl = (url?: string) => {\n if (\n typeof document === \"undefined\" ||\n !url ||\n audioPreloadLinkCache.has(url)\n ) {\n return;\n }\n\n const link = document.createElement(\"link\");\n link.rel = \"preload\";\n link.as = \"audio\";\n link.href = url;\n if (/^https?:/i.test(url)) {\n link.crossOrigin = \"anonymous\";\n }\n document.head.appendChild(link);\n audioPreloadLinkCache.add(url);\n};\n\nexport type PlayerProps = React.ComponentProps<\"div\"> & {\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 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 onLoadingChange,\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 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 [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?.audioKey ?? \"none\"}`;\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 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 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 const shouldAutoResume = defaultPlaying && !isPausedByUserRef.current;\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 if (hasNewSrc) {\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [defaultPlaying, getSegmentSrc, tryPlayCurrentAudio, updateLoading]\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 = defaultPlaying && !isPausedByUserRef.current;\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 if (!hasNewSrc) {\n tryPlayCurrentAudio(\"sync-url\");\n }\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 = defaultPlaying && !isPausedByUserRef.current;\n setIsPlaying(false);\n updateLoading(!isPausedByUserRef.current);\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current =\n defaultPlaying && !isPausedByUserRef.current;\n setIsPlaying(false);\n updateLoading(!isPausedByUserRef.current);\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 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\">\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 onPlayRequest?.();\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n updateLoading(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 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 onPlayRequest?.();\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 <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":["audioPreloadLinkCache","preloadAudioUrl","url","link","PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","onLoadingChange","onPrev","onNext","onFullscreen","onEnded","onPlayRequest","onInteractionToggle","hasInteraction","isInteractionOpen","prevDisabled","nextDisabled","showControls","props","audioRef","useRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","isPlaying","setIsPlaying","useState","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","currentAudioKey","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","resetAudio","audioElement","tryPlayCurrentAudio","_reason","playPromise","_error","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","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 \"./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 = React.ComponentProps<\"div\"> & {\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 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 onLoadingChange,\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 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 [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?.audioKey ?? \"none\"}`;\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 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 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 const shouldAutoResume = defaultPlaying && !isPausedByUserRef.current;\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 if (hasNewSrc) {\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [defaultPlaying, getSegmentSrc, tryPlayCurrentAudio, updateLoading]\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 = defaultPlaying && !isPausedByUserRef.current;\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 if (!hasNewSrc) {\n tryPlayCurrentAudio(\"sync-url\");\n }\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 = defaultPlaying && !isPausedByUserRef.current;\n setIsPlaying(false);\n updateLoading(!isPausedByUserRef.current);\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current =\n defaultPlaying && !isPausedByUserRef.current;\n setIsPlaying(false);\n updateLoading(!isPausedByUserRef.current);\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 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\">\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 onPlayRequest?.();\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n updateLoading(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 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 onPlayRequest?.();\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 <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","onPlayRequest","onInteractionToggle","hasInteraction","isInteractionOpen","prevDisabled","nextDisabled","showControls","props","audioRef","useRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","isPlaying","setIsPlaying","useState","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","currentAudioKey","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","resetAudio","audioElement","tryPlayCurrentAudio","_reason","playPromise","_error","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","FilePenLine"],"mappings":"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"}
|