markdown-flow-ui 0.1.128-dev.1 → 0.1.129

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.
Files changed (95) hide show
  1. package/dist/_virtual/index.cjs8.js +1 -1
  2. package/dist/_virtual/index.cjs9.js +1 -1
  3. package/dist/_virtual/index.es8.js +2 -2
  4. package/dist/_virtual/index.es9.js +2 -2
  5. package/dist/assets/markdown-flow-ui.css +1 -1
  6. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs.js.map +1 -1
  7. package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js.map +1 -1
  8. package/dist/components/Slide/Player.cjs.js +1 -1
  9. package/dist/components/Slide/Player.cjs.js.map +1 -1
  10. package/dist/components/Slide/Player.d.ts +22 -2
  11. package/dist/components/Slide/Player.es.js +695 -474
  12. package/dist/components/Slide/Player.es.js.map +1 -1
  13. package/dist/components/Slide/Slide.cjs.js +1 -1
  14. package/dist/components/Slide/Slide.cjs.js.map +1 -1
  15. package/dist/components/Slide/Slide.es.js +673 -595
  16. package/dist/components/Slide/Slide.es.js.map +1 -1
  17. package/dist/components/Slide/Slide.stories.d.ts +2 -0
  18. package/dist/components/Slide/SubtitleOverlay.cjs.js.map +1 -1
  19. package/dist/components/Slide/SubtitleOverlay.es.js.map +1 -1
  20. package/dist/components/Slide/constants.cjs.js +1 -1
  21. package/dist/components/Slide/constants.cjs.js.map +1 -1
  22. package/dist/components/Slide/constants.d.ts +4 -2
  23. package/dist/components/Slide/constants.es.js +4 -2
  24. package/dist/components/Slide/constants.es.js.map +1 -1
  25. package/dist/components/Slide/useSlide.cjs.js +1 -1
  26. package/dist/components/Slide/useSlide.cjs.js.map +1 -1
  27. package/dist/components/Slide/useSlide.d.ts +2 -0
  28. package/dist/components/Slide/useSlide.es.js +124 -105
  29. package/dist/components/Slide/useSlide.es.js.map +1 -1
  30. package/dist/components/Slide/utils/audioSegments.cjs.js +2 -0
  31. package/dist/components/Slide/utils/audioSegments.cjs.js.map +1 -0
  32. package/dist/components/Slide/utils/audioSegments.d.ts +2 -0
  33. package/dist/components/Slide/utils/audioSegments.es.js +21 -0
  34. package/dist/components/Slide/utils/audioSegments.es.js.map +1 -0
  35. package/dist/components/Slide/utils/audioSegments.test.d.ts +1 -0
  36. package/dist/components/Slide/utils/playbackSequence.cjs.js +1 -1
  37. package/dist/components/Slide/utils/playbackSequence.cjs.js.map +1 -1
  38. package/dist/components/Slide/utils/playbackSequence.d.ts +10 -0
  39. package/dist/components/Slide/utils/playbackSequence.es.js +15 -6
  40. package/dist/components/Slide/utils/playbackSequence.es.js.map +1 -1
  41. package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs.js +1 -1
  42. package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs.js.map +1 -1
  43. package/dist/components/Slide/utils/playerKeyboardShortcuts.d.ts +1 -1
  44. package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js +14 -5
  45. package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js.map +1 -1
  46. package/dist/components/Slide/utils/segmentSeek.cjs.js +2 -0
  47. package/dist/components/Slide/utils/segmentSeek.cjs.js.map +1 -0
  48. package/dist/components/Slide/utils/segmentSeek.d.ts +8 -0
  49. package/dist/components/Slide/utils/segmentSeek.es.js +31 -0
  50. package/dist/components/Slide/utils/segmentSeek.es.js.map +1 -0
  51. package/dist/components/Slide/utils/segmentSeek.test.d.ts +1 -0
  52. package/dist/components/Slide/utils/streamingNavigation.cjs.js.map +1 -1
  53. package/dist/components/Slide/utils/streamingNavigation.es.js.map +1 -1
  54. package/dist/components/Slide/utils/subtitleCue.cjs.js +2 -2
  55. package/dist/components/Slide/utils/subtitleCue.cjs.js.map +1 -1
  56. package/dist/components/Slide/utils/subtitleCue.d.ts +31 -0
  57. package/dist/components/Slide/utils/subtitleCue.es.js +157 -6
  58. package/dist/components/Slide/utils/subtitleCue.es.js.map +1 -1
  59. package/dist/components/Slide/utils/subtitleJumpNavigation.cjs.js +2 -0
  60. package/dist/components/Slide/utils/subtitleJumpNavigation.cjs.js.map +1 -0
  61. package/dist/components/Slide/utils/subtitleJumpNavigation.d.ts +10 -0
  62. package/dist/components/Slide/utils/subtitleJumpNavigation.es.js +22 -0
  63. package/dist/components/Slide/utils/subtitleJumpNavigation.es.js.map +1 -0
  64. package/dist/components/Slide/utils/subtitleJumpNavigation.test.d.ts +1 -0
  65. package/dist/lib/interaction-defaults.cjs.js.map +1 -1
  66. package/dist/lib/interaction-defaults.es.js.map +1 -1
  67. package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
  68. package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  69. package/dist/node_modules/classnames/index.cjs.js +1 -1
  70. package/dist/node_modules/classnames/index.es.js +1 -1
  71. package/dist/node_modules/lucide-react/dist/esm/icons/fast-forward.cjs.js +7 -0
  72. package/dist/node_modules/lucide-react/dist/esm/icons/fast-forward.cjs.js.map +1 -0
  73. package/dist/node_modules/lucide-react/dist/esm/icons/fast-forward.es.js +16 -0
  74. package/dist/node_modules/lucide-react/dist/esm/icons/fast-forward.es.js.map +1 -0
  75. package/dist/node_modules/lucide-react/dist/esm/icons/rewind.cjs.js +7 -0
  76. package/dist/node_modules/lucide-react/dist/esm/icons/rewind.cjs.js.map +1 -0
  77. package/dist/node_modules/lucide-react/dist/esm/icons/rewind.es.js +16 -0
  78. package/dist/node_modules/lucide-react/dist/esm/icons/rewind.es.js.map +1 -0
  79. package/dist/node_modules/lucide-react/dist/esm/icons/skip-back.cjs.js +7 -0
  80. package/dist/node_modules/lucide-react/dist/esm/icons/skip-back.cjs.js.map +1 -0
  81. package/dist/node_modules/lucide-react/dist/esm/icons/skip-back.es.js +16 -0
  82. package/dist/node_modules/lucide-react/dist/esm/icons/skip-back.es.js.map +1 -0
  83. package/dist/node_modules/lucide-react/dist/esm/icons/skip-forward.cjs.js +7 -0
  84. package/dist/node_modules/lucide-react/dist/esm/icons/skip-forward.cjs.js.map +1 -0
  85. package/dist/node_modules/lucide-react/dist/esm/icons/skip-forward.es.js +16 -0
  86. package/dist/node_modules/lucide-react/dist/esm/icons/skip-forward.es.js.map +1 -0
  87. package/package.json +1 -1
  88. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs.js +0 -7
  89. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs.js.map +0 -1
  90. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.es.js +0 -16
  91. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.es.js.map +0 -1
  92. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-cw.cjs.js +0 -7
  93. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-cw.cjs.js.map +0 -1
  94. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-cw.es.js +0 -16
  95. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-cw.es.js.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const u=require("react"),C=require("./diff-utils.cjs.js"),P=require("./utils/streamingNavigation.cjs.js"),w=e=>e.filter(n=>n.is_marker),U=e=>e.reduce((n,t,r)=>(t.is_marker&&n.push(r),n),[]),S=e=>!!(e?.is_speakable&&(e.audio_url||(e.audio_segments?.length??0)>0)),B=(e=[])=>e.length>0&&!e.some(n=>n.is_final),p=e=>{const n=e.audio_url?.trim()??"",t=e.audio_segments??[];return{audioUrl:n,audioSegments:t,isAudioStreaming:!n&&B(t)}},G=(e,n)=>{const t=e;return t.element_bid||t.blockBid||t.generated_block_bid||`${e.type}:${String(e.sequence_number??n)}`},H=e=>e.reduce((n,t,r)=>{if(S(t)){const{audioUrl:s,audioSegments:c,isAudioStreaming:a}=p(t);n.push({audioKey:G(t,r),sequenceNumber:t.sequence_number,audioUrl:s,audioSegments:c,isAudioStreaming:a,element:t})}return n},[]),K=e=>{const n=new Map;let t=0;return e.forEach((r,s)=>{S(r)&&(n.set(s,t),t+=1)}),n},$=(e,n,t)=>n.reduce((r,s,c)=>{const a=n[c+1]??e.length,l=[];for(let d=s;d<a;d+=1){const f=e[d];if(!S(f))continue;const o=t.get(d);o!=null&&l.push(o)}return r.set(c,l),r},new Map),b=e=>{const n=e.findIndex(t=>t.is_renderable===!0);return n>=0?n:e.findIndex(t=>t.is_renderable!==!1)},h=e=>({...e,is_renderable:!0}),x=(e,n)=>n<0?[]:e.slice(0,n+1).reduce((t,r)=>{if(r.type==="interaction")return t;const s=h(r);return s.type==="diff"?C.applyDiffElement(t,s)??[...t,s]:r.is_new?[s]:t.length===0?[s]:[...t,s]},[]),j=e=>e.map((n,t)=>x(e,t)),D=(e,n,t)=>{if(t<0)return!1;const r=n[t];if(typeof r!="number")return!1;const s=n[t+1]??e.length;for(let c=r;c<s;c+=1)if(e[c]?.is_speakable)return!0;return!1},L=(e,n)=>e.length===n.length&&e.every((t,r)=>t===n[r]),O=(e,n)=>e.length===n.length&&e.every((t,r)=>t===n[r]),T=(e=[])=>{const n=u.useRef(e),t=u.useRef([]),r=u.useMemo(()=>L(n.current,e)?n.current:(n.current=e,e),[e]),s=u.useMemo(()=>w(r),[r]),c=u.useRef(s),a=u.useMemo(()=>U(r),[r]),l=u.useMemo(()=>H(r),[r]),d=u.useMemo(()=>K(r),[r]),f=u.useMemo(()=>$(r,a,d),[d,a,r]),[o,m]=u.useState(()=>b(s));u.useEffect(()=>{const i=c.current;m(N=>{const M=P.resolveNextSlideIndexAfterMarkerAppend({previousIndex:N,previousSlideElementList:i,nextSlideElementList:s});return M>=0?M:b(s)}),c.current=s},[s]);const _=u.useCallback(()=>{m(i=>i<=0?Math.max(i,0):Math.max(i-1,0))},[]),E=u.useCallback(()=>{m(i=>i<0?i:Math.min(i+1,s.length-1))},[s.length]),I=o>0,A=o>=0&&o<s.length-1,g=u.useMemo(()=>{if(o<0)return;const i=s[o];if(i)return h(i)},[o,s]),k=u.useMemo(()=>x(s,o),[o,s]),v=u.useMemo(()=>j(s),[s]),y=u.useMemo(()=>{const i=f.get(o)??[];return O(t.current,i)?t.current:(t.current=i,i)},[o,f]),q=u.useMemo(()=>D(r,a,o),[o,a,r]),R=u.useMemo(()=>g?.type==="interaction"?g:void 0,[g]);return{currentElementList:k,stepElementLists:v,slideElementList:s,currentIndex:o,audioList:l,currentAudioSequenceIndexes:y,currentStepHasSpeakableElement:q,currentInteractionElement:R,canGoPrev:I,canGoNext:A,handlePrev:_,handleNext:E}};exports.default=T;exports.resolveSlideAudioItemSource=p;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("react"),w=require("./diff-utils.cjs.js"),G=require("./utils/streamingNavigation.cjs.js"),U=e=>e.filter(n=>n.is_marker),B=e=>e.reduce((n,t,s)=>(t.is_marker&&n.push(s),n),[]),h=e=>!!(e?.is_speakable&&(e.audio_url||(e.audio_segments?.length??0)>0)),H=(e=[])=>e.length>0&&!e.some(n=>n.is_final),x=e=>{const n=e.audio_url?.trim()??"",t=e.audio_segments??[];return{audioUrl:n,audioSegments:t,isAudioStreaming:!n&&H(t)}},K=(e,n)=>{const t=e;return t.element_bid||t.blockBid||t.generated_block_bid||`${e.type}:${String(e.sequence_number??n)}`},T=e=>e.reduce((n,t,s)=>{if(h(t)){const{audioUrl:r,audioSegments:c,isAudioStreaming:a}=x(t);n.push({audioKey:K(t,s),sequenceNumber:t.sequence_number,audioUrl:r,audioSegments:c,isAudioStreaming:a,element:t})}return n},[]),$=e=>{const n=new Map;let t=0;return e.forEach((s,r)=>{h(s)&&(n.set(r,t),t+=1)}),n},j=(e,n,t)=>n.reduce((s,r,c)=>{const a=n[c+1]??e.length,f=[];for(let d=r;d<a;d+=1){const l=e[d];if(!h(l))continue;const m=t.get(d);m!=null&&f.push(m)}return s.set(c,f),s},new Map),D=e=>{const n=[];return e.forEach((t,s)=>{t.forEach(r=>{n[r]=s})}),n},b=e=>{const n=e.findIndex(t=>t.is_renderable===!0);return n>=0?n:e.findIndex(t=>t.is_renderable!==!1)},p=e=>({...e,is_renderable:!0}),E=(e,n)=>n<0?[]:e.slice(0,n+1).reduce((t,s)=>{if(s.type==="interaction")return t;const r=p(s);return r.type==="diff"?w.applyDiffElement(t,r)??[...t,r]:s.is_new?[r]:t.length===0?[r]:[...t,r]},[]),F=e=>e.map((n,t)=>E(e,t)),L=(e,n,t)=>{if(t<0)return!1;const s=n[t];if(typeof s!="number")return!1;const r=n[t+1]??e.length;for(let c=s;c<r;c+=1)if(e[c]?.is_speakable)return!0;return!1},O=(e,n)=>e.length===n.length&&e.every((t,s)=>t===n[s]),z=(e,n)=>e.length===n.length&&e.every((t,s)=>t===n[s]),J=(e=[])=>{const n=o.useRef(e),t=o.useRef([]),s=o.useMemo(()=>O(n.current,e)?n.current:(n.current=e,e),[e]),r=o.useMemo(()=>U(s),[s]),c=o.useRef(r),a=o.useMemo(()=>B(s),[s]),f=o.useMemo(()=>T(s),[s]),d=o.useMemo(()=>$(s),[s]),l=o.useMemo(()=>j(s,a,d),[d,a,s]),m=o.useMemo(()=>D(l),[l]),[i,g]=o.useState(()=>b(r));o.useEffect(()=>{const u=c.current;g(P=>{const M=G.resolveNextSlideIndexAfterMarkerAppend({previousIndex:P,previousSlideElementList:u,nextSlideElementList:r});return M>=0?M:b(r)}),c.current=r},[r]);const _=o.useCallback(()=>{g(u=>u<=0?Math.max(u,0):Math.max(u-1,0))},[]),I=o.useCallback(()=>{g(u=>u<0?u:Math.min(u+1,r.length-1))},[r.length]),A=o.useCallback(u=>{!Number.isFinite(u)||r.length===0||g(Math.min(Math.max(Math.trunc(u),0),r.length-1))},[r.length]),k=i>0,v=i>=0&&i<r.length-1,S=o.useMemo(()=>{if(i<0)return;const u=r[i];if(u)return p(u)},[i,r]),y=o.useMemo(()=>E(r,i),[i,r]),q=o.useMemo(()=>F(r),[r]),N=o.useMemo(()=>{const u=l.get(i)??[];return z(t.current,u)?t.current:(t.current=u,u)},[i,l]),R=o.useMemo(()=>L(s,a,i),[i,a,s]),C=o.useMemo(()=>S?.type==="interaction"?S:void 0,[S]);return{currentElementList:y,stepElementLists:q,slideElementList:r,currentIndex:i,audioList:f,audioSlideIndexes:m,currentAudioSequenceIndexes:N,currentStepHasSpeakableElement:R,currentInteractionElement:C,canGoPrev:k,canGoNext:v,handlePrev:_,handleNext:I,handleGoTo:A}};exports.default=J;exports.resolveSlideAudioItemSource=x;
2
2
  //# sourceMappingURL=useSlide.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSlide.cjs.js","sources":["../../../src/components/Slide/useSlide.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { applyDiffElement } from \"./diff-utils\";\nimport type { Element, ElementAudioSegment } from \"./types\";\nimport { resolveNextSlideIndexAfterMarkerAppend } from \"./utils/streamingNavigation\";\n\nexport interface SlideAudioItem {\n audioKey?: string;\n sequenceNumber?: number;\n audioUrl?: string;\n audioSegments?: ElementAudioSegment[];\n isAudioStreaming?: boolean;\n element?: Element;\n}\n\nexport interface UseSlideResult {\n currentElementList: Element[];\n stepElementLists: Element[][];\n slideElementList: Element[];\n currentIndex: number;\n audioList: SlideAudioItem[];\n currentAudioSequenceIndexes: number[];\n currentStepHasSpeakableElement: boolean;\n currentInteractionElement?: Element;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n}\n\nconst getMarkerElementList = (elementList: Element[]) =>\n elementList.filter((element) => element.is_marker);\n\nconst getMarkerElementIndexes = (elementList: Element[]) =>\n elementList.reduce<number[]>((indexes, element, index) => {\n if (element.is_marker) {\n indexes.push(index);\n }\n\n return indexes;\n }, []);\n\nconst hasPlayableAudio = (element?: Element) =>\n Boolean(\n element?.is_speakable &&\n (element.audio_url || (element.audio_segments?.length ?? 0) > 0)\n );\n\nconst isStreamingAudio = (segments: ElementAudioSegment[] = []) =>\n segments.length > 0 && !segments.some((segment) => segment.is_final);\n\nexport const resolveSlideAudioItemSource = (element: Element) => {\n const audioUrl = element.audio_url?.trim() ?? \"\";\n const audioSegments = element.audio_segments ?? [];\n\n return {\n audioUrl,\n audioSegments,\n isAudioStreaming: !audioUrl && isStreamingAudio(audioSegments),\n };\n};\n\nconst getElementAudioKey = (element: Element, index: number) => {\n const candidateElement = element as Element & {\n element_bid?: string;\n blockBid?: string;\n generated_block_bid?: string;\n };\n\n return (\n candidateElement.element_bid ||\n candidateElement.blockBid ||\n candidateElement.generated_block_bid ||\n `${element.type}:${String(element.sequence_number ?? index)}`\n );\n};\n\nconst getAudioList = (elementList: Element[]) =>\n elementList.reduce<SlideAudioItem[]>((list, element, elementIndex) => {\n if (hasPlayableAudio(element)) {\n const { audioUrl, audioSegments, isAudioStreaming } =\n resolveSlideAudioItemSource(element);\n\n list.push({\n audioKey: getElementAudioKey(element, elementIndex),\n sequenceNumber: element.sequence_number,\n // Keep the completed URL available once it arrives so loading can end.\n audioUrl,\n audioSegments,\n isAudioStreaming,\n element,\n });\n }\n\n return list;\n }, []);\n\nconst getAudioIndexMap = (elementList: Element[]) => {\n const audioIndexMap = new Map<number, number>();\n let audioIndex = 0;\n\n elementList.forEach((element, index) => {\n if (hasPlayableAudio(element)) {\n audioIndexMap.set(index, audioIndex);\n audioIndex += 1;\n }\n });\n\n return audioIndexMap;\n};\n\nconst getSlideAudioSequenceMap = (\n elementList: Element[],\n markerElementIndexes: number[],\n audioIndexMap: Map<number, number>\n) =>\n markerElementIndexes.reduce<Map<number, number[]>>(\n (sequenceMap, startIndex, slideIndex) => {\n const nextMarkerIndex =\n markerElementIndexes[slideIndex + 1] ?? elementList.length;\n const sequenceIndexes: number[] = [];\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n const element = elementList[index];\n\n if (!hasPlayableAudio(element)) {\n continue;\n }\n\n const audioIndex = audioIndexMap.get(index);\n\n if (audioIndex == null) {\n continue;\n }\n\n sequenceIndexes.push(audioIndex);\n }\n\n sequenceMap.set(slideIndex, sequenceIndexes);\n return sequenceMap;\n },\n new Map<number, number[]>()\n );\n\nconst getInitialSlideIndex = (slideElementList: Element[]) => {\n const visibleIndex = slideElementList.findIndex(\n (element) => element.is_renderable === true\n );\n\n if (visibleIndex >= 0) {\n return visibleIndex;\n }\n\n return slideElementList.findIndex(\n (element) => element.is_renderable !== false\n );\n};\n\nconst getVisibleElement = (element: Element): Element => ({\n ...element,\n is_renderable: true,\n});\n\nconst getCurrentElementList = (\n slideElementList: Element[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return [];\n }\n\n return slideElementList\n .slice(0, currentIndex + 1)\n .reduce<Element[]>((currentList, element) => {\n if (element.type === \"interaction\") {\n return currentList;\n }\n\n const visibleElement = getVisibleElement(element);\n\n if (visibleElement.type === \"diff\") {\n const nextList = applyDiffElement(currentList, visibleElement);\n\n return nextList ?? [...currentList, visibleElement];\n }\n\n if (element.is_new) {\n return [visibleElement];\n }\n\n if (currentList.length === 0) {\n return [visibleElement];\n }\n\n return [...currentList, visibleElement];\n }, []);\n};\n\nconst getStepElementLists = (slideElementList: Element[]) =>\n slideElementList.map((_, index) =>\n getCurrentElementList(slideElementList, index)\n );\n\nconst getStepHasSpeakableElement = (\n elementList: Element[],\n markerElementIndexes: number[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return false;\n }\n\n const startIndex = markerElementIndexes[currentIndex];\n\n if (typeof startIndex !== \"number\") {\n return false;\n }\n\n const nextMarkerIndex =\n markerElementIndexes[currentIndex + 1] ?? elementList.length;\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n if (elementList[index]?.is_speakable) {\n return true;\n }\n }\n\n return false;\n};\n\nconst hasSameElementReferences = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => element === nextElementList[index]);\n\nconst hasSameNumberValues = (prevValues: number[], nextValues: number[]) =>\n prevValues.length === nextValues.length &&\n prevValues.every((value, index) => value === nextValues[index]);\n\nconst useSlide = (elementList: Element[] = []): UseSlideResult => {\n const stableElementListRef = useRef(elementList);\n const stableCurrentAudioSequenceIndexesRef = useRef<number[]>([]);\n const stableElementList = useMemo(() => {\n if (hasSameElementReferences(stableElementListRef.current, elementList)) {\n return stableElementListRef.current;\n }\n\n // Reuse the previous wrapper array when the element references are unchanged.\n stableElementListRef.current = elementList;\n return elementList;\n }, [elementList]);\n const slideElementList = useMemo(\n () => getMarkerElementList(stableElementList),\n [stableElementList]\n );\n const previousSlideElementListRef = useRef(slideElementList);\n const markerElementIndexes = useMemo(\n () => getMarkerElementIndexes(stableElementList),\n [stableElementList]\n );\n const audioList = useMemo(\n () => getAudioList(stableElementList),\n [stableElementList]\n );\n const audioIndexMap = useMemo(\n () => getAudioIndexMap(stableElementList),\n [stableElementList]\n );\n const slideAudioSequenceMap = useMemo(\n () =>\n getSlideAudioSequenceMap(\n stableElementList,\n markerElementIndexes,\n audioIndexMap\n ),\n [audioIndexMap, markerElementIndexes, stableElementList]\n );\n const [currentIndex, setCurrentIndex] = useState(() =>\n getInitialSlideIndex(slideElementList)\n );\n\n useEffect(() => {\n const previousSlideElementList = previousSlideElementListRef.current;\n\n setCurrentIndex((prevIndex) => {\n const resolvedNextIndex = resolveNextSlideIndexAfterMarkerAppend({\n previousIndex: prevIndex,\n previousSlideElementList,\n nextSlideElementList: slideElementList,\n });\n\n if (resolvedNextIndex >= 0) {\n return resolvedNextIndex;\n }\n\n return getInitialSlideIndex(slideElementList);\n });\n\n previousSlideElementListRef.current = slideElementList;\n }, [slideElementList]);\n\n const handlePrev = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex <= 0) {\n return Math.max(prevIndex, 0);\n }\n\n return Math.max(prevIndex - 1, 0);\n });\n }, []);\n\n const handleNext = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex < 0) {\n return prevIndex;\n }\n\n return Math.min(prevIndex + 1, slideElementList.length - 1);\n });\n }, [slideElementList.length]);\n\n const canGoPrev = currentIndex > 0;\n const canGoNext =\n currentIndex >= 0 && currentIndex < slideElementList.length - 1;\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n const element = slideElementList[currentIndex];\n\n if (!element) {\n return undefined;\n }\n\n return getVisibleElement(element);\n }, [currentIndex, slideElementList]);\n const currentElementList = useMemo(\n () => getCurrentElementList(slideElementList, currentIndex),\n [currentIndex, slideElementList]\n );\n const stepElementLists = useMemo(\n () => getStepElementLists(slideElementList),\n [slideElementList]\n );\n const currentAudioSequenceIndexes = useMemo(() => {\n const nextAudioSequenceIndexes =\n slideAudioSequenceMap.get(currentIndex) ?? [];\n\n if (\n hasSameNumberValues(\n stableCurrentAudioSequenceIndexesRef.current,\n nextAudioSequenceIndexes\n )\n ) {\n return stableCurrentAudioSequenceIndexesRef.current;\n }\n\n stableCurrentAudioSequenceIndexesRef.current = nextAudioSequenceIndexes;\n\n return nextAudioSequenceIndexes;\n }, [currentIndex, slideAudioSequenceMap]);\n const currentStepHasSpeakableElement = useMemo(\n () =>\n getStepHasSpeakableElement(\n stableElementList,\n markerElementIndexes,\n currentIndex\n ),\n [currentIndex, markerElementIndexes, stableElementList]\n );\n const currentInteractionElement = useMemo(\n () =>\n currentStepElement?.type === \"interaction\"\n ? currentStepElement\n : undefined,\n [currentStepElement]\n );\n\n return {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n };\n};\n\nexport default useSlide;\n"],"names":["getMarkerElementList","elementList","element","getMarkerElementIndexes","indexes","index","hasPlayableAudio","isStreamingAudio","segments","segment","resolveSlideAudioItemSource","audioUrl","audioSegments","getElementAudioKey","candidateElement","getAudioList","list","elementIndex","isAudioStreaming","getAudioIndexMap","audioIndexMap","audioIndex","getSlideAudioSequenceMap","markerElementIndexes","sequenceMap","startIndex","slideIndex","nextMarkerIndex","sequenceIndexes","getInitialSlideIndex","slideElementList","visibleIndex","getVisibleElement","getCurrentElementList","currentIndex","currentList","visibleElement","applyDiffElement","getStepElementLists","_","getStepHasSpeakableElement","hasSameElementReferences","prevElementList","nextElementList","hasSameNumberValues","prevValues","nextValues","value","useSlide","stableElementListRef","useRef","stableCurrentAudioSequenceIndexesRef","stableElementList","useMemo","previousSlideElementListRef","audioList","slideAudioSequenceMap","setCurrentIndex","useState","useEffect","previousSlideElementList","prevIndex","resolvedNextIndex","resolveNextSlideIndexAfterMarkerAppend","handlePrev","useCallback","handleNext","canGoPrev","canGoNext","currentStepElement","currentElementList","stepElementLists","currentAudioSequenceIndexes","nextAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement"],"mappings":"sNA8BMA,EAAwBC,GAC5BA,EAAY,OAAQC,GAAYA,EAAQ,SAAS,EAE7CC,EAA2BF,GAC/BA,EAAY,OAAiB,CAACG,EAASF,EAASG,KAC1CH,EAAQ,WACVE,EAAQ,KAAKC,CAAK,EAGbD,GACN,EAAE,EAEDE,EAAoBJ,GACxB,GACEA,GAAS,eACRA,EAAQ,YAAcA,EAAQ,gBAAgB,QAAU,GAAK,IAG5DK,EAAmB,CAACC,EAAkC,KAC1DA,EAAS,OAAS,GAAK,CAACA,EAAS,KAAMC,GAAYA,EAAQ,QAAQ,EAExDC,EAA+BR,GAAqB,CAC/D,MAAMS,EAAWT,EAAQ,WAAW,KAAA,GAAU,GACxCU,EAAgBV,EAAQ,gBAAkB,CAAA,EAEhD,MAAO,CACL,SAAAS,EACA,cAAAC,EACA,iBAAkB,CAACD,GAAYJ,EAAiBK,CAAa,CAAA,CAEjE,EAEMC,EAAqB,CAACX,EAAkBG,IAAkB,CAC9D,MAAMS,EAAmBZ,EAMzB,OACEY,EAAiB,aACjBA,EAAiB,UACjBA,EAAiB,qBACjB,GAAGZ,EAAQ,IAAI,IAAI,OAAOA,EAAQ,iBAAmBG,CAAK,CAAC,EAE/D,EAEMU,EAAgBd,GACpBA,EAAY,OAAyB,CAACe,EAAMd,EAASe,IAAiB,CACpE,GAAIX,EAAiBJ,CAAO,EAAG,CAC7B,KAAM,CAAE,SAAAS,EAAU,cAAAC,EAAe,iBAAAM,CAAA,EAC/BR,EAA4BR,CAAO,EAErCc,EAAK,KAAK,CACR,SAAUH,EAAmBX,EAASe,CAAY,EAClD,eAAgBf,EAAQ,gBAExB,SAAAS,EACA,cAAAC,EACA,iBAAAM,EACA,QAAAhB,CAAA,CACD,CACH,CAEA,OAAOc,CACT,EAAG,EAAE,EAEDG,EAAoBlB,GAA2B,CACnD,MAAMmB,MAAoB,IAC1B,IAAIC,EAAa,EAEjB,OAAApB,EAAY,QAAQ,CAACC,EAASG,IAAU,CAClCC,EAAiBJ,CAAO,IAC1BkB,EAAc,IAAIf,EAAOgB,CAAU,EACnCA,GAAc,EAElB,CAAC,EAEMD,CACT,EAEME,EAA2B,CAC/BrB,EACAsB,EACAH,IAEAG,EAAqB,OACnB,CAACC,EAAaC,EAAYC,IAAe,CACvC,MAAMC,EACJJ,EAAqBG,EAAa,CAAC,GAAKzB,EAAY,OAChD2B,EAA4B,CAAA,EAElC,QAASvB,EAAQoB,EAAYpB,EAAQsB,EAAiBtB,GAAS,EAAG,CAChE,MAAMH,EAAUD,EAAYI,CAAK,EAEjC,GAAI,CAACC,EAAiBJ,CAAO,EAC3B,SAGF,MAAMmB,EAAaD,EAAc,IAAIf,CAAK,EAEtCgB,GAAc,MAIlBO,EAAgB,KAAKP,CAAU,CACjC,CAEA,OAAAG,EAAY,IAAIE,EAAYE,CAAe,EACpCJ,CACT,MACI,GACN,EAEIK,EAAwBC,GAAgC,CAC5D,MAAMC,EAAeD,EAAiB,UACnC5B,GAAYA,EAAQ,gBAAkB,EAAA,EAGzC,OAAI6B,GAAgB,EACXA,EAGFD,EAAiB,UACrB5B,GAAYA,EAAQ,gBAAkB,EAAA,CAE3C,EAEM8B,EAAqB9B,IAA+B,CACxD,GAAGA,EACH,cAAe,EACjB,GAEM+B,EAAwB,CAC5BH,EACAI,IAEIA,EAAe,EACV,CAAA,EAGFJ,EACJ,MAAM,EAAGI,EAAe,CAAC,EACzB,OAAkB,CAACC,EAAajC,IAAY,CAC3C,GAAIA,EAAQ,OAAS,cACnB,OAAOiC,EAGT,MAAMC,EAAiBJ,EAAkB9B,CAAO,EAEhD,OAAIkC,EAAe,OAAS,OACTC,EAAAA,iBAAiBF,EAAaC,CAAc,GAE1C,CAAC,GAAGD,EAAaC,CAAc,EAGhDlC,EAAQ,OACH,CAACkC,CAAc,EAGpBD,EAAY,SAAW,EAClB,CAACC,CAAc,EAGjB,CAAC,GAAGD,EAAaC,CAAc,CACxC,EAAG,CAAA,CAAE,EAGHE,EAAuBR,GAC3BA,EAAiB,IAAI,CAACS,EAAGlC,IACvB4B,EAAsBH,EAAkBzB,CAAK,CAC/C,EAEImC,EAA6B,CACjCvC,EACAsB,EACAW,IACG,CACH,GAAIA,EAAe,EACjB,MAAO,GAGT,MAAMT,EAAaF,EAAqBW,CAAY,EAEpD,GAAI,OAAOT,GAAe,SACxB,MAAO,GAGT,MAAME,EACJJ,EAAqBW,EAAe,CAAC,GAAKjC,EAAY,OAExD,QAASI,EAAQoB,EAAYpB,EAAQsB,EAAiBtB,GAAS,EAC7D,GAAIJ,EAAYI,CAAK,GAAG,aACtB,MAAO,GAIX,MAAO,EACT,EAEMoC,EAA2B,CAC/BC,EACAC,IAEAD,EAAgB,SAAWC,EAAgB,QAC3CD,EAAgB,MAAM,CAACxC,EAASG,IAAUH,IAAYyC,EAAgBtC,CAAK,CAAC,EAExEuC,EAAsB,CAACC,EAAsBC,IACjDD,EAAW,SAAWC,EAAW,QACjCD,EAAW,MAAM,CAACE,EAAO1C,IAAU0C,IAAUD,EAAWzC,CAAK,CAAC,EAE1D2C,EAAW,CAAC/C,EAAyB,KAAuB,CAChE,MAAMgD,EAAuBC,EAAAA,OAAOjD,CAAW,EACzCkD,EAAuCD,EAAAA,OAAiB,EAAE,EAC1DE,EAAoBC,EAAAA,QAAQ,IAC5BZ,EAAyBQ,EAAqB,QAAShD,CAAW,EAC7DgD,EAAqB,SAI9BA,EAAqB,QAAUhD,EACxBA,GACN,CAACA,CAAW,CAAC,EACV6B,EAAmBuB,EAAAA,QACvB,IAAMrD,EAAqBoD,CAAiB,EAC5C,CAACA,CAAiB,CAAA,EAEdE,EAA8BJ,EAAAA,OAAOpB,CAAgB,EACrDP,EAAuB8B,EAAAA,QAC3B,IAAMlD,EAAwBiD,CAAiB,EAC/C,CAACA,CAAiB,CAAA,EAEdG,EAAYF,EAAAA,QAChB,IAAMtC,EAAaqC,CAAiB,EACpC,CAACA,CAAiB,CAAA,EAEdhC,EAAgBiC,EAAAA,QACpB,IAAMlC,EAAiBiC,CAAiB,EACxC,CAACA,CAAiB,CAAA,EAEdI,EAAwBH,EAAAA,QAC5B,IACE/B,EACE8B,EACA7B,EACAH,CAAA,EAEJ,CAACA,EAAeG,EAAsB6B,CAAiB,CAAA,EAEnD,CAAClB,EAAcuB,CAAe,EAAIC,EAAAA,SAAS,IAC/C7B,EAAqBC,CAAgB,CAAA,EAGvC6B,EAAAA,UAAU,IAAM,CACd,MAAMC,EAA2BN,EAA4B,QAE7DG,EAAiBI,GAAc,CAC7B,MAAMC,EAAoBC,EAAAA,uCAAuC,CAC/D,cAAeF,EACf,yBAAAD,EACA,qBAAsB9B,CAAA,CACvB,EAED,OAAIgC,GAAqB,EAChBA,EAGFjC,EAAqBC,CAAgB,CAC9C,CAAC,EAEDwB,EAA4B,QAAUxB,CACxC,EAAG,CAACA,CAAgB,CAAC,EAErB,MAAMkC,EAAaC,EAAAA,YAAY,IAAM,CACnCR,EAAiBI,GACXA,GAAa,EACR,KAAK,IAAIA,EAAW,CAAC,EAGvB,KAAK,IAAIA,EAAY,EAAG,CAAC,CACjC,CACH,EAAG,CAAA,CAAE,EAECK,EAAaD,EAAAA,YAAY,IAAM,CACnCR,EAAiBI,GACXA,EAAY,EACPA,EAGF,KAAK,IAAIA,EAAY,EAAG/B,EAAiB,OAAS,CAAC,CAC3D,CACH,EAAG,CAACA,EAAiB,MAAM,CAAC,EAEtBqC,EAAYjC,EAAe,EAC3BkC,EACJlC,GAAgB,GAAKA,EAAeJ,EAAiB,OAAS,EAC1DuC,EAAqBhB,EAAAA,QAAQ,IAAM,CACvC,GAAInB,EAAe,EACjB,OAGF,MAAMhC,EAAU4B,EAAiBI,CAAY,EAE7C,GAAKhC,EAIL,OAAO8B,EAAkB9B,CAAO,CAClC,EAAG,CAACgC,EAAcJ,CAAgB,CAAC,EAC7BwC,EAAqBjB,EAAAA,QACzB,IAAMpB,EAAsBH,EAAkBI,CAAY,EAC1D,CAACA,EAAcJ,CAAgB,CAAA,EAE3ByC,EAAmBlB,EAAAA,QACvB,IAAMf,EAAoBR,CAAgB,EAC1C,CAACA,CAAgB,CAAA,EAEb0C,EAA8BnB,EAAAA,QAAQ,IAAM,CAChD,MAAMoB,EACJjB,EAAsB,IAAItB,CAAY,GAAK,CAAA,EAE7C,OACEU,EACEO,EAAqC,QACrCsB,CAAA,EAGKtB,EAAqC,SAG9CA,EAAqC,QAAUsB,EAExCA,EACT,EAAG,CAACvC,EAAcsB,CAAqB,CAAC,EAClCkB,EAAiCrB,EAAAA,QACrC,IACEb,EACEY,EACA7B,EACAW,CAAA,EAEJ,CAACA,EAAcX,EAAsB6B,CAAiB,CAAA,EAElDuB,EAA4BtB,EAAAA,QAChC,IACEgB,GAAoB,OAAS,cACzBA,EACA,OACN,CAACA,CAAkB,CAAA,EAGrB,MAAO,CACL,mBAAAC,EACA,iBAAAC,EACA,iBAAAzC,EACA,aAAAI,EACA,UAAAqB,EACA,4BAAAiB,EACA,+BAAAE,EACA,0BAAAC,EACA,UAAAR,EACA,UAAAC,EACA,WAAAJ,EACA,WAAAE,CAAA,CAEJ"}
1
+ {"version":3,"file":"useSlide.cjs.js","sources":["../../../src/components/Slide/useSlide.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { applyDiffElement } from \"./diff-utils\";\nimport type { Element, ElementAudioSegment } from \"./types\";\nimport { resolveNextSlideIndexAfterMarkerAppend } from \"./utils/streamingNavigation\";\n\nexport interface SlideAudioItem {\n audioKey?: string;\n sequenceNumber?: number;\n audioUrl?: string;\n audioSegments?: ElementAudioSegment[];\n isAudioStreaming?: boolean;\n element?: Element;\n}\n\nexport interface UseSlideResult {\n currentElementList: Element[];\n stepElementLists: Element[][];\n slideElementList: Element[];\n currentIndex: number;\n audioList: SlideAudioItem[];\n audioSlideIndexes: number[];\n currentAudioSequenceIndexes: number[];\n currentStepHasSpeakableElement: boolean;\n currentInteractionElement?: Element;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n handleGoTo: (index: number) => void;\n}\n\nconst getMarkerElementList = (elementList: Element[]) =>\n elementList.filter((element) => element.is_marker);\n\nconst getMarkerElementIndexes = (elementList: Element[]) =>\n elementList.reduce<number[]>((indexes, element, index) => {\n if (element.is_marker) {\n indexes.push(index);\n }\n\n return indexes;\n }, []);\n\nconst hasPlayableAudio = (element?: Element) =>\n Boolean(\n element?.is_speakable &&\n (element.audio_url || (element.audio_segments?.length ?? 0) > 0)\n );\n\nconst isStreamingAudio = (segments: ElementAudioSegment[] = []) =>\n segments.length > 0 && !segments.some((segment) => segment.is_final);\n\nexport const resolveSlideAudioItemSource = (element: Element) => {\n const audioUrl = element.audio_url?.trim() ?? \"\";\n const audioSegments = element.audio_segments ?? [];\n\n return {\n audioUrl,\n audioSegments,\n isAudioStreaming: !audioUrl && isStreamingAudio(audioSegments),\n };\n};\n\nconst getElementAudioKey = (element: Element, index: number) => {\n const candidateElement = element as Element & {\n element_bid?: string;\n blockBid?: string;\n generated_block_bid?: string;\n };\n\n return (\n candidateElement.element_bid ||\n candidateElement.blockBid ||\n candidateElement.generated_block_bid ||\n `${element.type}:${String(element.sequence_number ?? index)}`\n );\n};\n\nconst getAudioList = (elementList: Element[]) =>\n elementList.reduce<SlideAudioItem[]>((list, element, elementIndex) => {\n if (hasPlayableAudio(element)) {\n const { audioUrl, audioSegments, isAudioStreaming } =\n resolveSlideAudioItemSource(element);\n\n list.push({\n audioKey: getElementAudioKey(element, elementIndex),\n sequenceNumber: element.sequence_number,\n // Keep the completed URL available once it arrives so loading can end.\n audioUrl,\n audioSegments,\n isAudioStreaming,\n element,\n });\n }\n\n return list;\n }, []);\n\nconst getAudioIndexMap = (elementList: Element[]) => {\n const audioIndexMap = new Map<number, number>();\n let audioIndex = 0;\n\n elementList.forEach((element, index) => {\n if (hasPlayableAudio(element)) {\n audioIndexMap.set(index, audioIndex);\n audioIndex += 1;\n }\n });\n\n return audioIndexMap;\n};\n\nconst getSlideAudioSequenceMap = (\n elementList: Element[],\n markerElementIndexes: number[],\n audioIndexMap: Map<number, number>\n) =>\n markerElementIndexes.reduce<Map<number, number[]>>(\n (sequenceMap, startIndex, slideIndex) => {\n const nextMarkerIndex =\n markerElementIndexes[slideIndex + 1] ?? elementList.length;\n const sequenceIndexes: number[] = [];\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n const element = elementList[index];\n\n if (!hasPlayableAudio(element)) {\n continue;\n }\n\n const audioIndex = audioIndexMap.get(index);\n\n if (audioIndex == null) {\n continue;\n }\n\n sequenceIndexes.push(audioIndex);\n }\n\n sequenceMap.set(slideIndex, sequenceIndexes);\n return sequenceMap;\n },\n new Map<number, number[]>()\n );\n\nconst getAudioSlideIndexes = (slideAudioSequenceMap: Map<number, number[]>) => {\n const audioSlideIndexes: number[] = [];\n\n slideAudioSequenceMap.forEach((audioIndexes, slideIndex) => {\n audioIndexes.forEach((audioIndex) => {\n audioSlideIndexes[audioIndex] = slideIndex;\n });\n });\n\n return audioSlideIndexes;\n};\n\nconst getInitialSlideIndex = (slideElementList: Element[]) => {\n const visibleIndex = slideElementList.findIndex(\n (element) => element.is_renderable === true\n );\n\n if (visibleIndex >= 0) {\n return visibleIndex;\n }\n\n return slideElementList.findIndex(\n (element) => element.is_renderable !== false\n );\n};\n\nconst getVisibleElement = (element: Element): Element => ({\n ...element,\n is_renderable: true,\n});\n\nconst getCurrentElementList = (\n slideElementList: Element[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return [];\n }\n\n return slideElementList\n .slice(0, currentIndex + 1)\n .reduce<Element[]>((currentList, element) => {\n if (element.type === \"interaction\") {\n return currentList;\n }\n\n const visibleElement = getVisibleElement(element);\n\n if (visibleElement.type === \"diff\") {\n const nextList = applyDiffElement(currentList, visibleElement);\n\n return nextList ?? [...currentList, visibleElement];\n }\n\n if (element.is_new) {\n return [visibleElement];\n }\n\n if (currentList.length === 0) {\n return [visibleElement];\n }\n\n return [...currentList, visibleElement];\n }, []);\n};\n\nconst getStepElementLists = (slideElementList: Element[]) =>\n slideElementList.map((_, index) =>\n getCurrentElementList(slideElementList, index)\n );\n\nconst getStepHasSpeakableElement = (\n elementList: Element[],\n markerElementIndexes: number[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return false;\n }\n\n const startIndex = markerElementIndexes[currentIndex];\n\n if (typeof startIndex !== \"number\") {\n return false;\n }\n\n const nextMarkerIndex =\n markerElementIndexes[currentIndex + 1] ?? elementList.length;\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n if (elementList[index]?.is_speakable) {\n return true;\n }\n }\n\n return false;\n};\n\nconst hasSameElementReferences = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => element === nextElementList[index]);\n\nconst hasSameNumberValues = (prevValues: number[], nextValues: number[]) =>\n prevValues.length === nextValues.length &&\n prevValues.every((value, index) => value === nextValues[index]);\n\nconst useSlide = (elementList: Element[] = []): UseSlideResult => {\n const stableElementListRef = useRef(elementList);\n const stableCurrentAudioSequenceIndexesRef = useRef<number[]>([]);\n const stableElementList = useMemo(() => {\n if (hasSameElementReferences(stableElementListRef.current, elementList)) {\n return stableElementListRef.current;\n }\n\n // Reuse the previous wrapper array when the element references are unchanged.\n stableElementListRef.current = elementList;\n return elementList;\n }, [elementList]);\n const slideElementList = useMemo(\n () => getMarkerElementList(stableElementList),\n [stableElementList]\n );\n const previousSlideElementListRef = useRef(slideElementList);\n const markerElementIndexes = useMemo(\n () => getMarkerElementIndexes(stableElementList),\n [stableElementList]\n );\n const audioList = useMemo(\n () => getAudioList(stableElementList),\n [stableElementList]\n );\n const audioIndexMap = useMemo(\n () => getAudioIndexMap(stableElementList),\n [stableElementList]\n );\n const slideAudioSequenceMap = useMemo(\n () =>\n getSlideAudioSequenceMap(\n stableElementList,\n markerElementIndexes,\n audioIndexMap\n ),\n [audioIndexMap, markerElementIndexes, stableElementList]\n );\n const audioSlideIndexes = useMemo(\n () => getAudioSlideIndexes(slideAudioSequenceMap),\n [slideAudioSequenceMap]\n );\n const [currentIndex, setCurrentIndex] = useState(() =>\n getInitialSlideIndex(slideElementList)\n );\n\n useEffect(() => {\n const previousSlideElementList = previousSlideElementListRef.current;\n\n setCurrentIndex((prevIndex) => {\n const resolvedNextIndex = resolveNextSlideIndexAfterMarkerAppend({\n previousIndex: prevIndex,\n previousSlideElementList,\n nextSlideElementList: slideElementList,\n });\n\n if (resolvedNextIndex >= 0) {\n return resolvedNextIndex;\n }\n\n return getInitialSlideIndex(slideElementList);\n });\n\n previousSlideElementListRef.current = slideElementList;\n }, [slideElementList]);\n\n const handlePrev = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex <= 0) {\n return Math.max(prevIndex, 0);\n }\n\n return Math.max(prevIndex - 1, 0);\n });\n }, []);\n\n const handleNext = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex < 0) {\n return prevIndex;\n }\n\n return Math.min(prevIndex + 1, slideElementList.length - 1);\n });\n }, [slideElementList.length]);\n\n const handleGoTo = useCallback(\n (index: number) => {\n if (!Number.isFinite(index) || slideElementList.length === 0) {\n return;\n }\n\n setCurrentIndex(\n Math.min(Math.max(Math.trunc(index), 0), slideElementList.length - 1)\n );\n },\n [slideElementList.length]\n );\n\n const canGoPrev = currentIndex > 0;\n const canGoNext =\n currentIndex >= 0 && currentIndex < slideElementList.length - 1;\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n const element = slideElementList[currentIndex];\n\n if (!element) {\n return undefined;\n }\n\n return getVisibleElement(element);\n }, [currentIndex, slideElementList]);\n const currentElementList = useMemo(\n () => getCurrentElementList(slideElementList, currentIndex),\n [currentIndex, slideElementList]\n );\n const stepElementLists = useMemo(\n () => getStepElementLists(slideElementList),\n [slideElementList]\n );\n const currentAudioSequenceIndexes = useMemo(() => {\n const nextAudioSequenceIndexes =\n slideAudioSequenceMap.get(currentIndex) ?? [];\n\n if (\n hasSameNumberValues(\n stableCurrentAudioSequenceIndexesRef.current,\n nextAudioSequenceIndexes\n )\n ) {\n return stableCurrentAudioSequenceIndexesRef.current;\n }\n\n stableCurrentAudioSequenceIndexesRef.current = nextAudioSequenceIndexes;\n\n return nextAudioSequenceIndexes;\n }, [currentIndex, slideAudioSequenceMap]);\n const currentStepHasSpeakableElement = useMemo(\n () =>\n getStepHasSpeakableElement(\n stableElementList,\n markerElementIndexes,\n currentIndex\n ),\n [currentIndex, markerElementIndexes, stableElementList]\n );\n const currentInteractionElement = useMemo(\n () =>\n currentStepElement?.type === \"interaction\"\n ? currentStepElement\n : undefined,\n [currentStepElement]\n );\n\n return {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n audioSlideIndexes,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n handleGoTo,\n };\n};\n\nexport default useSlide;\n"],"names":["getMarkerElementList","elementList","element","getMarkerElementIndexes","indexes","index","hasPlayableAudio","isStreamingAudio","segments","segment","resolveSlideAudioItemSource","audioUrl","audioSegments","getElementAudioKey","candidateElement","getAudioList","list","elementIndex","isAudioStreaming","getAudioIndexMap","audioIndexMap","audioIndex","getSlideAudioSequenceMap","markerElementIndexes","sequenceMap","startIndex","slideIndex","nextMarkerIndex","sequenceIndexes","getAudioSlideIndexes","slideAudioSequenceMap","audioSlideIndexes","audioIndexes","getInitialSlideIndex","slideElementList","visibleIndex","getVisibleElement","getCurrentElementList","currentIndex","currentList","visibleElement","applyDiffElement","getStepElementLists","_","getStepHasSpeakableElement","hasSameElementReferences","prevElementList","nextElementList","hasSameNumberValues","prevValues","nextValues","value","useSlide","stableElementListRef","useRef","stableCurrentAudioSequenceIndexesRef","stableElementList","useMemo","previousSlideElementListRef","audioList","setCurrentIndex","useState","useEffect","previousSlideElementList","prevIndex","resolvedNextIndex","resolveNextSlideIndexAfterMarkerAppend","handlePrev","useCallback","handleNext","handleGoTo","canGoPrev","canGoNext","currentStepElement","currentElementList","stepElementLists","currentAudioSequenceIndexes","nextAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement"],"mappings":"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"}
@@ -13,6 +13,7 @@ export interface UseSlideResult {
13
13
  slideElementList: Element[];
14
14
  currentIndex: number;
15
15
  audioList: SlideAudioItem[];
16
+ audioSlideIndexes: number[];
16
17
  currentAudioSequenceIndexes: number[];
17
18
  currentStepHasSpeakableElement: boolean;
18
19
  currentInteractionElement?: Element;
@@ -20,6 +21,7 @@ export interface UseSlideResult {
20
21
  canGoNext: boolean;
21
22
  handlePrev: () => void;
22
23
  handleNext: () => void;
24
+ handleGoTo: (index: number) => void;
23
25
  }
24
26
  export declare const resolveSlideAudioItemSource: (element: Element) => {
25
27
  audioUrl: string;
@@ -1,25 +1,25 @@
1
- import { useRef as p, useMemo as c, useState as w, useEffect as P, useCallback as b } from "react";
2
- import { applyDiffElement as B } from "./diff-utils.es.js";
3
- import { resolveNextSlideIndexAfterMarkerAppend as G } from "./utils/streamingNavigation.es.js";
4
- const H = (e) => e.filter((n) => n.is_marker), K = (e) => e.reduce((n, t, r) => (t.is_marker && n.push(r), n), []), S = (e) => !!(e?.is_speakable && (e.audio_url || (e.audio_segments?.length ?? 0) > 0)), U = (e = []) => e.length > 0 && !e.some((n) => n.is_final), $ = (e) => {
1
+ import { useRef as S, useMemo as u, useState as P, useEffect as B, useCallback as p } from "react";
2
+ import { applyDiffElement as H } from "./diff-utils.es.js";
3
+ import { resolveNextSlideIndexAfterMarkerAppend as K } from "./utils/streamingNavigation.es.js";
4
+ const U = (e) => e.filter((n) => n.is_marker), $ = (e) => e.reduce((n, t, o) => (t.is_marker && n.push(o), n), []), x = (e) => !!(e?.is_speakable && (e.audio_url || (e.audio_segments?.length ?? 0) > 0)), D = (e = []) => e.length > 0 && !e.some((n) => n.is_final), F = (e) => {
5
5
  const n = e.audio_url?.trim() ?? "", t = e.audio_segments ?? [];
6
6
  return {
7
7
  audioUrl: n,
8
8
  audioSegments: t,
9
- isAudioStreaming: !n && U(t)
9
+ isAudioStreaming: !n && D(t)
10
10
  };
11
- }, D = (e, n) => {
11
+ }, L = (e, n) => {
12
12
  const t = e;
13
13
  return t.element_bid || t.blockBid || t.generated_block_bid || `${e.type}:${String(e.sequence_number ?? n)}`;
14
- }, L = (e) => e.reduce((n, t, r) => {
15
- if (S(t)) {
16
- const { audioUrl: s, audioSegments: u, isAudioStreaming: a } = $(t);
14
+ }, T = (e) => e.reduce((n, t, o) => {
15
+ if (x(t)) {
16
+ const { audioUrl: r, audioSegments: c, isAudioStreaming: a } = F(t);
17
17
  n.push({
18
- audioKey: D(t, r),
18
+ audioKey: L(t, o),
19
19
  sequenceNumber: t.sequence_number,
20
20
  // Keep the completed URL available once it arrives so loading can end.
21
- audioUrl: s,
22
- audioSegments: u,
21
+ audioUrl: r,
22
+ audioSegments: c,
23
23
  isAudioStreaming: a,
24
24
  element: t
25
25
  });
@@ -28,134 +28,153 @@ const H = (e) => e.filter((n) => n.is_marker), K = (e) => e.reduce((n, t, r) =>
28
28
  }, []), j = (e) => {
29
29
  const n = /* @__PURE__ */ new Map();
30
30
  let t = 0;
31
- return e.forEach((r, s) => {
32
- S(r) && (n.set(s, t), t += 1);
31
+ return e.forEach((o, r) => {
32
+ x(o) && (n.set(r, t), t += 1);
33
33
  }), n;
34
34
  }, z = (e, n, t) => n.reduce(
35
- (r, s, u) => {
36
- const a = n[u + 1] ?? e.length, l = [];
37
- for (let d = s; d < a; d += 1) {
38
- const f = e[d];
39
- if (!S(f))
35
+ (o, r, c) => {
36
+ const a = n[c + 1] ?? e.length, f = [];
37
+ for (let d = r; d < a; d += 1) {
38
+ const l = e[d];
39
+ if (!x(l))
40
40
  continue;
41
- const o = t.get(d);
42
- o != null && l.push(o);
41
+ const g = t.get(d);
42
+ g != null && f.push(g);
43
43
  }
44
- return r.set(u, l), r;
44
+ return o.set(c, f), o;
45
45
  },
46
46
  /* @__PURE__ */ new Map()
47
- ), h = (e) => {
47
+ ), J = (e) => {
48
+ const n = [];
49
+ return e.forEach((t, o) => {
50
+ t.forEach((r) => {
51
+ n[r] = o;
52
+ });
53
+ }), n;
54
+ }, E = (e) => {
48
55
  const n = e.findIndex(
49
56
  (t) => t.is_renderable === !0
50
57
  );
51
58
  return n >= 0 ? n : e.findIndex(
52
59
  (t) => t.is_renderable !== !1
53
60
  );
54
- }, E = (e) => ({
61
+ }, I = (e) => ({
55
62
  ...e,
56
63
  is_renderable: !0
57
- }), _ = (e, n) => n < 0 ? [] : e.slice(0, n + 1).reduce((t, r) => {
58
- if (r.type === "interaction")
64
+ }), _ = (e, n) => n < 0 ? [] : e.slice(0, n + 1).reduce((t, o) => {
65
+ if (o.type === "interaction")
59
66
  return t;
60
- const s = E(r);
61
- return s.type === "diff" ? B(t, s) ?? [...t, s] : r.is_new ? [s] : t.length === 0 ? [s] : [...t, s];
62
- }, []), F = (e) => e.map(
67
+ const r = I(o);
68
+ return r.type === "diff" ? H(t, r) ?? [...t, r] : o.is_new ? [r] : t.length === 0 ? [r] : [...t, r];
69
+ }, []), O = (e) => e.map(
63
70
  (n, t) => _(e, t)
64
- ), J = (e, n, t) => {
71
+ ), Q = (e, n, t) => {
65
72
  if (t < 0)
66
73
  return !1;
67
- const r = n[t];
68
- if (typeof r != "number")
74
+ const o = n[t];
75
+ if (typeof o != "number")
69
76
  return !1;
70
- const s = n[t + 1] ?? e.length;
71
- for (let u = r; u < s; u += 1)
72
- if (e[u]?.is_speakable)
77
+ const r = n[t + 1] ?? e.length;
78
+ for (let c = o; c < r; c += 1)
79
+ if (e[c]?.is_speakable)
73
80
  return !0;
74
81
  return !1;
75
- }, O = (e, n) => e.length === n.length && e.every((t, r) => t === n[r]), Q = (e, n) => e.length === n.length && e.every((t, r) => t === n[r]), X = (e = []) => {
76
- const n = p(e), t = p([]), r = c(() => O(n.current, e) ? n.current : (n.current = e, e), [e]), s = c(
77
- () => H(r),
78
- [r]
79
- ), u = p(s), a = c(
80
- () => K(r),
81
- [r]
82
- ), l = c(
83
- () => L(r),
84
- [r]
85
- ), d = c(
86
- () => j(r),
87
- [r]
88
- ), f = c(
82
+ }, V = (e, n) => e.length === n.length && e.every((t, o) => t === n[o]), W = (e, n) => e.length === n.length && e.every((t, o) => t === n[o]), ee = (e = []) => {
83
+ const n = S(e), t = S([]), o = u(() => V(n.current, e) ? n.current : (n.current = e, e), [e]), r = u(
84
+ () => U(o),
85
+ [o]
86
+ ), c = S(r), a = u(
87
+ () => $(o),
88
+ [o]
89
+ ), f = u(
90
+ () => T(o),
91
+ [o]
92
+ ), d = u(
93
+ () => j(o),
94
+ [o]
95
+ ), l = u(
89
96
  () => z(
90
- r,
97
+ o,
91
98
  a,
92
99
  d
93
100
  ),
94
- [d, a, r]
95
- ), [o, g] = w(
96
- () => h(s)
101
+ [d, a, o]
102
+ ), g = u(
103
+ () => J(l),
104
+ [l]
105
+ ), [i, m] = P(
106
+ () => E(r)
97
107
  );
98
- P(() => {
99
- const i = u.current;
100
- g((C) => {
101
- const x = G({
102
- previousIndex: C,
103
- previousSlideElementList: i,
104
- nextSlideElementList: s
108
+ B(() => {
109
+ const s = c.current;
110
+ m((G) => {
111
+ const b = K({
112
+ previousIndex: G,
113
+ previousSlideElementList: s,
114
+ nextSlideElementList: r
105
115
  });
106
- return x >= 0 ? x : h(s);
107
- }), u.current = s;
108
- }, [s]);
109
- const I = b(() => {
110
- g((i) => i <= 0 ? Math.max(i, 0) : Math.max(i - 1, 0));
111
- }, []), A = b(() => {
112
- g((i) => i < 0 ? i : Math.min(i + 1, s.length - 1));
113
- }, [s.length]), M = o > 0, k = o >= 0 && o < s.length - 1, m = c(() => {
114
- if (o < 0)
116
+ return b >= 0 ? b : E(r);
117
+ }), c.current = r;
118
+ }, [r]);
119
+ const M = p(() => {
120
+ m((s) => s <= 0 ? Math.max(s, 0) : Math.max(s - 1, 0));
121
+ }, []), A = p(() => {
122
+ m((s) => s < 0 ? s : Math.min(s + 1, r.length - 1));
123
+ }, [r.length]), k = p(
124
+ (s) => {
125
+ !Number.isFinite(s) || r.length === 0 || m(
126
+ Math.min(Math.max(Math.trunc(s), 0), r.length - 1)
127
+ );
128
+ },
129
+ [r.length]
130
+ ), y = i > 0, v = i >= 0 && i < r.length - 1, h = u(() => {
131
+ if (i < 0)
115
132
  return;
116
- const i = s[o];
117
- if (i)
118
- return E(i);
119
- }, [o, s]), y = c(
120
- () => _(s, o),
121
- [o, s]
122
- ), v = c(
123
- () => F(s),
124
- [s]
125
- ), q = c(() => {
126
- const i = f.get(o) ?? [];
127
- return Q(
133
+ const s = r[i];
134
+ if (s)
135
+ return I(s);
136
+ }, [i, r]), q = u(
137
+ () => _(r, i),
138
+ [i, r]
139
+ ), N = u(
140
+ () => O(r),
141
+ [r]
142
+ ), R = u(() => {
143
+ const s = l.get(i) ?? [];
144
+ return W(
128
145
  t.current,
129
- i
130
- ) ? t.current : (t.current = i, i);
131
- }, [o, f]), N = c(
132
- () => J(
133
- r,
146
+ s
147
+ ) ? t.current : (t.current = s, s);
148
+ }, [i, l]), C = u(
149
+ () => Q(
150
+ o,
134
151
  a,
135
- o
152
+ i
136
153
  ),
137
- [o, a, r]
138
- ), R = c(
139
- () => m?.type === "interaction" ? m : void 0,
140
- [m]
154
+ [i, a, o]
155
+ ), w = u(
156
+ () => h?.type === "interaction" ? h : void 0,
157
+ [h]
141
158
  );
142
159
  return {
143
- currentElementList: y,
144
- stepElementLists: v,
145
- slideElementList: s,
146
- currentIndex: o,
147
- audioList: l,
148
- currentAudioSequenceIndexes: q,
149
- currentStepHasSpeakableElement: N,
150
- currentInteractionElement: R,
151
- canGoPrev: M,
152
- canGoNext: k,
153
- handlePrev: I,
154
- handleNext: A
160
+ currentElementList: q,
161
+ stepElementLists: N,
162
+ slideElementList: r,
163
+ currentIndex: i,
164
+ audioList: f,
165
+ audioSlideIndexes: g,
166
+ currentAudioSequenceIndexes: R,
167
+ currentStepHasSpeakableElement: C,
168
+ currentInteractionElement: w,
169
+ canGoPrev: y,
170
+ canGoNext: v,
171
+ handlePrev: M,
172
+ handleNext: A,
173
+ handleGoTo: k
155
174
  };
156
175
  };
157
176
  export {
158
- X as default,
159
- $ as resolveSlideAudioItemSource
177
+ ee as default,
178
+ F as resolveSlideAudioItemSource
160
179
  };
161
180
  //# sourceMappingURL=useSlide.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSlide.es.js","sources":["../../../src/components/Slide/useSlide.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { applyDiffElement } from \"./diff-utils\";\nimport type { Element, ElementAudioSegment } from \"./types\";\nimport { resolveNextSlideIndexAfterMarkerAppend } from \"./utils/streamingNavigation\";\n\nexport interface SlideAudioItem {\n audioKey?: string;\n sequenceNumber?: number;\n audioUrl?: string;\n audioSegments?: ElementAudioSegment[];\n isAudioStreaming?: boolean;\n element?: Element;\n}\n\nexport interface UseSlideResult {\n currentElementList: Element[];\n stepElementLists: Element[][];\n slideElementList: Element[];\n currentIndex: number;\n audioList: SlideAudioItem[];\n currentAudioSequenceIndexes: number[];\n currentStepHasSpeakableElement: boolean;\n currentInteractionElement?: Element;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n}\n\nconst getMarkerElementList = (elementList: Element[]) =>\n elementList.filter((element) => element.is_marker);\n\nconst getMarkerElementIndexes = (elementList: Element[]) =>\n elementList.reduce<number[]>((indexes, element, index) => {\n if (element.is_marker) {\n indexes.push(index);\n }\n\n return indexes;\n }, []);\n\nconst hasPlayableAudio = (element?: Element) =>\n Boolean(\n element?.is_speakable &&\n (element.audio_url || (element.audio_segments?.length ?? 0) > 0)\n );\n\nconst isStreamingAudio = (segments: ElementAudioSegment[] = []) =>\n segments.length > 0 && !segments.some((segment) => segment.is_final);\n\nexport const resolveSlideAudioItemSource = (element: Element) => {\n const audioUrl = element.audio_url?.trim() ?? \"\";\n const audioSegments = element.audio_segments ?? [];\n\n return {\n audioUrl,\n audioSegments,\n isAudioStreaming: !audioUrl && isStreamingAudio(audioSegments),\n };\n};\n\nconst getElementAudioKey = (element: Element, index: number) => {\n const candidateElement = element as Element & {\n element_bid?: string;\n blockBid?: string;\n generated_block_bid?: string;\n };\n\n return (\n candidateElement.element_bid ||\n candidateElement.blockBid ||\n candidateElement.generated_block_bid ||\n `${element.type}:${String(element.sequence_number ?? index)}`\n );\n};\n\nconst getAudioList = (elementList: Element[]) =>\n elementList.reduce<SlideAudioItem[]>((list, element, elementIndex) => {\n if (hasPlayableAudio(element)) {\n const { audioUrl, audioSegments, isAudioStreaming } =\n resolveSlideAudioItemSource(element);\n\n list.push({\n audioKey: getElementAudioKey(element, elementIndex),\n sequenceNumber: element.sequence_number,\n // Keep the completed URL available once it arrives so loading can end.\n audioUrl,\n audioSegments,\n isAudioStreaming,\n element,\n });\n }\n\n return list;\n }, []);\n\nconst getAudioIndexMap = (elementList: Element[]) => {\n const audioIndexMap = new Map<number, number>();\n let audioIndex = 0;\n\n elementList.forEach((element, index) => {\n if (hasPlayableAudio(element)) {\n audioIndexMap.set(index, audioIndex);\n audioIndex += 1;\n }\n });\n\n return audioIndexMap;\n};\n\nconst getSlideAudioSequenceMap = (\n elementList: Element[],\n markerElementIndexes: number[],\n audioIndexMap: Map<number, number>\n) =>\n markerElementIndexes.reduce<Map<number, number[]>>(\n (sequenceMap, startIndex, slideIndex) => {\n const nextMarkerIndex =\n markerElementIndexes[slideIndex + 1] ?? elementList.length;\n const sequenceIndexes: number[] = [];\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n const element = elementList[index];\n\n if (!hasPlayableAudio(element)) {\n continue;\n }\n\n const audioIndex = audioIndexMap.get(index);\n\n if (audioIndex == null) {\n continue;\n }\n\n sequenceIndexes.push(audioIndex);\n }\n\n sequenceMap.set(slideIndex, sequenceIndexes);\n return sequenceMap;\n },\n new Map<number, number[]>()\n );\n\nconst getInitialSlideIndex = (slideElementList: Element[]) => {\n const visibleIndex = slideElementList.findIndex(\n (element) => element.is_renderable === true\n );\n\n if (visibleIndex >= 0) {\n return visibleIndex;\n }\n\n return slideElementList.findIndex(\n (element) => element.is_renderable !== false\n );\n};\n\nconst getVisibleElement = (element: Element): Element => ({\n ...element,\n is_renderable: true,\n});\n\nconst getCurrentElementList = (\n slideElementList: Element[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return [];\n }\n\n return slideElementList\n .slice(0, currentIndex + 1)\n .reduce<Element[]>((currentList, element) => {\n if (element.type === \"interaction\") {\n return currentList;\n }\n\n const visibleElement = getVisibleElement(element);\n\n if (visibleElement.type === \"diff\") {\n const nextList = applyDiffElement(currentList, visibleElement);\n\n return nextList ?? [...currentList, visibleElement];\n }\n\n if (element.is_new) {\n return [visibleElement];\n }\n\n if (currentList.length === 0) {\n return [visibleElement];\n }\n\n return [...currentList, visibleElement];\n }, []);\n};\n\nconst getStepElementLists = (slideElementList: Element[]) =>\n slideElementList.map((_, index) =>\n getCurrentElementList(slideElementList, index)\n );\n\nconst getStepHasSpeakableElement = (\n elementList: Element[],\n markerElementIndexes: number[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return false;\n }\n\n const startIndex = markerElementIndexes[currentIndex];\n\n if (typeof startIndex !== \"number\") {\n return false;\n }\n\n const nextMarkerIndex =\n markerElementIndexes[currentIndex + 1] ?? elementList.length;\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n if (elementList[index]?.is_speakable) {\n return true;\n }\n }\n\n return false;\n};\n\nconst hasSameElementReferences = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => element === nextElementList[index]);\n\nconst hasSameNumberValues = (prevValues: number[], nextValues: number[]) =>\n prevValues.length === nextValues.length &&\n prevValues.every((value, index) => value === nextValues[index]);\n\nconst useSlide = (elementList: Element[] = []): UseSlideResult => {\n const stableElementListRef = useRef(elementList);\n const stableCurrentAudioSequenceIndexesRef = useRef<number[]>([]);\n const stableElementList = useMemo(() => {\n if (hasSameElementReferences(stableElementListRef.current, elementList)) {\n return stableElementListRef.current;\n }\n\n // Reuse the previous wrapper array when the element references are unchanged.\n stableElementListRef.current = elementList;\n return elementList;\n }, [elementList]);\n const slideElementList = useMemo(\n () => getMarkerElementList(stableElementList),\n [stableElementList]\n );\n const previousSlideElementListRef = useRef(slideElementList);\n const markerElementIndexes = useMemo(\n () => getMarkerElementIndexes(stableElementList),\n [stableElementList]\n );\n const audioList = useMemo(\n () => getAudioList(stableElementList),\n [stableElementList]\n );\n const audioIndexMap = useMemo(\n () => getAudioIndexMap(stableElementList),\n [stableElementList]\n );\n const slideAudioSequenceMap = useMemo(\n () =>\n getSlideAudioSequenceMap(\n stableElementList,\n markerElementIndexes,\n audioIndexMap\n ),\n [audioIndexMap, markerElementIndexes, stableElementList]\n );\n const [currentIndex, setCurrentIndex] = useState(() =>\n getInitialSlideIndex(slideElementList)\n );\n\n useEffect(() => {\n const previousSlideElementList = previousSlideElementListRef.current;\n\n setCurrentIndex((prevIndex) => {\n const resolvedNextIndex = resolveNextSlideIndexAfterMarkerAppend({\n previousIndex: prevIndex,\n previousSlideElementList,\n nextSlideElementList: slideElementList,\n });\n\n if (resolvedNextIndex >= 0) {\n return resolvedNextIndex;\n }\n\n return getInitialSlideIndex(slideElementList);\n });\n\n previousSlideElementListRef.current = slideElementList;\n }, [slideElementList]);\n\n const handlePrev = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex <= 0) {\n return Math.max(prevIndex, 0);\n }\n\n return Math.max(prevIndex - 1, 0);\n });\n }, []);\n\n const handleNext = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex < 0) {\n return prevIndex;\n }\n\n return Math.min(prevIndex + 1, slideElementList.length - 1);\n });\n }, [slideElementList.length]);\n\n const canGoPrev = currentIndex > 0;\n const canGoNext =\n currentIndex >= 0 && currentIndex < slideElementList.length - 1;\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n const element = slideElementList[currentIndex];\n\n if (!element) {\n return undefined;\n }\n\n return getVisibleElement(element);\n }, [currentIndex, slideElementList]);\n const currentElementList = useMemo(\n () => getCurrentElementList(slideElementList, currentIndex),\n [currentIndex, slideElementList]\n );\n const stepElementLists = useMemo(\n () => getStepElementLists(slideElementList),\n [slideElementList]\n );\n const currentAudioSequenceIndexes = useMemo(() => {\n const nextAudioSequenceIndexes =\n slideAudioSequenceMap.get(currentIndex) ?? [];\n\n if (\n hasSameNumberValues(\n stableCurrentAudioSequenceIndexesRef.current,\n nextAudioSequenceIndexes\n )\n ) {\n return stableCurrentAudioSequenceIndexesRef.current;\n }\n\n stableCurrentAudioSequenceIndexesRef.current = nextAudioSequenceIndexes;\n\n return nextAudioSequenceIndexes;\n }, [currentIndex, slideAudioSequenceMap]);\n const currentStepHasSpeakableElement = useMemo(\n () =>\n getStepHasSpeakableElement(\n stableElementList,\n markerElementIndexes,\n currentIndex\n ),\n [currentIndex, markerElementIndexes, stableElementList]\n );\n const currentInteractionElement = useMemo(\n () =>\n currentStepElement?.type === \"interaction\"\n ? currentStepElement\n : undefined,\n [currentStepElement]\n );\n\n return {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n };\n};\n\nexport default useSlide;\n"],"names":["getMarkerElementList","elementList","element","getMarkerElementIndexes","indexes","index","hasPlayableAudio","isStreamingAudio","segments","segment","resolveSlideAudioItemSource","audioUrl","audioSegments","getElementAudioKey","candidateElement","getAudioList","list","elementIndex","isAudioStreaming","getAudioIndexMap","audioIndexMap","audioIndex","getSlideAudioSequenceMap","markerElementIndexes","sequenceMap","startIndex","slideIndex","nextMarkerIndex","sequenceIndexes","getInitialSlideIndex","slideElementList","visibleIndex","getVisibleElement","getCurrentElementList","currentIndex","currentList","visibleElement","applyDiffElement","getStepElementLists","_","getStepHasSpeakableElement","hasSameElementReferences","prevElementList","nextElementList","hasSameNumberValues","prevValues","nextValues","value","useSlide","stableElementListRef","useRef","stableCurrentAudioSequenceIndexesRef","stableElementList","useMemo","previousSlideElementListRef","audioList","slideAudioSequenceMap","setCurrentIndex","useState","useEffect","previousSlideElementList","prevIndex","resolvedNextIndex","resolveNextSlideIndexAfterMarkerAppend","handlePrev","useCallback","handleNext","canGoPrev","canGoNext","currentStepElement","currentElementList","stepElementLists","currentAudioSequenceIndexes","nextAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement"],"mappings":"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"}
1
+ {"version":3,"file":"useSlide.es.js","sources":["../../../src/components/Slide/useSlide.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { applyDiffElement } from \"./diff-utils\";\nimport type { Element, ElementAudioSegment } from \"./types\";\nimport { resolveNextSlideIndexAfterMarkerAppend } from \"./utils/streamingNavigation\";\n\nexport interface SlideAudioItem {\n audioKey?: string;\n sequenceNumber?: number;\n audioUrl?: string;\n audioSegments?: ElementAudioSegment[];\n isAudioStreaming?: boolean;\n element?: Element;\n}\n\nexport interface UseSlideResult {\n currentElementList: Element[];\n stepElementLists: Element[][];\n slideElementList: Element[];\n currentIndex: number;\n audioList: SlideAudioItem[];\n audioSlideIndexes: number[];\n currentAudioSequenceIndexes: number[];\n currentStepHasSpeakableElement: boolean;\n currentInteractionElement?: Element;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n handleGoTo: (index: number) => void;\n}\n\nconst getMarkerElementList = (elementList: Element[]) =>\n elementList.filter((element) => element.is_marker);\n\nconst getMarkerElementIndexes = (elementList: Element[]) =>\n elementList.reduce<number[]>((indexes, element, index) => {\n if (element.is_marker) {\n indexes.push(index);\n }\n\n return indexes;\n }, []);\n\nconst hasPlayableAudio = (element?: Element) =>\n Boolean(\n element?.is_speakable &&\n (element.audio_url || (element.audio_segments?.length ?? 0) > 0)\n );\n\nconst isStreamingAudio = (segments: ElementAudioSegment[] = []) =>\n segments.length > 0 && !segments.some((segment) => segment.is_final);\n\nexport const resolveSlideAudioItemSource = (element: Element) => {\n const audioUrl = element.audio_url?.trim() ?? \"\";\n const audioSegments = element.audio_segments ?? [];\n\n return {\n audioUrl,\n audioSegments,\n isAudioStreaming: !audioUrl && isStreamingAudio(audioSegments),\n };\n};\n\nconst getElementAudioKey = (element: Element, index: number) => {\n const candidateElement = element as Element & {\n element_bid?: string;\n blockBid?: string;\n generated_block_bid?: string;\n };\n\n return (\n candidateElement.element_bid ||\n candidateElement.blockBid ||\n candidateElement.generated_block_bid ||\n `${element.type}:${String(element.sequence_number ?? index)}`\n );\n};\n\nconst getAudioList = (elementList: Element[]) =>\n elementList.reduce<SlideAudioItem[]>((list, element, elementIndex) => {\n if (hasPlayableAudio(element)) {\n const { audioUrl, audioSegments, isAudioStreaming } =\n resolveSlideAudioItemSource(element);\n\n list.push({\n audioKey: getElementAudioKey(element, elementIndex),\n sequenceNumber: element.sequence_number,\n // Keep the completed URL available once it arrives so loading can end.\n audioUrl,\n audioSegments,\n isAudioStreaming,\n element,\n });\n }\n\n return list;\n }, []);\n\nconst getAudioIndexMap = (elementList: Element[]) => {\n const audioIndexMap = new Map<number, number>();\n let audioIndex = 0;\n\n elementList.forEach((element, index) => {\n if (hasPlayableAudio(element)) {\n audioIndexMap.set(index, audioIndex);\n audioIndex += 1;\n }\n });\n\n return audioIndexMap;\n};\n\nconst getSlideAudioSequenceMap = (\n elementList: Element[],\n markerElementIndexes: number[],\n audioIndexMap: Map<number, number>\n) =>\n markerElementIndexes.reduce<Map<number, number[]>>(\n (sequenceMap, startIndex, slideIndex) => {\n const nextMarkerIndex =\n markerElementIndexes[slideIndex + 1] ?? elementList.length;\n const sequenceIndexes: number[] = [];\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n const element = elementList[index];\n\n if (!hasPlayableAudio(element)) {\n continue;\n }\n\n const audioIndex = audioIndexMap.get(index);\n\n if (audioIndex == null) {\n continue;\n }\n\n sequenceIndexes.push(audioIndex);\n }\n\n sequenceMap.set(slideIndex, sequenceIndexes);\n return sequenceMap;\n },\n new Map<number, number[]>()\n );\n\nconst getAudioSlideIndexes = (slideAudioSequenceMap: Map<number, number[]>) => {\n const audioSlideIndexes: number[] = [];\n\n slideAudioSequenceMap.forEach((audioIndexes, slideIndex) => {\n audioIndexes.forEach((audioIndex) => {\n audioSlideIndexes[audioIndex] = slideIndex;\n });\n });\n\n return audioSlideIndexes;\n};\n\nconst getInitialSlideIndex = (slideElementList: Element[]) => {\n const visibleIndex = slideElementList.findIndex(\n (element) => element.is_renderable === true\n );\n\n if (visibleIndex >= 0) {\n return visibleIndex;\n }\n\n return slideElementList.findIndex(\n (element) => element.is_renderable !== false\n );\n};\n\nconst getVisibleElement = (element: Element): Element => ({\n ...element,\n is_renderable: true,\n});\n\nconst getCurrentElementList = (\n slideElementList: Element[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return [];\n }\n\n return slideElementList\n .slice(0, currentIndex + 1)\n .reduce<Element[]>((currentList, element) => {\n if (element.type === \"interaction\") {\n return currentList;\n }\n\n const visibleElement = getVisibleElement(element);\n\n if (visibleElement.type === \"diff\") {\n const nextList = applyDiffElement(currentList, visibleElement);\n\n return nextList ?? [...currentList, visibleElement];\n }\n\n if (element.is_new) {\n return [visibleElement];\n }\n\n if (currentList.length === 0) {\n return [visibleElement];\n }\n\n return [...currentList, visibleElement];\n }, []);\n};\n\nconst getStepElementLists = (slideElementList: Element[]) =>\n slideElementList.map((_, index) =>\n getCurrentElementList(slideElementList, index)\n );\n\nconst getStepHasSpeakableElement = (\n elementList: Element[],\n markerElementIndexes: number[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return false;\n }\n\n const startIndex = markerElementIndexes[currentIndex];\n\n if (typeof startIndex !== \"number\") {\n return false;\n }\n\n const nextMarkerIndex =\n markerElementIndexes[currentIndex + 1] ?? elementList.length;\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n if (elementList[index]?.is_speakable) {\n return true;\n }\n }\n\n return false;\n};\n\nconst hasSameElementReferences = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => element === nextElementList[index]);\n\nconst hasSameNumberValues = (prevValues: number[], nextValues: number[]) =>\n prevValues.length === nextValues.length &&\n prevValues.every((value, index) => value === nextValues[index]);\n\nconst useSlide = (elementList: Element[] = []): UseSlideResult => {\n const stableElementListRef = useRef(elementList);\n const stableCurrentAudioSequenceIndexesRef = useRef<number[]>([]);\n const stableElementList = useMemo(() => {\n if (hasSameElementReferences(stableElementListRef.current, elementList)) {\n return stableElementListRef.current;\n }\n\n // Reuse the previous wrapper array when the element references are unchanged.\n stableElementListRef.current = elementList;\n return elementList;\n }, [elementList]);\n const slideElementList = useMemo(\n () => getMarkerElementList(stableElementList),\n [stableElementList]\n );\n const previousSlideElementListRef = useRef(slideElementList);\n const markerElementIndexes = useMemo(\n () => getMarkerElementIndexes(stableElementList),\n [stableElementList]\n );\n const audioList = useMemo(\n () => getAudioList(stableElementList),\n [stableElementList]\n );\n const audioIndexMap = useMemo(\n () => getAudioIndexMap(stableElementList),\n [stableElementList]\n );\n const slideAudioSequenceMap = useMemo(\n () =>\n getSlideAudioSequenceMap(\n stableElementList,\n markerElementIndexes,\n audioIndexMap\n ),\n [audioIndexMap, markerElementIndexes, stableElementList]\n );\n const audioSlideIndexes = useMemo(\n () => getAudioSlideIndexes(slideAudioSequenceMap),\n [slideAudioSequenceMap]\n );\n const [currentIndex, setCurrentIndex] = useState(() =>\n getInitialSlideIndex(slideElementList)\n );\n\n useEffect(() => {\n const previousSlideElementList = previousSlideElementListRef.current;\n\n setCurrentIndex((prevIndex) => {\n const resolvedNextIndex = resolveNextSlideIndexAfterMarkerAppend({\n previousIndex: prevIndex,\n previousSlideElementList,\n nextSlideElementList: slideElementList,\n });\n\n if (resolvedNextIndex >= 0) {\n return resolvedNextIndex;\n }\n\n return getInitialSlideIndex(slideElementList);\n });\n\n previousSlideElementListRef.current = slideElementList;\n }, [slideElementList]);\n\n const handlePrev = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex <= 0) {\n return Math.max(prevIndex, 0);\n }\n\n return Math.max(prevIndex - 1, 0);\n });\n }, []);\n\n const handleNext = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex < 0) {\n return prevIndex;\n }\n\n return Math.min(prevIndex + 1, slideElementList.length - 1);\n });\n }, [slideElementList.length]);\n\n const handleGoTo = useCallback(\n (index: number) => {\n if (!Number.isFinite(index) || slideElementList.length === 0) {\n return;\n }\n\n setCurrentIndex(\n Math.min(Math.max(Math.trunc(index), 0), slideElementList.length - 1)\n );\n },\n [slideElementList.length]\n );\n\n const canGoPrev = currentIndex > 0;\n const canGoNext =\n currentIndex >= 0 && currentIndex < slideElementList.length - 1;\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n const element = slideElementList[currentIndex];\n\n if (!element) {\n return undefined;\n }\n\n return getVisibleElement(element);\n }, [currentIndex, slideElementList]);\n const currentElementList = useMemo(\n () => getCurrentElementList(slideElementList, currentIndex),\n [currentIndex, slideElementList]\n );\n const stepElementLists = useMemo(\n () => getStepElementLists(slideElementList),\n [slideElementList]\n );\n const currentAudioSequenceIndexes = useMemo(() => {\n const nextAudioSequenceIndexes =\n slideAudioSequenceMap.get(currentIndex) ?? [];\n\n if (\n hasSameNumberValues(\n stableCurrentAudioSequenceIndexesRef.current,\n nextAudioSequenceIndexes\n )\n ) {\n return stableCurrentAudioSequenceIndexesRef.current;\n }\n\n stableCurrentAudioSequenceIndexesRef.current = nextAudioSequenceIndexes;\n\n return nextAudioSequenceIndexes;\n }, [currentIndex, slideAudioSequenceMap]);\n const currentStepHasSpeakableElement = useMemo(\n () =>\n getStepHasSpeakableElement(\n stableElementList,\n markerElementIndexes,\n currentIndex\n ),\n [currentIndex, markerElementIndexes, stableElementList]\n );\n const currentInteractionElement = useMemo(\n () =>\n currentStepElement?.type === \"interaction\"\n ? currentStepElement\n : undefined,\n [currentStepElement]\n );\n\n return {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n audioSlideIndexes,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n handleGoTo,\n };\n};\n\nexport default useSlide;\n"],"names":["getMarkerElementList","elementList","element","getMarkerElementIndexes","indexes","index","hasPlayableAudio","isStreamingAudio","segments","segment","resolveSlideAudioItemSource","audioUrl","audioSegments","getElementAudioKey","candidateElement","getAudioList","list","elementIndex","isAudioStreaming","getAudioIndexMap","audioIndexMap","audioIndex","getSlideAudioSequenceMap","markerElementIndexes","sequenceMap","startIndex","slideIndex","nextMarkerIndex","sequenceIndexes","getAudioSlideIndexes","slideAudioSequenceMap","audioSlideIndexes","audioIndexes","getInitialSlideIndex","slideElementList","visibleIndex","getVisibleElement","getCurrentElementList","currentIndex","currentList","visibleElement","applyDiffElement","getStepElementLists","_","getStepHasSpeakableElement","hasSameElementReferences","prevElementList","nextElementList","hasSameNumberValues","prevValues","nextValues","value","useSlide","stableElementListRef","useRef","stableCurrentAudioSequenceIndexesRef","stableElementList","useMemo","previousSlideElementListRef","audioList","setCurrentIndex","useState","useEffect","previousSlideElementList","prevIndex","resolvedNextIndex","resolveNextSlideIndexAfterMarkerAppend","handlePrev","useCallback","handleNext","handleGoTo","canGoPrev","canGoNext","currentStepElement","currentElementList","stepElementLists","currentAudioSequenceIndexes","nextAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=new WeakMap,d=t=>!!t,S=(t,e)=>t.length===e.length&&t.every((n,s)=>n===e[s]),i=t=>{const e=t?.audioSegments;if(!e)return[];const n=o.get(e);if(n&&S(n.lastSegments,e))return n.sortedSegments;const s=e.filter(d).sort((g,r)=>(g?.segment_index??0)-(r?.segment_index??0));return o.set(e,{lastSegments:[...e],sortedSegments:s}),s};exports.getSortedAudioSegments=i;
2
+ //# sourceMappingURL=audioSegments.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioSegments.cjs.js","sources":["../../../../src/components/Slide/utils/audioSegments.ts"],"sourcesContent":["import type { SlideAudioItem } from \"../useSlide\";\n\ntype SlideAudioSegments = NonNullable<SlideAudioItem[\"audioSegments\"]>;\ntype SlideAudioSegment = SlideAudioSegments[number];\n\nconst sortedAudioSegmentsCache = new WeakMap<\n SlideAudioSegments,\n {\n lastSegments: Array<SlideAudioSegment | null | undefined>;\n sortedSegments: SlideAudioSegments;\n }\n>();\n\nconst isPresentAudioSegment = (\n segment: SlideAudioSegment | null | undefined\n): segment is SlideAudioSegment => Boolean(segment);\n\nconst hasSameSegmentReferences = (\n previousSegments: Array<SlideAudioSegment | null | undefined>,\n nextSegments: SlideAudioSegments\n) =>\n previousSegments.length === nextSegments.length &&\n previousSegments.every(\n (previousSegment, index) => previousSegment === nextSegments[index]\n );\n\nexport const getSortedAudioSegments = (audioItem?: SlideAudioItem) => {\n const audioSegments = audioItem?.audioSegments;\n\n if (!audioSegments) {\n return [];\n }\n\n const cachedSegments = sortedAudioSegmentsCache.get(audioSegments);\n\n if (\n cachedSegments &&\n hasSameSegmentReferences(cachedSegments.lastSegments, audioSegments)\n ) {\n return cachedSegments.sortedSegments;\n }\n\n const sortedSegments = audioSegments\n .filter(isPresentAudioSegment)\n .sort(\n (prevSegment, nextSegment) =>\n (prevSegment?.segment_index ?? 0) - (nextSegment?.segment_index ?? 0)\n );\n\n sortedAudioSegmentsCache.set(audioSegments, {\n lastSegments: [...audioSegments],\n sortedSegments,\n });\n\n return sortedSegments;\n};\n"],"names":["sortedAudioSegmentsCache","isPresentAudioSegment","segment","hasSameSegmentReferences","previousSegments","nextSegments","previousSegment","index","getSortedAudioSegments","audioItem","audioSegments","cachedSegments","sortedSegments","prevSegment","nextSegment"],"mappings":"gFAKA,MAAMA,MAA+B,QAQ/BC,EACJC,GACiC,EAAQA,EAErCC,EAA2B,CAC/BC,EACAC,IAEAD,EAAiB,SAAWC,EAAa,QACzCD,EAAiB,MACf,CAACE,EAAiBC,IAAUD,IAAoBD,EAAaE,CAAK,CACpE,EAEWC,EAA0BC,GAA+B,CACpE,MAAMC,EAAgBD,GAAW,cAEjC,GAAI,CAACC,EACH,MAAO,CAAA,EAGT,MAAMC,EAAiBX,EAAyB,IAAIU,CAAa,EAEjE,GACEC,GACAR,EAAyBQ,EAAe,aAAcD,CAAa,EAEnE,OAAOC,EAAe,eAGxB,MAAMC,EAAiBF,EACpB,OAAOT,CAAqB,EAC5B,KACC,CAACY,EAAaC,KACXD,GAAa,eAAiB,IAAMC,GAAa,eAAiB,EAAA,EAGzE,OAAAd,EAAyB,IAAIU,EAAe,CAC1C,aAAc,CAAC,GAAGA,CAAa,EAC/B,eAAAE,CAAA,CACD,EAEMA,CACT"}
@@ -0,0 +1,2 @@
1
+ import { SlideAudioItem } from '../useSlide';
2
+ export declare const getSortedAudioSegments: (audioItem?: SlideAudioItem) => import('..').ElementAudioSegment[];
@@ -0,0 +1,21 @@
1
+ const o = /* @__PURE__ */ new WeakMap(), d = (t) => !!t, m = (t, e) => t.length === e.length && t.every(
2
+ (n, s) => n === e[s]
3
+ ), a = (t) => {
4
+ const e = t?.audioSegments;
5
+ if (!e)
6
+ return [];
7
+ const n = o.get(e);
8
+ if (n && m(n.lastSegments, e))
9
+ return n.sortedSegments;
10
+ const s = e.filter(d).sort(
11
+ (g, r) => (g?.segment_index ?? 0) - (r?.segment_index ?? 0)
12
+ );
13
+ return o.set(e, {
14
+ lastSegments: [...e],
15
+ sortedSegments: s
16
+ }), s;
17
+ };
18
+ export {
19
+ a as getSortedAudioSegments
20
+ };
21
+ //# sourceMappingURL=audioSegments.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioSegments.es.js","sources":["../../../../src/components/Slide/utils/audioSegments.ts"],"sourcesContent":["import type { SlideAudioItem } from \"../useSlide\";\n\ntype SlideAudioSegments = NonNullable<SlideAudioItem[\"audioSegments\"]>;\ntype SlideAudioSegment = SlideAudioSegments[number];\n\nconst sortedAudioSegmentsCache = new WeakMap<\n SlideAudioSegments,\n {\n lastSegments: Array<SlideAudioSegment | null | undefined>;\n sortedSegments: SlideAudioSegments;\n }\n>();\n\nconst isPresentAudioSegment = (\n segment: SlideAudioSegment | null | undefined\n): segment is SlideAudioSegment => Boolean(segment);\n\nconst hasSameSegmentReferences = (\n previousSegments: Array<SlideAudioSegment | null | undefined>,\n nextSegments: SlideAudioSegments\n) =>\n previousSegments.length === nextSegments.length &&\n previousSegments.every(\n (previousSegment, index) => previousSegment === nextSegments[index]\n );\n\nexport const getSortedAudioSegments = (audioItem?: SlideAudioItem) => {\n const audioSegments = audioItem?.audioSegments;\n\n if (!audioSegments) {\n return [];\n }\n\n const cachedSegments = sortedAudioSegmentsCache.get(audioSegments);\n\n if (\n cachedSegments &&\n hasSameSegmentReferences(cachedSegments.lastSegments, audioSegments)\n ) {\n return cachedSegments.sortedSegments;\n }\n\n const sortedSegments = audioSegments\n .filter(isPresentAudioSegment)\n .sort(\n (prevSegment, nextSegment) =>\n (prevSegment?.segment_index ?? 0) - (nextSegment?.segment_index ?? 0)\n );\n\n sortedAudioSegmentsCache.set(audioSegments, {\n lastSegments: [...audioSegments],\n sortedSegments,\n });\n\n return sortedSegments;\n};\n"],"names":["sortedAudioSegmentsCache","isPresentAudioSegment","segment","hasSameSegmentReferences","previousSegments","nextSegments","previousSegment","index","getSortedAudioSegments","audioItem","audioSegments","cachedSegments","sortedSegments","prevSegment","nextSegment"],"mappings":"AAKA,MAAMA,wBAA+B,QAAA,GAQ/BC,IAAwB,CAC5BC,MACiC,EAAQA,GAErCC,IAA2B,CAC/BC,GACAC,MAEAD,EAAiB,WAAWC,EAAa,UACzCD,EAAiB;AAAA,EACf,CAACE,GAAiBC,MAAUD,MAAoBD,EAAaE,CAAK;AACpE,GAEWC,IAAyB,CAACC,MAA+B;AACpE,QAAMC,IAAgBD,GAAW;AAEjC,MAAI,CAACC;AACH,WAAO,CAAA;AAGT,QAAMC,IAAiBX,EAAyB,IAAIU,CAAa;AAEjE,MACEC,KACAR,EAAyBQ,EAAe,cAAcD,CAAa;AAEnE,WAAOC,EAAe;AAGxB,QAAMC,IAAiBF,EACpB,OAAOT,CAAqB,EAC5B;AAAA,IACC,CAACY,GAAaC,OACXD,GAAa,iBAAiB,MAAMC,GAAa,iBAAiB;AAAA,EAAA;AAGzE,SAAAd,EAAyB,IAAIU,GAAe;AAAA,IAC1C,cAAc,CAAC,GAAGA,CAAa;AAAA,IAC/B,gBAAAE;AAAA,EAAA,CACD,GAEMA;AACT;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=({previousResetKey:n,nextResetKey:t,currentAudioKey:i,hasCompletedCurrentStepAudio:a})=>{const e=n!==t;return{hasPlaybackContextChanged:e,shouldInitializeAudioSequence:e||!i&&!a}};exports.getPlaybackSequenceTransition=o;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=({previousResetKey:t,nextResetKey:n,currentAudioKey:u,hasCompletedCurrentStepAudio:a})=>{const e=t!==n;return{hasPlaybackContextChanged:e,shouldInitializeAudioSequence:e||!u&&!a}},r=({currentAudioKey:t,currentAudioSequenceLength:n,currentStepHasSpeakableElement:u,hasCompletedCurrentStepAudio:a,shouldBlockPlaybackForInteraction:e,shouldPausePlaybackForCustomAction:i,shouldSkipDefaultAudioStart:o})=>t||n===0||o||i||!u||e?!1:!a;exports.getPlaybackSequenceTransition=l;exports.shouldStartDefaultAudioSequence=r;
2
2
  //# sourceMappingURL=playbackSequence.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"playbackSequence.cjs.js","sources":["../../../../src/components/Slide/utils/playbackSequence.ts"],"sourcesContent":["export interface PlaybackSequenceTransitionOptions {\n previousResetKey: string | null;\n nextResetKey: string;\n currentAudioKey: string | null;\n hasCompletedCurrentStepAudio: boolean;\n}\n\nexport interface PlaybackSequenceTransitionResult {\n hasPlaybackContextChanged: boolean;\n shouldInitializeAudioSequence: boolean;\n}\n\nexport const getPlaybackSequenceTransition = ({\n previousResetKey,\n nextResetKey,\n currentAudioKey,\n hasCompletedCurrentStepAudio,\n}: PlaybackSequenceTransitionOptions): PlaybackSequenceTransitionResult => {\n const hasPlaybackContextChanged = previousResetKey !== nextResetKey;\n const shouldInitializeAudioSequence =\n hasPlaybackContextChanged ||\n (!currentAudioKey && !hasCompletedCurrentStepAudio);\n\n return {\n hasPlaybackContextChanged,\n shouldInitializeAudioSequence,\n };\n};\n"],"names":["getPlaybackSequenceTransition","previousResetKey","nextResetKey","currentAudioKey","hasCompletedCurrentStepAudio","hasPlaybackContextChanged"],"mappings":"gFAYO,MAAMA,EAAgC,CAAC,CAC5C,iBAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,6BAAAC,CACF,IAA2E,CACzE,MAAMC,EAA4BJ,IAAqBC,EAKvD,MAAO,CACL,0BAAAG,EACA,8BALAA,GACC,CAACF,GAAmB,CAACC,CAItB,CAEJ"}
1
+ {"version":3,"file":"playbackSequence.cjs.js","sources":["../../../../src/components/Slide/utils/playbackSequence.ts"],"sourcesContent":["export interface PlaybackSequenceTransitionOptions {\n previousResetKey: string | null;\n nextResetKey: string;\n currentAudioKey: string | null;\n hasCompletedCurrentStepAudio: boolean;\n}\n\nexport interface PlaybackSequenceTransitionResult {\n hasPlaybackContextChanged: boolean;\n shouldInitializeAudioSequence: boolean;\n}\n\nexport interface DefaultAudioSequenceStartOptions {\n currentAudioKey: string | null;\n currentAudioSequenceLength: number;\n currentStepHasSpeakableElement: boolean;\n hasCompletedCurrentStepAudio: boolean;\n shouldBlockPlaybackForInteraction: boolean;\n shouldPausePlaybackForCustomAction: boolean;\n shouldSkipDefaultAudioStart: boolean;\n}\n\nexport const getPlaybackSequenceTransition = ({\n previousResetKey,\n nextResetKey,\n currentAudioKey,\n hasCompletedCurrentStepAudio,\n}: PlaybackSequenceTransitionOptions): PlaybackSequenceTransitionResult => {\n const hasPlaybackContextChanged = previousResetKey !== nextResetKey;\n const shouldInitializeAudioSequence =\n hasPlaybackContextChanged ||\n (!currentAudioKey && !hasCompletedCurrentStepAudio);\n\n return {\n hasPlaybackContextChanged,\n shouldInitializeAudioSequence,\n };\n};\n\nexport const shouldStartDefaultAudioSequence = ({\n currentAudioKey,\n currentAudioSequenceLength,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldBlockPlaybackForInteraction,\n shouldPausePlaybackForCustomAction,\n shouldSkipDefaultAudioStart,\n}: DefaultAudioSequenceStartOptions) => {\n if (\n currentAudioKey ||\n currentAudioSequenceLength === 0 ||\n shouldSkipDefaultAudioStart\n ) {\n return false;\n }\n\n if (\n shouldPausePlaybackForCustomAction ||\n !currentStepHasSpeakableElement ||\n shouldBlockPlaybackForInteraction\n ) {\n return false;\n }\n\n return !hasCompletedCurrentStepAudio;\n};\n"],"names":["getPlaybackSequenceTransition","previousResetKey","nextResetKey","currentAudioKey","hasCompletedCurrentStepAudio","hasPlaybackContextChanged","shouldStartDefaultAudioSequence","currentAudioSequenceLength","currentStepHasSpeakableElement","shouldBlockPlaybackForInteraction","shouldPausePlaybackForCustomAction","shouldSkipDefaultAudioStart"],"mappings":"gFAsBO,MAAMA,EAAgC,CAAC,CAC5C,iBAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,6BAAAC,CACF,IAA2E,CACzE,MAAMC,EAA4BJ,IAAqBC,EAKvD,MAAO,CACL,0BAAAG,EACA,8BALAA,GACC,CAACF,GAAmB,CAACC,CAItB,CAEJ,EAEaE,EAAkC,CAAC,CAC9C,gBAAAH,EACA,2BAAAI,EACA,+BAAAC,EACA,6BAAAJ,EACA,kCAAAK,EACA,mCAAAC,EACA,4BAAAC,CACF,IAEIR,GACAI,IAA+B,GAC/BI,GAMAD,GACA,CAACF,GACDC,EAEO,GAGF,CAACL"}
@@ -8,4 +8,14 @@ export interface PlaybackSequenceTransitionResult {
8
8
  hasPlaybackContextChanged: boolean;
9
9
  shouldInitializeAudioSequence: boolean;
10
10
  }
11
+ export interface DefaultAudioSequenceStartOptions {
12
+ currentAudioKey: string | null;
13
+ currentAudioSequenceLength: number;
14
+ currentStepHasSpeakableElement: boolean;
15
+ hasCompletedCurrentStepAudio: boolean;
16
+ shouldBlockPlaybackForInteraction: boolean;
17
+ shouldPausePlaybackForCustomAction: boolean;
18
+ shouldSkipDefaultAudioStart: boolean;
19
+ }
11
20
  export declare const getPlaybackSequenceTransition: ({ previousResetKey, nextResetKey, currentAudioKey, hasCompletedCurrentStepAudio, }: PlaybackSequenceTransitionOptions) => PlaybackSequenceTransitionResult;
21
+ export declare const shouldStartDefaultAudioSequence: ({ currentAudioKey, currentAudioSequenceLength, currentStepHasSpeakableElement, hasCompletedCurrentStepAudio, shouldBlockPlaybackForInteraction, shouldPausePlaybackForCustomAction, shouldSkipDefaultAudioStart, }: DefaultAudioSequenceStartOptions) => boolean;