@cuemath/leap 2.8.40-hg1 → 2.8.40-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.
Files changed (85) hide show
  1. package/dist/assets/illustrations/illustrations.js +2 -0
  2. package/dist/assets/illustrations/illustrations.js.map +1 -1
  3. package/dist/assets/lottie/lottie.js +0 -6
  4. package/dist/assets/lottie/lottie.js.map +1 -1
  5. package/dist/assets/sounds/sounds.js +7 -0
  6. package/dist/assets/sounds/sounds.js.map +1 -0
  7. package/dist/features/circle-games/game-launcher/comps/tables-card/table-mode/table-mode-styled.js +3 -3
  8. package/dist/features/circle-games/game-launcher/comps/tables-card/table-mode/table-mode-styled.js.map +1 -1
  9. package/dist/features/circle-games/game-launcher/comps/tables-card/table-mode/table-mode.js +35 -29
  10. package/dist/features/circle-games/game-launcher/comps/tables-card/table-mode/table-mode.js.map +1 -1
  11. package/dist/features/circle-games/game-launcher/comps/tables-card/table-star/table-star-styled.js +11 -0
  12. package/dist/features/circle-games/game-launcher/comps/tables-card/table-star/table-star-styled.js.map +1 -0
  13. package/dist/features/circle-games/game-launcher/comps/tables-card/table-star/table-star.js +16 -0
  14. package/dist/features/circle-games/game-launcher/comps/tables-card/table-star/table-star.js.map +1 -0
  15. package/dist/features/circle-games/game-launcher/comps/tables-card/tables-card-styled.js +42 -35
  16. package/dist/features/circle-games/game-launcher/comps/tables-card/tables-card-styled.js.map +1 -1
  17. package/dist/features/circle-games/game-launcher/comps/tables-card/tables-card.js +212 -223
  18. package/dist/features/circle-games/game-launcher/comps/tables-card/tables-card.js.map +1 -1
  19. package/dist/features/circle-games/game-launcher/game-launcher-analytics-events.js +7 -8
  20. package/dist/features/circle-games/game-launcher/game-launcher-analytics-events.js.map +1 -1
  21. package/dist/features/circle-games/game-launcher/game-launcher.js +24 -25
  22. package/dist/features/circle-games/game-launcher/game-launcher.js.map +1 -1
  23. package/dist/features/circle-games/games/web-view/web-view-types.js.map +1 -1
  24. package/dist/features/circle-games/hooks/use-circle-sounds/constants.js +3 -8
  25. package/dist/features/circle-games/hooks/use-circle-sounds/constants.js.map +1 -1
  26. package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds-enums.js +2 -2
  27. package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds-enums.js.map +1 -1
  28. package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.js +17 -22
  29. package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.js.map +1 -1
  30. package/dist/features/post-game-stats/enums/post-game-stats-enum.js +1 -1
  31. package/dist/features/post-game-stats/enums/post-game-stats-enum.js.map +1 -1
  32. package/dist/features/post-game-stats/points/points.js +10 -15
  33. package/dist/features/post-game-stats/points/points.js.map +1 -1
  34. package/dist/features/post-game-stats/post-game-stats.js +61 -83
  35. package/dist/features/post-game-stats/post-game-stats.js.map +1 -1
  36. package/dist/features/talk-meter/helper.js +11 -0
  37. package/dist/features/talk-meter/helper.js.map +1 -0
  38. package/dist/features/talk-meter/hooks/use-talk-meter.js +123 -0
  39. package/dist/features/talk-meter/hooks/use-talk-meter.js.map +1 -0
  40. package/dist/features/talk-meter/ripple/index.js +62 -0
  41. package/dist/features/talk-meter/ripple/index.js.map +1 -0
  42. package/dist/features/talk-meter/talk-meter-styled.js +89 -0
  43. package/dist/features/talk-meter/talk-meter-styled.js.map +1 -0
  44. package/dist/features/talk-meter/talk-meter-view/talk-meter-view-styled.js +22 -0
  45. package/dist/features/talk-meter/talk-meter-view/talk-meter-view-styled.js.map +1 -0
  46. package/dist/features/talk-meter/talk-meter-view/talk-meter-view.js +101 -0
  47. package/dist/features/talk-meter/talk-meter-view/talk-meter-view.js.map +1 -0
  48. package/dist/features/talk-meter/talk-meter.js +75 -0
  49. package/dist/features/talk-meter/talk-meter.js.map +1 -0
  50. package/dist/index.d.ts +45 -52
  51. package/dist/index.js +100 -100
  52. package/dist/static/female-avatar.b8cd1012.svg +1 -0
  53. package/dist/static/male-avatar.2febc9eb.svg +1 -0
  54. package/package.json +1 -1
  55. package/dist/features/circle-games/game-launcher/comps/tables-card/table-mode-star/table-mode-star-styled.js +0 -25
  56. package/dist/features/circle-games/game-launcher/comps/tables-card/table-mode-star/table-mode-star-styled.js.map +0 -1
  57. package/dist/features/circle-games/game-launcher/comps/tables-card/table-mode-star/table-mode-star.js +0 -57
  58. package/dist/features/circle-games/game-launcher/comps/tables-card/table-mode-star/table-mode-star.js.map +0 -1
  59. package/dist/features/circle-games/game-launcher/comps/tables-card/table-segment-star/table-segment-star-styled.js +0 -27
  60. package/dist/features/circle-games/game-launcher/comps/tables-card/table-segment-star/table-segment-star-styled.js.map +0 -1
  61. package/dist/features/circle-games/game-launcher/comps/tables-card/table-segment-star/table-segment-star.js +0 -37
  62. package/dist/features/circle-games/game-launcher/comps/tables-card/table-segment-star/table-segment-star.js.map +0 -1
  63. package/dist/features/post-game-stats/digital-meter/comp/animated-arc/animated-arc-styled.js +0 -17
  64. package/dist/features/post-game-stats/digital-meter/comp/animated-arc/animated-arc-styled.js.map +0 -1
  65. package/dist/features/post-game-stats/digital-meter/comp/animated-arc/animated-arc.js +0 -47
  66. package/dist/features/post-game-stats/digital-meter/comp/animated-arc/animated-arc.js.map +0 -1
  67. package/dist/features/post-game-stats/digital-meter/comp/animated-arc/constants.js +0 -6
  68. package/dist/features/post-game-stats/digital-meter/comp/animated-arc/constants.js.map +0 -1
  69. package/dist/features/post-game-stats/digital-meter/constants.js +0 -16
  70. package/dist/features/post-game-stats/digital-meter/constants.js.map +0 -1
  71. package/dist/features/post-game-stats/digital-meter/digital-meter-styled.js +0 -87
  72. package/dist/features/post-game-stats/digital-meter/digital-meter-styled.js.map +0 -1
  73. package/dist/features/post-game-stats/digital-meter/digital-meter.js +0 -191
  74. package/dist/features/post-game-stats/digital-meter/digital-meter.js.map +0 -1
  75. package/dist/features/post-game-stats/digital-meter/helper.js +0 -33
  76. package/dist/features/post-game-stats/digital-meter/helper.js.map +0 -1
  77. package/dist/features/post-game-stats/number-count-animation/number-count-animation.js +0 -27
  78. package/dist/features/post-game-stats/number-count-animation/number-count-animation.js.map +0 -1
  79. package/dist/static/point2.7cec6e24.json +0 -1
  80. package/dist/static/point3.f96fe7aa.json +0 -1
  81. package/dist/static/point4.fe04fb83.json +0 -1
  82. package/dist/static/table-mode-star.b8a1d762.json +0 -1
  83. package/dist/static/table-segment-star.78e851d6.json +0 -1
  84. package/dist/static/target-achieved-text.053bd142.json +0 -2830
  85. package/dist/static/target-achieved-text.10db8475.json +0 -1
@@ -1,92 +1,70 @@
1
- import { jsx as n, jsxs as y } from "react/jsx-runtime";
2
- import { memo as c, forwardRef as v, useState as d, useMemo as i, useCallback as a, useImperativeHandle as g } from "react";
3
- import { Accuracy as C } from "./accuracy/accuracy.js";
4
- import { Clock as A } from "./clock/clock.js";
5
- import { DigitalMeter as I } from "./digital-meter/digital-meter.js";
1
+ import { jsxs as S, jsx as n } from "react/jsx-runtime";
2
+ import { memo as C, forwardRef as T, useState as d, useCallback as h, useImperativeHandle as y } from "react";
3
+ import { Accuracy as A } from "./accuracy/accuracy.js";
4
+ import { Clock as R } from "./clock/clock.js";
6
5
  import { EPostGameStat as p } from "./enums/post-game-stats-enum.js";
7
- import { Points as P } from "./points/points.js";
8
- import { StatsWrapper as R, BlackBg as S } from "./post-game-stats-styled.js";
9
- import { Streak as k } from "./streak/streak.js";
10
- const K = c(
11
- v(({ stats: o, show: s, onComplete: m }, f) => {
12
- const [t, h] = d(0), e = i(() => o[t], [t, o]), u = a(() => {
13
- var r;
14
- if ((r = e == null ? void 0 : e.onComplete) == null || r.call(e), t === o.length - 1) {
15
- m == null || m();
6
+ import { Points as k } from "./points/points.js";
7
+ import { StatsWrapper as w, BlackBg as I } from "./post-game-stats-styled.js";
8
+ import { Streak as P } from "./streak/streak.js";
9
+ const b = C(
10
+ T(({ stats: e, show: f, onComplete: l }, a) => {
11
+ var i, u;
12
+ const [r, x] = d(0), t = h(() => {
13
+ var o, c;
14
+ if ((c = (o = e[r]) == null ? void 0 : o.onComplete) == null || c.call(o), r === e.length - 1) {
15
+ l == null || l();
16
16
  return;
17
17
  }
18
- h((T) => T + 1);
19
- }, [t, m, o.length, e]), l = a(() => {
20
- e != null && e.stopAtEnd || u();
21
- }, [e, u]);
22
- g(f, () => ({
23
- moveToNextAndPlay: u
24
- }));
25
- const x = i(() => {
26
- if (e) {
27
- const r = `${e.type}-${t}`;
28
- return e.type === p.POINT ? /* @__PURE__ */ n(
29
- P,
30
- {
31
- point: e.value,
32
- show: e.type === p.POINT,
33
- onComplete: l,
34
- onReveal: e.onReveal
35
- },
36
- r
37
- ) : e.type === p.DIGITAL_METER ? /* @__PURE__ */ n(
38
- I,
39
- {
40
- value: e.value,
41
- maxValue: e.maxValue ?? 1,
42
- targetValue: e.targetValue,
43
- displayText: e.displayText ?? "",
44
- progressType: e.progressType ?? "linear",
45
- helperTextPrimary: e.helperTextPrimary ?? "",
46
- helperTextSecondary: e.helperTextSecondary ?? "",
47
- show: !0,
48
- onComplete: l
49
- },
50
- r
51
- ) : e.type === p.STREAK ? /* @__PURE__ */ n(
52
- k,
53
- {
54
- currStreak: e.value,
55
- show: !0,
56
- onComplete: l,
57
- helperText: e.helperText,
58
- onReveal: e.onReveal
59
- },
60
- r
61
- ) : e.type === p.ACCURACY ? /* @__PURE__ */ n(
62
- C,
63
- {
64
- accuracy: e.value,
65
- show: !0,
66
- onComplete: l,
67
- helperText: e.helperText
68
- },
69
- r
70
- ) : e.type === p.CLOCK ? /* @__PURE__ */ n(
71
- A,
72
- {
73
- timeInMs: e.value,
74
- show: !0,
75
- onComplete: l,
76
- helperText: e.helperText
77
- },
78
- r
79
- ) : null;
80
- }
81
- return null;
82
- }, [e, l, t]);
83
- return !s || o.length === 0 || t >= o.length ? null : /* @__PURE__ */ y(R, { children: [
84
- /* @__PURE__ */ n(S, {}),
85
- x
18
+ x((v) => v + 1);
19
+ }, [r, l, e]), m = h(() => {
20
+ var o;
21
+ (o = e[r]) != null && o.stopAtEnd || t();
22
+ }, [e, r, t]);
23
+ return y(a, () => ({
24
+ moveToNextAndPlay: t
25
+ })), !f || e.length === 0 || r >= e.length ? null : /* @__PURE__ */ S(w, { children: [
26
+ /* @__PURE__ */ n(I, {}),
27
+ /* @__PURE__ */ n(
28
+ k,
29
+ {
30
+ point: e[r].value,
31
+ show: e[r].type === p.POINT,
32
+ onComplete: m,
33
+ onReveal: (i = e[r]) == null ? void 0 : i.onReveal
34
+ }
35
+ ),
36
+ /* @__PURE__ */ n(
37
+ P,
38
+ {
39
+ currStreak: e[r].value,
40
+ show: e[r].type === p.STREAK,
41
+ onComplete: m,
42
+ helperText: e[r].helperText,
43
+ onReveal: (u = e[r]) == null ? void 0 : u.onReveal
44
+ }
45
+ ),
46
+ /* @__PURE__ */ n(
47
+ A,
48
+ {
49
+ accuracy: e[r].value,
50
+ show: e[r].type === p.ACCURACY,
51
+ onComplete: m,
52
+ helperText: e[r].helperText
53
+ }
54
+ ),
55
+ /* @__PURE__ */ n(
56
+ R,
57
+ {
58
+ timeInMs: e[r].value,
59
+ show: e[r].type === p.CLOCK,
60
+ onComplete: m,
61
+ helperText: e[r].helperText
62
+ }
63
+ )
86
64
  ] });
87
65
  })
88
66
  );
89
67
  export {
90
- K as PostGameStats
68
+ b as PostGameStats
91
69
  };
92
70
  //# sourceMappingURL=post-game-stats.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"post-game-stats.js","sources":["../../../src/features/post-game-stats/post-game-stats.tsx"],"sourcesContent":["import type { IPostGameStatsProps, IPostGameStatsRef } from './post-game-stats-types';\n\nimport { useState, memo, useCallback, forwardRef, useImperativeHandle, useMemo } from 'react';\n\nimport { Accuracy } from './accuracy/accuracy';\nimport { Clock } from './clock/clock';\nimport { DigitalMeter } from './digital-meter/digital-meter';\nimport { EPostGameStat } from './enums/post-game-stats-enum';\nimport { Points } from './points/points';\nimport * as Styled from './post-game-stats-styled';\nimport { Streak } from './streak/streak';\n\nexport const PostGameStats = memo(\n forwardRef<IPostGameStatsRef, IPostGameStatsProps>(({ stats, show, onComplete }, ref) => {\n const [currStatIndex, setCurrentStatIndex] = useState(0);\n const currStatData = useMemo(() => stats[currStatIndex], [currStatIndex, stats]);\n\n const moveToNextAndPlay = useCallback(() => {\n currStatData?.onComplete?.();\n\n if (currStatIndex === stats.length - 1) {\n onComplete?.();\n\n return;\n }\n setCurrentStatIndex(prev => prev + 1);\n }, [currStatIndex, onComplete, stats.length, currStatData]);\n\n const onStatAnimationComplete = useCallback(() => {\n if (currStatData?.stopAtEnd) {\n return;\n }\n moveToNextAndPlay(); // Autoplay since stopAtEnd is false\n }, [currStatData, moveToNextAndPlay]);\n\n useImperativeHandle(ref, () => ({\n moveToNextAndPlay,\n }));\n\n const currentStat = useMemo(() => {\n if (currStatData) {\n const key = `${currStatData.type}-${currStatIndex}`;\n\n if (currStatData.type === EPostGameStat.POINT) {\n return (\n <Points\n key={key}\n point={currStatData.value}\n show={currStatData.type === EPostGameStat.POINT}\n onComplete={onStatAnimationComplete}\n onReveal={currStatData.onReveal}\n />\n );\n }\n\n if (currStatData.type === EPostGameStat.DIGITAL_METER) {\n return (\n <DigitalMeter\n key={key}\n value={currStatData.value}\n maxValue={currStatData.maxValue ?? 1}\n targetValue={currStatData.targetValue}\n displayText={currStatData.displayText ?? ''}\n progressType={currStatData.progressType ?? 'linear'}\n helperTextPrimary={currStatData.helperTextPrimary ?? ''}\n helperTextSecondary={currStatData.helperTextSecondary ?? ''}\n show={true}\n onComplete={onStatAnimationComplete}\n />\n );\n }\n\n if (currStatData.type === EPostGameStat.STREAK) {\n return (\n <Streak\n key={key}\n currStreak={currStatData.value}\n show={true}\n onComplete={onStatAnimationComplete}\n helperText={currStatData.helperText}\n onReveal={currStatData.onReveal}\n />\n );\n }\n\n if (currStatData.type === EPostGameStat.ACCURACY) {\n return (\n <Accuracy\n key={key}\n accuracy={currStatData.value}\n show={true}\n onComplete={onStatAnimationComplete}\n helperText={currStatData.helperText}\n />\n );\n }\n\n if (currStatData.type === EPostGameStat.CLOCK) {\n return (\n <Clock\n key={key}\n timeInMs={currStatData.value}\n show={true}\n onComplete={onStatAnimationComplete}\n helperText={currStatData.helperText}\n />\n );\n }\n\n return null;\n }\n\n return null;\n }, [currStatData, onStatAnimationComplete, currStatIndex]);\n\n if (!show || stats.length === 0 || currStatIndex >= stats.length) {\n return null;\n }\n\n return (\n <Styled.StatsWrapper>\n <Styled.BlackBg />\n\n {currentStat}\n </Styled.StatsWrapper>\n );\n }),\n);\n"],"names":["PostGameStats","memo","forwardRef","stats","show","onComplete","ref","currStatIndex","setCurrentStatIndex","useState","currStatData","useMemo","moveToNextAndPlay","useCallback","_a","prev","onStatAnimationComplete","useImperativeHandle","currentStat","key","EPostGameStat","jsx","Points","DigitalMeter","Streak","Accuracy","Clock","jsxs","Styled.StatsWrapper","Styled.BlackBg"],"mappings":";;;;;;;;;AAYO,MAAMA,IAAgBC;AAAA,EAC3BC,EAAmD,CAAC,EAAE,OAAAC,GAAO,MAAAC,GAAM,YAAAC,EAAA,GAAcC,MAAQ;AACvF,UAAM,CAACC,GAAeC,CAAmB,IAAIC,EAAS,CAAC,GACjDC,IAAeC,EAAQ,MAAMR,EAAMI,CAAa,GAAG,CAACA,GAAeJ,CAAK,CAAC,GAEzES,IAAoBC,EAAY,MAAM;;AAGtC,WAFJC,IAAAJ,KAAA,gBAAAA,EAAc,eAAd,QAAAI,EAAA,KAAAJ,IAEIH,MAAkBJ,EAAM,SAAS,GAAG;AACzB,QAAAE,KAAA,QAAAA;AAEb;AAAA,MACF;AACoB,MAAAG,EAAA,CAAAO,MAAQA,IAAO,CAAC;AAAA,IAAA,GACnC,CAACR,GAAeF,GAAYF,EAAM,QAAQO,CAAY,CAAC,GAEpDM,IAA0BH,EAAY,MAAM;AAChD,MAAIH,KAAA,QAAAA,EAAc,aAGAE;IAAA,GACjB,CAACF,GAAcE,CAAiB,CAAC;AAEpC,IAAAK,EAAoBX,GAAK,OAAO;AAAA,MAC9B,mBAAAM;AAAA,IACA,EAAA;AAEI,UAAAM,IAAcP,EAAQ,MAAM;AAChC,UAAID,GAAc;AAChB,cAAMS,IAAM,GAAGT,EAAa,IAAI,IAAIH,CAAa;AAE7C,eAAAG,EAAa,SAASU,EAAc,QAEpC,gBAAAC;AAAA,UAACC;AAAA,UAAA;AAAA,YAEC,OAAOZ,EAAa;AAAA,YACpB,MAAMA,EAAa,SAASU,EAAc;AAAA,YAC1C,YAAYJ;AAAA,YACZ,UAAUN,EAAa;AAAA,UAAA;AAAA,UAJlBS;AAAA,QAAA,IASPT,EAAa,SAASU,EAAc,gBAEpC,gBAAAC;AAAA,UAACE;AAAA,UAAA;AAAA,YAEC,OAAOb,EAAa;AAAA,YACpB,UAAUA,EAAa,YAAY;AAAA,YACnC,aAAaA,EAAa;AAAA,YAC1B,aAAaA,EAAa,eAAe;AAAA,YACzC,cAAcA,EAAa,gBAAgB;AAAA,YAC3C,mBAAmBA,EAAa,qBAAqB;AAAA,YACrD,qBAAqBA,EAAa,uBAAuB;AAAA,YACzD,MAAM;AAAA,YACN,YAAYM;AAAA,UAAA;AAAA,UATPG;AAAA,QAAA,IAcPT,EAAa,SAASU,EAAc,SAEpC,gBAAAC;AAAA,UAACG;AAAA,UAAA;AAAA,YAEC,YAAYd,EAAa;AAAA,YACzB,MAAM;AAAA,YACN,YAAYM;AAAA,YACZ,YAAYN,EAAa;AAAA,YACzB,UAAUA,EAAa;AAAA,UAAA;AAAA,UALlBS;AAAA,QAAA,IAUPT,EAAa,SAASU,EAAc,WAEpC,gBAAAC;AAAA,UAACI;AAAA,UAAA;AAAA,YAEC,UAAUf,EAAa;AAAA,YACvB,MAAM;AAAA,YACN,YAAYM;AAAA,YACZ,YAAYN,EAAa;AAAA,UAAA;AAAA,UAJpBS;AAAA,QAAA,IASPT,EAAa,SAASU,EAAc,QAEpC,gBAAAC;AAAA,UAACK;AAAA,UAAA;AAAA,YAEC,UAAUhB,EAAa;AAAA,YACvB,MAAM;AAAA,YACN,YAAYM;AAAA,YACZ,YAAYN,EAAa;AAAA,UAAA;AAAA,UAJpBS;AAAA,QAAA,IASJ;AAAA,MACT;AAEO,aAAA;AAAA,IACN,GAAA,CAACT,GAAcM,GAAyBT,CAAa,CAAC;AAEzD,WAAI,CAACH,KAAQD,EAAM,WAAW,KAAKI,KAAiBJ,EAAM,SACjD,OAIP,gBAAAwB,EAACC,GAAA,EACC,UAAA;AAAA,MAAC,gBAAAP,EAAAQ,GAAA,EAAe;AAAA,MAEfX;AAAA,IACH,EAAA,CAAA;AAAA,EAAA,CAEH;AACH;"}
1
+ {"version":3,"file":"post-game-stats.js","sources":["../../../src/features/post-game-stats/post-game-stats.tsx"],"sourcesContent":["import type { IPostGameStatsProps, IPostGameStatsRef } from './post-game-stats-types';\n\nimport { useState, memo, useCallback, forwardRef, useImperativeHandle } from 'react';\n\nimport { Accuracy } from './accuracy/accuracy';\nimport { Clock } from './clock/clock';\nimport { EPostGameStat } from './enums/post-game-stats-enum';\nimport { Points } from './points/points';\nimport * as Styled from './post-game-stats-styled';\nimport { Streak } from './streak/streak';\n\nexport const PostGameStats = memo(\n forwardRef<IPostGameStatsRef, IPostGameStatsProps>(({ stats, show, onComplete }, ref) => {\n const [currStatIndex, setCurrentStatIndex] = useState(0);\n\n const moveToNextAndPlay = useCallback(() => {\n stats[currStatIndex]?.onComplete?.();\n\n if (currStatIndex === stats.length - 1) {\n onComplete?.();\n\n return;\n }\n setCurrentStatIndex(prev => prev + 1);\n }, [currStatIndex, onComplete, stats]);\n\n const onStatAnimationComplete = useCallback(() => {\n if (stats[currStatIndex]?.stopAtEnd) {\n return;\n }\n moveToNextAndPlay(); // Autoplay since stopAtEnd is false\n }, [stats, currStatIndex, moveToNextAndPlay]);\n\n useImperativeHandle(ref, () => ({\n moveToNextAndPlay,\n }));\n\n if (!show || stats.length === 0 || currStatIndex >= stats.length) {\n return null;\n }\n\n return (\n <Styled.StatsWrapper>\n <Styled.BlackBg />\n <Points\n point={stats[currStatIndex]!.value}\n show={stats[currStatIndex]!.type === EPostGameStat.POINT}\n onComplete={onStatAnimationComplete}\n onReveal={stats[currStatIndex]?.onReveal}\n />\n <Streak\n currStreak={stats[currStatIndex]!.value}\n show={stats[currStatIndex]!.type === EPostGameStat.STREAK}\n onComplete={onStatAnimationComplete}\n helperText={stats[currStatIndex]!.helperText}\n onReveal={stats[currStatIndex]?.onReveal}\n />\n <Accuracy\n accuracy={stats[currStatIndex]!.value}\n show={stats[currStatIndex]!.type === EPostGameStat.ACCURACY}\n onComplete={onStatAnimationComplete}\n helperText={stats[currStatIndex]!.helperText}\n />\n <Clock\n timeInMs={stats[currStatIndex]!.value}\n show={stats[currStatIndex]!.type === EPostGameStat.CLOCK}\n onComplete={onStatAnimationComplete}\n helperText={stats[currStatIndex]!.helperText}\n />\n </Styled.StatsWrapper>\n );\n }),\n);\n"],"names":["PostGameStats","memo","forwardRef","stats","show","onComplete","ref","currStatIndex","setCurrentStatIndex","useState","moveToNextAndPlay","useCallback","_b","_a","prev","onStatAnimationComplete","useImperativeHandle","jsxs","Styled.StatsWrapper","jsx","Styled.BlackBg","Points","EPostGameStat","Streak","Accuracy","Clock"],"mappings":";;;;;;;;AAWO,MAAMA,IAAgBC;AAAA,EAC3BC,EAAmD,CAAC,EAAE,OAAAC,GAAO,MAAAC,GAAM,YAAAC,EAAA,GAAcC,MAAQ;;AACvF,UAAM,CAACC,GAAeC,CAAmB,IAAIC,EAAS,CAAC,GAEjDC,IAAoBC,EAAY,MAAM;;AAGtC,WAFEC,KAAAC,IAAAV,EAAAI,CAAa,MAAb,gBAAAM,EAAgB,eAAhB,QAAAD,EAAA,KAAAC,IAEFN,MAAkBJ,EAAM,SAAS,GAAG;AACzB,QAAAE,KAAA,QAAAA;AAEb;AAAA,MACF;AACoB,MAAAG,EAAA,CAAAM,MAAQA,IAAO,CAAC;AAAA,IACnC,GAAA,CAACP,GAAeF,GAAYF,CAAK,CAAC,GAE/BY,IAA0BJ,EAAY,MAAM;;AAC5C,OAAAE,IAAAV,EAAMI,CAAa,MAAnB,QAAAM,EAAsB,aAGRH;IACjB,GAAA,CAACP,GAAOI,GAAeG,CAAiB,CAAC;AAM5C,WAJAM,EAAoBV,GAAK,OAAO;AAAA,MAC9B,mBAAAI;AAAA,IACA,EAAA,GAEE,CAACN,KAAQD,EAAM,WAAW,KAAKI,KAAiBJ,EAAM,SACjD,OAIP,gBAAAc,EAACC,GAAA,EACC,UAAA;AAAA,MAAC,gBAAAC,EAAAC,GAAA,EAAe;AAAA,MAChB,gBAAAD;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,OAAOlB,EAAMI,CAAa,EAAG;AAAA,UAC7B,MAAMJ,EAAMI,CAAa,EAAG,SAASe,EAAc;AAAA,UACnD,YAAYP;AAAA,UACZ,WAAUF,IAAAV,EAAMI,CAAa,MAAnB,gBAAAM,EAAsB;AAAA,QAAA;AAAA,MAClC;AAAA,MACA,gBAAAM;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,YAAYpB,EAAMI,CAAa,EAAG;AAAA,UAClC,MAAMJ,EAAMI,CAAa,EAAG,SAASe,EAAc;AAAA,UACnD,YAAYP;AAAA,UACZ,YAAYZ,EAAMI,CAAa,EAAG;AAAA,UAClC,WAAUK,IAAAT,EAAMI,CAAa,MAAnB,gBAAAK,EAAsB;AAAA,QAAA;AAAA,MAClC;AAAA,MACA,gBAAAO;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,UAAUrB,EAAMI,CAAa,EAAG;AAAA,UAChC,MAAMJ,EAAMI,CAAa,EAAG,SAASe,EAAc;AAAA,UACnD,YAAYP;AAAA,UACZ,YAAYZ,EAAMI,CAAa,EAAG;AAAA,QAAA;AAAA,MACpC;AAAA,MACA,gBAAAY;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,UAAUtB,EAAMI,CAAa,EAAG;AAAA,UAChC,MAAMJ,EAAMI,CAAa,EAAG,SAASe,EAAc;AAAA,UACnD,YAAYP;AAAA,UACZ,YAAYZ,EAAMI,CAAa,EAAG;AAAA,QAAA;AAAA,MACpC;AAAA,IACF,EAAA,CAAA;AAAA,EAAA,CAEH;AACH;"}
@@ -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 { useMemo as S, useCallback as u, useState as J, useRef as v, useEffect as I } from "react";
3
+ import { useUIContext as ae } from "../../ui/context/context.js";
4
+ const C = 1e3 * 60, Te = (Q) => {
5
+ var Y, j;
6
+ const {
7
+ userType: X,
8
+ studentId: D,
9
+ teacherId: P,
10
+ classStartTime: r,
11
+ avPackageEnabled: k,
12
+ teacherClassroomId: U,
13
+ teacherTalkTime: p,
14
+ studentTalkTime: R,
15
+ lastBatchReceivedNo: i,
16
+ canDisplayBatch: y,
17
+ classDuration: _ = 0,
18
+ onMessageReceive: L,
19
+ onDismissMeter: g
20
+ } = Q, f = S(() => 0.36 * _, [_]), d = S(() => 0.73 * _, [_]), h = u(
21
+ (e, t) => {
22
+ const o = Date.now(), A = e.getTime(), te = Math.abs(o - A), n = Math.floor(te / 1e3 / 60), q = (t === 0 || t === 1) && n >= f - 2 && n <= f, z = (t === 1 || t === 2) && n >= d - 2 && n <= d, G = n >= 50;
23
+ let M = 0, N = !1;
24
+ return G ? M = 0 : z ? (M = 2, N = n >= d) : q && (M = 1, N = n >= f), {
25
+ lastMinutesLeft: G,
26
+ canSendBatch: q || z,
27
+ batchNoToSend: M,
28
+ minutes: n,
29
+ canDisplay: N
30
+ };
31
+ },
32
+ [f, d]
33
+ ), [c, H] = J(!1), [Z, b] = J(!1), { onEvent: K } = ae(), { sendMessage: O } = se(), V = ne(), w = (Y = V.find((e) => e.userId === D)) == null ? void 0 : Y.id, x = (j = V.find((e) => e.userType === "teacher")) == null ? void 0 : j.id, s = X === "TEACHER", T = v(p), a = v(R), F = v(0), W = a.current + T.current, $ = Math.ceil(a.current * 100 / W) || 0, ee = Math.floor(T.current * 100 / W) || 0, E = S(
34
+ () => ({
35
+ teacher_classroom_id: U,
36
+ teacher_id: P,
37
+ studentId: D
38
+ }),
39
+ [D, U, P]
40
+ ), B = u(() => {
41
+ b(!0), H(!1), g();
42
+ }, [g]), m = u(
43
+ (e, t = {}) => {
44
+ K(e, { ...E, ...t });
45
+ },
46
+ [K, E]
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
+ m("TALK_METER_BATCH_SENT", {
51
+ batch_no: e,
52
+ ...o
53
+ }), k && O(
54
+ t,
55
+ {
56
+ ...E,
57
+ ...o,
58
+ batch_no: e
59
+ },
60
+ s ? w : x
61
+ ), F.current = a.current;
62
+ },
63
+ [k, s, E, O, w, x, m]
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
+ }), I(() => {
74
+ c || (T.current = p, a.current = R);
75
+ }, [p, R, c]), I(() => {
76
+ let e;
77
+ return c && (e = setTimeout(() => {
78
+ B();
79
+ }, C)), () => {
80
+ e && clearTimeout(e);
81
+ };
82
+ }, [c, B]), I(() => {
83
+ let e;
84
+ return r && y && !c && (e = setInterval(() => {
85
+ const { canDisplay: t } = h(r, i);
86
+ t && (m("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
+ }, C / 30)), () => {
92
+ e && clearInterval(e);
93
+ };
94
+ }, [
95
+ c,
96
+ y,
97
+ r,
98
+ h,
99
+ i,
100
+ m
101
+ ]), I(() => {
102
+ let e;
103
+ return r && !s && (e = setInterval(() => {
104
+ const { lastMinutesLeft: t, canSendBatch: o, batchNoToSend: A } = h(
105
+ r,
106
+ i
107
+ );
108
+ t ? F.current !== a.current && l(A) : o && l(A);
109
+ }, C / 6)), () => {
110
+ e && clearInterval(e);
111
+ };
112
+ }, [r, h, s, i, l]), {
113
+ canAnimateIn: c,
114
+ canAnimateOut: Z,
115
+ stdRatio: $,
116
+ tchRatio: ee,
117
+ handleDismiss: B
118
+ };
119
+ };
120
+ export {
121
+ Te 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 = useMemo(() => 0.36 * classDuration, [classDuration]);\n const BATCH_TWO_MINUTE = useMemo(() => 0.73 * classDuration, [classDuration]);\n\n const getBatchToSendInfo = useCallback(\n (classStartTimeFromProps: Date, batchSeen: number) => {\n const now = Date.now();\n const classTS = classStartTimeFromProps.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 >= 50;\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],\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","useMemo","BATCH_TWO_MINUTE","getBatchToSendInfo","useCallback","classStartTimeFromProps","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","handleDismiss","trackEvent","eventName","data","sendBatch","EVENT_NAME","speechTimePayload","useAVMessage","_","useEffect","dismissTimer","interval","canDisplay","canSendBatch","batchNoToSend"],"mappings":"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"}
@@ -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;"}