@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
|
|
2
|
-
import { BASE_URL_V3 as
|
|
3
|
-
const { useGet:
|
|
4
|
-
getURL: (s, t, { courseStream: e }) => `${
|
|
5
|
-
})
|
|
6
|
-
|
|
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
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
2
|
-
import { memo as
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
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:
|
|
21
|
+
image_url: A,
|
|
13
22
|
assigned: n,
|
|
14
|
-
title:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
},
|
|
21
|
-
|
|
34
|
+
}, N)), () => {
|
|
35
|
+
a.current && clearTimeout(a.current);
|
|
22
36
|
}), [e, n]);
|
|
23
|
-
const
|
|
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"),
|
|
46
|
+
t("assigned"), I(!0);
|
|
33
47
|
break;
|
|
34
48
|
case "movingOut":
|
|
35
|
-
t("hidden"),
|
|
49
|
+
t("hidden"), s == null || s();
|
|
36
50
|
break;
|
|
37
51
|
}
|
|
38
|
-
}, [e,
|
|
39
|
-
n ||
|
|
40
|
-
|
|
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]),
|
|
64
|
+
}, [l]), E = () => e === "visible" || n ? /* @__PURE__ */ c(w, { children: [
|
|
43
65
|
/* @__PURE__ */ c(
|
|
44
|
-
|
|
66
|
+
W,
|
|
45
67
|
{
|
|
46
68
|
$justifyContent: "center",
|
|
47
69
|
$alignItems: "center",
|
|
48
70
|
$width: "100%",
|
|
49
71
|
$height: "100%",
|
|
50
|
-
onClick:
|
|
72
|
+
onClick: _,
|
|
51
73
|
title: "Click to preview",
|
|
52
74
|
$flexGapX: 1.5,
|
|
53
75
|
children: [
|
|
54
|
-
/* @__PURE__ */ i(
|
|
55
|
-
/* @__PURE__ */ i(
|
|
56
|
-
/* @__PURE__ */ i(
|
|
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
|
-
|
|
61
|
-
|
|
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:
|
|
70
|
-
$disabled: n,
|
|
71
|
-
children: /* @__PURE__ */ i(
|
|
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(
|
|
96
|
+
] }) : e === "assigned" ? /* @__PURE__ */ c(U, { $alignItems: "center", $justifyContent: "center", $flexGap: 8, children: [
|
|
75
97
|
/* @__PURE__ */ i(
|
|
76
|
-
|
|
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(
|
|
105
|
+
children: /* @__PURE__ */ i(L, {})
|
|
84
106
|
}
|
|
85
107
|
),
|
|
86
|
-
/* @__PURE__ */ i(
|
|
108
|
+
/* @__PURE__ */ i(r, { $renderAs: "ab1-bold", $align: "center", $color: "WHITE", children: "Puzzle assigned" })
|
|
87
109
|
] }) : null;
|
|
88
|
-
return e === "hidden" && !
|
|
89
|
-
|
|
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:
|
|
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:
|
|
119
|
+
children: E()
|
|
98
120
|
}
|
|
99
121
|
) });
|
|
100
122
|
}
|
|
101
|
-
),
|
|
123
|
+
), F = M;
|
|
102
124
|
export {
|
|
103
|
-
|
|
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;
|