@cuemath/leap 3.1.44-as2 → 3.1.44-beta-0.1

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 (31) hide show
  1. package/dist/features/cue-canvas/cue-canvas-core.js +8 -8
  2. package/dist/features/cue-canvas/cue-canvas-core.js.map +1 -1
  3. package/dist/features/cue-canvas/cue-canvas-helpers.js +48 -58
  4. package/dist/features/cue-canvas/cue-canvas-helpers.js.map +1 -1
  5. package/dist/features/hooks/use-audio-player.js +19 -50
  6. package/dist/features/hooks/use-audio-player.js.map +1 -1
  7. package/dist/features/worksheet/worksheet/worksheet-action-bar/worksheet-action-bar.js +45 -43
  8. package/dist/features/worksheet/worksheet/worksheet-action-bar/worksheet-action-bar.js.map +1 -1
  9. package/dist/features/worksheet/worksheet/worksheet-helpers.js +98 -84
  10. package/dist/features/worksheet/worksheet/worksheet-helpers.js.map +1 -1
  11. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question.js +66 -66
  12. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question.js.map +1 -1
  13. package/dist/features/worksheet/worksheet/worksheet-questions-controller/use-handler-callbacks.js +78 -75
  14. package/dist/features/worksheet/worksheet/worksheet-questions-controller/use-handler-callbacks.js.map +1 -1
  15. package/dist/features/worksheet/worksheet/worksheet-questions-controller/worksheet-questions-controller.js +268 -202
  16. package/dist/features/worksheet/worksheet/worksheet-questions-controller/worksheet-questions-controller.js.map +1 -1
  17. package/dist/features/worksheet/worksheet/worksheet-types.js.map +1 -1
  18. package/dist/features/worksheet/worksheet/worksheet.js +374 -352
  19. package/dist/features/worksheet/worksheet/worksheet.js.map +1 -1
  20. package/dist/features/worksheet/worksheet-preview/dynamic-worksheet-preview/dynamic-worksheet-preview.js +20 -18
  21. package/dist/features/worksheet/worksheet-preview/dynamic-worksheet-preview/dynamic-worksheet-preview.js.map +1 -1
  22. package/dist/features/worksheet/worksheet-preview/hooks/use-worksheet-layout.js +33 -26
  23. package/dist/features/worksheet/worksheet-preview/hooks/use-worksheet-layout.js.map +1 -1
  24. package/dist/features/worksheet/worksheet-preview/worksheet-preview-styled.js +22 -15
  25. package/dist/features/worksheet/worksheet-preview/worksheet-preview-styled.js.map +1 -1
  26. package/dist/features/worksheet/worksheet-preview/worksheet-preview-view.js +85 -66
  27. package/dist/features/worksheet/worksheet-preview/worksheet-preview-view.js.map +1 -1
  28. package/dist/features/worksheet/worksheet-preview/worksheet-preview.js +51 -32
  29. package/dist/features/worksheet/worksheet-preview/worksheet-preview.js.map +1 -1
  30. package/dist/index.d.ts +15 -0
  31. package/package.json +1 -1
@@ -4,8 +4,8 @@ var s = (c, t, e) => g(c, typeof t != "symbol" ? t + "" : t, e);
4
4
  import { captureMessage as f } from "@sentry/browser";
5
5
  import y from "../../node_modules/lodash.debounce/index.js";
6
6
  import { CANVAS_COLORS as d } from "./constants/constants.js";
7
- import { getColorsForUser as C, removeTileButton as m, removeMusicTiles as T, removeCanvasCredit as w, removeMask as I, checkTextOrEquationTool as b, getReverseMap as A, STATELESS_TOOLS as E, getToolAndSubtool as S } from "./cue-canvas-helpers.js";
8
- class P {
7
+ import { getColorsForUser as C, removeTileButton as m, removeMask as T, checkTextOrEquationTool as w, getReverseMap as I, STATELESS_TOOLS as b, getToolAndSubtool as A } from "./cue-canvas-helpers.js";
8
+ class U {
9
9
  constructor({
10
10
  onPublish: t,
11
11
  onSubscribe: e,
@@ -48,7 +48,7 @@ class P {
48
48
  });
49
49
  s(this, "onChange", (t) => {
50
50
  const a = Object.fromEntries(t.entries());
51
- b(a) && (this.onUpdateActiveTool("move"), this.setTool("move")), this.publishToChannel(a);
51
+ w(a) && (this.onUpdateActiveTool("move"), this.setTool("move")), this.publishToChannel(a);
52
52
  });
53
53
  s(this, "undo", () => {
54
54
  if (!this.polycanvas)
@@ -56,7 +56,7 @@ class P {
56
56
  const t = this.polycanvas.undo();
57
57
  if (!t)
58
58
  return;
59
- const e = A(t);
59
+ const e = I(t);
60
60
  this.onChange(e);
61
61
  });
62
62
  s(this, "redo", () => {
@@ -182,7 +182,7 @@ class P {
182
182
  });
183
183
  s(this, "setTool", (t) => {
184
184
  if (!this.polycanvas || t === this.activeTool) return;
185
- const [e, a] = S(t);
185
+ const [e, a] = A(t);
186
186
  switch (e) {
187
187
  case "clearAll":
188
188
  this.clearCanvas();
@@ -219,7 +219,7 @@ class P {
219
219
  default:
220
220
  this.polycanvas.setTool(e, a);
221
221
  }
222
- E.has(t) || (this.activeTool = t);
222
+ b.has(t) || (this.activeTool = t);
223
223
  });
224
224
  /**
225
225
  * The `update` method is called in two cases:
@@ -269,10 +269,10 @@ class P {
269
269
  },
270
270
  ...a,
271
271
  imageUpload: this.renderAs === "whiteboard" && this.userType === "TEACHER" && this.uploadImageToS3 ? this.uploadImageToS3 : void 0
272
- }), this.renderAs === "whiteboard" && this.userType === "TEACHER" && (this.polycanvas.toggleSidebar(!1), this.polycanvas.bindKeyboardEvents({}), m(t), T(t), w(t), this.polycanvas.on("viewport", this.debouncedViewportChange)), I(t), this.polycanvas.on("change", this.onChange), i && this.update(i);
272
+ }), this.renderAs === "whiteboard" && this.userType === "TEACHER" && (this.polycanvas.toggleSidebar(!1), this.polycanvas.bindKeyboardEvents({}), m(t), this.polycanvas.on("viewport", this.debouncedViewportChange)), T(t), this.polycanvas.on("change", this.onChange), i && this.update(i);
273
273
  }
274
274
  }
275
275
  export {
276
- P as CueCanvasCore
276
+ U as CueCanvasCore
277
277
  };
278
278
  //# sourceMappingURL=cue-canvas-core.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cue-canvas-core.js","sources":["../../../src/features/cue-canvas/cue-canvas-core.ts"],"sourcesContent":["import type { TUserTypes } from '../ui/types';\nimport type {\n IActionData,\n IViewport,\n TCueCanvasChangeData,\n TCueCanvasGridName,\n TCueCanvasTool,\n TPublish,\n TRenderAs,\n TCueCanvasChangeDataObject,\n IReplaceCanvas,\n ICueCanvasCoreProps,\n TUpdateCanvasConfig,\n TCueCanvasColors,\n} from './types/cue-canvas';\nimport type { ICreateOptions } from './types/cue-canvas';\nimport type { IPolypad, IPolyPadInstance } from './types/polypad';\n\nimport { captureMessage } from '@sentry/browser';\nimport debounce from 'lodash.debounce';\n\nimport { CANVAS_COLORS } from './constants/constants';\nimport {\n checkTextOrEquationTool,\n getColorsForUser,\n getReverseMap,\n getToolAndSubtool,\n removeCanvasCredit,\n removeMask,\n removeMusicTiles,\n removeTileButton,\n STATELESS_TOOLS,\n} from './cue-canvas-helpers';\n\ndeclare global {\n interface Window {\n Polypad: IPolypad;\n }\n}\n\n/**\n * The CueCanvasCore class manages the canvas state and tool synchronization.\n * When text or equations are added, Polypad automatically switches to 'move' tool.\n * onUpdateActiveTool ensures the UI reflects this automatic tool change.\n */\n\nexport class CueCanvasCore {\n private polycanvas: IPolyPadInstance | undefined;\n private publish?: TPublish;\n private height: number;\n private onUpdateActiveTool: (tool: TCueCanvasTool) => void;\n private onUpdateHeight?: (height: number) => void;\n private userId: string;\n private canvasId: string;\n private userType: TUserTypes;\n private renderAs: TRenderAs;\n private fileInput: HTMLInputElement | null = null;\n private debouncedViewportChange: ReturnType<typeof debounce>;\n private uploadImageToS3?: (file: File) => Promise<string>;\n private updateCanvasConfigChange?: TUpdateCanvasConfig;\n private gridName?: TCueCanvasGridName;\n private activeColor: TCueCanvasColors;\n private activeTool: TCueCanvasTool | undefined;\n\n constructor({\n onPublish,\n onSubscribe,\n onUpdateActiveTool,\n onUpdateHeight,\n uploadImageToS3,\n height,\n userId,\n canvasId,\n userType,\n renderAs,\n updateCanvasConfig,\n }: ICueCanvasCoreProps) {\n this.onUpdateHeight = onUpdateHeight;\n this.onUpdateActiveTool = onUpdateActiveTool;\n this.height = height;\n this.uploadImageToS3 = uploadImageToS3;\n this.userId = userId;\n this.canvasId = canvasId;\n this.publish = onPublish;\n this.userType = userType;\n this.renderAs = renderAs;\n this.debouncedViewportChange = debounce(this.onViewPortChange, 300);\n this.updateCanvasConfigChange = updateCanvasConfig;\n this.activeColor = getColorsForUser(userType, renderAs)[0] as TCueCanvasColors;\n this.activeTool = undefined; // Default to first color in the palette\n onSubscribe?.(this.canvasId, this.update);\n }\n\n async create({ canvasElementRef, canvasConfig, canvasSetting, initialData }: ICreateOptions) {\n if (!canvasElementRef.current) {\n throw new Error('PolyCanvas: Div Element Not found for canvas');\n }\n this.polycanvas = await window.Polypad.create(canvasElementRef.current, {\n initial: {\n options: canvasConfig,\n },\n ...canvasSetting,\n imageUpload:\n this.renderAs === 'whiteboard' && this.userType === 'TEACHER' && this.uploadImageToS3\n ? this.uploadImageToS3\n : undefined,\n });\n\n if (this.renderAs === 'whiteboard' && this.userType === 'TEACHER') {\n this.polycanvas.toggleSidebar(false);\n this.polycanvas.bindKeyboardEvents({});\n\n removeTileButton(canvasElementRef);\n removeMusicTiles(canvasElementRef);\n removeCanvasCredit(canvasElementRef);\n this.polycanvas.on('viewport', this.debouncedViewportChange);\n }\n\n removeMask(canvasElementRef);\n this.polycanvas.on('change', this.onChange);\n if (initialData) {\n this.update(initialData);\n }\n }\n\n private publishToChannel = (payload: TCueCanvasChangeDataObject) => {\n if (!this.publish) return;\n\n this.publish({\n eventName: 'cue_canvas_changed',\n eventPayload: {\n data: payload,\n height: this.height,\n userId: this.userId,\n responseId: this.canvasId,\n },\n });\n };\n\n private onChange = (e: unknown) => {\n const data = e as TCueCanvasChangeData;\n const payload = Object.fromEntries(data.entries());\n\n if (checkTextOrEquationTool(payload)) {\n this.onUpdateActiveTool('move');\n this.setTool('move');\n }\n\n this.publishToChannel(payload);\n };\n\n private undo = () => {\n if (!this.polycanvas) {\n return;\n }\n\n const data = this.polycanvas.undo() as TCueCanvasChangeData;\n\n if (!data) {\n return;\n }\n\n const undoData = getReverseMap(data);\n\n this.onChange(undoData);\n };\n\n private redo = () => {\n if (!this.polycanvas) {\n return;\n }\n\n const data = this.polycanvas.redo() as TCueCanvasChangeData;\n\n if (!data) {\n return;\n }\n\n this.onChange(data);\n };\n\n clearCanvas = () => {\n if (this.polycanvas) {\n this.polycanvas.clear();\n }\n };\n\n private zoomIn = () => {\n if (!this.polycanvas) return;\n\n const viewPort = this.polycanvas.getViewport();\n\n this.polycanvas.setViewport(viewPort.x, viewPort.y, viewPort.zoom * 1.1);\n };\n\n private zoomOut = () => {\n if (!this.polycanvas) return;\n\n const viewPort = this.polycanvas.getViewport();\n\n this.polycanvas.setViewport(viewPort.x, viewPort.y, viewPort.zoom * 0.9);\n };\n\n getCanvasAsImage = async () => {\n if (!this.polycanvas) return;\n\n const image = await this.polycanvas.image(3000, 3000, 'png');\n\n return image;\n };\n\n private downloadCanvasAsImage = async () => {\n if (!this.polycanvas) return;\n\n const image = await this.polycanvas.image(3000, 3000, 'png');\n\n if (!image) return;\n\n const downloadLink = document.createElement('a');\n\n downloadLink.href = image;\n downloadLink.download = `canvas-drawing-${Date.now()}.png`;\n downloadLink.click();\n };\n\n private onViewPortChange = (e: IViewport): void => {\n if (!this.updateCanvasConfigChange) return;\n\n this.updateCanvasConfigChange({ dimesion: e });\n };\n\n private openFileUpload = (): void => {\n if (!this.fileInput) {\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.accept = 'image/*';\n this.fileInput.style.display = 'none';\n this.fileInput.onchange = this.onSelectImage;\n document.body.appendChild(this.fileInput);\n }\n\n this.fileInput.click();\n };\n\n addImageToCanvas = (imageUrl: string): void => {\n if (!this.polycanvas) return;\n\n const viewPort = this.polycanvas.getViewport();\n const imgJson = {\n name: 'image',\n href: imageUrl,\n x: viewPort.x + 24,\n y: viewPort.y + 24,\n width: 500,\n };\n\n const key = this.polycanvas.add({\n ...imgJson,\n });\n\n this.publishToChannel({\n [key]: [undefined, { ...imgJson, status: 'locked' }],\n });\n this.onUpdateActiveTool('move');\n this.setTool('move');\n };\n\n private onSelectImage = async (event: Event): Promise<void> => {\n const target = event.target as HTMLInputElement;\n const file = target.files?.[0];\n\n if (!file || !this.polycanvas || !this.uploadImageToS3) return;\n\n const imageUrl = await this.uploadImageToS3(file);\n\n if (imageUrl === 'error') {\n return;\n }\n\n this.addImageToCanvas(imageUrl);\n\n target.value = '';\n };\n\n private updateCanvas = ({ data, userId }: IActionData) => {\n const canEditStroke = this.userType === 'TEACHER' || userId === this.userId;\n\n try {\n Object.entries(data).forEach(([key, value]) => {\n if (!value[0] && value[1]) {\n if ('name' in value[1] && value[1].name === 'image') {\n value[1].status = this.userType === 'STUDENT' ? 'locked' : undefined; // Lock only images for students\n }\n this.polycanvas?.add({ ...value[1], cannotEdit: !canEditStroke }, key);\n } else if (value[0] && !value[1]) {\n this.polycanvas?.delete(key);\n } else if (value[0] && value[1]) {\n this.polycanvas?.update(key, { ...value[1] });\n }\n });\n } catch (error) {\n captureMessage('Error Updating Canvas', data);\n }\n };\n\n toggleTiles = (val: boolean) => {\n this.polycanvas?.toggleSidebar(val);\n };\n\n setViewPort = ({ x, y, zoom }: IViewport) => {\n if (this.polycanvas) {\n const cv = this.polycanvas?.getViewport();\n\n if (cv.x === x && cv.y === y && cv.zoom === zoom) {\n return; // No change needed\n }\n\n this.polycanvas.setViewport(x, y, zoom);\n }\n };\n\n resetViewPort = () => {\n if (this.polycanvas) {\n this.polycanvas.resetViewport();\n }\n };\n\n changeGrid = (gridName: TCueCanvasGridName) => {\n if (!this.polycanvas || this.gridName === gridName) return;\n\n this.polycanvas.setOptions({\n grid: gridName,\n });\n this.gridName = gridName;\n if (this.updateCanvasConfigChange) {\n this.updateCanvasConfigChange({ gridName: gridName });\n }\n };\n\n lockSelectedTiles = () => {\n const { tiles: allTiles } = this.polycanvas?.serialize() || {};\n const selectedItems = this.polycanvas?.getSelection() || [];\n\n if (selectedItems.length > 0 && allTiles) {\n const lockedTiles: TCueCanvasChangeDataObject = {};\n\n selectedItems.forEach(key => {\n if (!allTiles[key]?.name) return;\n\n const updatedJson = { ...allTiles[key], status: 'locked' as const };\n\n this.polycanvas?.update(key, updatedJson);\n if (allTiles[key]?.name) lockedTiles[key] = [allTiles[key], updatedJson];\n });\n\n this.publishToChannel(lockedTiles);\n }\n };\n\n unlockAllTiles = () => {\n if (!this.polycanvas) return;\n\n const { tiles: allTiles } = this.polycanvas.serialize();\n const unlockedTiles: TCueCanvasChangeDataObject = {};\n\n if (allTiles && Object.entries(allTiles).length > 0) {\n Object.entries(allTiles).forEach(([key, item]) => {\n if (item.status !== 'locked') return;\n\n const updatedJson = { ...item, status: undefined };\n\n this.polycanvas?.update(key, updatedJson);\n unlockedTiles[key] = [item, updatedJson];\n });\n\n this.publishToChannel(unlockedTiles);\n }\n };\n\n replaceCanvas = (data: IReplaceCanvas) => {\n if (!this.polycanvas) return;\n\n const { data: canvasData, gridName } = data;\n\n this.polycanvas.clear();\n if (gridName) {\n this.changeGrid(gridName);\n }\n\n Object.entries(canvasData).forEach(([key, value]) => {\n if (!value[0] && value[1]) {\n this.polycanvas?.add({ ...value[1] }, key);\n\n return;\n }\n });\n\n this.publishToChannel(canvasData);\n };\n\n setTool = (tool: TCueCanvasTool) => {\n if (!this.polycanvas || tool === this.activeTool) return;\n\n const [currTool, currSubTool] = getToolAndSubtool(tool);\n\n switch (currTool) {\n case 'clearAll':\n this.clearCanvas();\n break;\n case 'home':\n this.resetViewPort();\n break;\n case 'undo':\n this.undo();\n break;\n case 'redo':\n this.redo();\n break;\n case 'lock':\n this.lockSelectedTiles();\n break;\n case 'unlock':\n this.unlockAllTiles();\n break;\n case 'zoomIn':\n this.zoomIn();\n break;\n case 'zoomOut':\n this.zoomOut();\n break;\n case 'upload':\n this.openFileUpload();\n break;\n case 'download':\n this.downloadCanvasAsImage();\n break;\n case 'grid':\n break;\n default:\n this.polycanvas.setTool(currTool, currSubTool);\n }\n if (!STATELESS_TOOLS.has(tool)) {\n this.activeTool = tool;\n }\n };\n\n /**\n * The `update` method is called in two cases:\n * 1. When receiving initial data to update the canvas content.\n * 2. When receiving strokes from other peers to update the canvas content.\n * Each item can contain multiple actions, which are applied to the canvas.\n *\n * The method checks if the payload is an array or a single object.\n * If it's an array, it iterates over each item and updates the canvas accordingly.\n * If it's a single object, it directly updates the canvas.\n *\n * Additionally, if the payload contains a height greater than the current height of the canvas, the `updateHeight` method is called to update the canvas height.\n */\n update = (payload: IActionData | IActionData[]) => {\n if (Array.isArray(payload)) {\n const heights = payload.map(data => data.height).filter(Boolean);\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > this.height) {\n this.updateHeight(maxHeight);\n }\n payload.forEach(item => this.updateCanvas(item));\n } else {\n if (payload.height > this.height) {\n this.updateHeight(payload.height);\n }\n this.updateCanvas(payload);\n }\n };\n\n getSelections = () => {\n return this.polycanvas ? this.polycanvas.getSelection() : [];\n };\n\n setColor = (color: TCueCanvasColors) => {\n if (!this.polycanvas || !this.activeColor) return;\n\n const selectedColor = CANVAS_COLORS[color];\n\n const selections = this.getSelections();\n\n if (selections && selections.length > 0) {\n selections.forEach((key: string) => {\n this.polycanvas?.update(key, { color: selectedColor });\n this.onChange(\n new Map([[key, [{ color: CANVAS_COLORS[this.activeColor] }, { color: selectedColor }]]]),\n );\n });\n }\n this.polycanvas.setColor(selectedColor);\n this.activeColor = color;\n };\n\n updateHeight = (height: number) => {\n this.height = height;\n this.onUpdateHeight?.(height);\n };\n\n destroy = () => {\n if (this.polycanvas) {\n this.polycanvas.off('change', this.onChange);\n this.polycanvas.destroy();\n this.debouncedViewportChange.cancel();\n\n if (this.renderAs === 'whiteboard' && this.userType === 'TEACHER') {\n this.polycanvas.off('viewport', this.debouncedViewportChange);\n }\n this.polycanvas = undefined;\n\n if (this.fileInput && this.fileInput.parentNode) {\n this.fileInput.parentNode.removeChild(this.fileInput);\n this.fileInput = null;\n }\n }\n };\n}\n"],"names":["CueCanvasCore","onPublish","onSubscribe","onUpdateActiveTool","onUpdateHeight","uploadImageToS3","height","userId","canvasId","userType","renderAs","updateCanvasConfig","__publicField","payload","e","checkTextOrEquationTool","data","undoData","getReverseMap","viewPort","image","downloadLink","imageUrl","imgJson","key","event","target","file","_a","canEditStroke","value","_b","_c","captureMessage","val","x","y","zoom","cv","gridName","allTiles","selectedItems","lockedTiles","updatedJson","unlockedTiles","item","canvasData","tool","currTool","currSubTool","getToolAndSubtool","STATELESS_TOOLS","heights","maxHeight","color","selectedColor","CANVAS_COLORS","selections","debounce","getColorsForUser","canvasElementRef","canvasConfig","canvasSetting","initialData","removeTileButton","removeMusicTiles","removeCanvasCredit","removeMask"],"mappings":"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"}
1
+ {"version":3,"file":"cue-canvas-core.js","sources":["../../../src/features/cue-canvas/cue-canvas-core.ts"],"sourcesContent":["import type { TUserTypes } from '../ui/types';\nimport type {\n IActionData,\n IViewport,\n TCueCanvasChangeData,\n TCueCanvasGridName,\n TCueCanvasTool,\n TPublish,\n TRenderAs,\n TCueCanvasChangeDataObject,\n IReplaceCanvas,\n ICueCanvasCoreProps,\n TUpdateCanvasConfig,\n TCueCanvasColors,\n} from './types/cue-canvas';\nimport type { ICreateOptions } from './types/cue-canvas';\nimport type { IPolypad, IPolyPadInstance } from './types/polypad';\n\nimport { captureMessage } from '@sentry/browser';\nimport debounce from 'lodash.debounce';\n\nimport { CANVAS_COLORS } from './constants/constants';\nimport {\n checkTextOrEquationTool,\n getColorsForUser,\n getReverseMap,\n getToolAndSubtool,\n removeMask,\n removeTileButton,\n STATELESS_TOOLS,\n} from './cue-canvas-helpers';\n\ndeclare global {\n interface Window {\n Polypad: IPolypad;\n }\n}\n\n/**\n * The CueCanvasCore class manages the canvas state and tool synchronization.\n * When text or equations are added, Polypad automatically switches to 'move' tool.\n * onUpdateActiveTool ensures the UI reflects this automatic tool change.\n */\n\nexport class CueCanvasCore {\n private polycanvas: IPolyPadInstance | undefined;\n private publish?: TPublish;\n private height: number;\n private onUpdateActiveTool: (tool: TCueCanvasTool) => void;\n private onUpdateHeight?: (height: number) => void;\n private userId: string;\n private canvasId: string;\n private userType: TUserTypes;\n private renderAs: TRenderAs;\n private fileInput: HTMLInputElement | null = null;\n private debouncedViewportChange: ReturnType<typeof debounce>;\n private uploadImageToS3?: (file: File) => Promise<string>;\n private updateCanvasConfigChange?: TUpdateCanvasConfig;\n private gridName?: TCueCanvasGridName;\n private activeColor: TCueCanvasColors;\n private activeTool: TCueCanvasTool | undefined;\n\n constructor({\n onPublish,\n onSubscribe,\n onUpdateActiveTool,\n onUpdateHeight,\n uploadImageToS3,\n height,\n userId,\n canvasId,\n userType,\n renderAs,\n updateCanvasConfig,\n }: ICueCanvasCoreProps) {\n this.onUpdateHeight = onUpdateHeight;\n this.onUpdateActiveTool = onUpdateActiveTool;\n this.height = height;\n this.uploadImageToS3 = uploadImageToS3;\n this.userId = userId;\n this.canvasId = canvasId;\n this.publish = onPublish;\n this.userType = userType;\n this.renderAs = renderAs;\n this.debouncedViewportChange = debounce(this.onViewPortChange, 300);\n this.updateCanvasConfigChange = updateCanvasConfig;\n this.activeColor = getColorsForUser(userType, renderAs)[0] as TCueCanvasColors;\n this.activeTool = undefined; // Default to first color in the palette\n onSubscribe?.(this.canvasId, this.update);\n }\n\n async create({ canvasElementRef, canvasConfig, canvasSetting, initialData }: ICreateOptions) {\n if (!canvasElementRef.current) {\n throw new Error('PolyCanvas: Div Element Not found for canvas');\n }\n this.polycanvas = await window.Polypad.create(canvasElementRef.current, {\n initial: {\n options: canvasConfig,\n },\n ...canvasSetting,\n imageUpload:\n this.renderAs === 'whiteboard' && this.userType === 'TEACHER' && this.uploadImageToS3\n ? this.uploadImageToS3\n : undefined,\n });\n\n if (this.renderAs === 'whiteboard' && this.userType === 'TEACHER') {\n this.polycanvas.toggleSidebar(false);\n this.polycanvas.bindKeyboardEvents({});\n\n removeTileButton(canvasElementRef);\n this.polycanvas.on('viewport', this.debouncedViewportChange);\n }\n\n removeMask(canvasElementRef);\n this.polycanvas.on('change', this.onChange);\n if (initialData) {\n this.update(initialData);\n }\n }\n\n private publishToChannel = (payload: TCueCanvasChangeDataObject) => {\n if (!this.publish) return;\n\n this.publish({\n eventName: 'cue_canvas_changed',\n eventPayload: {\n data: payload,\n height: this.height,\n userId: this.userId,\n responseId: this.canvasId,\n },\n });\n };\n\n private onChange = (e: unknown) => {\n const data = e as TCueCanvasChangeData;\n const payload = Object.fromEntries(data.entries());\n\n if (checkTextOrEquationTool(payload)) {\n this.onUpdateActiveTool('move');\n this.setTool('move');\n }\n\n this.publishToChannel(payload);\n };\n\n private undo = () => {\n if (!this.polycanvas) {\n return;\n }\n\n const data = this.polycanvas.undo() as TCueCanvasChangeData;\n\n if (!data) {\n return;\n }\n\n const undoData = getReverseMap(data);\n\n this.onChange(undoData);\n };\n\n private redo = () => {\n if (!this.polycanvas) {\n return;\n }\n\n const data = this.polycanvas.redo() as TCueCanvasChangeData;\n\n if (!data) {\n return;\n }\n\n this.onChange(data);\n };\n\n clearCanvas = () => {\n if (this.polycanvas) {\n this.polycanvas.clear();\n }\n };\n\n private zoomIn = () => {\n if (!this.polycanvas) return;\n\n const viewPort = this.polycanvas.getViewport();\n\n this.polycanvas.setViewport(viewPort.x, viewPort.y, viewPort.zoom * 1.1);\n };\n\n private zoomOut = () => {\n if (!this.polycanvas) return;\n\n const viewPort = this.polycanvas.getViewport();\n\n this.polycanvas.setViewport(viewPort.x, viewPort.y, viewPort.zoom * 0.9);\n };\n\n getCanvasAsImage = async () => {\n if (!this.polycanvas) return;\n\n const image = await this.polycanvas.image(3000, 3000, 'png');\n\n return image;\n };\n\n private downloadCanvasAsImage = async () => {\n if (!this.polycanvas) return;\n\n const image = await this.polycanvas.image(3000, 3000, 'png');\n\n if (!image) return;\n\n const downloadLink = document.createElement('a');\n\n downloadLink.href = image;\n downloadLink.download = `canvas-drawing-${Date.now()}.png`;\n downloadLink.click();\n };\n\n private onViewPortChange = (e: IViewport): void => {\n if (!this.updateCanvasConfigChange) return;\n\n this.updateCanvasConfigChange({ dimesion: e });\n };\n\n private openFileUpload = (): void => {\n if (!this.fileInput) {\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.accept = 'image/*';\n this.fileInput.style.display = 'none';\n this.fileInput.onchange = this.onSelectImage;\n document.body.appendChild(this.fileInput);\n }\n\n this.fileInput.click();\n };\n\n addImageToCanvas = (imageUrl: string): void => {\n if (!this.polycanvas) return;\n\n const viewPort = this.polycanvas.getViewport();\n const imgJson = {\n name: 'image',\n href: imageUrl,\n x: viewPort.x + 24,\n y: viewPort.y + 24,\n width: 500,\n };\n\n const key = this.polycanvas.add({\n ...imgJson,\n });\n\n this.publishToChannel({\n [key]: [undefined, { ...imgJson, status: 'locked' }],\n });\n this.onUpdateActiveTool('move');\n this.setTool('move');\n };\n\n private onSelectImage = async (event: Event): Promise<void> => {\n const target = event.target as HTMLInputElement;\n const file = target.files?.[0];\n\n if (!file || !this.polycanvas || !this.uploadImageToS3) return;\n\n const imageUrl = await this.uploadImageToS3(file);\n\n if (imageUrl === 'error') {\n return;\n }\n\n this.addImageToCanvas(imageUrl);\n\n target.value = '';\n };\n\n private updateCanvas = ({ data, userId }: IActionData) => {\n const canEditStroke = this.userType === 'TEACHER' || userId === this.userId;\n\n try {\n Object.entries(data).forEach(([key, value]) => {\n if (!value[0] && value[1]) {\n if ('name' in value[1] && value[1].name === 'image') {\n value[1].status = this.userType === 'STUDENT' ? 'locked' : undefined; // Lock only images for students\n }\n this.polycanvas?.add({ ...value[1], cannotEdit: !canEditStroke }, key);\n } else if (value[0] && !value[1]) {\n this.polycanvas?.delete(key);\n } else if (value[0] && value[1]) {\n this.polycanvas?.update(key, { ...value[1] });\n }\n });\n } catch (error) {\n captureMessage('Error Updating Canvas', data);\n }\n };\n\n toggleTiles = (val: boolean) => {\n this.polycanvas?.toggleSidebar(val);\n };\n\n setViewPort = ({ x, y, zoom }: IViewport) => {\n if (this.polycanvas) {\n const cv = this.polycanvas?.getViewport();\n\n if (cv.x === x && cv.y === y && cv.zoom === zoom) {\n return; // No change needed\n }\n\n this.polycanvas.setViewport(x, y, zoom);\n }\n };\n\n resetViewPort = () => {\n if (this.polycanvas) {\n this.polycanvas.resetViewport();\n }\n };\n\n changeGrid = (gridName: TCueCanvasGridName) => {\n if (!this.polycanvas || this.gridName === gridName) return;\n\n this.polycanvas.setOptions({\n grid: gridName,\n });\n this.gridName = gridName;\n if (this.updateCanvasConfigChange) {\n this.updateCanvasConfigChange({ gridName: gridName });\n }\n };\n\n lockSelectedTiles = () => {\n const { tiles: allTiles } = this.polycanvas?.serialize() || {};\n const selectedItems = this.polycanvas?.getSelection() || [];\n\n if (selectedItems.length > 0 && allTiles) {\n const lockedTiles: TCueCanvasChangeDataObject = {};\n\n selectedItems.forEach(key => {\n if (!allTiles[key]?.name) return;\n\n const updatedJson = { ...allTiles[key], status: 'locked' as const };\n\n this.polycanvas?.update(key, updatedJson);\n if (allTiles[key]?.name) lockedTiles[key] = [allTiles[key], updatedJson];\n });\n\n this.publishToChannel(lockedTiles);\n }\n };\n\n unlockAllTiles = () => {\n if (!this.polycanvas) return;\n\n const { tiles: allTiles } = this.polycanvas.serialize();\n const unlockedTiles: TCueCanvasChangeDataObject = {};\n\n if (allTiles && Object.entries(allTiles).length > 0) {\n Object.entries(allTiles).forEach(([key, item]) => {\n if (item.status !== 'locked') return;\n\n const updatedJson = { ...item, status: undefined };\n\n this.polycanvas?.update(key, updatedJson);\n unlockedTiles[key] = [item, updatedJson];\n });\n\n this.publishToChannel(unlockedTiles);\n }\n };\n\n replaceCanvas = (data: IReplaceCanvas) => {\n if (!this.polycanvas) return;\n\n const { data: canvasData, gridName } = data;\n\n this.polycanvas.clear();\n if (gridName) {\n this.changeGrid(gridName);\n }\n\n Object.entries(canvasData).forEach(([key, value]) => {\n if (!value[0] && value[1]) {\n this.polycanvas?.add({ ...value[1] }, key);\n\n return;\n }\n });\n\n this.publishToChannel(canvasData);\n };\n\n setTool = (tool: TCueCanvasTool) => {\n if (!this.polycanvas || tool === this.activeTool) return;\n\n const [currTool, currSubTool] = getToolAndSubtool(tool);\n\n switch (currTool) {\n case 'clearAll':\n this.clearCanvas();\n break;\n case 'home':\n this.resetViewPort();\n break;\n case 'undo':\n this.undo();\n break;\n case 'redo':\n this.redo();\n break;\n case 'lock':\n this.lockSelectedTiles();\n break;\n case 'unlock':\n this.unlockAllTiles();\n break;\n case 'zoomIn':\n this.zoomIn();\n break;\n case 'zoomOut':\n this.zoomOut();\n break;\n case 'upload':\n this.openFileUpload();\n break;\n case 'download':\n this.downloadCanvasAsImage();\n break;\n case 'grid':\n break;\n default:\n this.polycanvas.setTool(currTool, currSubTool);\n }\n if (!STATELESS_TOOLS.has(tool)) {\n this.activeTool = tool;\n }\n };\n\n /**\n * The `update` method is called in two cases:\n * 1. When receiving initial data to update the canvas content.\n * 2. When receiving strokes from other peers to update the canvas content.\n * Each item can contain multiple actions, which are applied to the canvas.\n *\n * The method checks if the payload is an array or a single object.\n * If it's an array, it iterates over each item and updates the canvas accordingly.\n * If it's a single object, it directly updates the canvas.\n *\n * Additionally, if the payload contains a height greater than the current height of the canvas, the `updateHeight` method is called to update the canvas height.\n */\n update = (payload: IActionData | IActionData[]) => {\n if (Array.isArray(payload)) {\n const heights = payload.map(data => data.height).filter(Boolean);\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > this.height) {\n this.updateHeight(maxHeight);\n }\n payload.forEach(item => this.updateCanvas(item));\n } else {\n if (payload.height > this.height) {\n this.updateHeight(payload.height);\n }\n this.updateCanvas(payload);\n }\n };\n\n getSelections = () => {\n return this.polycanvas ? this.polycanvas.getSelection() : [];\n };\n\n setColor = (color: TCueCanvasColors) => {\n if (!this.polycanvas || !this.activeColor) return;\n\n const selectedColor = CANVAS_COLORS[color];\n\n const selections = this.getSelections();\n\n if (selections && selections.length > 0) {\n selections.forEach((key: string) => {\n this.polycanvas?.update(key, { color: selectedColor });\n this.onChange(\n new Map([[key, [{ color: CANVAS_COLORS[this.activeColor] }, { color: selectedColor }]]]),\n );\n });\n }\n this.polycanvas.setColor(selectedColor);\n this.activeColor = color;\n };\n\n updateHeight = (height: number) => {\n this.height = height;\n this.onUpdateHeight?.(height);\n };\n\n destroy = () => {\n if (this.polycanvas) {\n this.polycanvas.off('change', this.onChange);\n this.polycanvas.destroy();\n this.debouncedViewportChange.cancel();\n\n if (this.renderAs === 'whiteboard' && this.userType === 'TEACHER') {\n this.polycanvas.off('viewport', this.debouncedViewportChange);\n }\n this.polycanvas = undefined;\n\n if (this.fileInput && this.fileInput.parentNode) {\n this.fileInput.parentNode.removeChild(this.fileInput);\n this.fileInput = null;\n }\n }\n };\n}\n"],"names":["CueCanvasCore","onPublish","onSubscribe","onUpdateActiveTool","onUpdateHeight","uploadImageToS3","height","userId","canvasId","userType","renderAs","updateCanvasConfig","__publicField","payload","e","checkTextOrEquationTool","data","undoData","getReverseMap","viewPort","image","downloadLink","imageUrl","imgJson","key","event","target","file","_a","canEditStroke","value","_b","_c","captureMessage","val","x","y","zoom","cv","gridName","allTiles","selectedItems","lockedTiles","updatedJson","unlockedTiles","item","canvasData","tool","currTool","currSubTool","getToolAndSubtool","STATELESS_TOOLS","heights","maxHeight","color","selectedColor","CANVAS_COLORS","selections","debounce","getColorsForUser","canvasElementRef","canvasConfig","canvasSetting","initialData","removeTileButton","removeMask"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { CANVAS_COLORS as u } from "./constants/constants.js";
2
- const h = [
2
+ const E = [
3
3
  "none",
4
4
  "square2-grid",
5
5
  "square-checked",
@@ -9,7 +9,7 @@ const h = [
9
9
  "square-grid",
10
10
  "tri-grid",
11
11
  "tri2-grid"
12
- ], y = /* @__PURE__ */ new Set([
12
+ ], S = /* @__PURE__ */ new Set([
13
13
  "undo",
14
14
  "redo",
15
15
  "clearAll",
@@ -20,72 +20,64 @@ const h = [
20
20
  "zoomOut",
21
21
  "upload",
22
22
  "download"
23
- ]), m = (o) => {
24
- var t;
25
- const e = (t = o.current) == null ? void 0 : t.shadowRoot;
26
- if (e) {
27
- const n = e.querySelectorAll("x-polypad");
28
- if (n[0]) {
29
- const s = n[0].querySelector("svg.canvas"), r = s == null ? void 0 : s.querySelector("path.mask");
23
+ ]), m = (e) => {
24
+ var n;
25
+ const t = (n = e.current) == null ? void 0 : n.shadowRoot;
26
+ if (t) {
27
+ const o = t.querySelectorAll("x-polypad");
28
+ if (o[0]) {
29
+ const s = o[0].querySelector("svg.canvas"), r = s == null ? void 0 : s.querySelector("path.mask");
30
30
  r == null || r.setAttribute("stroke", "transparent"), r == null || r.setAttribute("fill", "transparent"), r == null || r.removeAttribute("style");
31
31
  }
32
32
  }
33
- }, E = (o) => {
33
+ }, b = (e) => {
34
34
  var r;
35
- const e = (r = o.current) == null ? void 0 : r.shadowRoot, t = e == null ? void 0 : e.querySelector("x-pp-sidebar"), n = t == null ? void 0 : t.getElementsByClassName("tabs-header"), s = t == null ? void 0 : t.getElementsByClassName("tabs-body");
36
- if (t == null || t.setAttribute("style", "display: none;"), t == null || t.setAttribute("style", "height: 30px;"), n && n.length > 0) {
37
- const a = n[0];
35
+ const t = (r = e.current) == null ? void 0 : r.shadowRoot, n = t == null ? void 0 : t.querySelector("x-pp-sidebar"), o = n == null ? void 0 : n.getElementsByClassName("tabs-header"), s = n == null ? void 0 : n.getElementsByClassName("tabs-body");
36
+ if (n == null || n.setAttribute("style", "display: none;"), n == null || n.setAttribute("style", "height: 30px;"), o && o.length > 0) {
37
+ const a = o[0];
38
38
  a.style.display = "none";
39
39
  }
40
40
  if (s && s.length > 0) {
41
41
  const a = s[0];
42
42
  a.style.top = "48px";
43
43
  }
44
- t == null || t.setAttribute("style", "display: block;");
45
- }, f = (o) => {
46
- var n, s;
47
- const e = (n = o.current.shadowRoot) == null ? void 0 : n.querySelectorAll('[data-key="music"]')[0], t = (s = o.current.shadowRoot) == null ? void 0 : s.querySelectorAll('[data-key="logic"]')[0];
48
- e && (e.style.display = "none"), t && (t.style.display = "none");
49
- }, b = (o) => {
50
- var t;
51
- const e = (t = o.current.shadowRoot) == null ? void 0 : t.querySelectorAll('[class="credit"]')[0];
52
- e && (e.style.display = "none");
53
- }, C = (o, e, t, n) => t === "canvas" ? {
44
+ n == null || n.setAttribute("style", "display: block;");
45
+ }, y = (e, t, n, o) => n === "canvas" ? {
54
46
  canvas: "notebook",
55
- canvasX: o,
56
- canvasY: e,
47
+ canvasX: e,
48
+ canvasY: t,
57
49
  noPinchPan: !0,
58
50
  grid: "none",
59
51
  background: "transparent",
60
52
  noSnapping: !0
61
53
  } : {
62
54
  canvas: "infinite",
63
- canvasX: o,
64
- canvasY: e,
55
+ canvasX: e,
56
+ canvasY: t,
65
57
  grid: "none",
66
- noPinchPan: n === "STUDENT",
67
- noDeleting: n === "STUDENT",
68
- noCopyPaste: n === "STUDENT",
58
+ noPinchPan: o === "STUDENT",
59
+ noDeleting: o === "STUDENT",
60
+ noCopyPaste: o === "STUDENT",
69
61
  noMusic: !0,
70
62
  noAudio: !0
71
- }, v = (o, e) => o === "canvas" ? {
63
+ }, f = (e, t) => e === "canvas" ? {
72
64
  sidebarTiles: !1,
73
65
  sidebarSettings: !1,
74
66
  settings: !1,
75
67
  toolbar: !1,
76
68
  canvasMargin: 0
77
69
  } : {
78
- sidebarTiles: e === "TEACHER",
70
+ sidebarTiles: t === "TEACHER",
79
71
  sidebarSettings: !1,
80
72
  settings: !1,
81
73
  toolbar: !1
82
- }, d = (o) => [o[1], o[0]], R = (o) => {
83
- const e = /* @__PURE__ */ new Map();
84
- return o.forEach((t, n) => {
85
- e.set(n, d(t));
86
- }), e;
87
- }, O = (o) => {
88
- switch (o) {
74
+ }, d = (e) => [e[1], e[0]], C = (e) => {
75
+ const t = /* @__PURE__ */ new Map();
76
+ return e.forEach((n, o) => {
77
+ t.set(o, d(n));
78
+ }), t;
79
+ }, v = (e) => {
80
+ switch (e) {
89
81
  case "pen":
90
82
  return ["pen", "pen"];
91
83
  case "marker":
@@ -97,7 +89,7 @@ const h = [
97
89
  case "equation":
98
90
  return ["text", "equation"];
99
91
  default:
100
- return [o, void 0];
92
+ return [e, void 0];
101
93
  }
102
94
  }, g = [
103
95
  "pen",
@@ -140,30 +132,28 @@ const h = [
140
132
  "move",
141
133
  "undo",
142
134
  "redo"
143
- ], T = ["pen", "ruler", "eraser", "move", "undo", "redo"], N = (o, e) => e === "whiteboard" ? o === "TEACHER" ? g : A : o === "TEACHER" ? p : T, _ = (o, e = "canvas") => e === "whiteboard" ? Object.keys(u).filter(
144
- (t) => !t.startsWith("CANVAS")
145
- ) : o === "TEACHER" ? ["CANVAS_RED", "CANVAS_YELLOW", "CANVAS_GREEN"] : ["CANVAS_BLUE", "CANVAS_PURPLE", "CANVAS_PINK"], k = (o) => ["pen", "ruler", "marker", "highlighter"].includes(o), q = (o) => Object.values(o).some((e) => !!(!e[0] && e[1] && "name" in e[1] && (e[1].name === "text" || e[1].name === "equation"))), w = (o) => {
146
- const e = o.split(","), t = e[0] ?? "", n = e[1] ?? "", r = t.includes("base64") ? atob(n) : decodeURIComponent(n), a = t.match(/:(.*?);/), l = a ? a[1] : "application/octet-stream", i = new Uint8Array(r.length);
135
+ ], T = ["pen", "ruler", "eraser", "move", "undo", "redo"], O = (e, t) => t === "whiteboard" ? e === "TEACHER" ? g : A : e === "TEACHER" ? p : T, R = (e, t = "canvas") => t === "whiteboard" ? Object.keys(u).filter(
136
+ (n) => !n.startsWith("CANVAS")
137
+ ) : e === "TEACHER" ? ["CANVAS_RED", "CANVAS_YELLOW", "CANVAS_GREEN"] : ["CANVAS_BLUE", "CANVAS_PURPLE", "CANVAS_PINK"], N = (e) => ["pen", "ruler", "marker", "highlighter"].includes(e), _ = (e) => Object.values(e).some((t) => !!(!t[0] && t[1] && "name" in t[1] && (t[1].name === "text" || t[1].name === "equation"))), k = (e) => {
138
+ const t = e.split(","), n = t[0] ?? "", o = t[1] ?? "", r = n.includes("base64") ? atob(o) : decodeURIComponent(o), a = n.match(/:(.*?);/), l = a ? a[1] : "application/octet-stream", i = new Uint8Array(r.length);
147
139
  for (let c = 0; c < r.length; c++)
148
140
  i[c] = r.charCodeAt(c);
149
141
  return new Blob([i], { type: l });
150
142
  };
151
143
  export {
152
- h as GRID_NAMES,
153
- y as STATELESS_TOOLS,
154
- q as checkTextOrEquationTool,
155
- w as dataURIToBlob,
156
- C as getCanvasConfig,
157
- v as getCanvasSettings,
158
- _ as getColorsForUser,
159
- k as getIsWritingTool,
144
+ E as GRID_NAMES,
145
+ S as STATELESS_TOOLS,
146
+ _ as checkTextOrEquationTool,
147
+ k as dataURIToBlob,
148
+ y as getCanvasConfig,
149
+ f as getCanvasSettings,
150
+ R as getColorsForUser,
151
+ N as getIsWritingTool,
160
152
  d as getReverseAction,
161
- R as getReverseMap,
162
- O as getToolAndSubtool,
163
- N as getUserTools,
164
- b as removeCanvasCredit,
153
+ C as getReverseMap,
154
+ v as getToolAndSubtool,
155
+ O as getUserTools,
165
156
  m as removeMask,
166
- f as removeMusicTiles,
167
- E as removeTileButton
157
+ b as removeTileButton
168
158
  };
169
159
  //# sourceMappingURL=cue-canvas-helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cue-canvas-helpers.js","sources":["../../../src/features/cue-canvas/cue-canvas-helpers.ts"],"sourcesContent":["import type { TUserTypes } from '../ui/types';\nimport type {\n TCueCanvasColors,\n TCueCanvasChangeData,\n TCueCanvasTool,\n TCueCanvasToolOption,\n TDrawingData,\n TRenderAs,\n TCueCanvasGridName,\n TCueCanvasChangeDataObject,\n} from './types/cue-canvas';\nimport type { IPolypadCreateOptions, IPolypadOptions } from './types/polypad';\n\nimport { CANVAS_COLORS } from './constants/constants';\n\nexport const GRID_NAMES: TCueCanvasGridName[] = [\n 'none',\n 'square2-grid',\n 'square-checked',\n 'square-dots',\n 'tri-dots',\n 'tri2-dots',\n 'square-grid',\n 'tri-grid',\n 'tri2-grid',\n];\n\nexport const STATELESS_TOOLS = new Set<TCueCanvasTool>([\n 'undo',\n 'redo',\n 'clearAll',\n 'home',\n 'lock',\n 'unlock',\n 'zoomIn',\n 'zoomOut',\n 'upload',\n 'download',\n]);\n\nexport const removeMask = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const shadowRoot = canvasElementRef.current?.shadowRoot;\n\n if (shadowRoot) {\n const xPolypad = shadowRoot.querySelectorAll('x-polypad');\n\n if (xPolypad[0]) {\n const svgCanvas = xPolypad[0].querySelector('svg.canvas');\n const maskPath = svgCanvas?.querySelector('path.mask');\n\n maskPath?.setAttribute('stroke', 'transparent');\n maskPath?.setAttribute('fill', 'transparent');\n maskPath?.removeAttribute('style');\n }\n }\n\n return undefined;\n};\n\nexport const removeTileButton = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const shadowRoot = canvasElementRef.current?.shadowRoot;\n const sidebar = shadowRoot?.querySelector('x-pp-sidebar') as HTMLElement;\n const tabsHeader = sidebar?.getElementsByClassName('tabs-header');\n const tabsBody = sidebar?.getElementsByClassName('tabs-body');\n\n sidebar?.setAttribute('style', 'display: none;');\n sidebar?.setAttribute('style', 'height: 30px;');\n\n if (tabsHeader && tabsHeader.length > 0) {\n const firstTabHeader = tabsHeader[0] as HTMLElement;\n\n firstTabHeader.style.display = 'none';\n }\n\n if (tabsBody && tabsBody.length > 0) {\n const firstTabBody = tabsBody[0] as HTMLElement;\n\n firstTabBody.style.top = '48px';\n }\n sidebar?.setAttribute('style', 'display: block;');\n};\n\nexport const removeMusicTiles = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const musicTiles = canvasElementRef.current.shadowRoot?.querySelectorAll(`[data-key=\"music\"]`)[0];\n const logicTiles = canvasElementRef.current.shadowRoot?.querySelectorAll(`[data-key=\"logic\"]`)[0];\n\n if (musicTiles) {\n (musicTiles as HTMLElement).style.display = 'none';\n }\n\n if (logicTiles) {\n (logicTiles as HTMLElement).style.display = 'none';\n }\n};\n\nexport const removeCanvasCredit = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const creditSection =\n canvasElementRef.current.shadowRoot?.querySelectorAll(`[class=\"credit\"]`)[0];\n\n if (creditSection) {\n (creditSection as HTMLElement).style.display = 'none';\n }\n};\n\nexport const getCanvasConfig = (\n width: number,\n height: number,\n renderAs: TRenderAs,\n userType: TUserTypes,\n): IPolypadOptions => {\n return renderAs === 'canvas'\n ? {\n canvas: 'notebook',\n canvasX: width,\n canvasY: height,\n noPinchPan: true,\n grid: 'none',\n background: 'transparent',\n noSnapping: true,\n }\n : {\n canvas: 'infinite',\n canvasX: width,\n canvasY: height,\n grid: 'none',\n noPinchPan: userType === 'STUDENT',\n noDeleting: userType === 'STUDENT',\n noCopyPaste: userType === 'STUDENT',\n noMusic: true,\n noAudio: true,\n };\n};\n\nexport const getCanvasSettings = (\n renderAs: TRenderAs,\n userType: TUserTypes,\n): IPolypadCreateOptions => {\n return renderAs === 'canvas'\n ? {\n sidebarTiles: false,\n sidebarSettings: false,\n settings: false,\n toolbar: false,\n canvasMargin: 0,\n }\n : {\n sidebarTiles: userType === 'TEACHER',\n sidebarSettings: false,\n settings: false,\n toolbar: false,\n };\n};\n\nexport const getReverseAction = (action: TDrawingData[]) => [action[1], action[0]];\n\nexport const getReverseMap = (data: TCueCanvasChangeData) => {\n const newData = new Map<string, TDrawingData[]>();\n\n data.forEach((value, key) => {\n newData.set(key, getReverseAction(value));\n });\n\n return newData;\n};\n\nexport const getToolAndSubtool = (\n tool: TCueCanvasTool,\n): [\n Exclude<TCueCanvasTool, 'marker' | 'highlighter' | 'ruler' | 'equation'>,\n TCueCanvasToolOption | undefined,\n] => {\n switch (tool) {\n case 'pen':\n return ['pen', 'pen'];\n case 'marker':\n return ['pen', 'marker'];\n case 'highlighter':\n return ['pen', 'highlighter'];\n case 'ruler':\n return ['pen', 'ruler'];\n case 'equation':\n return ['text', 'equation'];\n default:\n return [tool, undefined];\n }\n};\n\nconst TEACHER_WHITEBOARD_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'lock',\n 'unlock',\n 'zoomIn',\n 'zoomOut',\n 'pan',\n 'clearAll',\n 'text',\n 'equation',\n 'grid',\n 'home',\n 'undo',\n 'redo',\n\n 'upload',\n 'download',\n];\n\nconst STUDENT_WHITEBOARD_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'text',\n 'undo',\n 'redo',\n 'download',\n];\n\nconst TEACHER_DEFAULT_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'undo',\n 'redo',\n];\n\nconst STUDENT_DEFAULT_TOOLS: TCueCanvasTool[] = ['pen', 'ruler', 'eraser', 'move', 'undo', 'redo'];\n\nexport const getUserTools = (userType: TUserTypes, renderAs: TRenderAs): TCueCanvasTool[] => {\n if (renderAs === 'whiteboard') {\n return userType === 'TEACHER' ? TEACHER_WHITEBOARD_TOOLS : STUDENT_WHITEBOARD_TOOLS;\n }\n\n return userType === 'TEACHER' ? TEACHER_DEFAULT_TOOLS : STUDENT_DEFAULT_TOOLS;\n};\n\nexport const getColorsForUser = (userType: TUserTypes, renderAs: TRenderAs = 'canvas') => {\n if (renderAs === 'whiteboard') {\n return Object.keys(CANVAS_COLORS).filter(\n color => !color.startsWith('CANVAS'),\n ) as TCueCanvasColors[];\n }\n\n return userType === 'TEACHER'\n ? (['CANVAS_RED', 'CANVAS_YELLOW', 'CANVAS_GREEN'] as TCueCanvasColors[])\n : (['CANVAS_BLUE', 'CANVAS_PURPLE', 'CANVAS_PINK'] as TCueCanvasColors[]);\n};\n\nexport const getIsWritingTool = (penTool: string) => {\n return ['pen', 'ruler', 'marker', 'highlighter'].includes(penTool);\n};\n\nexport const checkTextOrEquationTool = (payload: TCueCanvasChangeDataObject) => {\n return Object.values(payload).some(value => {\n if (\n !value[0] &&\n value[1] &&\n 'name' in value[1] &&\n (value[1].name === 'text' || value[1].name === 'equation')\n ) {\n return true;\n }\n\n return false;\n });\n};\n\nexport const dataURIToBlob = (dataURI: string): Blob => {\n const parts = dataURI.split(',');\n const metadata = parts[0] ?? '';\n const base64Data = parts[1] ?? '';\n\n const isBase64 = metadata.includes('base64');\n const byteString = isBase64 ? atob(base64Data) : decodeURIComponent(base64Data);\n\n const mimeTypeMatch = metadata.match(/:(.*?);/);\n const mimeType = mimeTypeMatch ? mimeTypeMatch[1] : 'application/octet-stream';\n\n const byteArray = new Uint8Array(byteString.length);\n\n for (let i = 0; i < byteString.length; i++) {\n byteArray[i] = byteString.charCodeAt(i);\n }\n\n return new Blob([byteArray], { type: mimeType });\n};\n\nexport const jsonToBlob = (json: unknown) => {\n const data = JSON.stringify(json);\n\n return new Blob([data], {\n type: 'application/json',\n });\n};\n"],"names":["GRID_NAMES","STATELESS_TOOLS","removeMask","canvasElementRef","shadowRoot","_a","xPolypad","svgCanvas","maskPath","removeTileButton","sidebar","tabsHeader","tabsBody","firstTabHeader","firstTabBody","removeMusicTiles","musicTiles","logicTiles","_b","removeCanvasCredit","creditSection","getCanvasConfig","width","height","renderAs","userType","getCanvasSettings","getReverseAction","action","getReverseMap","data","newData","value","key","getToolAndSubtool","tool","TEACHER_WHITEBOARD_TOOLS","STUDENT_WHITEBOARD_TOOLS","TEACHER_DEFAULT_TOOLS","STUDENT_DEFAULT_TOOLS","getUserTools","getColorsForUser","CANVAS_COLORS","color","getIsWritingTool","penTool","checkTextOrEquationTool","payload","dataURIToBlob","dataURI","parts","metadata","base64Data","byteString","mimeTypeMatch","mimeType","byteArray","i"],"mappings":"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"}
1
+ {"version":3,"file":"cue-canvas-helpers.js","sources":["../../../src/features/cue-canvas/cue-canvas-helpers.ts"],"sourcesContent":["import type { TUserTypes } from '../ui/types';\nimport type {\n TCueCanvasColors,\n TCueCanvasChangeData,\n TCueCanvasTool,\n TCueCanvasToolOption,\n TDrawingData,\n TRenderAs,\n TCueCanvasGridName,\n TCueCanvasChangeDataObject,\n} from './types/cue-canvas';\nimport type { IPolypadCreateOptions, IPolypadOptions } from './types/polypad';\n\nimport { CANVAS_COLORS } from './constants/constants';\n\nexport const GRID_NAMES: TCueCanvasGridName[] = [\n 'none',\n 'square2-grid',\n 'square-checked',\n 'square-dots',\n 'tri-dots',\n 'tri2-dots',\n 'square-grid',\n 'tri-grid',\n 'tri2-grid',\n];\n\nexport const STATELESS_TOOLS = new Set<TCueCanvasTool>([\n 'undo',\n 'redo',\n 'clearAll',\n 'home',\n 'lock',\n 'unlock',\n 'zoomIn',\n 'zoomOut',\n 'upload',\n 'download',\n]);\n\nexport const removeMask = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const shadowRoot = canvasElementRef.current?.shadowRoot;\n\n if (shadowRoot) {\n const xPolypad = shadowRoot.querySelectorAll('x-polypad');\n\n if (xPolypad[0]) {\n const svgCanvas = xPolypad[0].querySelector('svg.canvas');\n const maskPath = svgCanvas?.querySelector('path.mask');\n\n maskPath?.setAttribute('stroke', 'transparent');\n maskPath?.setAttribute('fill', 'transparent');\n maskPath?.removeAttribute('style');\n }\n }\n\n return undefined;\n};\n\nexport const removeTileButton = (canvasElementRef: React.RefObject<HTMLDivElement>) => {\n const shadowRoot = canvasElementRef.current?.shadowRoot;\n const sidebar = shadowRoot?.querySelector('x-pp-sidebar') as HTMLElement;\n const tabsHeader = sidebar?.getElementsByClassName('tabs-header');\n const tabsBody = sidebar?.getElementsByClassName('tabs-body');\n\n sidebar?.setAttribute('style', 'display: none;');\n sidebar?.setAttribute('style', 'height: 30px;');\n\n if (tabsHeader && tabsHeader.length > 0) {\n const firstTabHeader = tabsHeader[0] as HTMLElement;\n\n firstTabHeader.style.display = 'none';\n }\n\n if (tabsBody && tabsBody.length > 0) {\n const firstTabBody = tabsBody[0] as HTMLElement;\n\n firstTabBody.style.top = '48px';\n }\n sidebar?.setAttribute('style', 'display: block;');\n};\n\nexport const getCanvasConfig = (\n width: number,\n height: number,\n renderAs: TRenderAs,\n userType: TUserTypes,\n): IPolypadOptions => {\n return renderAs === 'canvas'\n ? {\n canvas: 'notebook',\n canvasX: width,\n canvasY: height,\n noPinchPan: true,\n grid: 'none',\n background: 'transparent',\n noSnapping: true,\n }\n : {\n canvas: 'infinite',\n canvasX: width,\n canvasY: height,\n grid: 'none',\n noPinchPan: userType === 'STUDENT',\n noDeleting: userType === 'STUDENT',\n noCopyPaste: userType === 'STUDENT',\n noMusic: true,\n noAudio: true,\n };\n};\n\nexport const getCanvasSettings = (\n renderAs: TRenderAs,\n userType: TUserTypes,\n): IPolypadCreateOptions => {\n return renderAs === 'canvas'\n ? {\n sidebarTiles: false,\n sidebarSettings: false,\n settings: false,\n toolbar: false,\n canvasMargin: 0,\n }\n : {\n sidebarTiles: userType === 'TEACHER',\n sidebarSettings: false,\n settings: false,\n toolbar: false,\n };\n};\n\nexport const getReverseAction = (action: TDrawingData[]) => [action[1], action[0]];\n\nexport const getReverseMap = (data: TCueCanvasChangeData) => {\n const newData = new Map<string, TDrawingData[]>();\n\n data.forEach((value, key) => {\n newData.set(key, getReverseAction(value));\n });\n\n return newData;\n};\n\nexport const getToolAndSubtool = (\n tool: TCueCanvasTool,\n): [\n Exclude<TCueCanvasTool, 'marker' | 'highlighter' | 'ruler' | 'equation'>,\n TCueCanvasToolOption | undefined,\n] => {\n switch (tool) {\n case 'pen':\n return ['pen', 'pen'];\n case 'marker':\n return ['pen', 'marker'];\n case 'highlighter':\n return ['pen', 'highlighter'];\n case 'ruler':\n return ['pen', 'ruler'];\n case 'equation':\n return ['text', 'equation'];\n default:\n return [tool, undefined];\n }\n};\n\nconst TEACHER_WHITEBOARD_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'lock',\n 'unlock',\n 'zoomIn',\n 'zoomOut',\n 'pan',\n 'clearAll',\n 'text',\n 'equation',\n 'grid',\n 'home',\n 'undo',\n 'redo',\n\n 'upload',\n 'download',\n];\n\nconst STUDENT_WHITEBOARD_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'text',\n 'undo',\n 'redo',\n 'download',\n];\n\nconst TEACHER_DEFAULT_TOOLS: TCueCanvasTool[] = [\n 'pen',\n 'ruler',\n 'marker',\n 'highlighter',\n 'eraser',\n 'move',\n 'undo',\n 'redo',\n];\n\nconst STUDENT_DEFAULT_TOOLS: TCueCanvasTool[] = ['pen', 'ruler', 'eraser', 'move', 'undo', 'redo'];\n\nexport const getUserTools = (userType: TUserTypes, renderAs: TRenderAs): TCueCanvasTool[] => {\n if (renderAs === 'whiteboard') {\n return userType === 'TEACHER' ? TEACHER_WHITEBOARD_TOOLS : STUDENT_WHITEBOARD_TOOLS;\n }\n\n return userType === 'TEACHER' ? TEACHER_DEFAULT_TOOLS : STUDENT_DEFAULT_TOOLS;\n};\n\nexport const getColorsForUser = (userType: TUserTypes, renderAs: TRenderAs = 'canvas') => {\n if (renderAs === 'whiteboard') {\n return Object.keys(CANVAS_COLORS).filter(\n color => !color.startsWith('CANVAS'),\n ) as TCueCanvasColors[];\n }\n\n return userType === 'TEACHER'\n ? (['CANVAS_RED', 'CANVAS_YELLOW', 'CANVAS_GREEN'] as TCueCanvasColors[])\n : (['CANVAS_BLUE', 'CANVAS_PURPLE', 'CANVAS_PINK'] as TCueCanvasColors[]);\n};\n\nexport const getIsWritingTool = (penTool: string) => {\n return ['pen', 'ruler', 'marker', 'highlighter'].includes(penTool);\n};\n\nexport const checkTextOrEquationTool = (payload: TCueCanvasChangeDataObject) => {\n return Object.values(payload).some(value => {\n if (\n !value[0] &&\n value[1] &&\n 'name' in value[1] &&\n (value[1].name === 'text' || value[1].name === 'equation')\n ) {\n return true;\n }\n\n return false;\n });\n};\n\nexport const dataURIToBlob = (dataURI: string): Blob => {\n const parts = dataURI.split(',');\n const metadata = parts[0] ?? '';\n const base64Data = parts[1] ?? '';\n\n const isBase64 = metadata.includes('base64');\n const byteString = isBase64 ? atob(base64Data) : decodeURIComponent(base64Data);\n\n const mimeTypeMatch = metadata.match(/:(.*?);/);\n const mimeType = mimeTypeMatch ? mimeTypeMatch[1] : 'application/octet-stream';\n\n const byteArray = new Uint8Array(byteString.length);\n\n for (let i = 0; i < byteString.length; i++) {\n byteArray[i] = byteString.charCodeAt(i);\n }\n\n return new Blob([byteArray], { type: mimeType });\n};\n\nexport const jsonToBlob = (json: unknown) => {\n const data = JSON.stringify(json);\n\n return new Blob([data], {\n type: 'application/json',\n });\n};\n"],"names":["GRID_NAMES","STATELESS_TOOLS","removeMask","canvasElementRef","shadowRoot","_a","xPolypad","svgCanvas","maskPath","removeTileButton","sidebar","tabsHeader","tabsBody","firstTabHeader","firstTabBody","getCanvasConfig","width","height","renderAs","userType","getCanvasSettings","getReverseAction","action","getReverseMap","data","newData","value","key","getToolAndSubtool","tool","TEACHER_WHITEBOARD_TOOLS","STUDENT_WHITEBOARD_TOOLS","TEACHER_DEFAULT_TOOLS","STUDENT_DEFAULT_TOOLS","getUserTools","getColorsForUser","CANVAS_COLORS","color","getIsWritingTool","penTool","checkTextOrEquationTool","payload","dataURIToBlob","dataURI","parts","metadata","base64Data","byteString","mimeTypeMatch","mimeType","byteArray","i"],"mappings":"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"}
@@ -1,70 +1,39 @@
1
- import { useState as l, useMemo as y, useCallback as f, useEffect as x } from "react";
2
- import { useUIContext as h } from "../ui/context/context.js";
3
- const E = (u) => {
4
- const [a, d] = l({}), { onEvent: o } = h(), e = y(() => {
5
- try {
6
- const t = window.AudioContext || window.webkitAudioContext;
7
- if (t)
8
- try {
9
- return new t();
10
- } catch (r) {
11
- o("audio_context_init_failed", { error: r });
12
- }
13
- } catch (t) {
14
- o("audio_context_detection_failed", { error: t });
15
- }
16
- return null;
17
- }, [o]), i = f(
1
+ import { useState as x, useMemo as y, useCallback as f, useEffect as _ } from "react";
2
+ import { useUIContext as p } from "../ui/context/context.js";
3
+ const C = (u) => {
4
+ const [a, s] = x({}), e = y(() => new (AudioContext || window.webkitAudioContext)(), []), { onEvent: o } = p(), c = f(
18
5
  async (t, r) => {
19
- if (!e) {
20
- o("audio_context_not_found", { name: r });
21
- return;
22
- }
23
6
  try {
24
- const n = await (await fetch(t)).arrayBuffer(), s = await e.decodeAudioData(n);
25
- d((_) => ({ ..._, [r]: s }));
26
- } catch (c) {
27
- o("audio_fetch_failed", { error: c });
7
+ const i = await (await fetch(t)).arrayBuffer(), d = await e.decodeAudioData(i);
8
+ s((l) => ({ ...l, [r]: d }));
9
+ } catch (n) {
10
+ o("audio_fetch_failed", { error: n });
28
11
  }
29
12
  },
30
13
  [e, o]
31
14
  );
32
- return x(() => (u.forEach(({ url: t, name: r }) => {
33
- i(t, r);
15
+ return _(() => (u.forEach(({ url: t, name: r }) => {
16
+ c(t, r);
34
17
  }), () => {
35
- if (e)
36
- try {
37
- e.state !== "closed" && e.close();
38
- } catch (t) {
39
- o("audio_context_closing_failed", { error: t });
40
- }
41
- }), [u, e, i, o]), f(
18
+ try {
19
+ e.close();
20
+ } catch (t) {
21
+ o("audio_context_closing_failed", { error: t });
22
+ }
23
+ }), [u, e, c, o]), f(
42
24
  (t) => {
43
- if (!e) {
44
- o("audio_context_not_found", { name: t });
45
- return;
46
- }
47
25
  const r = a[t];
48
26
  if (!r) {
49
27
  o("audio_buffer_not_found", { name: t });
50
28
  return;
51
29
  }
52
- try {
53
- const c = e.createBufferSource();
54
- c.buffer = r;
55
- try {
56
- c.connect(e.destination), c.start();
57
- } catch (n) {
58
- o("audio_playback_failed", { name: t, playError: n });
59
- }
60
- } catch (c) {
61
- o("audio_source_creation_failed", { name: t, sourceError: c });
62
- }
30
+ const n = e.createBufferSource();
31
+ n.buffer = r, n.connect(e.destination), n.start();
63
32
  },
64
33
  [a, e, o]
65
34
  );
66
35
  };
67
36
  export {
68
- E as default
37
+ C as default
69
38
  };
70
39
  //# sourceMappingURL=use-audio-player.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-audio-player.js","sources":["../../../src/features/hooks/use-audio-player.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useUIContext } from '../ui/context/context';\n\ndeclare global {\n interface Window {\n webkitAudioContext?: AudioContext;\n }\n}\n\nconst useAudioPlayer = (audioUrls: { url: string; name: string }[]) => {\n const [audioBuffers, setAudioBuffers] = useState<Record<string, AudioBuffer | null>>({});\n const { onEvent: trackEvent } = useUIContext();\n\n const context = useMemo(() => {\n try {\n const Ctx = window.AudioContext || window.webkitAudioContext;\n\n if (Ctx) {\n try {\n return new Ctx();\n } catch (initError) {\n trackEvent('audio_context_init_failed', { error: initError });\n }\n }\n } catch (e) {\n trackEvent('audio_context_detection_failed', { error: e });\n }\n\n return null;\n }, [trackEvent]);\n\n const getAudioBuffer = useCallback(\n async (url: string, name: string) => {\n if (!context) {\n trackEvent('audio_context_not_found', { name });\n\n return;\n }\n\n try {\n const response = await fetch(url);\n const arrayBuffer = await response.arrayBuffer();\n const audioBuffer = await context.decodeAudioData(arrayBuffer);\n\n setAudioBuffers(prev => ({ ...prev, [name]: audioBuffer }));\n } catch (e) {\n trackEvent('audio_fetch_failed', { error: e });\n }\n },\n [context, trackEvent],\n );\n\n useEffect(() => {\n audioUrls.forEach(({ url, name }) => {\n getAudioBuffer(url, name);\n });\n\n return () => {\n if (!context) return;\n\n try {\n if (context.state !== 'closed') context.close();\n } catch (e) {\n trackEvent('audio_context_closing_failed', { error: e });\n }\n };\n }, [audioUrls, context, getAudioBuffer, trackEvent]);\n const playSound = useCallback(\n (name: string) => {\n if (!context) {\n trackEvent('audio_context_not_found', { name });\n\n return;\n }\n\n const buffer = audioBuffers[name];\n\n if (!buffer) {\n trackEvent('audio_buffer_not_found', { name });\n\n return;\n }\n\n try {\n const source = context.createBufferSource();\n\n source.buffer = buffer;\n\n try {\n source.connect(context.destination);\n source.start();\n } catch (playError) {\n trackEvent('audio_playback_failed', { name, playError });\n }\n } catch (sourceError) {\n trackEvent('audio_source_creation_failed', { name, sourceError });\n }\n },\n [audioBuffers, context, trackEvent],\n );\n\n return playSound;\n};\n\nexport default useAudioPlayer;\n"],"names":["useAudioPlayer","audioUrls","audioBuffers","setAudioBuffers","useState","trackEvent","useUIContext","context","useMemo","Ctx","initError","e","getAudioBuffer","useCallback","url","name","arrayBuffer","audioBuffer","prev","useEffect","buffer","source","playError","sourceError"],"mappings":";;AAUM,MAAAA,IAAiB,CAACC,MAA+C;AACrE,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAA6C,CAAE,CAAA,GACjF,EAAE,SAASC,EAAW,IAAIC,EAAa,GAEvCC,IAAUC,EAAQ,MAAM;AACxB,QAAA;AACI,YAAAC,IAAM,OAAO,gBAAgB,OAAO;AAE1C,UAAIA;AACE,YAAA;AACF,iBAAO,IAAIA,EAAI;AAAA,iBACRC,GAAW;AAClB,UAAAL,EAAW,6BAA6B,EAAE,OAAOK,EAAW,CAAA;AAAA,QAC9D;AAAA,aAEKC,GAAG;AACV,MAAAN,EAAW,kCAAkC,EAAE,OAAOM,EAAG,CAAA;AAAA,IAC3D;AAEO,WAAA;AAAA,EAAA,GACN,CAACN,CAAU,CAAC,GAETO,IAAiBC;AAAA,IACrB,OAAOC,GAAaC,MAAiB;AACnC,UAAI,CAACR,GAAS;AACD,QAAAF,EAAA,2BAA2B,EAAE,MAAAU,EAAA,CAAM;AAE9C;AAAA,MACF;AAEI,UAAA;AAEI,cAAAC,IAAc,OADH,MAAM,MAAMF,CAAG,GACG,eAC7BG,IAAc,MAAMV,EAAQ,gBAAgBS,CAAW;AAE7C,QAAAb,EAAA,CAAAe,OAAS,EAAE,GAAGA,GAAM,CAACH,CAAI,GAAGE,EAAc,EAAA;AAAA,eACnDN,GAAG;AACV,QAAAN,EAAW,sBAAsB,EAAE,OAAOM,EAAG,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,CAACJ,GAASF,CAAU;AAAA,EAAA;AAGtB,SAAAc,EAAU,OACRlB,EAAU,QAAQ,CAAC,EAAE,KAAAa,GAAK,MAAAC,QAAW;AACnC,IAAAH,EAAeE,GAAKC,CAAI;AAAA,EAAA,CACzB,GAEM,MAAM;AACX,QAAKR;AAED,UAAA;AACF,QAAIA,EAAQ,UAAU,YAAUA,EAAQ,MAAM;AAAA,eACvCI,GAAG;AACV,QAAAN,EAAW,gCAAgC,EAAE,OAAOM,EAAG,CAAA;AAAA,MACzD;AAAA,EAAA,IAED,CAACV,GAAWM,GAASK,GAAgBP,CAAU,CAAC,GACjCQ;AAAA,IAChB,CAACE,MAAiB;AAChB,UAAI,CAACR,GAAS;AACD,QAAAF,EAAA,2BAA2B,EAAE,MAAAU,EAAA,CAAM;AAE9C;AAAA,MACF;AAEM,YAAAK,IAASlB,EAAaa,CAAI;AAEhC,UAAI,CAACK,GAAQ;AACA,QAAAf,EAAA,0BAA0B,EAAE,MAAAU,EAAA,CAAM;AAE7C;AAAA,MACF;AAEI,UAAA;AACI,cAAAM,IAASd,EAAQ;AAEvB,QAAAc,EAAO,SAASD;AAEZ,YAAA;AACK,UAAAC,EAAA,QAAQd,EAAQ,WAAW,GAClCc,EAAO,MAAM;AAAA,iBACNC,GAAW;AAClB,UAAAjB,EAAW,yBAAyB,EAAE,MAAAU,GAAM,WAAAO,EAAW,CAAA;AAAA,QACzD;AAAA,eACOC,GAAa;AACpB,QAAAlB,EAAW,gCAAgC,EAAE,MAAAU,GAAM,aAAAQ,EAAa,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,IACA,CAACrB,GAAcK,GAASF,CAAU;AAAA,EAAA;AAItC;"}
1
+ {"version":3,"file":"use-audio-player.js","sources":["../../../src/features/hooks/use-audio-player.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useUIContext } from '../ui/context/context';\n\ndeclare global {\n interface Window {\n webkitAudioContext?: AudioContext;\n }\n}\n\nconst useAudioPlayer = (audioUrls: { url: string; name: string }[]) => {\n const [audioBuffers, setAudioBuffers] = useState<Record<string, AudioBuffer | null>>({});\n\n const context = useMemo(() => {\n const audioContext = new (AudioContext || window.webkitAudioContext)();\n\n return audioContext;\n }, []);\n\n const { onEvent: trackEvent } = useUIContext();\n\n const getAudioBuffer = useCallback(\n async (url: string, name: string) => {\n try {\n const response = await fetch(url);\n const arrayBuffer = await response.arrayBuffer();\n const audioBuffer = await context.decodeAudioData(arrayBuffer);\n\n setAudioBuffers(prev => ({ ...prev, [name]: audioBuffer }));\n } catch (e) {\n trackEvent('audio_fetch_failed', { error: e });\n }\n },\n [context, trackEvent],\n );\n\n useEffect(() => {\n audioUrls.forEach(({ url, name }) => {\n getAudioBuffer(url, name);\n });\n\n return () => {\n try {\n context.close();\n } catch (e) {\n trackEvent('audio_context_closing_failed', { error: e });\n }\n };\n }, [audioUrls, context, getAudioBuffer, trackEvent]);\n\n const playSound = useCallback(\n (name: string) => {\n const buffer = audioBuffers[name];\n\n if (!buffer) {\n trackEvent('audio_buffer_not_found', { name });\n\n return;\n }\n\n const source = context.createBufferSource();\n\n source.buffer = buffer;\n source.connect(context.destination);\n source.start();\n },\n [audioBuffers, context, trackEvent],\n );\n\n return playSound;\n};\n\nexport default useAudioPlayer;\n"],"names":["useAudioPlayer","audioUrls","audioBuffers","setAudioBuffers","useState","context","useMemo","trackEvent","useUIContext","getAudioBuffer","useCallback","url","name","arrayBuffer","audioBuffer","prev","e","useEffect","buffer","source"],"mappings":";;AAUM,MAAAA,IAAiB,CAACC,MAA+C;AACrE,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAA6C,CAAE,CAAA,GAEjFC,IAAUC,EAAQ,MACD,KAAK,gBAAgB,OAAO,oBAAoB,GAGpE,CAAE,CAAA,GAEC,EAAE,SAASC,EAAW,IAAIC,EAAa,GAEvCC,IAAiBC;AAAA,IACrB,OAAOC,GAAaC,MAAiB;AAC/B,UAAA;AAEI,cAAAC,IAAc,OADH,MAAM,MAAMF,CAAG,GACG,eAC7BG,IAAc,MAAMT,EAAQ,gBAAgBQ,CAAW;AAE7C,QAAAV,EAAA,CAAAY,OAAS,EAAE,GAAGA,GAAM,CAACH,CAAI,GAAGE,EAAc,EAAA;AAAA,eACnDE,GAAG;AACV,QAAAT,EAAW,sBAAsB,EAAE,OAAOS,EAAG,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,CAACX,GAASE,CAAU;AAAA,EAAA;AAGtB,SAAAU,EAAU,OACRhB,EAAU,QAAQ,CAAC,EAAE,KAAAU,GAAK,MAAAC,QAAW;AACnC,IAAAH,EAAeE,GAAKC,CAAI;AAAA,EAAA,CACzB,GAEM,MAAM;AACP,QAAA;AACF,MAAAP,EAAQ,MAAM;AAAA,aACPW,GAAG;AACV,MAAAT,EAAW,gCAAgC,EAAE,OAAOS,EAAG,CAAA;AAAA,IACzD;AAAA,EAAA,IAED,CAACf,GAAWI,GAASI,GAAgBF,CAAU,CAAC,GAEjCG;AAAA,IAChB,CAACE,MAAiB;AACV,YAAAM,IAAShB,EAAaU,CAAI;AAEhC,UAAI,CAACM,GAAQ;AACA,QAAAX,EAAA,0BAA0B,EAAE,MAAAK,EAAA,CAAM;AAE7C;AAAA,MACF;AAEM,YAAAO,IAASd,EAAQ;AAEvB,MAAAc,EAAO,SAASD,GACTC,EAAA,QAAQd,EAAQ,WAAW,GAClCc,EAAO,MAAM;AAAA,IACf;AAAA,IACA,CAACjB,GAAcG,GAASE,CAAU;AAAA,EAAA;AAItC;"}