@cuemath/leap 3.5.11-as2 → 3.5.11-lock01

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.
@@ -9,8 +9,8 @@ class H {
9
9
  constructor({
10
10
  onPublish: t,
11
11
  onSubscribe: e,
12
- onUpdateActiveTool: i,
13
- onUpdateHeight: a,
12
+ onUpdateActiveTool: a,
13
+ onUpdateHeight: i,
14
14
  uploadImageToS3: o,
15
15
  height: n,
16
16
  userId: r,
@@ -47,8 +47,8 @@ class H {
47
47
  });
48
48
  });
49
49
  s(this, "onChange", (t) => {
50
- const i = Object.fromEntries(t.entries());
51
- b(i) && (this.onUpdateActiveTool("move"), this.setTool("move")), this.publishToChannel(i);
50
+ const a = Object.fromEntries(t.entries());
51
+ b(a) && (this.onUpdateActiveTool("move"), this.setTool("move")), this.publishToChannel(a);
52
52
  });
53
53
  s(this, "undo", () => {
54
54
  if (!this.polycanvas)
@@ -94,33 +94,33 @@ class H {
94
94
  });
95
95
  s(this, "addImageToCanvas", (t) => {
96
96
  if (!this.polycanvas) return;
97
- const e = this.polycanvas.getViewport(), i = {
97
+ const e = this.polycanvas.getViewport(), a = {
98
98
  name: "image",
99
99
  href: t,
100
100
  x: e.x + 24,
101
101
  y: e.y + 24,
102
102
  width: 500
103
- }, a = this.polycanvas.add({
104
- ...i
103
+ }, i = this.polycanvas.add({
104
+ ...a
105
105
  });
106
106
  this.publishToChannel({
107
- [a]: [void 0, { ...i, status: "locked" }]
107
+ [i]: [void 0, { ...a, status: "locked" }]
108
108
  }), this.onUpdateActiveTool("move"), this.setTool("move");
109
109
  });
110
110
  s(this, "onSelectImage", async (t) => {
111
111
  var o;
112
- const e = t.target, i = (o = e.files) == null ? void 0 : o[0];
113
- if (!i || !this.polycanvas || !this.uploadImageToS3) return;
114
- const a = await this.uploadImageToS3(i);
115
- a !== "error" && (this.addImageToCanvas(a), e.value = "");
112
+ const e = t.target, a = (o = e.files) == null ? void 0 : o[0];
113
+ if (!a || !this.polycanvas || !this.uploadImageToS3) return;
114
+ const i = await this.uploadImageToS3(a);
115
+ i !== "error" && (this.addImageToCanvas(i), e.value = "");
116
116
  });
117
117
  s(this, "updateCanvas", ({ data: t, userId: e }) => {
118
118
  var o, n;
119
- const i = this.userType === "TEACHER" || e === this.userId, a = ((n = (o = this.polycanvas) == null ? void 0 : o.serialize(1 / 0, 0, 0)) == null ? void 0 : n.tiles) || {};
119
+ const a = this.userType === "TEACHER" || e === this.userId, i = ((n = (o = this.polycanvas) == null ? void 0 : o.serialize(1 / 0, 0, 0)) == null ? void 0 : n.tiles) || {};
120
120
  try {
121
121
  Object.entries(t).forEach(([r, h]) => {
122
122
  var l, c, d;
123
- !h[0] && h[1] ? ("name" in h[1] && h[1].name === "image" && (h[1].status = this.userType === "STUDENT" ? "locked" : void 0), (l = this.polycanvas) == null || l.add({ ...h[1], cannotEdit: !i }, r)) : h[0] && !h[1] ? (c = this.polycanvas) == null || c.delete(r) : h[0] && h[1] && a[r] && ((d = this.polycanvas) == null || d.update(r, { ...h[1] }));
123
+ !h[0] && h[1] ? ("name" in h[1] && h[1].name === "image" && (h[1].status = this.userType === "STUDENT" ? "locked" : null), (l = this.polycanvas) == null || l.add({ ...h[1], cannotEdit: !a }, r)) : h[0] && !h[1] ? (c = this.polycanvas) == null || c.delete(r) : h[0] && h[1] && i[r] && ((d = this.polycanvas) == null || d.update(r, { ...h[1] }));
124
124
  });
125
125
  } catch (r) {
126
126
  f("Error Updating Canvas", { extra: { error: r } });
@@ -130,13 +130,13 @@ class H {
130
130
  var e;
131
131
  (e = this.polycanvas) == null || e.toggleSidebar(t);
132
132
  });
133
- s(this, "setViewPort", ({ x: t, y: e, zoom: i }) => {
134
- var a;
133
+ s(this, "setViewPort", ({ x: t, y: e, zoom: a }) => {
134
+ var i;
135
135
  if (this.polycanvas) {
136
- const o = (a = this.polycanvas) == null ? void 0 : a.getViewport();
137
- if (o.x === t && o.y === e && o.zoom === i)
136
+ const o = (i = this.polycanvas) == null ? void 0 : i.getViewport();
137
+ if (o.x === t && o.y === e && o.zoom === a)
138
138
  return;
139
- this.polycanvas.setViewport(t, e, i);
139
+ this.polycanvas.setViewport(t, e, a);
140
140
  }
141
141
  });
142
142
  s(this, "resetViewPort", () => {
@@ -148,8 +148,8 @@ class H {
148
148
  }), this.gridName = t, this.updateCanvasConfigChange && this.updateCanvasConfigChange({ gridName: t }));
149
149
  });
150
150
  s(this, "lockSelectedTiles", () => {
151
- var i, a;
152
- const { tiles: t } = ((i = this.polycanvas) == null ? void 0 : i.serialize()) || {}, e = ((a = this.polycanvas) == null ? void 0 : a.getSelection()) || [];
151
+ var a, i;
152
+ const { tiles: t } = ((a = this.polycanvas) == null ? void 0 : a.serialize()) || {}, e = ((i = this.polycanvas) == null ? void 0 : i.getSelection()) || [];
153
153
  if (e.length > 0 && t) {
154
154
  const o = {};
155
155
  e.forEach((n) => {
@@ -163,26 +163,26 @@ class H {
163
163
  s(this, "unlockAllTiles", () => {
164
164
  if (!this.polycanvas) return;
165
165
  const { tiles: t } = this.polycanvas.serialize(), e = {};
166
- t && Object.entries(t).length > 0 && (Object.entries(t).forEach(([i, a]) => {
166
+ t && Object.entries(t).length > 0 && (Object.entries(t).forEach(([a, i]) => {
167
167
  var n;
168
- const o = { ...a, status: void 0 };
169
- (n = this.polycanvas) == null || n.update(i, o), e[i] = [a, o];
168
+ const o = { ...i, status: null };
169
+ (n = this.polycanvas) == null || n.update(a, o), e[a] = [i, o];
170
170
  }), this.publishToChannel(e));
171
171
  });
172
172
  s(this, "replaceCanvas", (t) => {
173
173
  if (!this.polycanvas) return;
174
- const { data: e, gridName: i } = t;
175
- this.polycanvas.clear(), i && this.changeGrid(i), Object.entries(e).forEach(([a, o]) => {
174
+ const { data: e, gridName: a } = t;
175
+ this.polycanvas.clear(), a && this.changeGrid(a), Object.entries(e).forEach(([i, o]) => {
176
176
  var n;
177
177
  if (!o[0] && o[1]) {
178
- (n = this.polycanvas) == null || n.add({ ...o[1] }, a);
178
+ (n = this.polycanvas) == null || n.add({ ...o[1] }, i);
179
179
  return;
180
180
  }
181
181
  }), this.publishToChannel(e);
182
182
  });
183
183
  s(this, "setTool", (t) => {
184
184
  if (!this.polycanvas || t === this.activeTool) return;
185
- const [e, i] = S(t);
185
+ const [e, a] = S(t);
186
186
  switch (e) {
187
187
  case "clearAll":
188
188
  this.clearCanvas();
@@ -217,7 +217,7 @@ class H {
217
217
  case "grid":
218
218
  break;
219
219
  default:
220
- this.polycanvas.setTool(e, i);
220
+ this.polycanvas.setTool(e, a);
221
221
  }
222
222
  E.has(t) || (this.activeTool = t);
223
223
  });
@@ -235,19 +235,19 @@ class H {
235
235
  */
236
236
  s(this, "update", (t) => {
237
237
  if (Array.isArray(t)) {
238
- const e = t.map((a) => a.height).filter(Boolean), i = Math.max(...e);
239
- i > this.height && this.updateHeight(i), t.forEach((a) => this.updateCanvas(a));
238
+ const e = t.map((i) => i.height).filter(Boolean), a = Math.max(...e);
239
+ a > this.height && this.updateHeight(a), t.forEach((i) => this.updateCanvas(i));
240
240
  } else
241
241
  t.height > this.height && this.updateHeight(t.height), this.updateCanvas(t);
242
242
  });
243
243
  s(this, "getSelections", () => this.polycanvas ? this.polycanvas.getSelection() : []);
244
244
  s(this, "setColor", (t) => {
245
245
  if (!this.polycanvas || !this.activeColor) return;
246
- const e = u[t], i = this.getSelections();
247
- i && i.length > 0 && i.forEach((a) => {
246
+ const e = u[t], a = this.getSelections();
247
+ a && a.length > 0 && a.forEach((i) => {
248
248
  var o;
249
- (o = this.polycanvas) == null || o.update(a, { color: e }), this.onChange(
250
- /* @__PURE__ */ new Map([[a, [{ color: u[this.activeColor] }, { color: e }]]])
249
+ (o = this.polycanvas) == null || o.update(i, { color: e }), this.onChange(
250
+ /* @__PURE__ */ new Map([[i, [{ color: u[this.activeColor] }, { color: e }]]])
251
251
  );
252
252
  }), this.polycanvas.setColor(e), this.activeColor = t;
253
253
  });
@@ -258,18 +258,18 @@ class H {
258
258
  s(this, "destroy", () => {
259
259
  this.polycanvas && (this.polycanvas.off("change", this.onChange), this.polycanvas.destroy(), this.debouncedViewportChange.cancel(), this.renderAs === "whiteboard" && this.userType === "TEACHER" && this.polycanvas.off("viewport", this.debouncedViewportChange), this.polycanvas = void 0, this.fileInput && this.fileInput.parentNode && (this.fileInput.parentNode.removeChild(this.fileInput), this.fileInput = null));
260
260
  });
261
- this.onUpdateHeight = a, this.onUpdateActiveTool = i, this.height = n, this.uploadImageToS3 = o, this.userId = r, this.canvasId = h, this.publish = t, this.userType = l, this.renderAs = c, this.debouncedViewportChange = y(this.onViewPortChange, 300), this.updateCanvasConfigChange = d, this.activeColor = C(l, c)[0], this.activeTool = void 0, e == null || e(this.canvasId, this.update);
261
+ this.onUpdateHeight = i, this.onUpdateActiveTool = a, this.height = n, this.uploadImageToS3 = o, this.userId = r, this.canvasId = h, this.publish = t, this.userType = l, this.renderAs = c, this.debouncedViewportChange = y(this.onViewPortChange, 300), this.updateCanvasConfigChange = d, this.activeColor = C(l, c)[0], this.activeTool = void 0, e == null || e(this.canvasId, this.update);
262
262
  }
263
- async create({ canvasElementRef: t, canvasConfig: e, canvasSetting: i, initialData: a }) {
263
+ async create({ canvasElementRef: t, canvasConfig: e, canvasSetting: a, initialData: i }) {
264
264
  if (!t.current)
265
265
  throw new Error("PolyCanvas: Div Element Not found for canvas");
266
266
  this.polycanvas = await window.Polypad.create(t.current, {
267
267
  initial: {
268
268
  options: e
269
269
  },
270
- ...i,
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), a && this.update(a);
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);
273
273
  }
274
274
  }
275
275
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"cue-canvas-core.js","sources":["../../../src/features/cue-canvas/cue-canvas-core.ts"],"sourcesContent":["import { captureMessage } from '@sentry/browser';\nimport debounce from 'lodash.debounce';\n\nimport type { TUserTypes } from '../ui/types';\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';\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 ICreateOptions,\n} from './types/cue-canvas';\nimport type { IPolypad, IPolyPadInstance } from './types/polypad';\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 const allTiles = this.polycanvas?.serialize(Infinity, 0, 0)?.tiles || {};\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 if (allTiles[key]) this.polycanvas?.update(key, { ...value[1] });\n }\n });\n } catch (error) {\n captureMessage('Error Updating Canvas', { extra: { error } });\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 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","allTiles","_b","value","_c","error","captureMessage","val","x","y","zoom","cv","gridName","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 { captureMessage } from '@sentry/browser';\nimport debounce from 'lodash.debounce';\n\nimport type { TUserTypes } from '../ui/types';\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';\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 ICreateOptions,\n} from './types/cue-canvas';\nimport type { IPolypad, IPolyPadInstance } from './types/polypad';\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 const allTiles = this.polycanvas?.serialize(Infinity, 0, 0)?.tiles || {};\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' : null; // 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 if (allTiles[key]) this.polycanvas?.update(key, { ...value[1] });\n }\n });\n } catch (error) {\n captureMessage('Error Updating Canvas', { extra: { error } });\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 const updatedJson = { ...item, status: null };\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","allTiles","_b","value","_c","error","captureMessage","val","x","y","zoom","cv","gridName","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 +1 @@
1
- {"version":3,"file":"use-daily-timeline-get.js","sources":["../../../../src/features/timeline/api/use-daily-timeline-get.ts"],"sourcesContent":["import { createGetAPI } from '@cuemath/rest-api';\n\nimport { BASE_URL_V3 } from '../../../constants/api';\nimport { stringify } from '../../../helpers/query-string';\nimport type { TCourseStream } from '../../milestone/create/milestone-create-types';\nimport { type CARD_TYPE, type NODE_STATE } from '../daily-timeline-types';\n\nexport interface ITimeLineItem {\n accuracy: number | null;\n block_type: string | null;\n card_type?: string;\n chapter_name: string | null;\n feedback_comments: string | null;\n image_hue: string | null;\n is_timed: boolean;\n items: { ref: string }[] | null;\n label: string;\n learnosity_activity_ref: string | null;\n max_score: number | null;\n node_id: string;\n node_type: string;\n points: number | null;\n state: NODE_STATE;\n subtext: string | null;\n task_type: string | null;\n time_taken: number | null;\n tip: string | null;\n title: string;\n total_questions: number | null;\n total_score: number | null;\n user_block_id: string | null;\n user_id?: string;\n user_node_id: string;\n}\n\nexport interface ITimeLineEntry {\n cards: ITimeLineItem[];\n course_stream: TCourseStream | 'CIRCLE' | null;\n summary: string | null;\n type: CARD_TYPE;\n}\n\nexport interface ITimelineData {\n daily_logs: ITimeLineEntry[];\n from_date: string;\n to_date: string;\n}\n\nexport interface ITimelineResponse {\n curr_page: number | null;\n next_page: number | null;\n total_pages: number | null;\n user_logs: ITimelineData[];\n}\n\ninterface IGetUserTimelineParams {\n course_stream?: TCourseStream[];\n page?: number;\n timezone: string;\n}\n\nconst { useGet: useDailyTimelineGet } = createGetAPI<ITimelineResponse, IGetUserTimelineParams>({\n getURL: (studentId: string, queryParams) => {\n return `${BASE_URL_V3}/user-timeline/${studentId}?${stringify(queryParams)}`;\n },\n});\n\nexport { useDailyTimelineGet };\n"],"names":["useDailyTimelineGet","createGetAPI","studentId","queryParams","BASE_URL_V3","stringify"],"mappings":";;;AA6DA,MAAM,EAAE,QAAQA,EAAoB,IAAIC,EAAwD;AAAA,EAC9F,QAAQ,CAACC,GAAmBC,MACnB,GAAGC,CAAW,kBAAkBF,CAAS,IAAIG,EAAUF,CAAW,CAAC;AAE9E,CAAC;"}
1
+ {"version":3,"file":"use-daily-timeline-get.js","sources":["../../../../src/features/timeline/api/use-daily-timeline-get.ts"],"sourcesContent":["import { createGetAPI } from '@cuemath/rest-api';\n\nimport { BASE_URL_V3 } from '../../../constants/api';\nimport { stringify } from '../../../helpers/query-string';\nimport type { TCourseStream } from '../../milestone/create/milestone-create-types';\nimport { type CARD_TYPE, type NODE_STATE } from '../daily-timeline-types';\n\nexport interface ITimeLineItem {\n accuracy: number | null;\n block_type: string | null;\n card_type?: string;\n chapter_name: string | null;\n feedback_comments: string | null;\n image_hue: string | null;\n is_timed: boolean;\n items: { ref: string }[] | null;\n label: string;\n learnosity_activity_ref: string | null;\n max_score: number | null;\n node_id: string;\n node_type: string;\n points: number | null;\n state: NODE_STATE;\n subtext: string | null;\n task_type: string | null;\n time_taken: number | null;\n tip: string | null;\n title: string;\n total_questions: number | null;\n total_score: number | null;\n user_block_id: string | null;\n user_id?: string;\n user_node_id: string;\n}\n\nexport interface ITimeLineEntry {\n cards: ITimeLineItem[];\n course_stream: TCourseStream | 'CIRCLE' | null;\n summary: string | null;\n type: CARD_TYPE;\n}\n\nexport interface ITimelineData {\n daily_logs: ITimeLineEntry[];\n from_date: string;\n to_date: string;\n}\n\nexport interface ITimelineResponse {\n curr_page: number | null;\n next_page: number | null;\n per_page: number | null;\n total_pages: number | null;\n user_logs: ITimelineData[];\n}\n\ninterface IGetUserTimelineParams {\n course_stream?: TCourseStream[];\n page?: number;\n size?: number;\n timezone: string;\n}\n\nconst { useGet: useDailyTimelineGet } = createGetAPI<ITimelineResponse, IGetUserTimelineParams>({\n getURL: (studentId: string, queryParams) => {\n return `${BASE_URL_V3}/user-timeline/${studentId}?${stringify(queryParams)}`;\n },\n});\n\nexport { useDailyTimelineGet };\n"],"names":["useDailyTimelineGet","createGetAPI","studentId","queryParams","BASE_URL_V3","stringify"],"mappings":";;;AA+DA,MAAM,EAAE,QAAQA,EAAoB,IAAIC,EAAwD;AAAA,EAC9F,QAAQ,CAACC,GAAmBC,MACnB,GAAGC,CAAW,kBAAkBF,CAAS,IAAIG,EAAUF,CAAW,CAAC;AAE9E,CAAC;"}
@@ -1,6 +1,6 @@
1
1
  import { IMAGES as e } from "../../../assets/images/images.js";
2
- import { NODE_TYPE as _ } from "../../sheets/constants/sheet.js";
3
- const E = 1, o = {
2
+ import { NODE_TYPE as I } from "../../sheets/constants/sheet.js";
3
+ const n = 1, o = {
4
4
  "01": e.JAN,
5
5
  "02": e.FEB,
6
6
  "03": e.MAR,
@@ -13,17 +13,17 @@ const E = 1, o = {
13
13
  10: e.OCT,
14
14
  11: e.NOV,
15
15
  12: e.DEC
16
- }, m = [
17
- _.TURING_BASIC,
18
- _.TURING_LINK,
19
- _.TURING_SHARE,
20
- _.PYTHON_BASIC,
21
- _.PYTHON_VISUAL
16
+ }, E = [
17
+ I.TURING_BASIC,
18
+ I.TURING_LINK,
19
+ I.TURING_SHARE,
20
+ I.PYTHON_BASIC,
21
+ I.PYTHON_VISUAL
22
22
  ];
23
- var i = /* @__PURE__ */ ((I) => (I.TIMELINE_VIEWED = "timeline_viewed", I.TIMELINE_CLOSED = "timeline_closed", I.TIMELINE_SCROLLED = "timeline_scrolled", I.TIMELINE_VIEW_EXPANDED = "timeline_view_expanded", I.TIMELINE_VIEW_COLLAPSED = "timeline_view_collapsed", I))(i || {});
23
+ var i = /* @__PURE__ */ ((_) => (_.TIMELINE_VIEWED = "timeline_viewed", _.TIMELINE_CLOSED = "timeline_closed", _.TIMELINE_SCROLL_CONTINUED = "timeline_scroll_continued", _.TIMELINE_VIEW_EXPANDED = "timeline_view_expanded", _.TIMELINE_VIEW_COLLAPSED = "timeline_view_collapsed", _))(i || {});
24
24
  export {
25
- m as CODING_ACTIVITY_NODE_TYPES,
26
- E as INITIAL_PAGE,
25
+ E as CODING_ACTIVITY_NODE_TYPES,
26
+ n as INITIAL_PAGE,
27
27
  i as TIMELINE_EVENTS,
28
28
  o as monthImageMap
29
29
  };
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../../src/features/timeline/comps/constants.ts"],"sourcesContent":["import { IMAGES } from '../../../assets/images/images';\nimport { NODE_TYPE } from '../../sheets/constants/sheet';\n\nexport const INITIAL_PAGE = 1;\n\nexport const monthImageMap = {\n '01': IMAGES.JAN,\n '02': IMAGES.FEB,\n '03': IMAGES.MAR,\n '04': IMAGES.APR,\n '05': IMAGES.MAY,\n '06': IMAGES.JUN,\n '07': IMAGES.JUL,\n '08': IMAGES.AUG,\n '09': IMAGES.SEP,\n '10': IMAGES.OCT,\n '11': IMAGES.NOV,\n '12': IMAGES.DEC,\n};\n\nexport const CODING_ACTIVITY_NODE_TYPES = [\n NODE_TYPE.TURING_BASIC,\n NODE_TYPE.TURING_LINK,\n NODE_TYPE.TURING_SHARE,\n NODE_TYPE.PYTHON_BASIC,\n NODE_TYPE.PYTHON_VISUAL,\n];\n\nexport enum TIMELINE_EVENTS {\n TIMELINE_VIEWED = 'timeline_viewed',\n TIMELINE_CLOSED = 'timeline_closed',\n TIMELINE_SCROLLED = 'timeline_scrolled',\n TIMELINE_VIEW_EXPANDED = 'timeline_view_expanded',\n TIMELINE_VIEW_COLLAPSED = 'timeline_view_collapsed',\n}\n"],"names":["INITIAL_PAGE","monthImageMap","IMAGES","CODING_ACTIVITY_NODE_TYPES","NODE_TYPE","TIMELINE_EVENTS"],"mappings":";;AAGO,MAAMA,IAAe,GAEfC,IAAgB;AAAA,EAC3B,MAAMC,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,IAAMA,EAAO;AAAA,EACb,IAAMA,EAAO;AAAA,EACb,IAAMA,EAAO;AACf,GAEaC,IAA6B;AAAA,EACxCC,EAAU;AAAA,EACVA,EAAU;AAAA,EACVA,EAAU;AAAA,EACVA,EAAU;AAAA,EACVA,EAAU;AACZ;AAEY,IAAAC,sBAAAA,OACVA,EAAA,kBAAkB,mBAClBA,EAAA,kBAAkB,mBAClBA,EAAA,oBAAoB,qBACpBA,EAAA,yBAAyB,0BACzBA,EAAA,0BAA0B,2BALhBA,IAAAA,KAAA,CAAA,CAAA;"}
1
+ {"version":3,"file":"constants.js","sources":["../../../../src/features/timeline/comps/constants.ts"],"sourcesContent":["import { IMAGES } from '../../../assets/images/images';\nimport { NODE_TYPE } from '../../sheets/constants/sheet';\n\nexport const INITIAL_PAGE = 1;\n\nexport const monthImageMap = {\n '01': IMAGES.JAN,\n '02': IMAGES.FEB,\n '03': IMAGES.MAR,\n '04': IMAGES.APR,\n '05': IMAGES.MAY,\n '06': IMAGES.JUN,\n '07': IMAGES.JUL,\n '08': IMAGES.AUG,\n '09': IMAGES.SEP,\n '10': IMAGES.OCT,\n '11': IMAGES.NOV,\n '12': IMAGES.DEC,\n};\n\nexport const CODING_ACTIVITY_NODE_TYPES = [\n NODE_TYPE.TURING_BASIC,\n NODE_TYPE.TURING_LINK,\n NODE_TYPE.TURING_SHARE,\n NODE_TYPE.PYTHON_BASIC,\n NODE_TYPE.PYTHON_VISUAL,\n];\n\nexport enum TIMELINE_EVENTS {\n TIMELINE_VIEWED = 'timeline_viewed',\n TIMELINE_CLOSED = 'timeline_closed',\n TIMELINE_SCROLL_CONTINUED = 'timeline_scroll_continued',\n TIMELINE_VIEW_EXPANDED = 'timeline_view_expanded',\n TIMELINE_VIEW_COLLAPSED = 'timeline_view_collapsed',\n}\n"],"names":["INITIAL_PAGE","monthImageMap","IMAGES","CODING_ACTIVITY_NODE_TYPES","NODE_TYPE","TIMELINE_EVENTS"],"mappings":";;AAGO,MAAMA,IAAe,GAEfC,IAAgB;AAAA,EAC3B,MAAMC,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,MAAMA,EAAO;AAAA,EACb,IAAMA,EAAO;AAAA,EACb,IAAMA,EAAO;AAAA,EACb,IAAMA,EAAO;AACf,GAEaC,IAA6B;AAAA,EACxCC,EAAU;AAAA,EACVA,EAAU;AAAA,EACVA,EAAU;AAAA,EACVA,EAAU;AAAA,EACVA,EAAU;AACZ;AAEY,IAAAC,sBAAAA,OACVA,EAAA,kBAAkB,mBAClBA,EAAA,kBAAkB,mBAClBA,EAAA,4BAA4B,6BAC5BA,EAAA,yBAAyB,0BACzBA,EAAA,0BAA0B,2BALhBA,IAAAA,KAAA,CAAA,CAAA;"}
@@ -1 +1 @@
1
- {"version":3,"file":"daily-timeline-types.js","sources":["../../../src/features/timeline/daily-timeline-types.ts"],"sourcesContent":["import { type TCourseStream } from '../milestone/create/milestone-create-types';\nimport { type ITimelineData } from './api/use-daily-timeline-get';\n\nexport enum NODE_STATE {\n COMPLETED = 'COMPLETED',\n IN_PROGRESS = 'IN_PROGRESS',\n PENDING = 'PENDING',\n}\n\nexport enum USER_TYPE {\n TEACHER = 'TEACHER',\n STUDENT = 'STUDENT',\n PARENT = 'PARENT',\n}\n\nexport enum CARD_TYPE {\n CW = 'CW',\n HW = 'HW',\n CIRCLE = 'CIRCLE',\n}\n\nexport interface IDailyTimelineProps {\n userType: USER_TYPE;\n studentId: string;\n courseStreams?: TCourseStream[];\n onPuzzlesClick: (userNodeId: string) => void;\n onReviewClick?: (\n userNodeId: string | null,\n isSatMockTestBlock: boolean,\n userBlockId: string | null,\n ) => void;\n scrollAreaHeight?: string | number;\n}\n\nexport interface IDailyTimelineItemsProps extends IDailyTimelineProps {\n entry: ITimelineData;\n index: number;\n shouldShowTag: boolean;\n}\n"],"names":["NODE_STATE","USER_TYPE","CARD_TYPE"],"mappings":"AAGY,IAAAA,sBAAAA,OACVA,EAAA,YAAY,aACZA,EAAA,cAAc,eACdA,EAAA,UAAU,WAHAA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAA,UAAU,WACVA,EAAA,UAAU,WACVA,EAAA,SAAS,UAHCA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAA,KAAK,MACLA,EAAA,KAAK,MACLA,EAAA,SAAS,UAHCA,IAAAA,KAAA,CAAA,CAAA;"}
1
+ {"version":3,"file":"daily-timeline-types.js","sources":["../../../src/features/timeline/daily-timeline-types.ts"],"sourcesContent":["import { type TCourseStream } from '../milestone/create/milestone-create-types';\n\nexport enum NODE_STATE {\n COMPLETED = 'COMPLETED',\n IN_PROGRESS = 'IN_PROGRESS',\n PENDING = 'PENDING',\n}\n\nexport enum USER_TYPE {\n TEACHER = 'TEACHER',\n STUDENT = 'STUDENT',\n PARENT = 'PARENT',\n}\n\nexport enum CARD_TYPE {\n CW = 'CW',\n HW = 'HW',\n CIRCLE = 'CIRCLE',\n}\n\nexport interface IDailyTimelineProps {\n userType: USER_TYPE;\n studentId: string;\n courseStreams?: TCourseStream[];\n onPuzzlesClick: (userNodeId: string) => void;\n onReviewClick?: (\n userNodeId: string | null,\n isSatMockTestBlock: boolean,\n userBlockId: string | null,\n ) => void;\n scrollAreaHeight?: string | number;\n}\n"],"names":["NODE_STATE","USER_TYPE","CARD_TYPE"],"mappings":"AAEY,IAAAA,sBAAAA,OACVA,EAAA,YAAY,aACZA,EAAA,cAAc,eACdA,EAAA,UAAU,WAHAA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAA,UAAU,WACVA,EAAA,UAAU,WACVA,EAAA,SAAS,UAHCA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAA,KAAK,MACLA,EAAA,KAAK,MACLA,EAAA,SAAS,UAHCA,IAAAA,KAAA,CAAA,CAAA;"}
@@ -1,110 +1,155 @@
1
- import { jsx as t, jsxs as P } from "react/jsx-runtime";
2
- import { memo as $, useState as y, useCallback as _, useMemo as R, useEffect as f, Fragment as w } from "react";
3
- import D from "../ui/error/error.js";
4
- import j from "../ui/layout/flex-view.js";
5
- import F from "../ui/loader/app-loader/app-loader.js";
6
- import V from "../ui/intersection-loader/intersection-loader.js";
7
- import { useDailyTimelineGet as k } from "./api/use-daily-timeline-get.js";
8
- import { ScrollWrapper as G, DailyTimelineContainer as O } from "./daily-timeline-styled.js";
9
- import { USER_TYPE as U, CARD_TYPE as I } from "./daily-timeline-types.js";
10
- import { INITIAL_PAGE as W, TIMELINE_EVENTS as u } from "./comps/constants.js";
11
- import { getTimezone as Y } from "../../helpers/date-time.js";
12
- import { useUIContext as b } from "../ui/context/context.js";
13
- import X from "../hooks/use-previous.js";
14
- import q from "./daily-timeline-view.js";
15
- const x = $(
16
- ({ userType: c, studentId: o, courseStreams: m, onPuzzlesClick: M, onReviewClick: S, scrollAreaHeight: h }) => {
17
- const [l, p] = y([]), [g, T] = y(!1), { onEvent: s } = b(), {
18
- get: L,
1
+ import { jsx as r, jsxs as y } from "react/jsx-runtime";
2
+ import { memo as q, useState as v, useCallback as P, useMemo as H, useEffect as p } from "react";
3
+ import J from "../ui/error/error.js";
4
+ import R from "../ui/layout/flex-view.js";
5
+ import Q from "../ui/loader/app-loader/app-loader.js";
6
+ import Z from "../ui/intersection-loader/intersection-loader.js";
7
+ import g from "../ui/separator/separator.js";
8
+ import ee from "../ui/text/text.js";
9
+ import { useDailyTimelineGet as re } from "./api/use-daily-timeline-get.js";
10
+ import { getDayMonthYear as k } from "./comps/utils.js";
11
+ import oe from "./comps/daily-timeline-items/daily-timeline-items.js";
12
+ import { ScrollWrapper as te, DailyTimelineContainer as ie, DailyItems as ae } from "./daily-timeline-styled.js";
13
+ import { USER_TYPE as me, CARD_TYPE as d } from "./daily-timeline-types.js";
14
+ import se from "./comps/month-break/month-break.js";
15
+ import ne from "./comps/year-break/year-break.js";
16
+ import { INITIAL_PAGE as fe, TIMELINE_EVENTS as L } from "./comps/constants.js";
17
+ import { getTimezone as ce } from "../../helpers/date-time.js";
18
+ import le from "./comps/no-activity.js";
19
+ import { useUIContext as he } from "../ui/context/context.js";
20
+ import pe from "../hooks/use-previous.js";
21
+ import { parseISO as w } from "../../node_modules/date-fns/parseISO.js";
22
+ import { isLastDayOfMonth as ge } from "../../node_modules/date-fns/isLastDayOfMonth.js";
23
+ const X = q(
24
+ ({ userType: _, studentId: i, courseStreams: c, onPuzzlesClick: Y, onReviewClick: j, scrollAreaHeight: T }) => {
25
+ const [l, C] = v([]), [u, M] = v(!1), { onEvent: s } = he(), {
26
+ get: $,
19
27
  data: e,
20
- isProcessingFailed: d,
21
- isProcessing: z
22
- } = k(o), C = X(e == null ? void 0 : e.curr_page), n = _(
23
- (r = W, i = !1) => {
24
- i && T(!0), L(o, {
25
- page: r,
26
- timezone: Y(),
27
- course_stream: c === U.TEACHER ? m : []
28
+ isProcessingFailed: B,
29
+ isProcessing: b
30
+ } = re(i), D = pe(e == null ? void 0 : e.curr_page), n = P(
31
+ (o = fe, a = !1) => {
32
+ a && M(!0), $(i, {
33
+ page: o,
34
+ size: 10,
35
+ timezone: ce(),
36
+ course_stream: _ === me.TEACHER ? c : []
28
37
  });
29
38
  },
30
- [L, o, c, m]
31
- ), v = R(() => {
32
- const r = /* @__PURE__ */ new Set();
33
- l.forEach((a) => {
34
- a.daily_logs && a.daily_logs.forEach((E) => {
35
- E.course_stream && E.course_stream !== I.CIRCLE && r.add(E.course_stream);
39
+ [$, i, _, c]
40
+ ), U = H(() => {
41
+ const o = /* @__PURE__ */ new Set();
42
+ l.forEach((t) => {
43
+ t.daily_logs && t.daily_logs.forEach((m) => {
44
+ m.course_stream && m.course_stream !== d.CIRCLE && o.add(m.course_stream);
36
45
  });
37
46
  });
38
- const i = new Set(
39
- (m || []).filter((a) => String(a) !== I.CIRCLE)
47
+ const a = new Set(
48
+ (c || []).filter((t) => String(t) !== d.CIRCLE)
40
49
  );
41
- return i.size > 1 || r.size > 1 || i.size > 0 && r.size > 0 && (i.size !== r.size || !Array.from(i).every((a) => r.has(a)));
42
- }, [l, m]), A = _(() => {
43
- e != null && e.next_page && !g && (n(e.next_page, !0), s(
44
- u.TIMELINE_SCROLLED,
50
+ return a.size > 1 || o.size > 1 || a.size > 0 && o.size > 0 && (a.size !== o.size || !Array.from(a).every((t) => o.has(t)));
51
+ }, [l, c]), V = P(() => {
52
+ e != null && e.next_page && !u && (n(e.next_page, !0), s(
53
+ L.TIMELINE_SCROLL_CONTINUED,
45
54
  {
46
- student_id: o
55
+ student_id: i
47
56
  },
48
57
  { mixpanel: !0 }
49
58
  ));
50
- }, [e, o, s, g, n]), N = _(() => {
51
- n(1, !1), p([]);
52
- }, [n]);
53
- return f(() => {
54
- e && (e.curr_page === 1 ? p((e == null ? void 0 : e.user_logs) ?? []) : e.curr_page && C !== e.curr_page && (p((r) => [...r, ...e.user_logs ?? []]), T(!1)));
55
- }, [e, C]), f(() => {
59
+ }, [e, i, s, u, n]);
60
+ return p(() => {
61
+ e && e.curr_page && D !== e.curr_page && (e.curr_page === 1 ? C((e == null ? void 0 : e.user_logs) ?? []) : (C((o) => [...o, ...e.user_logs ?? []]), M(!1)));
62
+ }, [e, D]), p(() => {
56
63
  s(
57
- u.TIMELINE_VIEWED,
64
+ L.TIMELINE_VIEWED,
58
65
  {
59
- student_id: o
66
+ student_id: i
60
67
  },
61
68
  { mixpanel: !0 }
62
69
  );
63
- }, [o, s]), f(() => () => {
70
+ }, [i, s]), p(() => () => {
64
71
  s(
65
- u.TIMELINE_CLOSED,
72
+ L.TIMELINE_CLOSED,
66
73
  {
67
- student_id: o
74
+ student_id: i
68
75
  },
69
76
  { mixpanel: !0 }
70
77
  );
71
- }, [o, s]), f(() => {
78
+ }, [i, s]), p(() => {
72
79
  n(1, !1);
73
- }, [n]), d ? /* @__PURE__ */ t(D, { height: h ?? "100vh", onTryAgain: N }) : z && !l.length ? /* @__PURE__ */ t(
74
- j,
80
+ }, [n]), B ? /* @__PURE__ */ r(J, { height: T || "100vh", onTryAgain: n }) : b && !l.length ? /* @__PURE__ */ r(
81
+ R,
75
82
  {
76
83
  $alignItems: "center",
77
84
  $justifyContent: "center",
78
- $height: h || "100vh",
79
- children: /* @__PURE__ */ t(F, { width: "100%", height: "100%" })
85
+ $height: T || "100vh",
86
+ children: /* @__PURE__ */ r(Q, { width: "100%", height: "100%" })
80
87
  }
81
- ) : /* @__PURE__ */ t(G, { $alignItems: "center", $gapX: 1, children: /* @__PURE__ */ P(O, { children: [
82
- l.map((r, i) => /* @__PURE__ */ t(w, { children: /* @__PURE__ */ t(
83
- q,
84
- {
85
- entry: r,
86
- index: i,
87
- shouldShowTag: v,
88
- onPuzzlesClick: M,
89
- onReviewClick: S,
90
- userType: c,
91
- studentId: o
88
+ ) : /* @__PURE__ */ r(te, { $alignItems: "center", $gapX: 1, children: /* @__PURE__ */ y(ie, { children: [
89
+ l.map((o, a) => {
90
+ const { daily_logs: t, from_date: m, to_date: I } = o;
91
+ if (t) {
92
+ const F = w(m), N = w(I), {
93
+ day: S,
94
+ month: x,
95
+ monthName: G
96
+ } = k(F), {
97
+ day: z,
98
+ month: A,
99
+ year: W,
100
+ monthName: K
101
+ } = k(N), E = ge(N), h = E && A === 12 && z === 31;
102
+ return /* @__PURE__ */ y(R, { children: [
103
+ /* @__PURE__ */ r(ne, { toYear: W, isLastDayOfYear: h }),
104
+ !h && x && h && /* @__PURE__ */ r(g, { heightX: 1 }),
105
+ /* @__PURE__ */ r(
106
+ se,
107
+ {
108
+ fromMonth: x,
109
+ isLastDayOfMth: E,
110
+ isLastDayOfYear: h
111
+ }
112
+ ),
113
+ /* @__PURE__ */ y(ae, { $gutterX: 1, $addedMonthBreak: !!(E && A), children: [
114
+ /* @__PURE__ */ r(g, { heightX: 1 }),
115
+ /* @__PURE__ */ r(ee, { $renderAs: "ac4", $color: "BLACK_T_60", children: m === I ? `${S} ${G}` : `${S} - ${z} ${K}` }),
116
+ /* @__PURE__ */ r(g, { heightX: 0.75 }),
117
+ t.length > 0 ? t.map((f, O) => /* @__PURE__ */ r(
118
+ oe,
119
+ {
120
+ type: f.type,
121
+ summary: f.summary ?? "",
122
+ courseStream: f.course_stream,
123
+ cards: f.cards,
124
+ onPuzzleClick: Y,
125
+ onReviewClick: j,
126
+ userType: _,
127
+ shouldShowTag: U && f.course_stream !== d.CIRCLE,
128
+ isLastItem: O === t.length - 1,
129
+ fromDate: m,
130
+ studentId: i
131
+ },
132
+ `timeline-${O}`
133
+ )) : /* @__PURE__ */ r(le, {}),
134
+ /* @__PURE__ */ r(g, { heightX: 1 })
135
+ ] })
136
+ ] }, `timeline-entry-${a}`);
92
137
  }
93
- ) }, `timeline-entry-${i}`)),
94
- /* @__PURE__ */ t(
95
- V,
138
+ }),
139
+ /* @__PURE__ */ r(
140
+ Z,
96
141
  {
97
- onLoadMore: A,
98
- isLoading: g,
142
+ onLoadMore: V,
143
+ isLoading: u,
99
144
  hasMore: !!(e != null && e.next_page)
100
145
  }
101
146
  )
102
147
  ] }) });
103
148
  }
104
149
  );
105
- x.displayName = "DailyTimeline";
106
- const me = x;
150
+ X.displayName = "DailyTimeline";
151
+ const we = X;
107
152
  export {
108
- me as default
153
+ we as default
109
154
  };
110
155
  //# sourceMappingURL=daily-timeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"daily-timeline.js","sources":["../../../src/features/timeline/daily-timeline.tsx"],"sourcesContent":["import { Fragment, memo, useCallback, useEffect, useMemo, useState, type FC } from 'react';\n\nimport Error from '../ui/error/error';\nimport FlexView from '../ui/layout/flex-view';\nimport AppLoader from '../ui/loader/app-loader/app-loader';\nimport IntersectionLoader from '../ui/intersection-loader/intersection-loader';\nimport { type ITimelineData, useDailyTimelineGet } from './api/use-daily-timeline-get';\nimport * as Styled from './daily-timeline-styled';\nimport { CARD_TYPE, USER_TYPE, type IDailyTimelineProps } from './daily-timeline-types';\nimport { INITIAL_PAGE, TIMELINE_EVENTS } from './comps/constants';\nimport { getTimezone } from '../../helpers/date-time';\nimport { useUIContext } from '../ui/context/context';\nimport usePrevious from '../hooks/use-previous';\nimport DailyItemsContainer from './daily-timeline-view';\n\nconst DailyTimeline: FC<IDailyTimelineProps> = memo(\n ({ userType, studentId, courseStreams, onPuzzlesClick, onReviewClick, scrollAreaHeight }) => {\n const [allTimelineData, setAllTimelineData] = useState<ITimelineData[]>([]);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const { onEvent: trackEvent } = useUIContext();\n const {\n get: getTimeline,\n data: timelineData,\n isProcessingFailed,\n isProcessing,\n } = useDailyTimelineGet(studentId);\n\n const prevCurrentPage = usePrevious(timelineData?.curr_page);\n\n const fetchTimeline = useCallback(\n (page = INITIAL_PAGE, append = false) => {\n if (append) {\n setIsLoadingMore(true);\n }\n\n getTimeline(studentId, {\n page,\n timezone: getTimezone(),\n course_stream: userType === USER_TYPE.TEACHER ? courseStreams : [],\n });\n },\n [getTimeline, studentId, userType, courseStreams],\n );\n\n const shouldShowTag = useMemo(() => {\n const allCourseStreams = new Set<string>();\n\n allTimelineData.forEach(entry => {\n if (entry.daily_logs) {\n entry.daily_logs.forEach(log => {\n if (log.course_stream && log.course_stream !== CARD_TYPE.CIRCLE) {\n allCourseStreams.add(log.course_stream);\n }\n });\n }\n });\n\n const courseStreamsSet = new Set(\n (courseStreams || []).filter(stream => String(stream) !== CARD_TYPE.CIRCLE),\n );\n\n return (\n courseStreamsSet.size > 1 ||\n allCourseStreams.size > 1 ||\n (courseStreamsSet.size > 0 &&\n allCourseStreams.size > 0 &&\n (courseStreamsSet.size !== allCourseStreams.size ||\n !Array.from(courseStreamsSet).every(stream => allCourseStreams.has(stream))))\n );\n }, [allTimelineData, courseStreams]);\n\n const handleLoadMore = useCallback(() => {\n if (timelineData?.next_page && !isLoadingMore) {\n fetchTimeline(timelineData.next_page, true);\n trackEvent(\n TIMELINE_EVENTS.TIMELINE_SCROLLED,\n {\n student_id: studentId,\n },\n { mixpanel: true },\n );\n }\n }, [timelineData, studentId, trackEvent, isLoadingMore, fetchTimeline]);\n\n const onTryAgain = useCallback(() => {\n fetchTimeline(1, false);\n setAllTimelineData([]);\n }, [fetchTimeline]);\n\n useEffect(() => {\n if (timelineData) {\n if (timelineData.curr_page === 1) {\n setAllTimelineData(timelineData?.user_logs ?? []);\n } else if (timelineData.curr_page && prevCurrentPage !== timelineData.curr_page) {\n setAllTimelineData(prev => [...prev, ...(timelineData.user_logs ?? [])]);\n setIsLoadingMore(false);\n }\n }\n }, [timelineData, prevCurrentPage]);\n\n useEffect(() => {\n trackEvent(\n TIMELINE_EVENTS.TIMELINE_VIEWED,\n {\n student_id: studentId,\n },\n { mixpanel: true },\n );\n }, [studentId, trackEvent]);\n\n useEffect(() => {\n return () => {\n trackEvent(\n TIMELINE_EVENTS.TIMELINE_CLOSED,\n {\n student_id: studentId,\n },\n { mixpanel: true },\n );\n };\n }, [studentId, trackEvent]);\n\n useEffect(() => {\n fetchTimeline(1, false);\n }, [fetchTimeline]);\n\n if (isProcessingFailed) {\n return <Error height={scrollAreaHeight ?? '100vh'} onTryAgain={onTryAgain} />;\n }\n\n if (isProcessing && !allTimelineData.length) {\n return (\n <FlexView\n $alignItems=\"center\"\n $justifyContent=\"center\"\n $height={scrollAreaHeight || '100vh'}\n >\n <AppLoader width=\"100%\" height=\"100%\" />\n </FlexView>\n );\n }\n\n return (\n <Styled.ScrollWrapper $alignItems=\"center\" $gapX={1}>\n <Styled.DailyTimelineContainer>\n {allTimelineData.map((entry, index) => (\n <Fragment key={`timeline-entry-${index}`}>\n <DailyItemsContainer\n entry={entry}\n index={index}\n shouldShowTag={shouldShowTag}\n onPuzzlesClick={onPuzzlesClick}\n onReviewClick={onReviewClick}\n userType={userType}\n studentId={studentId}\n />\n </Fragment>\n ))}\n <IntersectionLoader\n onLoadMore={handleLoadMore}\n isLoading={isLoadingMore}\n hasMore={!!timelineData?.next_page}\n />\n </Styled.DailyTimelineContainer>\n </Styled.ScrollWrapper>\n );\n },\n);\n\nDailyTimeline.displayName = 'DailyTimeline';\n\nexport default DailyTimeline;\n"],"names":["DailyTimeline","memo","userType","studentId","courseStreams","onPuzzlesClick","onReviewClick","scrollAreaHeight","allTimelineData","setAllTimelineData","useState","isLoadingMore","setIsLoadingMore","trackEvent","useUIContext","getTimeline","timelineData","isProcessingFailed","isProcessing","useDailyTimelineGet","prevCurrentPage","usePrevious","fetchTimeline","useCallback","page","INITIAL_PAGE","append","getTimezone","USER_TYPE","shouldShowTag","useMemo","allCourseStreams","entry","log","CARD_TYPE","courseStreamsSet","stream","handleLoadMore","TIMELINE_EVENTS","onTryAgain","useEffect","prev","jsx","Error","FlexView","AppLoader","Styled.ScrollWrapper","jsxs","Styled.DailyTimelineContainer","index","Fragment","DailyItemsContainer","IntersectionLoader","DailyTimeline$1"],"mappings":"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"}
1
+ {"version":3,"file":"daily-timeline.js","sources":["../../../src/features/timeline/daily-timeline.tsx"],"sourcesContent":["import { isLastDayOfMonth, parseISO } from 'date-fns';\nimport { memo, useCallback, useEffect, useMemo, useState, type FC } from 'react';\n\nimport Error from '../ui/error/error';\nimport FlexView from '../ui/layout/flex-view';\nimport AppLoader from '../ui/loader/app-loader/app-loader';\nimport IntersectionLoader from '../ui/intersection-loader/intersection-loader';\nimport Separator from '../ui/separator/separator';\nimport Text from '../ui/text/text';\nimport { type ITimelineData, useDailyTimelineGet } from './api/use-daily-timeline-get';\nimport { getDayMonthYear } from './comps/utils';\nimport DailyTimelineItems from './comps/daily-timeline-items/daily-timeline-items';\nimport * as Styled from './daily-timeline-styled';\nimport { CARD_TYPE, USER_TYPE, type IDailyTimelineProps } from './daily-timeline-types';\nimport MonthBreak from './comps/month-break/month-break';\nimport YearBreak from './comps/year-break/year-break';\nimport { INITIAL_PAGE, TIMELINE_EVENTS } from './comps/constants';\nimport { getTimezone } from '../../helpers/date-time';\nimport NoActivity from './comps/no-activity';\nimport { useUIContext } from '../ui/context/context';\nimport usePrevious from '../hooks/use-previous';\n\nconst DailyTimeline: FC<IDailyTimelineProps> = memo(\n ({ userType, studentId, courseStreams, onPuzzlesClick, onReviewClick, scrollAreaHeight }) => {\n const [allTimelineData, setAllTimelineData] = useState<ITimelineData[]>([]);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const { onEvent: trackEvent } = useUIContext();\n const {\n get: getTimeline,\n data: timelineData,\n isProcessingFailed,\n isProcessing,\n } = useDailyTimelineGet(studentId);\n\n const prevCurrentPage = usePrevious(timelineData?.curr_page);\n\n const fetchTimeline = useCallback(\n (page = INITIAL_PAGE, append = false) => {\n if (append) {\n setIsLoadingMore(true);\n }\n\n getTimeline(studentId, {\n page,\n size: 10,\n timezone: getTimezone(),\n course_stream: userType === USER_TYPE.TEACHER ? courseStreams : [],\n });\n },\n [getTimeline, studentId, userType, courseStreams],\n );\n\n const shouldShowTag = useMemo(() => {\n const allCourseStreams = new Set<string>();\n\n allTimelineData.forEach(entry => {\n if (entry.daily_logs) {\n entry.daily_logs.forEach(log => {\n if (log.course_stream && log.course_stream !== CARD_TYPE.CIRCLE) {\n allCourseStreams.add(log.course_stream);\n }\n });\n }\n });\n\n const courseStreamsSet = new Set(\n (courseStreams || []).filter(stream => String(stream) !== CARD_TYPE.CIRCLE),\n );\n\n return (\n courseStreamsSet.size > 1 ||\n allCourseStreams.size > 1 ||\n (courseStreamsSet.size > 0 &&\n allCourseStreams.size > 0 &&\n (courseStreamsSet.size !== allCourseStreams.size ||\n !Array.from(courseStreamsSet).every(stream => allCourseStreams.has(stream))))\n );\n }, [allTimelineData, courseStreams]);\n\n const handleLoadMore = useCallback(() => {\n if (timelineData?.next_page && !isLoadingMore) {\n fetchTimeline(timelineData.next_page, true);\n trackEvent(\n TIMELINE_EVENTS.TIMELINE_SCROLL_CONTINUED,\n {\n student_id: studentId,\n },\n { mixpanel: true },\n );\n }\n }, [timelineData, studentId, trackEvent, isLoadingMore, fetchTimeline]);\n\n useEffect(() => {\n if (timelineData && timelineData.curr_page && prevCurrentPage !== timelineData.curr_page) {\n if (timelineData.curr_page === 1) {\n setAllTimelineData(timelineData?.user_logs ?? []);\n } else {\n setAllTimelineData(prev => [...prev, ...(timelineData.user_logs ?? [])]);\n setIsLoadingMore(false);\n }\n }\n }, [timelineData, prevCurrentPage]);\n\n useEffect(() => {\n trackEvent(\n TIMELINE_EVENTS.TIMELINE_VIEWED,\n {\n student_id: studentId,\n },\n { mixpanel: true },\n );\n }, [studentId, trackEvent]);\n\n useEffect(() => {\n return () => {\n trackEvent(\n TIMELINE_EVENTS.TIMELINE_CLOSED,\n {\n student_id: studentId,\n },\n { mixpanel: true },\n );\n };\n }, [studentId, trackEvent]);\n\n useEffect(() => {\n fetchTimeline(1, false);\n }, [fetchTimeline]);\n\n if (isProcessingFailed) {\n return <Error height={scrollAreaHeight || '100vh'} onTryAgain={fetchTimeline} />;\n }\n\n if (isProcessing && !allTimelineData.length) {\n return (\n <FlexView\n $alignItems=\"center\"\n $justifyContent=\"center\"\n $height={scrollAreaHeight || '100vh'}\n >\n <AppLoader width=\"100%\" height=\"100%\" />\n </FlexView>\n );\n }\n\n return (\n <Styled.ScrollWrapper $alignItems=\"center\" $gapX={1}>\n <Styled.DailyTimelineContainer>\n {allTimelineData.map((entry, index) => {\n const { daily_logs: dailyLogs, from_date: fromDate, to_date: toDate } = entry;\n\n if (dailyLogs) {\n const fromDateObj = parseISO(fromDate);\n const toDateObj = parseISO(toDate);\n\n const {\n day: fromDay,\n month: fromMonth,\n monthName: fromMonthName,\n } = getDayMonthYear(fromDateObj);\n\n const {\n day: toDay,\n month: toMonth,\n year: toYear,\n monthName: toMonthName,\n } = getDayMonthYear(toDateObj);\n\n const isLastDayOfMth = isLastDayOfMonth(toDateObj);\n const isLastDayOfYear = isLastDayOfMth && toMonth === 12 && toDay === 31;\n\n return (\n <FlexView key={`timeline-entry-${index}`}>\n <YearBreak toYear={toYear} isLastDayOfYear={isLastDayOfYear} />\n {!isLastDayOfYear && fromMonth && isLastDayOfYear && <Separator heightX={1} />}\n <MonthBreak\n fromMonth={fromMonth}\n isLastDayOfMth={isLastDayOfMth}\n isLastDayOfYear={isLastDayOfYear}\n />\n <Styled.DailyItems $gutterX={1} $addedMonthBreak={!!(isLastDayOfMth && toMonth)}>\n <Separator heightX={1} />\n <Text $renderAs=\"ac4\" $color=\"BLACK_T_60\">\n {fromDate === toDate\n ? `${fromDay} ${fromMonthName}`\n : `${fromDay} - ${toDay} ${toMonthName}`}\n </Text>\n <Separator heightX={0.75} />\n {dailyLogs.length > 0 ? (\n dailyLogs.map((log, logIndex) => (\n <DailyTimelineItems\n key={`timeline-${logIndex}`}\n type={log.type}\n summary={log.summary ?? ''}\n courseStream={log.course_stream}\n cards={log.cards}\n onPuzzleClick={onPuzzlesClick}\n onReviewClick={onReviewClick}\n userType={userType}\n shouldShowTag={shouldShowTag && log.course_stream !== CARD_TYPE.CIRCLE}\n isLastItem={logIndex === dailyLogs.length - 1}\n fromDate={fromDate}\n studentId={studentId}\n />\n ))\n ) : (\n <NoActivity />\n )}\n <Separator heightX={1} />\n </Styled.DailyItems>\n </FlexView>\n );\n }\n })}\n <IntersectionLoader\n onLoadMore={handleLoadMore}\n isLoading={isLoadingMore}\n hasMore={!!timelineData?.next_page}\n />\n </Styled.DailyTimelineContainer>\n </Styled.ScrollWrapper>\n );\n },\n);\n\nDailyTimeline.displayName = 'DailyTimeline';\n\nexport default DailyTimeline;\n"],"names":["DailyTimeline","memo","userType","studentId","courseStreams","onPuzzlesClick","onReviewClick","scrollAreaHeight","allTimelineData","setAllTimelineData","useState","isLoadingMore","setIsLoadingMore","trackEvent","useUIContext","getTimeline","timelineData","isProcessingFailed","isProcessing","useDailyTimelineGet","prevCurrentPage","usePrevious","fetchTimeline","useCallback","page","INITIAL_PAGE","append","getTimezone","USER_TYPE","shouldShowTag","useMemo","allCourseStreams","entry","log","CARD_TYPE","courseStreamsSet","stream","handleLoadMore","TIMELINE_EVENTS","useEffect","prev","Error","jsx","FlexView","AppLoader","Styled.ScrollWrapper","jsxs","Styled.DailyTimelineContainer","index","dailyLogs","fromDate","toDate","fromDateObj","parseISO","toDateObj","fromDay","fromMonth","fromMonthName","getDayMonthYear","toDay","toMonth","toYear","toMonthName","isLastDayOfMth","isLastDayOfMonth","isLastDayOfYear","YearBreak","Separator","MonthBreak","Styled.DailyItems","Text","logIndex","DailyTimelineItems","NoActivity","IntersectionLoader","DailyTimeline$1"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4132,7 +4132,7 @@ declare interface ITile {
4132
4132
  rot?: number;
4133
4133
  color?: string;
4134
4134
  isFlipped?: boolean;
4135
- status?: 'locked' | 'fixed' | 'hidden';
4135
+ status?: 'locked' | 'fixed' | 'hidden' | null;
4136
4136
  altText?: string;
4137
4137
  hideHandles?: boolean;
4138
4138
  layer?: 'front' | 'normal' | 'back';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cuemath/leap",
3
- "version": "3.5.11-as2",
3
+ "version": "3.5.11-lock01",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -1,78 +0,0 @@
1
- import { jsxs as s, Fragment as X, jsx as t } from "react/jsx-runtime";
2
- import { getDayMonthYear as D } from "./comps/utils.js";
3
- import Y from "../ui/layout/flex-view.js";
4
- import j from "./comps/year-break/year-break.js";
5
- import a from "../ui/separator/separator.js";
6
- import k from "./comps/month-break/month-break.js";
7
- import { DailyItems as A } from "./daily-timeline-styled.js";
8
- import B from "../ui/text/text.js";
9
- import S from "./comps/daily-timeline-items/daily-timeline-items.js";
10
- import x from "./comps/no-activity.js";
11
- import { CARD_TYPE as b } from "./daily-timeline-types.js";
12
- import { parseISO as u } from "../../node_modules/date-fns/parseISO.js";
13
- import { isLastDayOfMonth as w } from "../../node_modules/date-fns/isLastDayOfMonth.js";
14
- const z = ({
15
- entry: $,
16
- index: n,
17
- onPuzzlesClick: M,
18
- onReviewClick: _,
19
- shouldShowTag: g,
20
- studentId: C,
21
- userType: L
22
- }) => {
23
- const { daily_logs: r, from_date: m, to_date: h } = $, I = u(m), f = u(h), { day: c, month: y, monthName: N } = D(I), {
24
- day: p,
25
- month: l,
26
- year: O,
27
- monthName: T
28
- } = D(f), i = w(f), e = i && l === 12 && p === 31;
29
- return r ? /* @__PURE__ */ s(Y, { children: [
30
- n !== 0 && /* @__PURE__ */ s(X, { children: [
31
- /* @__PURE__ */ t(j, { toYear: O, isLastDayOfYear: e }),
32
- !e && y && e && /* @__PURE__ */ t(a, { heightX: 1 }),
33
- /* @__PURE__ */ t(
34
- k,
35
- {
36
- fromMonth: y,
37
- isLastDayOfMth: i,
38
- isLastDayOfYear: e
39
- }
40
- )
41
- ] }),
42
- /* @__PURE__ */ s(
43
- A,
44
- {
45
- $gutterX: 1,
46
- $addedMonthBreak: !!(i && l && n !== 0),
47
- children: [
48
- /* @__PURE__ */ t(a, { heightX: 1 }),
49
- /* @__PURE__ */ t(B, { $renderAs: "ac4", $color: "BLACK_T_60", children: m === h ? `${c} ${N}` : `${c} - ${p} ${T}` }),
50
- /* @__PURE__ */ t(a, { heightX: 0.75 }),
51
- r.length > 0 ? r.map((o, d) => /* @__PURE__ */ t(
52
- S,
53
- {
54
- type: o.type,
55
- summary: o.summary ?? "",
56
- courseStream: o.course_stream,
57
- cards: o.cards,
58
- onPuzzleClick: M,
59
- onReviewClick: _,
60
- userType: L,
61
- shouldShowTag: g && o.course_stream !== b.CIRCLE,
62
- isLastItem: d === r.length - 1,
63
- fromDate: m,
64
- studentId: C
65
- },
66
- `timeline-${d}`
67
- )) : /* @__PURE__ */ t(x, {}),
68
- /* @__PURE__ */ t(a, { heightX: 1 })
69
- ]
70
- }
71
- )
72
- ] }) : null;
73
- };
74
- z.displayName = "DailyItemsContainer";
75
- export {
76
- z as default
77
- };
78
- //# sourceMappingURL=daily-timeline-view.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daily-timeline-view.js","sources":["../../../src/features/timeline/daily-timeline-view.tsx"],"sourcesContent":["import { isLastDayOfMonth, parseISO } from 'date-fns';\nimport { type FC } from 'react';\n\nimport { getDayMonthYear } from './comps/utils';\nimport FlexView from '../ui/layout/flex-view';\nimport YearBreak from './comps/year-break/year-break';\nimport Separator from '../ui/separator/separator';\nimport MonthBreak from './comps/month-break/month-break';\nimport * as Styled from './daily-timeline-styled';\nimport Text from '../ui/text/text';\nimport DailyTimelineItems from './comps/daily-timeline-items/daily-timeline-items';\nimport NoActivity from './comps/no-activity';\nimport { CARD_TYPE, type IDailyTimelineItemsProps } from './daily-timeline-types';\n\nconst DailyItemsContainer: FC<IDailyTimelineItemsProps> = ({\n entry,\n index,\n onPuzzlesClick,\n onReviewClick,\n shouldShowTag,\n studentId,\n userType,\n}) => {\n const { daily_logs: dailyLogs, from_date: fromDate, to_date: toDate } = entry;\n const fromDateObj = parseISO(fromDate);\n const toDateObj = parseISO(toDate);\n\n const { day: fromDay, month: fromMonth, monthName: fromMonthName } = getDayMonthYear(fromDateObj);\n\n const {\n day: toDay,\n month: toMonth,\n year: toYear,\n monthName: toMonthName,\n } = getDayMonthYear(toDateObj);\n\n const isLastDayOfMth = isLastDayOfMonth(toDateObj);\n const isLastDayOfYear = isLastDayOfMth && toMonth === 12 && toDay === 31;\n\n if (!dailyLogs) {\n return null;\n }\n\n return (\n <FlexView>\n {index !== 0 && (\n <>\n <YearBreak toYear={toYear} isLastDayOfYear={isLastDayOfYear} />\n {!isLastDayOfYear && fromMonth && isLastDayOfYear && <Separator heightX={1} />}\n <MonthBreak\n fromMonth={fromMonth}\n isLastDayOfMth={isLastDayOfMth}\n isLastDayOfYear={isLastDayOfYear}\n />\n </>\n )}\n <Styled.DailyItems\n $gutterX={1}\n $addedMonthBreak={!!(isLastDayOfMth && toMonth && index !== 0)}\n >\n <Separator heightX={1} />\n <Text $renderAs=\"ac4\" $color=\"BLACK_T_60\">\n {fromDate === toDate\n ? `${fromDay} ${fromMonthName}`\n : `${fromDay} - ${toDay} ${toMonthName}`}\n </Text>\n <Separator heightX={0.75} />\n {dailyLogs.length > 0 ? (\n dailyLogs.map((log, logIndex) => (\n <DailyTimelineItems\n key={`timeline-${logIndex}`}\n type={log.type}\n summary={log.summary ?? ''}\n courseStream={log.course_stream}\n cards={log.cards}\n onPuzzleClick={onPuzzlesClick}\n onReviewClick={onReviewClick}\n userType={userType}\n shouldShowTag={shouldShowTag && log.course_stream !== CARD_TYPE.CIRCLE}\n isLastItem={logIndex === dailyLogs.length - 1}\n fromDate={fromDate}\n studentId={studentId}\n />\n ))\n ) : (\n <NoActivity />\n )}\n <Separator heightX={1} />\n </Styled.DailyItems>\n </FlexView>\n );\n};\n\nDailyItemsContainer.displayName = 'DailyItemsContainer';\n\nexport default DailyItemsContainer;\n"],"names":["DailyItemsContainer","entry","index","onPuzzlesClick","onReviewClick","shouldShowTag","studentId","userType","dailyLogs","fromDate","toDate","fromDateObj","parseISO","toDateObj","fromDay","fromMonth","fromMonthName","getDayMonthYear","toDay","toMonth","toYear","toMonthName","isLastDayOfMth","isLastDayOfMonth","isLastDayOfYear","FlexView","jsxs","Fragment","jsx","YearBreak","Separator","MonthBreak","Styled.DailyItems","Text","log","logIndex","DailyTimelineItems","CARD_TYPE","NoActivity"],"mappings":";;;;;;;;;;;;;AAcA,MAAMA,IAAoD,CAAC;AAAA,EACzD,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AACF,MAAM;AACJ,QAAM,EAAE,YAAYC,GAAW,WAAWC,GAAU,SAASC,EAAW,IAAAT,GAClEU,IAAcC,EAASH,CAAQ,GAC/BI,IAAYD,EAASF,CAAM,GAE3B,EAAE,KAAKI,GAAS,OAAOC,GAAW,WAAWC,EAAkB,IAAAC,EAAgBN,CAAW,GAE1F;AAAA,IACJ,KAAKO;AAAA,IACL,OAAOC;AAAA,IACP,MAAMC;AAAA,IACN,WAAWC;AAAA,EAAA,IACTJ,EAAgBJ,CAAS,GAEvBS,IAAiBC,EAAiBV,CAAS,GAC3CW,IAAkBF,KAAkBH,MAAY,MAAMD,MAAU;AAEtE,SAAKV,sBAKFiB,GACE,EAAA,UAAA;AAAA,IAAAvB,MAAU,KAEP,gBAAAwB,EAAAC,GAAA,EAAA,UAAA;AAAA,MAAC,gBAAAC,EAAAC,GAAA,EAAU,QAAAT,GAAgB,iBAAAI,EAAkC,CAAA;AAAA,MAC5D,CAACA,KAAmBT,KAAaS,KAAoB,gBAAAI,EAAAE,GAAA,EAAU,SAAS,GAAG;AAAA,MAC5E,gBAAAF;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,WAAAhB;AAAA,UACA,gBAAAO;AAAA,UACA,iBAAAE;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,GACF;AAAA,IAEF,gBAAAE;AAAA,MAACM;AAAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACV,kBAAkB,CAAC,EAAEV,KAAkBH,KAAWjB,MAAU;AAAA,QAE5D,UAAA;AAAA,UAAC,gBAAA0B,EAAAE,GAAA,EAAU,SAAS,EAAG,CAAA;AAAA,4BACtBG,GAAK,EAAA,WAAU,OAAM,QAAO,cAC1B,gBAAavB,IACV,GAAGI,CAAO,IAAIE,CAAa,KAC3B,GAAGF,CAAO,MAAMI,CAAK,IAAIG,CAAW,IAC1C;AAAA,UACA,gBAAAO,EAACE,GAAU,EAAA,SAAS,KAAM,CAAA;AAAA,UACzBtB,EAAU,SAAS,IAClBA,EAAU,IAAI,CAAC0B,GAAKC,MAClB,gBAAAP;AAAA,YAACQ;AAAA,YAAA;AAAA,cAEC,MAAMF,EAAI;AAAA,cACV,SAASA,EAAI,WAAW;AAAA,cACxB,cAAcA,EAAI;AAAA,cAClB,OAAOA,EAAI;AAAA,cACX,eAAe/B;AAAA,cACf,eAAAC;AAAA,cACA,UAAAG;AAAA,cACA,eAAeF,KAAiB6B,EAAI,kBAAkBG,EAAU;AAAA,cAChE,YAAYF,MAAa3B,EAAU,SAAS;AAAA,cAC5C,UAAAC;AAAA,cACA,WAAAH;AAAA,YAAA;AAAA,YAXK,YAAY6B,CAAQ;AAAA,UAAA,CAa5B,IAED,gBAAAP,EAACU,GAAW,EAAA;AAAA,UAEd,gBAAAV,EAACE,GAAU,EAAA,SAAS,EAAG,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACzB;AAAA,EACF,EAAA,CAAA,IAjDO;AAmDX;AAEA9B,EAAoB,cAAc;"}