@cuemath/leap 3.1.35-beta-0.2 → 3.1.35-beta-0.4

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.
@@ -1,13 +1,13 @@
1
- import { createGetAPI as o, createPostAPI as u } from "@cuemath/rest-api";
2
- import { BASE_URL_V3 as r } from "../../../constants/api.js";
3
- const { useGet: z, invalidate: l } = o({
4
- getURL: (s, t, { courseStream: e }) => `${r}/users/${s}/course-streams/${e}/puzzle/`
5
- });
6
- u({
7
- getURL: (s, { studentId: t, courseStream: e }) => `${r}/users/${t}/course-streams/${e}/puzzle/`
1
+ import { createGetAPI as r, createPostAPI as u } from "@cuemath/rest-api";
2
+ import { BASE_URL_V3 as o } from "../../../constants/api.js";
3
+ const { useGet: a, invalidate: P } = r({
4
+ getURL: (s, t, { courseStream: e }) => `${o}/users/${s}/course-streams/${e}/puzzle/`
5
+ }), { usePost: l } = u({
6
+ getURL: (s, { studentId: t, courseStream: e }) => `${o}/users/${t}/course-streams/${e}/puzzle/`
8
7
  });
9
8
  export {
10
- l as invalidatePuzzleToAssign,
11
- z as useGetPuzzleToAssign
9
+ P as invalidatePuzzleToAssign,
10
+ a as useGetPuzzleToAssign,
11
+ l as usePostPuzzleToAssign
12
12
  };
13
13
  //# sourceMappingURL=puzzle-assign.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"puzzle-assign.js","sources":["../../../../src/features/puzzles/api/puzzle-assign.ts"],"sourcesContent":["import type { TCourseStream } from '../../milestone/create/milestone-create-types';\nimport type { IPuzzleCardAssignData } from '../puzzle-container-types';\n\nimport { createGetAPI, createPostAPI } from '@cuemath/rest-api';\n\nimport { BASE_URL_V3 } from '../../../constants/api';\n\nconst { useGet: useGetPuzzleToAssign, invalidate: invalidatePuzzleToAssign } = createGetAPI<\n IPuzzleCardAssignData,\n void,\n { courseStream: TCourseStream }\n>({\n getURL: (studentId, _, { courseStream }) =>\n `${BASE_URL_V3}/users/${studentId}/course-streams/${courseStream}/puzzle/`,\n});\n\nconst { usePost: usePostPuzzleToAssign } = createPostAPI<\n Record<string, unknown>,\n {\n puzzle_id: string;\n action: string;\n },\n {\n studentId: string;\n courseStream: TCourseStream;\n }\n>({\n getURL: (_, { studentId, courseStream }) =>\n `${BASE_URL_V3}/users/${studentId}/course-streams/${courseStream}/puzzle/`,\n});\n\nexport { useGetPuzzleToAssign, usePostPuzzleToAssign, invalidatePuzzleToAssign };\n"],"names":["useGetPuzzleToAssign","invalidatePuzzleToAssign","createGetAPI","studentId","_","courseStream","BASE_URL_V3","createPostAPI"],"mappings":";;AAOA,MAAM,EAAE,QAAQA,GAAsB,YAAYC,EAAA,IAA6BC,EAI7E;AAAA,EACA,QAAQ,CAACC,GAAWC,GAAG,EAAE,cAAAC,EAAA,MACvB,GAAGC,CAAW,UAAUH,CAAS,mBAAmBE,CAAY;AACpE,CAAC;AAE0CE,EAUzC;AAAA,EACA,QAAQ,CAACH,GAAG,EAAE,WAAAD,GAAW,cAAAE,EAAA,MACvB,GAAGC,CAAW,UAAUH,CAAS,mBAAmBE,CAAY;AACpE,CAAC;"}
1
+ {"version":3,"file":"puzzle-assign.js","sources":["../../../../src/features/puzzles/api/puzzle-assign.ts"],"sourcesContent":["import type { TCourseStream } from '../../milestone/create/milestone-create-types';\nimport type { IPuzzleCardAssignData } from '../puzzle-container-types';\n\nimport { createGetAPI, createPostAPI } from '@cuemath/rest-api';\n\nimport { BASE_URL_V3 } from '../../../constants/api';\n\nconst { useGet: useGetPuzzleToAssign, invalidate: invalidatePuzzleToAssign } = createGetAPI<\n IPuzzleCardAssignData[],\n void,\n { courseStream: TCourseStream }\n>({\n getURL: (studentId, _, { courseStream }) =>\n `${BASE_URL_V3}/users/${studentId}/course-streams/${courseStream}/puzzle/`,\n});\n\nconst { usePost: usePostPuzzleToAssign } = createPostAPI<\n Record<string, unknown>,\n {\n puzzle_id: string;\n },\n {\n studentId: string;\n courseStream: TCourseStream;\n }\n>({\n getURL: (_, { studentId, courseStream }) =>\n `${BASE_URL_V3}/users/${studentId}/course-streams/${courseStream}/puzzle/`,\n});\n\nexport { useGetPuzzleToAssign, usePostPuzzleToAssign, invalidatePuzzleToAssign };\n"],"names":["useGetPuzzleToAssign","invalidatePuzzleToAssign","createGetAPI","studentId","_","courseStream","BASE_URL_V3","usePostPuzzleToAssign","createPostAPI"],"mappings":";;AAOA,MAAM,EAAE,QAAQA,GAAsB,YAAYC,EAAA,IAA6BC,EAI7E;AAAA,EACA,QAAQ,CAACC,GAAWC,GAAG,EAAE,cAAAC,EAAA,MACvB,GAAGC,CAAW,UAAUH,CAAS,mBAAmBE,CAAY;AACpE,CAAC,GAEK,EAAE,SAASE,EAAsB,IAAIC,EASzC;AAAA,EACA,QAAQ,CAACJ,GAAG,EAAE,WAAAD,GAAW,cAAAE,EAAA,MACvB,GAAGC,CAAW,UAAUH,CAAS,mBAAmBE,CAAY;AACpE,CAAC;"}
@@ -1,26 +1,40 @@
1
- import { jsx as i, jsxs as c, Fragment as P } from "react/jsx-runtime";
2
- import { memo as T, useState as u, useRef as v, useEffect as h, useCallback as m } from "react";
3
- import E from "../../assets/line-icons/icons/check2.js";
4
- import _ from "../ui/image/image.js";
5
- import s from "../ui/text/text.js";
6
- import x from "./comps/puzzle-card.js";
7
- import { PuzzleContainer as w, PuzzleContent as X, AssignedTag as j, PuzzleButton as L, PuzzleText as O, CheckMarkIcon as B } from "./puzzle-container-styled.js";
8
- const D = 1500, S = T(
9
- ({ userType: $, triggerReveal: a = !1, onFullyHidden: r, onPuzzleClick: l, puzzleData: f }) => {
1
+ import { jsx as i, jsxs as c, Fragment as w } from "react/jsx-runtime";
2
+ import { memo as X, useState as g, useRef as j, useEffect as m, useCallback as h } from "react";
3
+ import L from "../../assets/line-icons/icons/check2.js";
4
+ import O from "../ui/image/image.js";
5
+ import r from "../ui/text/text.js";
6
+ import { usePostPuzzleToAssign as B } from "./api/puzzle-assign.js";
7
+ import D from "./comps/puzzle-card.js";
8
+ import { PuzzleContainer as S, PuzzleContent as W, AssignedTag as G, PuzzleButton as K, PuzzleText as U, CheckMarkIcon as H } from "./puzzle-container-styled.js";
9
+ const N = 1500, M = X(
10
+ ({
11
+ userType: f,
12
+ triggerReveal: o = !1,
13
+ onFullyHidden: s,
14
+ onPuzzleClick: l,
15
+ puzzleData: $,
16
+ courseStream: z,
17
+ studentId: C
18
+ }) => {
10
19
  const {
11
20
  image_hue: d,
12
- image_url: C,
21
+ image_url: A,
13
22
  assigned: n,
14
- title: A
15
- } = f, [e, t] = u("hidden"), [g, z] = u(!1), o = v(null);
16
- h(() => {
17
- n || (a ? g ? t("assigned") : e === "hidden" && t("movingIn") : e !== "hidden" && e !== "movingOut" && t("movingOut"));
18
- }, [a, g, n]), h(() => (e === "assigned" && !n && (o.current = setTimeout(() => {
23
+ title: p,
24
+ id: b
25
+ } = $, [e, t] = g("hidden"), [u, I] = g(!1), a = j(null), { post: P, isProcessing: k } = B({
26
+ onComplete: (x) => {
27
+ x ? t("visible") : e === "visible" && t("assigning");
28
+ }
29
+ });
30
+ m(() => {
31
+ n || (o ? u ? t("assigned") : e === "hidden" && t("movingIn") : e !== "hidden" && e !== "movingOut" && t("movingOut"));
32
+ }, [o, u, n]), m(() => (e === "assigned" && !n && (a.current = setTimeout(() => {
19
33
  t("movingOut");
20
- }, D)), () => {
21
- o.current && clearTimeout(o.current);
34
+ }, N)), () => {
35
+ a.current && clearTimeout(a.current);
22
36
  }), [e, n]);
23
- const b = m(() => {
37
+ const T = h(() => {
24
38
  switch (e) {
25
39
  case "movingIn":
26
40
  t("revealing");
@@ -29,36 +43,44 @@ const D = 1500, S = T(
29
43
  t("visible");
30
44
  break;
31
45
  case "assigning":
32
- t("assigned"), z(!0);
46
+ t("assigned"), I(!0);
33
47
  break;
34
48
  case "movingOut":
35
- t("hidden"), r == null || r();
49
+ t("hidden"), s == null || s();
36
50
  break;
37
51
  }
38
- }, [e, r]), I = () => {
39
- n || e === "visible" && t("assigning");
40
- }, k = m(() => {
52
+ }, [e, s]), v = () => {
53
+ n || P(
54
+ {
55
+ puzzle_id: b
56
+ },
57
+ {
58
+ studentId: C,
59
+ courseStream: z
60
+ }
61
+ );
62
+ }, _ = h(() => {
41
63
  l();
42
- }, [l]), p = () => e === "visible" || n ? /* @__PURE__ */ c(P, { children: [
64
+ }, [l]), E = () => e === "visible" || n ? /* @__PURE__ */ c(w, { children: [
43
65
  /* @__PURE__ */ c(
44
- X,
66
+ W,
45
67
  {
46
68
  $justifyContent: "center",
47
69
  $alignItems: "center",
48
70
  $width: "100%",
49
71
  $height: "100%",
50
- onClick: k,
72
+ onClick: _,
51
73
  title: "Click to preview",
52
74
  $flexGapX: 1.5,
53
75
  children: [
54
- /* @__PURE__ */ i(_, { width: 136, height: 136, src: C, withLoader: !1, alt: "Puzzle" }),
55
- /* @__PURE__ */ i(s, { $renderAs: "h4", children: A }),
56
- /* @__PURE__ */ i(j, { $gap: 4, $gutter: 8, $background: "BLACK_1", children: /* @__PURE__ */ i(s, { $renderAs: "ac4", $color: "WHITE_1", children: "Assigned" }) })
76
+ /* @__PURE__ */ i(O, { width: 136, height: 136, src: A, withLoader: !1, alt: "Puzzle" }),
77
+ /* @__PURE__ */ i(r, { $renderAs: "h4", children: p }),
78
+ /* @__PURE__ */ i(G, { $gap: 4, $gutter: 8, $background: "BLACK_1", children: /* @__PURE__ */ i(r, { $renderAs: "ac4", $color: "WHITE_1", children: "Assigned" }) })
57
79
  ]
58
80
  }
59
81
  ),
60
- $ === "TEACHER" && /* @__PURE__ */ i(
61
- L,
82
+ f === "TEACHER" && /* @__PURE__ */ i(
83
+ K,
62
84
  {
63
85
  $background: "BLACK_1",
64
86
  $widthX: 15.75,
@@ -66,40 +88,40 @@ const D = 1500, S = T(
66
88
  $justifyContent: "center",
67
89
  $gapX: 0.75,
68
90
  $gutterX: 1,
69
- onClick: I,
70
- $disabled: n,
71
- children: /* @__PURE__ */ i(s, { $renderAs: "ub1-bold", $color: n ? "BLACK_T_38" : "WHITE_1", children: n ? "Discuss in next class" : "Assign" })
91
+ onClick: v,
92
+ $disabled: n || k,
93
+ children: /* @__PURE__ */ i(r, { $renderAs: "ub1-bold", $color: n ? "BLACK_T_38" : "WHITE_1", children: n ? "Discuss in next class" : "Assign" })
72
94
  }
73
95
  )
74
- ] }) : e === "assigned" ? /* @__PURE__ */ c(O, { $alignItems: "center", $justifyContent: "center", $flexGap: 8, children: [
96
+ ] }) : e === "assigned" ? /* @__PURE__ */ c(U, { $alignItems: "center", $justifyContent: "center", $flexGap: 8, children: [
75
97
  /* @__PURE__ */ i(
76
- B,
98
+ H,
77
99
  {
78
100
  $widthX: 2.5,
79
101
  $heightX: 2.5,
80
102
  $background: "WHITE",
81
103
  $alignItems: "center",
82
104
  $justifyContent: "center",
83
- children: /* @__PURE__ */ i(E, {})
105
+ children: /* @__PURE__ */ i(L, {})
84
106
  }
85
107
  ),
86
- /* @__PURE__ */ i(s, { $renderAs: "ab1-bold", $align: "center", $color: "WHITE", children: "Puzzle assigned" })
108
+ /* @__PURE__ */ i(r, { $renderAs: "ab1-bold", $align: "center", $color: "WHITE", children: "Puzzle assigned" })
87
109
  ] }) : null;
88
- return e === "hidden" && !a ? null : /* @__PURE__ */ i(w, { children: /* @__PURE__ */ i(
89
- x,
110
+ return e === "hidden" && !o ? null : /* @__PURE__ */ i(S, { children: /* @__PURE__ */ i(
111
+ D,
90
112
  {
91
113
  animationPhase: n ? void 0 : e,
92
- onAnimationEnd: b,
114
+ onAnimationEnd: T,
93
115
  imageHue: d ?? "BLUE",
94
116
  heightX: 19,
95
117
  widthX: 15.75,
96
118
  backgroundColor: n ? `${d}_2` : void 0,
97
- children: p()
119
+ children: E()
98
120
  }
99
121
  ) });
100
122
  }
101
- ), R = S;
123
+ ), F = M;
102
124
  export {
103
- R as default
125
+ F as default
104
126
  };
105
127
  //# sourceMappingURL=puzzle-container.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"puzzle-container.js","sources":["../../../src/features/puzzles/puzzle-container.tsx"],"sourcesContent":["import type { TPuzzleCardAnimationPhases } from './comps/puzzle-card-types';\nimport type { IPuzzleCardContainerProps } from './puzzle-container-types';\nimport type { FC } from 'react';\n\nimport { useState, useCallback, useEffect, useRef, memo } from 'react';\n\nimport Check2Icon from '../../assets/line-icons/icons/check2';\nimport Image from '../ui/image/image';\nimport Text from '../ui/text/text';\nimport PuzzleCard from './comps/puzzle-card';\nimport * as Styled from './puzzle-container-styled';\n\nconst ASSIGNED_DISPLAY_DURATION = 1500; // ms\n\nconst PuzzleCardContainer: FC<IPuzzleCardContainerProps> = memo(\n ({ userType, triggerReveal = false, onFullyHidden, onPuzzleClick, puzzleData }) => {\n const {\n image_hue: imageHue,\n image_url: imageUrl,\n assigned: externalAssigned,\n title,\n } = puzzleData;\n\n const [animationPhase, setAnimationPhase] = useState<TPuzzleCardAnimationPhases>('hidden');\n const [isAssigned, setIsAssigned] = useState(false);\n\n const assignedTimer = useRef<NodeJS.Timeout | null>(null);\n\n // Main trigger to start or hide the card\n useEffect(() => {\n if (!externalAssigned) {\n if (triggerReveal) {\n if (isAssigned) {\n setAnimationPhase('assigned'); // Already assigned, show statically\n } else if (animationPhase === 'hidden') {\n setAnimationPhase('movingIn'); // Start the animation sequence\n }\n } else {\n // If trigger is removed, start hiding (unless already hidden/hiding)\n if (animationPhase !== 'hidden' && animationPhase !== 'movingOut') {\n setAnimationPhase('movingOut');\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [triggerReveal, isAssigned, externalAssigned]);\n\n // Timer to auto-hide after the 'assigned' phase\n useEffect(() => {\n if (animationPhase === 'assigned' && !externalAssigned) {\n assignedTimer.current = setTimeout(() => {\n setAnimationPhase('movingOut');\n }, ASSIGNED_DISPLAY_DURATION);\n }\n\n return () => {\n if (assignedTimer.current) clearTimeout(assignedTimer.current);\n };\n }, [animationPhase, externalAssigned]);\n\n // State machine for animations\n const handleAnimationEnd = useCallback(() => {\n switch (animationPhase) {\n case 'movingIn':\n setAnimationPhase('revealing');\n break;\n case 'revealing':\n setAnimationPhase('visible');\n break;\n case 'assigning':\n setAnimationPhase('assigned');\n setIsAssigned(true);\n break;\n case 'movingOut':\n setAnimationPhase('hidden');\n onFullyHidden?.();\n break;\n default:\n break;\n }\n }, [animationPhase, onFullyHidden]);\n\n // Handler for the \"Assign\" button\n const handleAssign = () => {\n if (externalAssigned) return; // Do nothing if already assigned\n\n if (animationPhase === 'visible') {\n setAnimationPhase('assigning');\n }\n };\n\n const handleOnPuzzleClick = useCallback(() => {\n onPuzzleClick();\n }, [onPuzzleClick]);\n\n // Render content only during specific phases\n const renderContent = () => {\n if (animationPhase === 'visible' || externalAssigned) {\n return (\n <>\n <Styled.PuzzleContent\n $justifyContent=\"center\"\n $alignItems=\"center\"\n $width=\"100%\"\n $height=\"100%\"\n onClick={handleOnPuzzleClick}\n title=\"Click to preview\"\n $flexGapX={1.5}\n >\n <Image width={136} height={136} src={imageUrl} withLoader={false} alt=\"Puzzle\" />\n <Text $renderAs=\"h4\">{title}</Text>\n\n <Styled.AssignedTag $gap={4} $gutter={8} $background=\"BLACK_1\">\n <Text $renderAs=\"ac4\" $color=\"WHITE_1\">\n Assigned\n </Text>\n </Styled.AssignedTag>\n </Styled.PuzzleContent>\n\n {userType === 'TEACHER' && (\n <Styled.PuzzleButton\n $background=\"BLACK_1\"\n $widthX={15.75}\n $alignItems=\"center\"\n $justifyContent=\"center\"\n $gapX={0.75}\n $gutterX={1}\n onClick={handleAssign}\n $disabled={externalAssigned}\n >\n <Text $renderAs=\"ub1-bold\" $color={externalAssigned ? 'BLACK_T_38' : 'WHITE_1'}>\n {externalAssigned ? 'Discuss in next class' : 'Assign'}\n </Text>\n </Styled.PuzzleButton>\n )}\n </>\n );\n }\n\n if (animationPhase === 'assigned') {\n return (\n <Styled.PuzzleText $alignItems=\"center\" $justifyContent=\"center\" $flexGap={8}>\n <Styled.CheckMarkIcon\n $widthX={2.5}\n $heightX={2.5}\n $background=\"WHITE\"\n $alignItems=\"center\"\n $justifyContent=\"center\"\n >\n <Check2Icon />\n </Styled.CheckMarkIcon>\n\n <Text $renderAs=\"ab1-bold\" $align=\"center\" $color=\"WHITE\">\n Puzzle assigned\n </Text>\n </Styled.PuzzleText>\n );\n }\n\n // No content during animations\n return null;\n };\n\n if (animationPhase === 'hidden' && !triggerReveal) {\n return null;\n }\n\n return (\n <Styled.PuzzleContainer>\n <PuzzleCard\n animationPhase={!externalAssigned ? animationPhase : undefined}\n onAnimationEnd={handleAnimationEnd}\n imageHue={imageHue ?? 'BLUE'}\n heightX={19}\n widthX={15.75}\n backgroundColor={externalAssigned ? `${imageHue}_2` : undefined}\n >\n {renderContent()}\n </PuzzleCard>\n </Styled.PuzzleContainer>\n );\n },\n);\n\nexport default PuzzleCardContainer;\n"],"names":["ASSIGNED_DISPLAY_DURATION","PuzzleCardContainer","memo","userType","triggerReveal","onFullyHidden","onPuzzleClick","puzzleData","imageHue","imageUrl","externalAssigned","title","animationPhase","setAnimationPhase","useState","isAssigned","setIsAssigned","assignedTimer","useRef","useEffect","handleAnimationEnd","useCallback","handleAssign","handleOnPuzzleClick","renderContent","jsxs","Fragment","Styled.PuzzleContent","jsx","Image","Text","Styled.AssignedTag","Styled.PuzzleButton","Styled.PuzzleText","Styled.CheckMarkIcon","Check2Icon","Styled.PuzzleContainer","PuzzleCard","PuzzleCardContainer$1"],"mappings":"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"}
1
+ {"version":3,"file":"puzzle-container.js","sources":["../../../src/features/puzzles/puzzle-container.tsx"],"sourcesContent":["import type { TPuzzleCardAnimationPhases } from './comps/puzzle-card-types';\nimport type { IPuzzleCardContainerProps } from './puzzle-container-types';\nimport type { FC } from 'react';\n\nimport { useState, useCallback, useEffect, useRef, memo } from 'react';\n\nimport Check2Icon from '../../assets/line-icons/icons/check2';\nimport Image from '../ui/image/image';\nimport Text from '../ui/text/text';\nimport { usePostPuzzleToAssign } from './api/puzzle-assign';\nimport PuzzleCard from './comps/puzzle-card';\nimport * as Styled from './puzzle-container-styled';\n\nconst ASSIGNED_DISPLAY_DURATION = 1500; // ms\n\nconst PuzzleCardContainer: FC<IPuzzleCardContainerProps> = memo(\n ({\n userType,\n triggerReveal = false,\n onFullyHidden,\n onPuzzleClick,\n puzzleData,\n courseStream,\n studentId,\n }) => {\n const {\n image_hue: imageHue,\n image_url: imageUrl,\n assigned: externalAssigned,\n title,\n id: puzzleId,\n } = puzzleData;\n\n const [animationPhase, setAnimationPhase] = useState<TPuzzleCardAnimationPhases>('hidden');\n const [isAssigned, setIsAssigned] = useState(false);\n\n const assignedTimer = useRef<NodeJS.Timeout | null>(null);\n\n const { post: postPuzzleToAssign, isProcessing } = usePostPuzzleToAssign({\n onComplete: (error: string | null) => {\n if (error) {\n // Handle error (e.g., show a notification)\n setAnimationPhase('visible'); // Reset to visible if assignment fails\n } else {\n if (animationPhase === 'visible') {\n setAnimationPhase('assigning');\n }\n }\n },\n });\n\n // Main trigger to start or hide the card\n useEffect(() => {\n if (!externalAssigned) {\n if (triggerReveal) {\n if (isAssigned) {\n setAnimationPhase('assigned'); // Already assigned, show statically\n } else if (animationPhase === 'hidden') {\n setAnimationPhase('movingIn'); // Start the animation sequence\n }\n } else {\n // If trigger is removed, start hiding (unless already hidden/hiding)\n if (animationPhase !== 'hidden' && animationPhase !== 'movingOut') {\n setAnimationPhase('movingOut');\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [triggerReveal, isAssigned, externalAssigned]);\n\n // Timer to auto-hide after the 'assigned' phase\n useEffect(() => {\n if (animationPhase === 'assigned' && !externalAssigned) {\n assignedTimer.current = setTimeout(() => {\n setAnimationPhase('movingOut');\n }, ASSIGNED_DISPLAY_DURATION);\n }\n\n return () => {\n if (assignedTimer.current) clearTimeout(assignedTimer.current);\n };\n }, [animationPhase, externalAssigned]);\n\n // State machine for animations\n const handleAnimationEnd = useCallback(() => {\n switch (animationPhase) {\n case 'movingIn':\n setAnimationPhase('revealing');\n break;\n case 'revealing':\n setAnimationPhase('visible');\n break;\n case 'assigning':\n setAnimationPhase('assigned');\n setIsAssigned(true);\n break;\n case 'movingOut':\n setAnimationPhase('hidden');\n onFullyHidden?.();\n break;\n default:\n break;\n }\n }, [animationPhase, onFullyHidden]);\n\n // Handler for the \"Assign\" button\n const handleAssign = () => {\n if (externalAssigned) return; // Do nothing if already assigned\n\n postPuzzleToAssign(\n {\n puzzle_id: puzzleId,\n },\n {\n studentId,\n courseStream,\n },\n );\n // if (animationPhase === 'visible') {\n // setAnimationPhase('assigning');\n // }\n };\n\n const handleOnPuzzleClick = useCallback(() => {\n onPuzzleClick();\n }, [onPuzzleClick]);\n\n // Render content only during specific phases\n const renderContent = () => {\n if (animationPhase === 'visible' || externalAssigned) {\n return (\n <>\n <Styled.PuzzleContent\n $justifyContent=\"center\"\n $alignItems=\"center\"\n $width=\"100%\"\n $height=\"100%\"\n onClick={handleOnPuzzleClick}\n title=\"Click to preview\"\n $flexGapX={1.5}\n >\n <Image width={136} height={136} src={imageUrl} withLoader={false} alt=\"Puzzle\" />\n <Text $renderAs=\"h4\">{title}</Text>\n\n <Styled.AssignedTag $gap={4} $gutter={8} $background=\"BLACK_1\">\n <Text $renderAs=\"ac4\" $color=\"WHITE_1\">\n Assigned\n </Text>\n </Styled.AssignedTag>\n </Styled.PuzzleContent>\n\n {userType === 'TEACHER' && (\n <Styled.PuzzleButton\n $background=\"BLACK_1\"\n $widthX={15.75}\n $alignItems=\"center\"\n $justifyContent=\"center\"\n $gapX={0.75}\n $gutterX={1}\n onClick={handleAssign}\n $disabled={externalAssigned || isProcessing}\n >\n <Text $renderAs=\"ub1-bold\" $color={externalAssigned ? 'BLACK_T_38' : 'WHITE_1'}>\n {externalAssigned ? 'Discuss in next class' : 'Assign'}\n </Text>\n </Styled.PuzzleButton>\n )}\n </>\n );\n }\n\n if (animationPhase === 'assigned') {\n return (\n <Styled.PuzzleText $alignItems=\"center\" $justifyContent=\"center\" $flexGap={8}>\n <Styled.CheckMarkIcon\n $widthX={2.5}\n $heightX={2.5}\n $background=\"WHITE\"\n $alignItems=\"center\"\n $justifyContent=\"center\"\n >\n <Check2Icon />\n </Styled.CheckMarkIcon>\n\n <Text $renderAs=\"ab1-bold\" $align=\"center\" $color=\"WHITE\">\n Puzzle assigned\n </Text>\n </Styled.PuzzleText>\n );\n }\n\n // No content during animations\n return null;\n };\n\n if (animationPhase === 'hidden' && !triggerReveal) {\n return null;\n }\n\n return (\n <Styled.PuzzleContainer>\n <PuzzleCard\n animationPhase={!externalAssigned ? animationPhase : undefined}\n onAnimationEnd={handleAnimationEnd}\n imageHue={imageHue ?? 'BLUE'}\n heightX={19}\n widthX={15.75}\n backgroundColor={externalAssigned ? `${imageHue}_2` : undefined}\n >\n {renderContent()}\n </PuzzleCard>\n </Styled.PuzzleContainer>\n );\n },\n);\n\nexport default PuzzleCardContainer;\n"],"names":["ASSIGNED_DISPLAY_DURATION","PuzzleCardContainer","memo","userType","triggerReveal","onFullyHidden","onPuzzleClick","puzzleData","courseStream","studentId","imageHue","imageUrl","externalAssigned","title","puzzleId","animationPhase","setAnimationPhase","useState","isAssigned","setIsAssigned","assignedTimer","useRef","postPuzzleToAssign","isProcessing","usePostPuzzleToAssign","error","useEffect","handleAnimationEnd","useCallback","handleAssign","handleOnPuzzleClick","renderContent","jsxs","Fragment","Styled.PuzzleContent","jsx","Image","Text","Styled.AssignedTag","Styled.PuzzleButton","Styled.PuzzleText","Styled.CheckMarkIcon","Check2Icon","Styled.PuzzleContainer","PuzzleCard","PuzzleCardContainer$1"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2828,6 +2828,8 @@ declare interface IPuzzleCardContainerProps {
2828
2828
  onFullyHidden?: () => void;
2829
2829
  onPuzzleClick: () => void;
2830
2830
  puzzleData: IPuzzleCardAssignData;
2831
+ courseStream: TCourseStream;
2832
+ studentId: string;
2831
2833
  }
2832
2834
 
2833
2835
  export declare interface IPuzzleWebGameProps extends IBaseWebGameProps, ISyncableWebGameProps {
@@ -5940,8 +5942,8 @@ export declare const useGetPuzzleToAssign: (initialId?: string, initialQuery?: v
5940
5942
  get: (id: string, query: void, meta: {
5941
5943
  courseStream: TCourseStream;
5942
5944
  }) => Promise<void>;
5943
- resource: ResourceModel<IPuzzleCardAssignData> | undefined;
5944
- data: IPuzzleCardAssignData | undefined;
5945
+ resource: ResourceModel<IPuzzleCardAssignData[]> | undefined;
5946
+ data: IPuzzleCardAssignData[] | undefined;
5945
5947
  permissions: Record<string, unknown> | undefined;
5946
5948
  isProcessing: boolean;
5947
5949
  isProcessed: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cuemath/leap",
3
- "version": "3.1.35-beta-0.2",
3
+ "version": "3.1.35-beta-0.4",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"