@cuemath/leap 2.8.41 → 2.8.43-link.0
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.
- package/dist/assets/illustrations/illustrations.js +2 -0
- package/dist/assets/illustrations/illustrations.js.map +1 -1
- package/dist/assets/line-icons/icons/carat-left.js +26 -0
- package/dist/assets/line-icons/icons/carat-left.js.map +1 -0
- package/dist/assets/line-icons/icons/carat-right.js +26 -0
- package/dist/assets/line-icons/icons/carat-right.js.map +1 -0
- package/dist/assets/sounds/sounds.js +7 -0
- package/dist/assets/sounds/sounds.js.map +1 -0
- package/dist/features/circle-games/enum/circle-onboarding-steps.js +1 -1
- package/dist/features/circle-games/enum/circle-onboarding-steps.js.map +1 -1
- package/dist/features/circle-games/game-launcher/comps/card-container/card-container.js +20 -11
- package/dist/features/circle-games/game-launcher/comps/card-container/card-container.js.map +1 -1
- package/dist/features/circle-games/game-launcher/comps/carousel/carousel.js +53 -47
- package/dist/features/circle-games/game-launcher/comps/carousel/carousel.js.map +1 -1
- package/dist/features/circle-games/game-launcher/comps/tables-card/tables-card.js +159 -130
- package/dist/features/circle-games/game-launcher/comps/tables-card/tables-card.js.map +1 -1
- package/dist/features/circle-games/game-launcher/dal/use-get-circle-home-details-dal/use-get-circle-home-details-dal.js +14 -13
- package/dist/features/circle-games/game-launcher/dal/use-get-circle-home-details-dal/use-get-circle-home-details-dal.js.map +1 -1
- package/dist/features/circle-games/game-launcher/game-launcher.js +95 -68
- package/dist/features/circle-games/game-launcher/game-launcher.js.map +1 -1
- package/dist/features/circle-games/game-launcher/hooks/use-game-launcher-journey/constants.js +9 -0
- package/dist/features/circle-games/game-launcher/hooks/use-game-launcher-journey/constants.js.map +1 -0
- package/dist/features/circle-games/game-launcher/hooks/use-game-launcher-journey/use-game-launcher-journey.js +217 -0
- package/dist/features/circle-games/game-launcher/hooks/use-game-launcher-journey/use-game-launcher-journey.js.map +1 -0
- package/dist/features/circle-games/game-launcher/hooks/use-table-launcher-journey/constants.js +13 -0
- package/dist/features/circle-games/game-launcher/hooks/use-table-launcher-journey/constants.js.map +1 -0
- package/dist/features/circle-games/game-launcher/hooks/use-table-launcher-journey/use-table-launcher-journey-styled.js +13 -0
- package/dist/features/circle-games/game-launcher/hooks/use-table-launcher-journey/use-table-launcher-journey-styled.js.map +1 -0
- package/dist/features/circle-games/game-launcher/hooks/use-table-launcher-journey/use-table-launcher-journey.js +205 -0
- package/dist/features/circle-games/game-launcher/hooks/use-table-launcher-journey/use-table-launcher-journey.js.map +1 -0
- package/dist/features/journey/journey-id/journey-id-student.js +1 -1
- package/dist/features/journey/journey-id/journey-id-student.js.map +1 -1
- package/dist/features/talk-meter/helper.js +11 -0
- package/dist/features/talk-meter/helper.js.map +1 -0
- package/dist/features/talk-meter/hooks/use-talk-meter.js +123 -0
- package/dist/features/talk-meter/hooks/use-talk-meter.js.map +1 -0
- package/dist/features/talk-meter/ripple/index.js +62 -0
- package/dist/features/talk-meter/ripple/index.js.map +1 -0
- package/dist/features/talk-meter/talk-meter-styled.js +89 -0
- package/dist/features/talk-meter/talk-meter-styled.js.map +1 -0
- package/dist/features/talk-meter/talk-meter-view/talk-meter-view-styled.js +22 -0
- package/dist/features/talk-meter/talk-meter-view/talk-meter-view-styled.js.map +1 -0
- package/dist/features/talk-meter/talk-meter-view/talk-meter-view.js +101 -0
- package/dist/features/talk-meter/talk-meter-view/talk-meter-view.js.map +1 -0
- package/dist/features/talk-meter/talk-meter.js +75 -0
- package/dist/features/talk-meter/talk-meter.js.map +1 -0
- package/dist/index.d.ts +48 -2
- package/dist/index.js +135 -133
- package/dist/index.js.map +1 -1
- package/dist/static/female-avatar.b8cd1012.svg +1 -0
- package/dist/static/male-avatar.2febc9eb.svg +1 -0
- package/package.json +1 -1
- package/dist/features/circle-games/game-launcher/use-game-launcher-journey/constants.js +0 -7
- package/dist/features/circle-games/game-launcher/use-game-launcher-journey/constants.js.map +0 -1
- package/dist/features/circle-games/game-launcher/use-game-launcher-journey/use-game-launcher-journey.js +0 -213
- package/dist/features/circle-games/game-launcher/use-game-launcher-journey/use-game-launcher-journey.js.map +0 -1
@@ -0,0 +1,205 @@
|
|
1
|
+
import { jsx as r, Fragment as L } from "react/jsx-runtime";
|
2
|
+
import { useRef as I, useCallback as p } from "react";
|
3
|
+
import F from "../../../../../assets/line-icons/icons/carat-right.js";
|
4
|
+
import { PLATFORM_EVENTS_STUDENT as B } from "../../../../analytics-events/platform-events-student.js";
|
5
|
+
import { JOURNEY_ID_STUDENT as V } from "../../../../journey/journey-id/journey-id-student.js";
|
6
|
+
import { IndicatorType as d } from "../../../../journey/use-journey/constants.js";
|
7
|
+
import { useJourney as J } from "../../../../journey/use-journey/use-journey.js";
|
8
|
+
import X from "../../../../ui/buttons/icon-button/icon-button.js";
|
9
|
+
import { useUIContext as K } from "../../../../ui/context/context.js";
|
10
|
+
import b from "../../../../ui/layout/flex-view.js";
|
11
|
+
import m from "../../../../ui/text/text.js";
|
12
|
+
import { CIRCLE_ONBOARDING_ANALYTICS_STEPS as U } from "../../../enum/circle-onboarding-steps.js";
|
13
|
+
import { useCircleSounds as j } from "../../../hooks/use-circle-sounds/use-circle-sounds.js";
|
14
|
+
import { TablesCard as G } from "../../comps/tables-card/tables-card.js";
|
15
|
+
import { GAME_LAUNCHER_ANALYTICS_EVENTS as Z } from "../../game-launcher-analytics-events.js";
|
16
|
+
import { SHOW_PICK_A_LEVEL_TOOLTIP_AFTER_MS as q, SHOW_PICK_A_LEVEL_NUDGE_AFTER_MS as z, START_ANIMATING_CLONED_ELEM as v, TABLE_CARD_INDEX as M, GO_TO_TABLE_LAUNCHER_DURATION_MS as Q, SHOW_CLICK_TABLE_NUDGE_AFTER_MS as ee, PUZZLE_CARD_INDEX as te, SHOW_INITIAL_COACHMARK_AFTER_MS as $, SHOW_INITIAL_TOOLTIP_AFTER_MS as re } from "./constants.js";
|
17
|
+
import { Indicator as ne } from "./use-table-launcher-journey-styled.js";
|
18
|
+
const Ce = ({
|
19
|
+
carouselRefs: s,
|
20
|
+
onTableSegmentClick: O,
|
21
|
+
onJourneyComplete: R
|
22
|
+
}) => {
|
23
|
+
const e = V.CIRCLE_TABLES_INTRO_JOURNEY, t = I(null), f = I(null), N = I(!1), { playButtonSound: P } = j(), { nextCoachmark: n, setJourney: S, addCoachmark: a } = J(), { onEvent: _ } = K(), A = p(
|
24
|
+
(l) => {
|
25
|
+
var c, i;
|
26
|
+
l && O(l), _(B.ONBOARDING_STEP_COMPLETED, {
|
27
|
+
step: U.TABLES
|
28
|
+
}), (c = t == null ? void 0 : t.current) == null || c.setLabelVisiblity(!0), (i = t == null ? void 0 : t.current) == null || i.stopLabelAnimation(), R(e), n(e, !1);
|
29
|
+
},
|
30
|
+
[e, n, R, O, _]
|
31
|
+
), H = p(
|
32
|
+
(l, c) => {
|
33
|
+
var g, T, E;
|
34
|
+
if (!((g = t.current) != null && g.segmentedCardWrapperRef.current) || !((T = t.current) != null && T.labelRef.current))
|
35
|
+
return;
|
36
|
+
const i = t.current.labelRef.current.getBoundingClientRect(), o = (E = t.current) == null ? void 0 : E.segmentedCardWrapperRef.current.getBoundingClientRect();
|
37
|
+
a(e, {
|
38
|
+
originalElementToHighlightRef: t.current.segmentedCardWrapperRef,
|
39
|
+
isActive: !1,
|
40
|
+
type: d.TOOLTIP,
|
41
|
+
elementToHighlight: /* @__PURE__ */ r(
|
42
|
+
G,
|
43
|
+
{
|
44
|
+
ref: f,
|
45
|
+
defaultTable: c,
|
46
|
+
label: l.label,
|
47
|
+
data: l.data,
|
48
|
+
onPress: A,
|
49
|
+
onGoBackFromTableLevel: A
|
50
|
+
}
|
51
|
+
),
|
52
|
+
indicator: {
|
53
|
+
position: "left",
|
54
|
+
backgroundColor: "YELLOW_4",
|
55
|
+
width: 236,
|
56
|
+
tooltipItem: /* @__PURE__ */ r(b, { children: /* @__PURE__ */ r(m, { $renderAs: "ab2-bold", children: "Each table has 3 levels—clear them and earn 3 stars!" }) }),
|
57
|
+
tooltipXCoOrdinates: 0,
|
58
|
+
tooltipYCoOrdinates: i.height * 0.35
|
59
|
+
}
|
60
|
+
}), a(e, {
|
61
|
+
originalElementToHighlightRef: t.current.segmentedCardWrapperRef,
|
62
|
+
isActive: !1,
|
63
|
+
type: d.NUDGE,
|
64
|
+
indicator: {
|
65
|
+
nudge: "click",
|
66
|
+
content: /* @__PURE__ */ r(m, { $renderAs: "ab1", $color: "WHITE", children: "Pick a level" }),
|
67
|
+
nudgePointerX: o.width / 2 + 50,
|
68
|
+
nudgePointerY: o.height * 0.4
|
69
|
+
},
|
70
|
+
elementToHighlight: /* @__PURE__ */ r(L, {})
|
71
|
+
}), n(e, !1, q), n(e, !0, z);
|
72
|
+
const u = setTimeout(() => {
|
73
|
+
var h;
|
74
|
+
clearTimeout(u), (h = f.current) == null || h.startLabelAnimation("YELLOW_4");
|
75
|
+
}, v);
|
76
|
+
},
|
77
|
+
[a, A, e, n]
|
78
|
+
), C = p(() => {
|
79
|
+
var i;
|
80
|
+
P(), (i = s.current) == null || i.goToIndex(M), n(e, !1, Q), _(B.ONBOARDING_STEP_VIEWED, {
|
81
|
+
step: U.TABLES
|
82
|
+
});
|
83
|
+
const l = setTimeout(() => {
|
84
|
+
var o;
|
85
|
+
clearTimeout(l), (o = t.current) == null || o.setLabelVisiblity(!1), n(e, !0);
|
86
|
+
}, ee), c = setTimeout(() => {
|
87
|
+
var o;
|
88
|
+
clearTimeout(c), (o = f.current) == null || o.startLabelAnimation("YELLOW_4");
|
89
|
+
}, v);
|
90
|
+
}, [s, e, n, P, _]), x = p(
|
91
|
+
(l, c = !1) => {
|
92
|
+
var E, h, y, W, D, Y, k;
|
93
|
+
if (N.current)
|
94
|
+
return;
|
95
|
+
const i = (E = s.current) == null ? void 0 : E.indicatorRefs, o = (h = s.current) == null ? void 0 : h.nextBtnRef, u = i == null ? void 0 : i[M];
|
96
|
+
if (!((y = t.current) != null && y.segmentedCardWrapperRef.current) || !((W = t.current) != null && W.labelRef.current) || !i || !(o != null && o.current) || !u || !u.current)
|
97
|
+
return;
|
98
|
+
N.current = !0;
|
99
|
+
const g = t.current.labelRef.current.getBoundingClientRect(), T = (D = t.current) == null ? void 0 : D.segmentedCardWrapperRef.current.getBoundingClientRect();
|
100
|
+
S(e, []), c ? (a(e, {
|
101
|
+
originalElementToHighlightRef: u,
|
102
|
+
isActive: !1,
|
103
|
+
type: d.TOOLTIP,
|
104
|
+
elementToHighlight: /* @__PURE__ */ r(ne, { $isActive: !1 }),
|
105
|
+
indicator: {
|
106
|
+
position: "bottom",
|
107
|
+
backgroundColor: "YELLOW_4",
|
108
|
+
width: 52,
|
109
|
+
tooltipItem: /* @__PURE__ */ r(
|
110
|
+
b,
|
111
|
+
{
|
112
|
+
$position: "absolute",
|
113
|
+
$flexDirection: "row",
|
114
|
+
style: { top: 6, left: 8, cursor: "pointer" },
|
115
|
+
onClick: C,
|
116
|
+
children: /* @__PURE__ */ r(m, { $renderAs: "ab2-bold", children: "NEW" })
|
117
|
+
}
|
118
|
+
),
|
119
|
+
tooltipYCoOrdinates: 14
|
120
|
+
// Need some offset in Y direction from top
|
121
|
+
}
|
122
|
+
}), a(e, {
|
123
|
+
originalElementToHighlightRef: u,
|
124
|
+
isActive: !1,
|
125
|
+
type: d.NUDGE,
|
126
|
+
indicator: {
|
127
|
+
nudge: "click",
|
128
|
+
content: "",
|
129
|
+
nudgePointerY: 20
|
130
|
+
},
|
131
|
+
elementToHighlight: /* @__PURE__ */ r(L, {})
|
132
|
+
}), n(e, !1, $), n(e, !0, re)) : (a(e, {
|
133
|
+
originalElementToHighlightRef: (Y = s.current) == null ? void 0 : Y.nextBtnRef,
|
134
|
+
isActive: !1,
|
135
|
+
type: d.NUDGE,
|
136
|
+
indicator: {
|
137
|
+
nudge: "click",
|
138
|
+
content: /* @__PURE__ */ r(m, { $renderAs: "ab1", $color: "WHITE", children: "Click to proceed" }),
|
139
|
+
nudgePointerX: 0,
|
140
|
+
nudgePointerY: 0
|
141
|
+
},
|
142
|
+
elementToHighlight: /* @__PURE__ */ r(
|
143
|
+
X,
|
144
|
+
{
|
145
|
+
renderAs: "secondary",
|
146
|
+
Icon: F,
|
147
|
+
onClick: C,
|
148
|
+
analyticsLabel: Z.JOURNEY_NEXT_ACTIVITY
|
149
|
+
}
|
150
|
+
)
|
151
|
+
}), (k = s.current) == null || k.goToIndex(te), n(e, !1, $)), a(e, {
|
152
|
+
originalElementToHighlightRef: t.current.labelRef,
|
153
|
+
isActive: !1,
|
154
|
+
type: d.TOOLTIP,
|
155
|
+
elementToHighlight: /* @__PURE__ */ r(L, {}),
|
156
|
+
indicator: {
|
157
|
+
position: "right",
|
158
|
+
backgroundColor: "YELLOW_4",
|
159
|
+
width: 264,
|
160
|
+
tooltipItem: /* @__PURE__ */ r(b, { children: /* @__PURE__ */ r(m, { $renderAs: "ab2-bold", children: "Get faster at multiplication! Practice everyday and become a Tables champ." }) }),
|
161
|
+
tooltipXCoOrdinates: g.width + 50,
|
162
|
+
tooltipYCoOrdinates: g.height / 2
|
163
|
+
}
|
164
|
+
}), a(e, {
|
165
|
+
originalElementToHighlightRef: t.current.segmentedCardWrapperRef,
|
166
|
+
isActive: !1,
|
167
|
+
type: d.NUDGE,
|
168
|
+
indicator: {
|
169
|
+
nudge: "click",
|
170
|
+
content: /* @__PURE__ */ r(m, { $renderAs: "ab1", $color: "WHITE", children: "Pick a table to start" }),
|
171
|
+
nudgePointerX: T.width / 2 + 50,
|
172
|
+
nudgePointerY: T.height / 2
|
173
|
+
},
|
174
|
+
elementToHighlight: /* @__PURE__ */ r(
|
175
|
+
G,
|
176
|
+
{
|
177
|
+
ref: f,
|
178
|
+
label: l.label,
|
179
|
+
data: l.data,
|
180
|
+
onPress: () => {
|
181
|
+
},
|
182
|
+
onPressTableSegment: (w) => H(l, w)
|
183
|
+
}
|
184
|
+
)
|
185
|
+
});
|
186
|
+
},
|
187
|
+
[
|
188
|
+
a,
|
189
|
+
s,
|
190
|
+
C,
|
191
|
+
H,
|
192
|
+
e,
|
193
|
+
n,
|
194
|
+
S
|
195
|
+
]
|
196
|
+
);
|
197
|
+
return {
|
198
|
+
tableRef: t,
|
199
|
+
startJourney: x
|
200
|
+
};
|
201
|
+
};
|
202
|
+
export {
|
203
|
+
Ce as useTableLauncherJourney
|
204
|
+
};
|
205
|
+
//# sourceMappingURL=use-table-launcher-journey.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-table-launcher-journey.js","sources":["../../../../../../src/features/circle-games/game-launcher/hooks/use-table-launcher-journey/use-table-launcher-journey.tsx"],"sourcesContent":["/* eslint-disable react-native/no-inline-styles */\nimport type { IArrowTooltipProps } from '../../../../ui/arrow-tooltip/arrow-tooltip-types';\nimport type { INudgeProps } from '../../../../ui/nudge/nudge-types';\nimport type { ITableCardRef, ITableDetails } from '../../comps/tables-card/tables-card-types';\nimport type {\n ITableInfo,\n ITables,\n} from '../../dal/use-get-circle-home-details-dal/use-get-circle-home-dal-types';\nimport type { IUseTableJourneyProps } from './use-table-launcher-journey-types';\n\nimport { useCallback, useRef } from 'react';\n\nimport CaratRightIcon from '../../../../../assets/line-icons/icons/carat-right';\nimport { PLATFORM_EVENTS_STUDENT } from '../../../../analytics-events/platform-events-student';\nimport { JOURNEY_ID_STUDENT } from '../../../../journey/journey-id/journey-id-student';\nimport { IndicatorType } from '../../../../journey/use-journey/constants';\nimport { useJourney } from '../../../../journey/use-journey/use-journey';\nimport IconButton from '../../../../ui/buttons/icon-button/icon-button';\nimport { useUIContext } from '../../../../ui/context/context';\nimport FlexView from '../../../../ui/layout/flex-view';\nimport Text from '../../../../ui/text/text';\nimport { CIRCLE_ONBOARDING_ANALYTICS_STEPS as Action } from '../../../enum/circle-onboarding-steps';\nimport { useCircleSounds } from '../../../hooks/use-circle-sounds/use-circle-sounds';\nimport { TablesCard } from '../../comps/tables-card/tables-card';\nimport { GAME_LAUNCHER_ANALYTICS_EVENTS } from '../../game-launcher-analytics-events';\nimport {\n PUZZLE_CARD_INDEX,\n SHOW_PICK_A_LEVEL_NUDGE_AFTER_MS,\n SHOW_PICK_A_LEVEL_TOOLTIP_AFTER_MS,\n TABLE_CARD_INDEX,\n} from './constants';\nimport {\n GO_TO_TABLE_LAUNCHER_DURATION_MS,\n SHOW_CLICK_TABLE_NUDGE_AFTER_MS,\n SHOW_INITIAL_COACHMARK_AFTER_MS,\n SHOW_INITIAL_TOOLTIP_AFTER_MS,\n START_ANIMATING_CLONED_ELEM,\n} from './constants';\nimport * as S from './use-table-launcher-journey-styled';\n\nexport const useTableLauncherJourney = ({\n carouselRefs,\n onTableSegmentClick,\n onJourneyComplete,\n}: IUseTableJourneyProps) => {\n const journeyId = JOURNEY_ID_STUDENT.CIRCLE_TABLES_INTRO_JOURNEY;\n const originalTableRef = useRef<ITableCardRef>(null);\n const highlightedTableRef = useRef<ITableCardRef>(null);\n const isJourneyInProgress = useRef(false);\n\n const { playButtonSound } = useCircleSounds();\n const { nextCoachmark, setJourney, addCoachmark } = useJourney();\n const { onEvent: trackAnalytics } = useUIContext();\n\n const endJourney = useCallback(\n (tableDetails?: ITableDetails) => {\n // Only when User clicked on play\n if (tableDetails) {\n onTableSegmentClick(tableDetails);\n }\n trackAnalytics(PLATFORM_EVENTS_STUDENT.ONBOARDING_STEP_COMPLETED, {\n step: Action.TABLES,\n });\n\n // Reset original table card ref label\n originalTableRef?.current?.setLabelVisiblity(true);\n originalTableRef?.current?.stopLabelAnimation();\n onJourneyComplete(journeyId);\n nextCoachmark(journeyId, false);\n },\n [journeyId, nextCoachmark, onJourneyComplete, onTableSegmentClick, trackAnalytics],\n );\n\n const handleTableSegmentClick = useCallback(\n (launcherData: ITables, tableData: ITableInfo) => {\n if (\n !originalTableRef.current?.segmentedCardWrapperRef.current ||\n !originalTableRef.current?.labelRef.current\n ) {\n return;\n }\n\n const segmentedCardDims = originalTableRef.current.labelRef.current.getBoundingClientRect();\n const tableCardDims =\n originalTableRef.current?.segmentedCardWrapperRef.current.getBoundingClientRect();\n\n addCoachmark(journeyId, {\n originalElementToHighlightRef: originalTableRef.current.segmentedCardWrapperRef,\n isActive: false,\n type: IndicatorType.TOOLTIP,\n elementToHighlight: (\n <TablesCard\n ref={highlightedTableRef}\n defaultTable={tableData}\n label={launcherData.label}\n data={launcherData.data}\n onPress={endJourney}\n onGoBackFromTableLevel={endJourney}\n />\n ),\n indicator: {\n position: 'left',\n backgroundColor: 'YELLOW_4',\n width: 236,\n tooltipItem: (\n <FlexView>\n <Text $renderAs=\"ab2-bold\">Each table has 3 levels—clear them and earn 3 stars!</Text>\n </FlexView>\n ),\n tooltipXCoOrdinates: 0,\n tooltipYCoOrdinates: segmentedCardDims.height * 0.35,\n } as IArrowTooltipProps,\n });\n\n addCoachmark(journeyId, {\n originalElementToHighlightRef: originalTableRef.current.segmentedCardWrapperRef,\n isActive: false,\n type: IndicatorType.NUDGE,\n indicator: {\n nudge: 'click',\n content: (\n <Text $renderAs=\"ab1\" $color=\"WHITE\">\n Pick a level\n </Text>\n ),\n nudgePointerX: tableCardDims.width / 2 + 50,\n nudgePointerY: tableCardDims.height * 0.4,\n } as INudgeProps,\n elementToHighlight: <></>,\n });\n\n nextCoachmark(journeyId, false, SHOW_PICK_A_LEVEL_TOOLTIP_AFTER_MS); // Show coachmark => Each table has 3... and Hide the previous two\n nextCoachmark(journeyId, true, SHOW_PICK_A_LEVEL_NUDGE_AFTER_MS); // Show nudge => Pick a level\n\n const startAnimationOnLabelAgain = setTimeout(() => {\n clearTimeout(startAnimationOnLabelAgain);\n highlightedTableRef.current?.startLabelAnimation('YELLOW_4');\n }, START_ANIMATING_CLONED_ELEM);\n },\n [addCoachmark, endJourney, journeyId, nextCoachmark],\n );\n\n const goToTableLauncher = useCallback(() => {\n playButtonSound();\n carouselRefs.current?.goToIndex(TABLE_CARD_INDEX);\n nextCoachmark(journeyId, false, GO_TO_TABLE_LAUNCHER_DURATION_MS);\n\n trackAnalytics(PLATFORM_EVENTS_STUDENT.ONBOARDING_STEP_VIEWED, {\n step: Action.TABLES,\n });\n\n const showNudge = setTimeout(() => {\n clearTimeout(showNudge);\n originalTableRef.current?.setLabelVisiblity(false);\n nextCoachmark(journeyId, true);\n }, SHOW_CLICK_TABLE_NUDGE_AFTER_MS);\n\n const animateLabel = setTimeout(() => {\n clearTimeout(animateLabel);\n highlightedTableRef.current?.startLabelAnimation('YELLOW_4');\n }, START_ANIMATING_CLONED_ELEM);\n }, [carouselRefs, journeyId, nextCoachmark, playButtonSound, trackAnalytics]);\n\n const startJourney = useCallback(\n (tablesData: ITables, isTutorialOnboardingDone: boolean = false) => {\n if (isJourneyInProgress.current) {\n return;\n }\n\n const paginationList = carouselRefs.current?.indicatorRefs;\n const carouselNextBtnRef = carouselRefs.current?.nextBtnRef;\n const tablePaginationRef = paginationList?.[TABLE_CARD_INDEX];\n\n if (\n !originalTableRef.current?.segmentedCardWrapperRef.current ||\n !originalTableRef.current?.labelRef.current ||\n !paginationList ||\n !carouselNextBtnRef?.current ||\n !tablePaginationRef ||\n !tablePaginationRef.current\n ) {\n return;\n }\n\n isJourneyInProgress.current = true;\n\n const labelDims = originalTableRef.current.labelRef.current.getBoundingClientRect();\n const tableCardDims =\n originalTableRef.current?.segmentedCardWrapperRef.current.getBoundingClientRect();\n\n setJourney(journeyId, []);\n\n // TAKE THE USER TO THE TABLE CARD\n if (!isTutorialOnboardingDone) {\n addCoachmark(journeyId, {\n originalElementToHighlightRef: carouselRefs.current?.nextBtnRef,\n isActive: false,\n type: IndicatorType.NUDGE,\n indicator: {\n nudge: 'click',\n content: (\n <Text $renderAs=\"ab1\" $color=\"WHITE\">\n Click to proceed\n </Text>\n ),\n nudgePointerX: 0,\n nudgePointerY: 0,\n } as INudgeProps,\n elementToHighlight: (\n <IconButton\n renderAs=\"secondary\"\n Icon={CaratRightIcon}\n onClick={goToTableLauncher}\n analyticsLabel={GAME_LAUNCHER_ANALYTICS_EVENTS.JOURNEY_NEXT_ACTIVITY}\n />\n ),\n });\n carouselRefs.current?.goToIndex(PUZZLE_CARD_INDEX);\n nextCoachmark(journeyId, false, SHOW_INITIAL_COACHMARK_AFTER_MS); // Show nudge => Click to proceed\n } else {\n addCoachmark(journeyId, {\n originalElementToHighlightRef: tablePaginationRef as React.RefObject<HTMLDivElement>,\n isActive: false,\n type: IndicatorType.TOOLTIP,\n elementToHighlight: <S.Indicator $isActive={false} />,\n indicator: {\n position: 'bottom',\n backgroundColor: 'YELLOW_4',\n width: 52,\n tooltipItem: (\n <FlexView\n $position=\"absolute\"\n $flexDirection=\"row\"\n style={{ top: 6, left: 8, cursor: 'pointer' }}\n onClick={goToTableLauncher}\n >\n <Text $renderAs=\"ab2-bold\">NEW</Text>\n </FlexView>\n ),\n tooltipYCoOrdinates: 14, // Need some offset in Y direction from top\n } as IArrowTooltipProps,\n });\n addCoachmark(journeyId, {\n originalElementToHighlightRef: tablePaginationRef as React.RefObject<HTMLDivElement>,\n isActive: false,\n type: IndicatorType.NUDGE,\n indicator: {\n nudge: 'click',\n content: '',\n nudgePointerY: 20,\n } as INudgeProps,\n elementToHighlight: <></>,\n });\n nextCoachmark(journeyId, false, SHOW_INITIAL_COACHMARK_AFTER_MS); // Show Coachmark => NEW\n nextCoachmark(journeyId, true, SHOW_INITIAL_TOOLTIP_AFTER_MS); // Show Nudge over Coachmark\n }\n\n // SHOW THE USER SELECT A TABLE\n addCoachmark(journeyId, {\n originalElementToHighlightRef: originalTableRef.current.labelRef,\n isActive: false,\n type: IndicatorType.TOOLTIP,\n elementToHighlight: <></>,\n indicator: {\n position: 'right',\n backgroundColor: 'YELLOW_4',\n width: 264,\n tooltipItem: (\n <FlexView>\n <Text $renderAs=\"ab2-bold\">\n Get faster at multiplication! Practice everyday and become a Tables champ.\n </Text>\n </FlexView>\n ),\n tooltipXCoOrdinates: labelDims.width + 50,\n tooltipYCoOrdinates: labelDims.height / 2,\n } as IArrowTooltipProps,\n });\n\n addCoachmark(journeyId, {\n originalElementToHighlightRef: originalTableRef.current.segmentedCardWrapperRef,\n isActive: false,\n type: IndicatorType.NUDGE,\n indicator: {\n nudge: 'click',\n content: (\n <Text $renderAs=\"ab1\" $color=\"WHITE\">\n {'Pick a table to start'}\n </Text>\n ),\n nudgePointerX: tableCardDims.width / 2 + 50,\n nudgePointerY: tableCardDims.height / 2,\n } as INudgeProps,\n elementToHighlight: (\n <TablesCard\n ref={highlightedTableRef}\n label={tablesData.label}\n data={tablesData.data}\n onPress={() => {}}\n onPressTableSegment={tableInfo => handleTableSegmentClick(tablesData, tableInfo)}\n />\n ),\n });\n },\n [\n addCoachmark,\n carouselRefs,\n goToTableLauncher,\n handleTableSegmentClick,\n journeyId,\n nextCoachmark,\n setJourney,\n ],\n );\n\n return {\n tableRef: originalTableRef,\n startJourney,\n };\n};\n"],"names":["useTableLauncherJourney","carouselRefs","onTableSegmentClick","onJourneyComplete","journeyId","JOURNEY_ID_STUDENT","originalTableRef","useRef","highlightedTableRef","isJourneyInProgress","playButtonSound","useCircleSounds","nextCoachmark","setJourney","addCoachmark","useJourney","trackAnalytics","useUIContext","endJourney","useCallback","tableDetails","PLATFORM_EVENTS_STUDENT","Action","_a","_b","handleTableSegmentClick","launcherData","tableData","segmentedCardDims","tableCardDims","_c","IndicatorType","jsx","TablesCard","FlexView","Text","Fragment","SHOW_PICK_A_LEVEL_TOOLTIP_AFTER_MS","SHOW_PICK_A_LEVEL_NUDGE_AFTER_MS","startAnimationOnLabelAgain","START_ANIMATING_CLONED_ELEM","goToTableLauncher","TABLE_CARD_INDEX","GO_TO_TABLE_LAUNCHER_DURATION_MS","showNudge","SHOW_CLICK_TABLE_NUDGE_AFTER_MS","animateLabel","startJourney","tablesData","isTutorialOnboardingDone","paginationList","carouselNextBtnRef","tablePaginationRef","_d","labelDims","_e","S.Indicator","SHOW_INITIAL_COACHMARK_AFTER_MS","SHOW_INITIAL_TOOLTIP_AFTER_MS","_f","IconButton","CaratRightIcon","GAME_LAUNCHER_ANALYTICS_EVENTS","_g","PUZZLE_CARD_INDEX","tableInfo"],"mappings":"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"}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
var E = /* @__PURE__ */ ((R) => (R.CIRCLE_ACTIVITIES_INTRO_JOURNEY = "CIRCLE_ACTIVITIES_INTRO_JOURNEY", R.CIRCLE_LEADERBOARD_INTRO_JOURNEY = "CIRCLE_LEADERBOARD_INTRO_JOURNEY", R.CIRCLE_POINTS_REWARD_JOURNEY = "CIRCLE_POINTS_REWARD_JOURNEY", R.CIRCLE_STREAK_UPDATE_JOURNEY = "CIRCLE_STREAK_UPDATE_JOURNEY", R.CIRCLE_TUTORIAL_JOURNEY = "CIRCLE_TUTORIAL_JOURNEY", R))(E || {});
|
1
|
+
var E = /* @__PURE__ */ ((R) => (R.CIRCLE_ACTIVITIES_INTRO_JOURNEY = "CIRCLE_ACTIVITIES_INTRO_JOURNEY", R.CIRCLE_LEADERBOARD_INTRO_JOURNEY = "CIRCLE_LEADERBOARD_INTRO_JOURNEY", R.CIRCLE_POINTS_REWARD_JOURNEY = "CIRCLE_POINTS_REWARD_JOURNEY", R.CIRCLE_STREAK_UPDATE_JOURNEY = "CIRCLE_STREAK_UPDATE_JOURNEY", R.CIRCLE_TUTORIAL_JOURNEY = "CIRCLE_TUTORIAL_JOURNEY", R.CIRCLE_TABLES_INTRO_JOURNEY = "CIRCLE_TABLES_INTRO_JOURNEY", R))(E || {});
|
2
2
|
export {
|
3
3
|
E as JOURNEY_ID_STUDENT
|
4
4
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"journey-id-student.js","sources":["../../../../src/features/journey/journey-id/journey-id-student.ts"],"sourcesContent":["export enum JOURNEY_ID_STUDENT {\n CIRCLE_ACTIVITIES_INTRO_JOURNEY = 'CIRCLE_ACTIVITIES_INTRO_JOURNEY',\n CIRCLE_LEADERBOARD_INTRO_JOURNEY = 'CIRCLE_LEADERBOARD_INTRO_JOURNEY',\n CIRCLE_POINTS_REWARD_JOURNEY = 'CIRCLE_POINTS_REWARD_JOURNEY',\n CIRCLE_STREAK_UPDATE_JOURNEY = 'CIRCLE_STREAK_UPDATE_JOURNEY',\n CIRCLE_TUTORIAL_JOURNEY = 'CIRCLE_TUTORIAL_JOURNEY',\n}\n"],"names":["JOURNEY_ID_STUDENT"],"mappings":"AAAY,IAAAA,sBAAAA,OACVA,EAAA,kCAAkC,mCAClCA,EAAA,mCAAmC,oCACnCA,EAAA,+BAA+B,gCAC/BA,EAAA,+BAA+B,gCAC/BA,EAAA,0BAA0B,
|
1
|
+
{"version":3,"file":"journey-id-student.js","sources":["../../../../src/features/journey/journey-id/journey-id-student.ts"],"sourcesContent":["export enum JOURNEY_ID_STUDENT {\n CIRCLE_ACTIVITIES_INTRO_JOURNEY = 'CIRCLE_ACTIVITIES_INTRO_JOURNEY',\n CIRCLE_LEADERBOARD_INTRO_JOURNEY = 'CIRCLE_LEADERBOARD_INTRO_JOURNEY',\n CIRCLE_POINTS_REWARD_JOURNEY = 'CIRCLE_POINTS_REWARD_JOURNEY',\n CIRCLE_STREAK_UPDATE_JOURNEY = 'CIRCLE_STREAK_UPDATE_JOURNEY',\n CIRCLE_TUTORIAL_JOURNEY = 'CIRCLE_TUTORIAL_JOURNEY',\n CIRCLE_TABLES_INTRO_JOURNEY = 'CIRCLE_TABLES_INTRO_JOURNEY',\n}\n"],"names":["JOURNEY_ID_STUDENT"],"mappings":"AAAY,IAAAA,sBAAAA,OACVA,EAAA,kCAAkC,mCAClCA,EAAA,mCAAmC,oCACnCA,EAAA,+BAA+B,gCAC/BA,EAAA,+BAA+B,gCAC/BA,EAAA,0BAA0B,2BAC1BA,EAAA,8BAA8B,+BANpBA,IAAAA,KAAA,CAAA,CAAA;"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
const e = (T) => {
|
2
|
+
const E = {
|
3
|
+
STUDENT: "RED",
|
4
|
+
TEACHER: "ORANGE_2"
|
5
|
+
};
|
6
|
+
return T >= 50 ? (E.STUDENT = "GREEN_4", E.TEACHER = "GREEN_2") : T >= 25 && (E.STUDENT = "YELLOW_4", E.TEACHER = "YELLOW_2"), E;
|
7
|
+
};
|
8
|
+
export {
|
9
|
+
e as getMeterColor
|
10
|
+
};
|
11
|
+
//# sourceMappingURL=helper.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"helper.js","sources":["../../../src/features/talk-meter/helper.ts"],"sourcesContent":["import type { TColorNames, TUserTypes } from '../ui/types';\n\nconst getMeterColor = (stdRatio: number) => {\n const COLOR_MAP: Record<TUserTypes, TColorNames> = {\n STUDENT: 'RED',\n TEACHER: 'ORANGE_2',\n };\n\n if (stdRatio >= 50) {\n COLOR_MAP.STUDENT = 'GREEN_4';\n COLOR_MAP.TEACHER = 'GREEN_2';\n } else if (stdRatio >= 25) {\n COLOR_MAP.STUDENT = 'YELLOW_4';\n COLOR_MAP.TEACHER = 'YELLOW_2';\n }\n\n return COLOR_MAP;\n};\n\nexport { getMeterColor };\n"],"names":["getMeterColor","stdRatio","COLOR_MAP"],"mappings":"AAEM,MAAAA,IAAgB,CAACC,MAAqB;AAC1C,QAAMC,IAA6C;AAAA,IACjD,SAAS;AAAA,IACT,SAAS;AAAA,EAAA;AAGX,SAAID,KAAY,MACdC,EAAU,UAAU,WACpBA,EAAU,UAAU,aACXD,KAAY,OACrBC,EAAU,UAAU,YACpBA,EAAU,UAAU,aAGfA;AACT;"}
|
@@ -0,0 +1,123 @@
|
|
1
|
+
import { useAVActions as se, useRemotePeers as ne, useAVMessage as ce } from "@cuemath/av";
|
2
|
+
import { useCallback as u, useState as J, useRef as B, useMemo as ae, useEffect as M } from "react";
|
3
|
+
import { useUIContext as re } from "../../ui/context/context.js";
|
4
|
+
const v = 1e3 * 60, le = (Q) => {
|
5
|
+
var Y, j;
|
6
|
+
const {
|
7
|
+
userType: X,
|
8
|
+
studentId: I,
|
9
|
+
teacherId: C,
|
10
|
+
classStartTime: r,
|
11
|
+
avPackageEnabled: P,
|
12
|
+
teacherClassroomId: U,
|
13
|
+
teacherTalkTime: D,
|
14
|
+
studentTalkTime: p,
|
15
|
+
lastBatchReceivedNo: i,
|
16
|
+
canDisplayBatch: k,
|
17
|
+
classDuration: S = 0,
|
18
|
+
onMessageReceive: L,
|
19
|
+
onDismissMeter: y
|
20
|
+
} = Q, _ = Math.round(0.36 * (S / 60)), f = Math.round(0.73 * (S / 60)), g = S / 60 - 5, d = u(
|
21
|
+
(e, t) => {
|
22
|
+
const o = Date.now(), m = e.getTime(), te = Math.abs(o - m), n = Math.floor(te / 1e3 / 60), q = (t === 0 || t === 1) && n >= _ - 2 && n <= _, z = (t === 1 || t === 2) && n >= f - 2 && n <= f, G = n >= g;
|
23
|
+
let A = 0, R = !1;
|
24
|
+
return G ? A = 0 : z ? (A = 2, R = n >= f) : q && (A = 1, R = n >= _), {
|
25
|
+
lastMinutesLeft: G,
|
26
|
+
canSendBatch: q || z,
|
27
|
+
batchNoToSend: A,
|
28
|
+
minutes: n,
|
29
|
+
canDisplay: R
|
30
|
+
};
|
31
|
+
},
|
32
|
+
[_, f, g]
|
33
|
+
), [c, H] = J(!1), [Z, b] = J(!1), { onEvent: K } = re(), { sendMessage: O } = se(), V = ne(), w = (Y = V.find((e) => e.userId === I)) == null ? void 0 : Y.id, x = (j = V.find((e) => e.userType === "teacher")) == null ? void 0 : j.id, s = X === "TEACHER", T = B(D), a = B(p), F = B(0), W = a.current + T.current, $ = Math.ceil(a.current * 100 / W) || 0, ee = Math.floor(T.current * 100 / W) || 0, h = ae(
|
34
|
+
() => ({
|
35
|
+
teacher_classroom_id: U,
|
36
|
+
teacher_id: C,
|
37
|
+
studentId: I
|
38
|
+
}),
|
39
|
+
[I, U, C]
|
40
|
+
), N = u(() => {
|
41
|
+
b(!0), H(!1), y();
|
42
|
+
}, [y]), E = u(
|
43
|
+
(e, t = {}) => {
|
44
|
+
K(e, { ...h, ...t });
|
45
|
+
},
|
46
|
+
[K, h]
|
47
|
+
), l = u(
|
48
|
+
(e) => {
|
49
|
+
const t = s ? "TEACHER_TALK_TIME_UPDATED" : "STUDENT_TALK_TIME_UPDATED", o = s ? { teacher_speech_time: T.current } : { student_speech_time: a.current };
|
50
|
+
E("TALK_METER_BATCH_SENT", {
|
51
|
+
batch_no: e,
|
52
|
+
...o
|
53
|
+
}), P && O(
|
54
|
+
t,
|
55
|
+
{
|
56
|
+
...h,
|
57
|
+
...o,
|
58
|
+
batch_no: e
|
59
|
+
},
|
60
|
+
s ? w : x
|
61
|
+
), F.current = a.current;
|
62
|
+
},
|
63
|
+
[P, s, h, O, w, x, E]
|
64
|
+
);
|
65
|
+
return ce({
|
66
|
+
type: s ? "STUDENT_TALK_TIME_UPDATED" : "TEACHER_TALK_TIME_UPDATED",
|
67
|
+
onMessage: u(
|
68
|
+
(e, t) => {
|
69
|
+
L(t), s && l(t.batch_no);
|
70
|
+
},
|
71
|
+
[s, L, l]
|
72
|
+
)
|
73
|
+
}), M(() => {
|
74
|
+
c || (T.current = D, a.current = p);
|
75
|
+
}, [D, p, c]), M(() => {
|
76
|
+
let e;
|
77
|
+
return c && (e = setTimeout(() => {
|
78
|
+
N();
|
79
|
+
}, v)), () => {
|
80
|
+
e && clearTimeout(e);
|
81
|
+
};
|
82
|
+
}, [c, N]), M(() => {
|
83
|
+
let e;
|
84
|
+
return r && k && !c && (e = setInterval(() => {
|
85
|
+
const { canDisplay: t } = d(r, i);
|
86
|
+
t && (E("TALK_METER_BATCH_DISPLAYED", {
|
87
|
+
student_speech_time: a.current,
|
88
|
+
teacher_speech_time: T.current,
|
89
|
+
batch_no: i
|
90
|
+
}), H(!0), b(!1));
|
91
|
+
}, v / 30)), () => {
|
92
|
+
e && clearInterval(e);
|
93
|
+
};
|
94
|
+
}, [
|
95
|
+
c,
|
96
|
+
k,
|
97
|
+
r,
|
98
|
+
d,
|
99
|
+
i,
|
100
|
+
E
|
101
|
+
]), M(() => {
|
102
|
+
let e;
|
103
|
+
return r && !s && (e = setInterval(() => {
|
104
|
+
const { lastMinutesLeft: t, canSendBatch: o, batchNoToSend: m } = d(
|
105
|
+
r,
|
106
|
+
i
|
107
|
+
);
|
108
|
+
t ? F.current !== a.current && l(m) : o && l(m);
|
109
|
+
}, v / 6)), () => {
|
110
|
+
e && clearInterval(e);
|
111
|
+
};
|
112
|
+
}, [r, d, s, i, l]), {
|
113
|
+
canAnimateIn: c,
|
114
|
+
canAnimateOut: Z,
|
115
|
+
stdRatio: $,
|
116
|
+
tchRatio: ee,
|
117
|
+
handleDismiss: N
|
118
|
+
};
|
119
|
+
};
|
120
|
+
export {
|
121
|
+
le as useTalkMeter
|
122
|
+
};
|
123
|
+
//# sourceMappingURL=use-talk-meter.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-talk-meter.js","sources":["../../../../src/features/talk-meter/hooks/use-talk-meter.ts"],"sourcesContent":["import type { ITalkMeterHook, TMessageData } from '../talk-meter-types';\n\nimport { useAVActions, useAVMessage, useRemotePeers } from '@cuemath/av';\nimport { useRef, useMemo, useCallback, useState, useEffect } from 'react';\n\nimport { useUIContext } from '../../ui/context/context';\n\nconst ONE_MINUTE = 1000 * 60;\n\nexport const useTalkMeter = (props: ITalkMeterHook) => {\n const {\n userType,\n studentId,\n teacherId,\n classStartTime,\n avPackageEnabled,\n teacherClassroomId,\n teacherTalkTime,\n studentTalkTime,\n lastBatchReceivedNo,\n canDisplayBatch,\n classDuration = 0,\n onMessageReceive,\n onDismissMeter,\n } = props;\n\n const BATCH_ONE_MINUTE = Math.round(0.36 * (classDuration / 60));\n const BATCH_TWO_MINUTE = Math.round(0.73 * (classDuration / 60));\n const LAST_MINUTES = classDuration / 60 - 5;\n\n const getBatchToSendInfo = useCallback(\n (classStartFrom: Date, batchSeen: number) => {\n const now = Date.now();\n const classTS = classStartFrom.getTime();\n const diff = Math.abs(now - classTS);\n const minutes = Math.floor(diff / 1000 / 60);\n const canSendFirstBatch =\n (batchSeen === 0 || batchSeen === 1) &&\n minutes >= BATCH_ONE_MINUTE - 2 &&\n minutes <= BATCH_ONE_MINUTE;\n const canSendSecondBatch =\n (batchSeen === 1 || batchSeen === 2) &&\n minutes >= BATCH_TWO_MINUTE - 2 &&\n minutes <= BATCH_TWO_MINUTE;\n\n const lastMinutesLeft = minutes >= LAST_MINUTES;\n\n let batchNo = 0;\n let canDisplayTalkBatch = false;\n\n if (lastMinutesLeft) {\n batchNo = 0;\n } else if (canSendSecondBatch) {\n batchNo = 2;\n canDisplayTalkBatch = minutes >= BATCH_TWO_MINUTE;\n } else if (canSendFirstBatch) {\n batchNo = 1;\n canDisplayTalkBatch = minutes >= BATCH_ONE_MINUTE;\n }\n\n return {\n lastMinutesLeft,\n canSendBatch: canSendFirstBatch || canSendSecondBatch,\n batchNoToSend: batchNo,\n minutes,\n canDisplay: canDisplayTalkBatch,\n };\n },\n [BATCH_ONE_MINUTE, BATCH_TWO_MINUTE, LAST_MINUTES],\n );\n\n const [canAnimateIn, setCanAnimateIn] = useState(false);\n const [canAnimateOut, setCanAnimateOut] = useState(false);\n\n const { onEvent } = useUIContext();\n const { sendMessage } = useAVActions();\n\n const remotePeers = useRemotePeers();\n const studentPeerId = remotePeers.find(peer => peer.userId === studentId)?.id;\n const teacherPeerId = remotePeers.find(p => p.userType === 'teacher')?.id;\n\n const isTeacher = userType === 'TEACHER';\n\n const teacherTalkRef = useRef(teacherTalkTime);\n const studentTalkRef = useRef(studentTalkTime);\n const prevSentRef = useRef(0);\n\n const totalTalkTime = studentTalkRef.current + teacherTalkRef.current;\n const stdRatio = Math.ceil((studentTalkRef.current * 100) / totalTalkTime) || 0;\n const tchRatio = Math.floor((teacherTalkRef.current * 100) / totalTalkTime) || 0;\n\n const payload = useMemo(\n () => ({\n teacher_classroom_id: teacherClassroomId,\n teacher_id: teacherId,\n studentId: studentId,\n }),\n [studentId, teacherClassroomId, teacherId],\n );\n\n const handleDismiss = useCallback(() => {\n setCanAnimateOut(true);\n setCanAnimateIn(false);\n onDismissMeter();\n }, [onDismissMeter]);\n\n const trackEvent = useCallback(\n (eventName: string, data = {}) => {\n onEvent(eventName, { ...payload, ...data });\n },\n [onEvent, payload],\n );\n\n const sendBatch = useCallback(\n (batchNo: number) => {\n const EVENT_NAME = isTeacher ? 'TEACHER_TALK_TIME_UPDATED' : 'STUDENT_TALK_TIME_UPDATED';\n const speechTimePayload = isTeacher\n ? { teacher_speech_time: teacherTalkRef.current }\n : { student_speech_time: studentTalkRef.current };\n\n trackEvent('TALK_METER_BATCH_SENT', {\n batch_no: batchNo,\n ...speechTimePayload,\n });\n if (avPackageEnabled) {\n sendMessage(\n EVENT_NAME,\n {\n ...payload,\n ...speechTimePayload,\n batch_no: batchNo,\n },\n isTeacher ? studentPeerId : teacherPeerId,\n );\n }\n\n prevSentRef.current = studentTalkRef.current;\n },\n [avPackageEnabled, isTeacher, payload, sendMessage, studentPeerId, teacherPeerId, trackEvent],\n );\n\n useAVMessage<TMessageData>({\n type: isTeacher ? 'STUDENT_TALK_TIME_UPDATED' : 'TEACHER_TALK_TIME_UPDATED',\n onMessage: useCallback(\n (_, data) => {\n onMessageReceive(data);\n if (isTeacher) sendBatch(data.batch_no);\n },\n [isTeacher, onMessageReceive, sendBatch],\n ),\n });\n\n useEffect(() => {\n if (!canAnimateIn) {\n teacherTalkRef.current = teacherTalkTime;\n studentTalkRef.current = studentTalkTime;\n }\n }, [teacherTalkTime, studentTalkTime, canAnimateIn]);\n\n useEffect(() => {\n let dismissTimer: NodeJS.Timeout | undefined;\n\n if (canAnimateIn) {\n dismissTimer = setTimeout(() => {\n handleDismiss();\n }, ONE_MINUTE);\n }\n\n return () => {\n if (dismissTimer) clearTimeout(dismissTimer);\n };\n }, [canAnimateIn, handleDismiss]);\n\n useEffect(() => {\n let interval: NodeJS.Timeout | undefined;\n\n if (classStartTime && canDisplayBatch && !canAnimateIn) {\n interval = setInterval(() => {\n const { canDisplay } = getBatchToSendInfo(classStartTime, lastBatchReceivedNo);\n\n if (canDisplay) {\n trackEvent('TALK_METER_BATCH_DISPLAYED', {\n student_speech_time: studentTalkRef.current,\n teacher_speech_time: teacherTalkRef.current,\n batch_no: lastBatchReceivedNo,\n });\n setCanAnimateIn(true);\n setCanAnimateOut(false);\n }\n }, ONE_MINUTE / 30);\n }\n\n return () => {\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [\n canAnimateIn,\n canDisplayBatch,\n classStartTime,\n getBatchToSendInfo,\n lastBatchReceivedNo,\n trackEvent,\n ]);\n\n useEffect(() => {\n let interval: NodeJS.Timeout | undefined;\n\n if (classStartTime && !isTeacher) {\n interval = setInterval(() => {\n const { lastMinutesLeft, canSendBatch, batchNoToSend } = getBatchToSendInfo(\n classStartTime,\n lastBatchReceivedNo,\n );\n\n if (lastMinutesLeft) {\n if (prevSentRef.current !== studentTalkRef.current) {\n sendBatch(batchNoToSend);\n }\n } else if (canSendBatch) {\n sendBatch(batchNoToSend);\n }\n }, ONE_MINUTE / 6);\n }\n\n return () => {\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [classStartTime, getBatchToSendInfo, isTeacher, lastBatchReceivedNo, sendBatch]);\n\n return {\n canAnimateIn,\n canAnimateOut,\n stdRatio,\n tchRatio,\n handleDismiss,\n };\n};\n"],"names":["ONE_MINUTE","useTalkMeter","props","userType","studentId","teacherId","classStartTime","avPackageEnabled","teacherClassroomId","teacherTalkTime","studentTalkTime","lastBatchReceivedNo","canDisplayBatch","classDuration","onMessageReceive","onDismissMeter","BATCH_ONE_MINUTE","BATCH_TWO_MINUTE","LAST_MINUTES","getBatchToSendInfo","useCallback","classStartFrom","batchSeen","now","classTS","diff","minutes","canSendFirstBatch","canSendSecondBatch","lastMinutesLeft","batchNo","canDisplayTalkBatch","canAnimateIn","setCanAnimateIn","useState","canAnimateOut","setCanAnimateOut","onEvent","useUIContext","sendMessage","useAVActions","remotePeers","useRemotePeers","studentPeerId","_a","peer","teacherPeerId","_b","p","isTeacher","teacherTalkRef","useRef","studentTalkRef","prevSentRef","totalTalkTime","stdRatio","tchRatio","payload","useMemo","handleDismiss","trackEvent","eventName","data","sendBatch","EVENT_NAME","speechTimePayload","useAVMessage","_","useEffect","dismissTimer","interval","canDisplay","canSendBatch","batchNoToSend"],"mappings":";;;AAOA,MAAMA,IAAa,MAAO,IAEbC,KAAe,CAACC,MAA0B;;AAC/C,QAAA;AAAA,IACJ,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,kBAAAC;AAAA,IACA,gBAAAC;AAAA,EACE,IAAAb,GAEEc,IAAmB,KAAK,MAAM,QAAQH,IAAgB,GAAG,GACzDI,IAAmB,KAAK,MAAM,QAAQJ,IAAgB,GAAG,GACzDK,IAAeL,IAAgB,KAAK,GAEpCM,IAAqBC;AAAA,IACzB,CAACC,GAAsBC,MAAsB;AACrC,YAAAC,IAAM,KAAK,OACXC,IAAUH,EAAe,WACzBI,KAAO,KAAK,IAAIF,IAAMC,CAAO,GAC7BE,IAAU,KAAK,MAAMD,KAAO,MAAO,EAAE,GACrCE,KACHL,MAAc,KAAKA,MAAc,MAClCI,KAAWV,IAAmB,KAC9BU,KAAWV,GACPY,KACHN,MAAc,KAAKA,MAAc,MAClCI,KAAWT,IAAmB,KAC9BS,KAAWT,GAEPY,IAAkBH,KAAWR;AAEnC,UAAIY,IAAU,GACVC,IAAsB;AAE1B,aAAIF,IACQC,IAAA,IACDF,KACCE,IAAA,GACVC,IAAsBL,KAAWT,KACxBU,MACCG,IAAA,GACVC,IAAsBL,KAAWV,IAG5B;AAAA,QACL,iBAAAa;AAAA,QACA,cAAcF,KAAqBC;AAAA,QACnC,eAAeE;AAAA,QACf,SAAAJ;AAAA,QACA,YAAYK;AAAA,MAAA;AAAA,IAEhB;AAAA,IACA,CAACf,GAAkBC,GAAkBC,CAAY;AAAA,EAAA,GAG7C,CAACc,GAAcC,CAAe,IAAIC,EAAS,EAAK,GAChD,CAACC,GAAeC,CAAgB,IAAIF,EAAS,EAAK,GAElD,EAAE,SAAAG,MAAYC,MACd,EAAE,aAAAC,MAAgBC,MAElBC,IAAcC,MACdC,KAAgBC,IAAAH,EAAY,KAAK,OAAQI,EAAK,WAAWzC,CAAS,MAAlD,gBAAAwC,EAAqD,IACrEE,KAAgBC,IAAAN,EAAY,KAAK,OAAKO,EAAE,aAAa,SAAS,MAA9C,gBAAAD,EAAiD,IAEjEE,IAAY9C,MAAa,WAEzB+C,IAAiBC,EAAO1C,CAAe,GACvC2C,IAAiBD,EAAOzC,CAAe,GACvC2C,IAAcF,EAAO,CAAC,GAEtBG,IAAgBF,EAAe,UAAUF,EAAe,SACxDK,IAAW,KAAK,KAAMH,EAAe,UAAU,MAAOE,CAAa,KAAK,GACxEE,KAAW,KAAK,MAAON,EAAe,UAAU,MAAOI,CAAa,KAAK,GAEzEG,IAAUC;AAAA,IACd,OAAO;AAAA,MACL,sBAAsBlD;AAAA,MACtB,YAAYH;AAAA,MACZ,WAAAD;AAAA,IAAA;AAAA,IAEF,CAACA,GAAWI,GAAoBH,CAAS;AAAA,EAAA,GAGrCsD,IAAgBvC,EAAY,MAAM;AACtC,IAAAgB,EAAiB,EAAI,GACrBH,EAAgB,EAAK,GACNlB;EAAA,GACd,CAACA,CAAc,CAAC,GAEb6C,IAAaxC;AAAA,IACjB,CAACyC,GAAmBC,IAAO,OAAO;AAChC,MAAAzB,EAAQwB,GAAW,EAAE,GAAGJ,GAAS,GAAGK,EAAM,CAAA;AAAA,IAC5C;AAAA,IACA,CAACzB,GAASoB,CAAO;AAAA,EAAA,GAGbM,IAAY3C;AAAA,IAChB,CAACU,MAAoB;AACb,YAAAkC,IAAaf,IAAY,8BAA8B,6BACvDgB,IAAoBhB,IACtB,EAAE,qBAAqBC,EAAe,QACtC,IAAA,EAAE,qBAAqBE,EAAe;AAE1C,MAAAQ,EAAW,yBAAyB;AAAA,QAClC,UAAU9B;AAAA,QACV,GAAGmC;AAAA,MAAA,CACJ,GACG1D,KACFgC;AAAA,QACEyB;AAAA,QACA;AAAA,UACE,GAAGP;AAAA,UACH,GAAGQ;AAAA,UACH,UAAUnC;AAAA,QACZ;AAAA,QACAmB,IAAYN,IAAgBG;AAAA,MAAA,GAIhCO,EAAY,UAAUD,EAAe;AAAA,IACvC;AAAA,IACA,CAAC7C,GAAkB0C,GAAWQ,GAASlB,GAAaI,GAAeG,GAAec,CAAU;AAAA,EAAA;AAGnE,SAAAM,GAAA;AAAA,IACzB,MAAMjB,IAAY,8BAA8B;AAAA,IAChD,WAAW7B;AAAA,MACT,CAAC+C,GAAGL,MAAS;AACX,QAAAhD,EAAiBgD,CAAI,GACjBb,KAAqBc,EAAAD,EAAK,QAAQ;AAAA,MACxC;AAAA,MACA,CAACb,GAAWnC,GAAkBiD,CAAS;AAAA,IACzC;AAAA,EAAA,CACD,GAEDK,EAAU,MAAM;AACd,IAAKpC,MACHkB,EAAe,UAAUzC,GACzB2C,EAAe,UAAU1C;AAAA,EAE1B,GAAA,CAACD,GAAiBC,GAAiBsB,CAAY,CAAC,GAEnDoC,EAAU,MAAM;AACV,QAAAC;AAEJ,WAAIrC,MACFqC,IAAe,WAAW,MAAM;AAChB,MAAAV;OACb3D,CAAU,IAGR,MAAM;AACP,MAAAqE,kBAA2BA,CAAY;AAAA,IAAA;AAAA,EAC7C,GACC,CAACrC,GAAc2B,CAAa,CAAC,GAEhCS,EAAU,MAAM;AACV,QAAAE;AAEA,WAAAhE,KAAkBM,KAAmB,CAACoB,MACxCsC,IAAW,YAAY,MAAM;AAC3B,YAAM,EAAE,YAAAC,EAAe,IAAApD,EAAmBb,GAAgBK,CAAmB;AAE7E,MAAI4D,MACFX,EAAW,8BAA8B;AAAA,QACvC,qBAAqBR,EAAe;AAAA,QACpC,qBAAqBF,EAAe;AAAA,QACpC,UAAUvC;AAAA,MAAA,CACX,GACDsB,EAAgB,EAAI,GACpBG,EAAiB,EAAK;AAAA,IACxB,GACCpC,IAAa,EAAE,IAGb,MAAM;AACX,MAAIsE,KACF,cAAcA,CAAQ;AAAA,IACxB;AAAA,EACF,GACC;AAAA,IACDtC;AAAA,IACApB;AAAA,IACAN;AAAA,IACAa;AAAA,IACAR;AAAA,IACAiD;AAAA,EAAA,CACD,GAEDQ,EAAU,MAAM;AACV,QAAAE;AAEA,WAAAhE,KAAkB,CAAC2C,MACrBqB,IAAW,YAAY,MAAM;AAC3B,YAAM,EAAE,iBAAAzC,GAAiB,cAAA2C,GAAc,eAAAC,EAAkB,IAAAtD;AAAA,QACvDb;AAAA,QACAK;AAAA,MAAA;AAGF,MAAIkB,IACEwB,EAAY,YAAYD,EAAe,WACzCW,EAAUU,CAAa,IAEhBD,KACTT,EAAUU,CAAa;AAAA,IACzB,GACCzE,IAAa,CAAC,IAGZ,MAAM;AACX,MAAIsE,KACF,cAAcA,CAAQ;AAAA,IACxB;AAAA,EACF,GACC,CAAChE,GAAgBa,GAAoB8B,GAAWtC,GAAqBoD,CAAS,CAAC,GAE3E;AAAA,IACL,cAAA/B;AAAA,IACA,eAAAG;AAAA,IACA,UAAAoB;AAAA,IACA,UAAAC;AAAA,IACA,eAAAG;AAAA,EAAA;AAEJ;"}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { jsx as c } from "react/jsx-runtime";
|
2
|
+
import { useRef as l, useCallback as u, useEffect as p } from "react";
|
3
|
+
import f, { keyframes as d, css as n } from "styled-components";
|
4
|
+
import { SOUNDS as y } from "../../../assets/sounds/sounds.js";
|
5
|
+
import { useUIContext as g } from "../../ui/context/context.js";
|
6
|
+
import x from "../../ui/layout/flex-view.js";
|
7
|
+
const A = d`
|
8
|
+
0% {
|
9
|
+
opacity: 1;
|
10
|
+
transform: scale(1);
|
11
|
+
}
|
12
|
+
50% {
|
13
|
+
opacity: 0;
|
14
|
+
transform: scale(1.10) scaleY(1.15);
|
15
|
+
}
|
16
|
+
100% {
|
17
|
+
opacity: 0;
|
18
|
+
transform: scale(1.10) scaleY(1.15);
|
19
|
+
}
|
20
|
+
`, h = f(x)(
|
21
|
+
({ $delay: i }) => n`
|
22
|
+
height: 104px;
|
23
|
+
width: calc(100% - 24px);
|
24
|
+
position: absolute;
|
25
|
+
border-radius: 12px;
|
26
|
+
z-index: 0;
|
27
|
+
left: 0;
|
28
|
+
right: 0;
|
29
|
+
margin-left: auto;
|
30
|
+
margin-right: auto;
|
31
|
+
${i > 0 && n`
|
32
|
+
animation-name: ${A};
|
33
|
+
animation-delay: ${i || 0}ms;
|
34
|
+
animation-duration: 1000ms;
|
35
|
+
animation-iteration-count: infinite;
|
36
|
+
animation-timing-function: ease-in;
|
37
|
+
`};
|
38
|
+
`
|
39
|
+
), L = (i) => {
|
40
|
+
const { delay: o, color: s, withAudio: e = !0 } = i, { onEvent: r } = g(), m = l(new Audio(y.ALERT)), a = u(() => {
|
41
|
+
try {
|
42
|
+
m.current.play();
|
43
|
+
} catch (t) {
|
44
|
+
r("debug_log", {
|
45
|
+
type: "UNABLE TO PLAY SOUND IN TALK METER",
|
46
|
+
error: JSON.stringify(t)
|
47
|
+
});
|
48
|
+
}
|
49
|
+
}, [r]);
|
50
|
+
return p(() => {
|
51
|
+
let t = null;
|
52
|
+
return e && (t = setTimeout(() => {
|
53
|
+
a();
|
54
|
+
}, o)), () => {
|
55
|
+
t && clearTimeout(t);
|
56
|
+
};
|
57
|
+
}, [e, o, a]), /* @__PURE__ */ c(h, { $delay: o, $borderColor: s });
|
58
|
+
};
|
59
|
+
export {
|
60
|
+
L as default
|
61
|
+
};
|
62
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/features/talk-meter/ripple/index.tsx"],"sourcesContent":["import type { TColorNames } from '../../ui/types';\nimport type { FC } from 'react';\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport styled, { css, keyframes } from 'styled-components';\n\nimport { SOUNDS } from '../../../assets/sounds/sounds';\nimport { useUIContext } from '../../ui/context/context';\nimport FlexView from '../../ui/layout/flex-view';\n\nconst rippleAnimation = keyframes`\n0% {\n opacity: 1;\n transform: scale(1);\n}\n50% {\n opacity: 0;\n transform: scale(1.10) scaleY(1.15);\n}\n100% {\n opacity: 0;\n transform: scale(1.10) scaleY(1.15);\n}\n`;\n\nconst RippleView = styled(FlexView)<{ $delay: number }>(\n ({ $delay }) => css`\n height: 104px;\n width: calc(100% - 24px);\n position: absolute;\n border-radius: 12px;\n z-index: 0;\n left: 0;\n right: 0;\n margin-left: auto;\n margin-right: auto;\n ${$delay > 0 &&\n css`\n animation-name: ${rippleAnimation};\n animation-delay: ${$delay || 0}ms;\n animation-duration: 1000ms;\n animation-iteration-count: infinite;\n animation-timing-function: ease-in;\n `};\n `,\n);\n\ninterface IRipple {\n delay: number;\n color: TColorNames;\n withAudio?: boolean;\n}\n\nconst Ripple: FC<IRipple> = props => {\n const { delay, color, withAudio = true } = props;\n const { onEvent: trackEvent } = useUIContext();\n const audioRef = useRef(new Audio(SOUNDS.ALERT));\n\n const playAudio = useCallback(() => {\n try {\n audioRef.current.play();\n } catch (err) {\n trackEvent('debug_log', {\n type: 'UNABLE TO PLAY SOUND IN TALK METER',\n error: JSON.stringify(err),\n });\n }\n }, [trackEvent]);\n\n useEffect(() => {\n let audioTimer: NodeJS.Timeout | null = null;\n\n if (withAudio) {\n audioTimer = setTimeout(() => {\n playAudio();\n }, delay);\n }\n\n return () => {\n if (audioTimer) clearTimeout(audioTimer);\n };\n }, [withAudio, delay, playAudio]);\n\n return <RippleView $delay={delay} $borderColor={color} />;\n};\n\nexport default Ripple;\n"],"names":["rippleAnimation","keyframes","RippleView","styled","FlexView","$delay","css","Ripple","props","delay","color","withAudio","trackEvent","useUIContext","audioRef","useRef","SOUNDS","playAudio","useCallback","err","useEffect","audioTimer","jsx"],"mappings":";;;;;;AAUA,MAAMA,IAAkBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAelBC,IAAaC,EAAOC,CAAQ;AAAA,EAChC,CAAC,EAAE,QAAAC,EAAa,MAAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUZD,IAAS,KACXC;AAAA,wBACoBN,CAAe;AAAA,yBACdK,KAAU,CAAC;AAAA;AAAA;AAAA;AAAA,KAI/B;AAAA;AAEL,GAQME,IAAsB,CAASC,MAAA;AACnC,QAAM,EAAE,OAAAC,GAAO,OAAAC,GAAO,WAAAC,IAAY,OAASH,GACrC,EAAE,SAASI,EAAW,IAAIC,EAAa,GACvCC,IAAWC,EAAO,IAAI,MAAMC,EAAO,KAAK,CAAC,GAEzCC,IAAYC,EAAY,MAAM;AAC9B,QAAA;AACF,MAAAJ,EAAS,QAAQ;aACVK,GAAK;AACZ,MAAAP,EAAW,aAAa;AAAA,QACtB,MAAM;AAAA,QACN,OAAO,KAAK,UAAUO,CAAG;AAAA,MAAA,CAC1B;AAAA,IACH;AAAA,EAAA,GACC,CAACP,CAAU,CAAC;AAEf,SAAAQ,EAAU,MAAM;AACd,QAAIC,IAAoC;AAExC,WAAIV,MACFU,IAAa,WAAW,MAAM;AAClB,MAAAJ;OACTR,CAAK,IAGH,MAAM;AACP,MAAAY,kBAAyBA,CAAU;AAAA,IAAA;AAAA,EAExC,GAAA,CAACV,GAAWF,GAAOQ,CAAS,CAAC,GAExB,gBAAAK,EAAApB,GAAA,EAAW,QAAQO,GAAO,cAAcC,EAAO,CAAA;AACzD;"}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
import o, { keyframes as a, css as t } from "styled-components";
|
2
|
+
import s from "../../assets/line-icons/icons/cross.js";
|
3
|
+
import r from "../ui/layout/flex-view.js";
|
4
|
+
const l = a`
|
5
|
+
0% {
|
6
|
+
opacity: 0;
|
7
|
+
transform: translate(0%, -100%) scale(0);
|
8
|
+
height: 0px;
|
9
|
+
}
|
10
|
+
50% {
|
11
|
+
opacity: 1;
|
12
|
+
}
|
13
|
+
100% {
|
14
|
+
opacity: 1;
|
15
|
+
transform: translate(0%, 0%) scale(1);
|
16
|
+
height: 128px;
|
17
|
+
}
|
18
|
+
`, c = a`
|
19
|
+
0% {
|
20
|
+
opacity: 1;
|
21
|
+
transform: translate(0%, 0%) scale(1);
|
22
|
+
}
|
23
|
+
100% {
|
24
|
+
opacity: 0;
|
25
|
+
transform: translate(0%, -100%) scale(1);
|
26
|
+
height: 0px;
|
27
|
+
}
|
28
|
+
`, y = o(s)`
|
29
|
+
position: absolute;
|
30
|
+
top: 15px;
|
31
|
+
right: 20px;
|
32
|
+
color: black;
|
33
|
+
width: 20px;
|
34
|
+
height: 20px;
|
35
|
+
z-index: 2;
|
36
|
+
`, f = o(r)(
|
37
|
+
({ $isTeacher: n, $animated: i, $canAnimateIn: e, $canAnimateOut: p }) => t`
|
38
|
+
width: 100%;
|
39
|
+
max-width: 336px;
|
40
|
+
|
41
|
+
${i ? `
|
42
|
+
height: 0;
|
43
|
+
opacity: 0;
|
44
|
+
display: none;
|
45
|
+
` : `
|
46
|
+
height: 100%;
|
47
|
+
opacity: 1;
|
48
|
+
display: flex;
|
49
|
+
`}
|
50
|
+
|
51
|
+
${n ? null : `
|
52
|
+
${i ? `
|
53
|
+
top: 70px;
|
54
|
+
right: 10px;
|
55
|
+
position: fixed;
|
56
|
+
` : `
|
57
|
+
top: 0;
|
58
|
+
right: 0px;
|
59
|
+
position: relative;
|
60
|
+
`}
|
61
|
+
z-index: 100;
|
62
|
+
`}
|
63
|
+
|
64
|
+
${e ? t`
|
65
|
+
animation-name: ${l};
|
66
|
+
animation-duration: 800ms;
|
67
|
+
animation-iteration-count: 1;
|
68
|
+
animation-timing-function: ease-out;
|
69
|
+
opacity: 1;
|
70
|
+
display: flex;
|
71
|
+
height: 128px;
|
72
|
+
` : null}
|
73
|
+
|
74
|
+
${p ? t`
|
75
|
+
animation-name: ${c};
|
76
|
+
animation-duration: 400ms;
|
77
|
+
animation-iteration-count: 1;
|
78
|
+
animation-timing-function: ease-out;
|
79
|
+
opacity: 0;
|
80
|
+
display: none;
|
81
|
+
height: 0px;
|
82
|
+
` : null}
|
83
|
+
`
|
84
|
+
);
|
85
|
+
export {
|
86
|
+
y as CloseIcon,
|
87
|
+
f as Wrapper
|
88
|
+
};
|
89
|
+
//# sourceMappingURL=talk-meter-styled.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"talk-meter-styled.js","sources":["../../../src/features/talk-meter/talk-meter-styled.tsx"],"sourcesContent":["import styled, { css, keyframes } from 'styled-components';\n\nimport CrossIcon from '../../assets/line-icons/icons/cross';\nimport FlexView from '../ui/layout/flex-view';\n\nconst scaleInAnim = keyframes`\n 0% {\n opacity: 0;\n transform: translate(0%, -100%) scale(0);\n height: 0px;\n }\n 50% {\n opacity: 1;\n }\n 100% {\n opacity: 1;\n transform: translate(0%, 0%) scale(1);\n height: 128px;\n }\n`;\n\nconst scaleOutAnim = keyframes`\n 0% {\n opacity: 1;\n transform: translate(0%, 0%) scale(1);\n }\n 100% {\n opacity: 0;\n transform: translate(0%, -100%) scale(1);\n height: 0px;\n }\n`;\n\nconst CloseIcon = styled(CrossIcon)`\n position: absolute;\n top: 15px;\n right: 20px;\n color: black;\n width: 20px;\n height: 20px;\n z-index: 2;\n`;\n\nconst Wrapper = styled(FlexView)<{\n $isTeacher: boolean;\n $animated: boolean;\n $canAnimateIn: boolean;\n $canAnimateOut: boolean;\n}>(\n ({ $isTeacher, $animated, $canAnimateIn, $canAnimateOut }) => css`\n width: 100%;\n max-width: 336px;\n\n ${$animated\n ? `\n height: 0;\n opacity: 0;\n display: none;\n `\n : `\n height: 100%;\n opacity: 1;\n display: flex;\n `}\n\n ${!$isTeacher\n ? `\n ${\n $animated\n ? `\n top: 70px;\n right: 10px;\n position: fixed;\n `\n : `\n top: 0;\n right: 0px;\n position: relative;\n `\n }\n z-index: 100;\n `\n : null}\n \n ${$canAnimateIn\n ? css`\n animation-name: ${scaleInAnim};\n animation-duration: 800ms;\n animation-iteration-count: 1;\n animation-timing-function: ease-out;\n opacity: 1;\n display: flex;\n height: 128px;\n `\n : null}\n\n ${$canAnimateOut\n ? css`\n animation-name: ${scaleOutAnim};\n animation-duration: 400ms;\n animation-iteration-count: 1;\n animation-timing-function: ease-out;\n opacity: 0;\n display: none;\n height: 0px;\n `\n : null}\n `,\n);\n\nexport { Wrapper, CloseIcon };\n"],"names":["scaleInAnim","keyframes","scaleOutAnim","CloseIcon","styled","CrossIcon","Wrapper","FlexView","$isTeacher","$animated","$canAnimateIn","$canAnimateOut","css"],"mappings":";;;AAKA,MAAMA,IAAcC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgBdC,IAAeD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYfE,IAAYC,EAAOC,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAU5BC,IAAUF,EAAOG,CAAQ;AAAA,EAM7B,CAAC,EAAE,YAAAC,GAAY,WAAAC,GAAW,eAAAC,GAAe,gBAAAC,QAAqBC;AAAA;AAAA;AAAA;AAAA,MAI1DH,IACE;AAAA;AAAA;AAAA;AAAA,cAKA;AAAA;AAAA;AAAA;AAAA,WAIG;AAAA;AAAA,MAEJD,IAiBC,OAhBA;AAAA,cAEMC,IACI;AAAA;AAAA;AAAA;AAAA,oBAKA;AAAA;AAAA;AAAA;AAAA,iBAKN;AAAA;AAAA,WAGA;AAAA;AAAA,MAENC,IACEE;AAAA,4BACoBZ,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAQ/B,IAAI;AAAA;AAAA,MAENW,IACEC;AAAA,4BACoBV,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAQhC,IAAI;AAAA;AAEZ;"}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import e from "styled-components";
|
2
|
+
import i from "../../ui/layout/flex-view.js";
|
3
|
+
const p = e(i)`
|
4
|
+
height: 104px;
|
5
|
+
transition: height 300ms ease-in-out;
|
6
|
+
z-index: 1;
|
7
|
+
`;
|
8
|
+
e.div(
|
9
|
+
({ $avatarUrl: r }) => `
|
10
|
+
width: 20px;
|
11
|
+
height: 20px;
|
12
|
+
border-radius: 50%;
|
13
|
+
background: url(${r});
|
14
|
+
background-size: cover;
|
15
|
+
background-repeat: no-repeat;
|
16
|
+
position: relative;
|
17
|
+
`
|
18
|
+
);
|
19
|
+
export {
|
20
|
+
p as MeterWrapper
|
21
|
+
};
|
22
|
+
//# sourceMappingURL=talk-meter-view-styled.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"talk-meter-view-styled.js","sources":["../../../../src/features/talk-meter/talk-meter-view/talk-meter-view-styled.tsx"],"sourcesContent":["import styled from 'styled-components';\n\nimport FlexView from '../../ui/layout/flex-view';\n\nconst MeterWrapper = styled(FlexView)`\n height: 104px;\n transition: height 300ms ease-in-out;\n z-index: 1;\n`;\n\nconst Avatar = styled.div<{ $avatarUrl: string }>(\n ({ $avatarUrl }) => `\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: url(${$avatarUrl});\n background-size: cover;\n background-repeat: no-repeat;\n position: relative;\n`,\n);\n\nexport { MeterWrapper, Avatar };\n"],"names":["MeterWrapper","styled","FlexView","$avatarUrl"],"mappings":";;AAIM,MAAAA,IAAeC,EAAOC,CAAQ;AAAA;AAAA;AAAA;AAAA;AAMrBD,EAAO;AAAA,EACpB,CAAC,EAAE,YAAAE,EAAA,MAAiB;AAAA;AAAA;AAAA;AAAA,oBAIFA,CAAU;AAAA;AAAA;AAAA;AAAA;AAK9B;"}
|