@cuemath/leap 3.1.41 → 3.1.42
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/features/post-game-stats/accuracy/accuracy.js +74 -63
- package/dist/features/post-game-stats/accuracy/accuracy.js.map +1 -1
- package/dist/features/post-game-stats/clock/clock.js +89 -66
- package/dist/features/post-game-stats/clock/clock.js.map +1 -1
- package/dist/features/post-game-stats/score/score.js +59 -53
- package/dist/features/post-game-stats/score/score.js.map +1 -1
- package/dist/features/post-game-stats/streak/streak.js +61 -56
- package/dist/features/post-game-stats/streak/streak.js.map +1 -1
- package/dist/features/utils/utils.js +17 -14
- package/dist/features/utils/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,80 +1,91 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { memo as
|
|
4
|
-
import { LOTTIE as
|
|
5
|
-
import { useCircleSounds as
|
|
6
|
-
import { CircleSoundKey as
|
|
7
|
-
import { delay as
|
|
8
|
-
import { AnimatedPercentTextInput as
|
|
9
|
-
import { Accuracy as
|
|
10
|
-
import { getAccuracyFramesToPlay as
|
|
11
|
-
import { NEEDLE_HOLD_TIME as
|
|
12
|
-
const
|
|
13
|
-
const { play:
|
|
14
|
-
var
|
|
1
|
+
import { jsxs as k, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import x from "lottie-web";
|
|
3
|
+
import { memo as K, useRef as s, useState as T, useCallback as q, useEffect as O } from "react";
|
|
4
|
+
import { LOTTIE as w } from "../../../assets/lottie/lottie.js";
|
|
5
|
+
import { useCircleSounds as z } from "../../circle-games/hooks/use-circle-sounds/use-circle-sounds.js";
|
|
6
|
+
import { CircleSoundKey as F } from "../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums.js";
|
|
7
|
+
import { delay as d } from "../../utils/utils.js";
|
|
8
|
+
import { AnimatedPercentTextInput as B } from "./accuracy-comps.js";
|
|
9
|
+
import { Accuracy as G, AccuracyMeterLottie as J, AnimatedAccuracyNeedleContainer as Q, AccuracyNeedleLottie as V, TextWrapper as Z, PercentTextWrapper as ee } from "./accuracy-styled.js";
|
|
10
|
+
import { getAccuracyFramesToPlay as te } from "./accuracy-utils.js";
|
|
11
|
+
import { NEEDLE_HOLD_TIME as U, METER as g, TEXT_DISAPPEAR_DELAY as re, TEXT_DISAPPEAR_DURATION as ae, TEXT_APPEAR_DURATION as ne, NEEDLE as v, NEEDLE_LOTTIE_FPS as $ } from "./constants.js";
|
|
12
|
+
const Ee = K(({ show: f, onComplete: u, accuracy: A, helperText: R }) => {
|
|
13
|
+
const { play: m } = z(), D = s(null), I = s(null), l = s(void 0), a = s(void 0), [Y, j] = T(!0), [p, _] = T(!1), [L, H] = T(!1), X = s(0), n = s([]), P = (v.IN_FRAMES[1] - v.IN_FRAMES[0]) / $ * 1e3, S = q(async () => {
|
|
14
|
+
var t, o;
|
|
15
15
|
try {
|
|
16
|
-
|
|
16
|
+
const { promise: e, timerId: r } = d(U);
|
|
17
|
+
n.current.push(r), await e, j(!1), _(!1), m(F.ACCURACY_OUT), (t = l.current) == null || t.playSegments(g.OUT_FRAMES, !0);
|
|
18
|
+
const { promise: c, timerId: E } = d(re);
|
|
19
|
+
(o = n.current) == null || o.push(E), await c, H(!0), u == null || u();
|
|
17
20
|
} catch (e) {
|
|
18
21
|
console.log(e);
|
|
19
22
|
}
|
|
20
|
-
}, [
|
|
21
|
-
return
|
|
22
|
-
if (
|
|
23
|
-
return
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
23
|
+
}, [u, m]);
|
|
24
|
+
return O(() => {
|
|
25
|
+
if (!f)
|
|
26
|
+
return;
|
|
27
|
+
const t = async () => {
|
|
28
|
+
const { promise: e, timerId: r } = d(U);
|
|
29
|
+
n.current.push(r), await e, S();
|
|
30
|
+
};
|
|
31
|
+
return (async () => {
|
|
32
|
+
var h, N, M, C;
|
|
33
|
+
const [e, r] = await Promise.all([
|
|
34
|
+
fetch(w.ACCURACY_METER),
|
|
35
|
+
fetch(w.ACCURACY_NEEDLE)
|
|
36
|
+
]), [c, E] = await Promise.all([
|
|
37
|
+
e.json(),
|
|
38
|
+
r.json()
|
|
39
|
+
]);
|
|
40
|
+
l.current = x.loadAnimation({
|
|
41
|
+
container: D.current,
|
|
42
|
+
animationData: c,
|
|
43
|
+
autoplay: !1,
|
|
44
|
+
loop: !1,
|
|
45
|
+
renderer: "svg"
|
|
46
|
+
}), a.current = x.loadAnimation({
|
|
47
|
+
container: I.current,
|
|
48
|
+
animationData: E,
|
|
49
|
+
autoplay: !1,
|
|
50
|
+
loop: !1,
|
|
51
|
+
renderer: "svg"
|
|
52
|
+
}), m(F.ACCURACY_IN), (h = l.current) == null || h.playSegments(g.IN_FRAMES, !0);
|
|
53
|
+
const { promise: W, timerId: b } = d(P);
|
|
54
|
+
n.current.push(b), await W;
|
|
55
|
+
const y = te(A);
|
|
56
|
+
X.current = y, (N = a.current) == null || N.setSpeed(y / $), (M = a.current) == null || M.playSegments([0, y], !0), _(!0), (C = a.current) == null || C.addEventListener("complete", t);
|
|
57
|
+
})(), () => {
|
|
58
|
+
var e, r, c;
|
|
59
|
+
(e = a.current) == null || e.removeEventListener("complete", t), (r = l.current) == null || r.destroy(), (c = a.current) == null || c.destroy();
|
|
60
|
+
};
|
|
61
|
+
}, [f, A, P, S, m]), O(() => {
|
|
62
|
+
const t = n.current;
|
|
63
|
+
return () => t == null ? void 0 : t.forEach((o) => {
|
|
64
|
+
o && clearTimeout(o);
|
|
65
|
+
});
|
|
66
|
+
}, [n]), f ? /* @__PURE__ */ k(G, { children: [
|
|
67
|
+
/* @__PURE__ */ i(J, { ref: D }),
|
|
68
|
+
Y && /* @__PURE__ */ i(Q, { children: /* @__PURE__ */ i(V, { ref: I }) }),
|
|
69
|
+
R && /* @__PURE__ */ i(
|
|
70
|
+
Z,
|
|
60
71
|
{
|
|
61
72
|
$delay: 1e3,
|
|
62
|
-
$animationType:
|
|
63
|
-
$duration:
|
|
64
|
-
children:
|
|
73
|
+
$animationType: L ? "fadeout" : "fadein",
|
|
74
|
+
$duration: L ? ae : ne,
|
|
75
|
+
children: R
|
|
65
76
|
}
|
|
66
77
|
),
|
|
67
|
-
|
|
68
|
-
|
|
78
|
+
p && /* @__PURE__ */ i(
|
|
79
|
+
ee,
|
|
69
80
|
{
|
|
70
|
-
$animationType:
|
|
81
|
+
$animationType: p ? "fadein" : "fadeout",
|
|
71
82
|
$duration: 200,
|
|
72
|
-
children: /* @__PURE__ */
|
|
83
|
+
children: /* @__PURE__ */ i(B, { accuracy: Math.round(A), time: 1e3 })
|
|
73
84
|
}
|
|
74
85
|
)
|
|
75
86
|
] }) : null;
|
|
76
87
|
});
|
|
77
88
|
export {
|
|
78
|
-
|
|
89
|
+
Ee as Accuracy
|
|
79
90
|
};
|
|
80
91
|
//# sourceMappingURL=accuracy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accuracy.js","sources":["../../../../src/features/post-game-stats/accuracy/accuracy.tsx"],"sourcesContent":["import type { IAccuracyProps } from './accuracy-types';\nimport type { AnimationItem } from 'lottie-web';\nimport type { FC } from 'react';\n\nimport Lottie from 'lottie-web';\nimport { memo, useEffect, useRef, useState, useCallback } from 'react';\n\nimport { LOTTIE } from '../../../assets/lottie/lottie';\nimport { useCircleSounds } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds';\nimport { CircleSoundKey } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums';\nimport { delay } from '../../utils/utils';\nimport { AnimatedPercentTextInput } from './accuracy-comps';\nimport * as Styled from './accuracy-styled';\nimport { getAccuracyFramesToPlay } from './accuracy-utils';\nimport {\n METER,\n NEEDLE,\n NEEDLE_HOLD_TIME,\n TEXT_APPEAR_DURATION,\n TEXT_DISAPPEAR_DELAY,\n TEXT_DISAPPEAR_DURATION,\n NEEDLE_LOTTIE_FPS,\n} from './constants';\n\nexport const Accuracy: FC<IAccuracyProps> = memo(({ show, onComplete, accuracy, helperText }) => {\n const { play } = useCircleSounds();\n const accuracyMeterRef = useRef<HTMLDivElement>(null);\n const accuracyNeedleRef = useRef<HTMLDivElement>(null);\n const accuracyMeterAnimationRef = useRef<AnimationItem>(undefined);\n const accuracyNeedleAnimationRef = useRef<AnimationItem>(undefined);\n\n const [showAccuracy, setShowAccuracy] = useState(true);\n const [showPercent, setShowPercent] = useState(false);\n const [fadeOut, setFadeOut] = useState(false);\n const needleFramesToPlay = useRef(0);\n\n const percentStartAnimationDelayInMs =\n ((NEEDLE.IN_FRAMES[1] - NEEDLE.IN_FRAMES[0]) / NEEDLE_LOTTIE_FPS) * 1000;\n\n const playExitAnimation = useCallback(async () => {\n try {\n await delay(NEEDLE_HOLD_TIME);\n setShowAccuracy(false);\n setShowPercent(false);\n play(CircleSoundKey.ACCURACY_OUT);\n accuracyMeterAnimationRef.current?.playSegments(METER.OUT_FRAMES, true);\n await delay(TEXT_DISAPPEAR_DELAY);\n setFadeOut(true);\n onComplete?.();\n } catch (err) {\n /* eslint-disable no-console */\n console.log(err);\n }\n }, [onComplete, play]);\n\n useEffect(() => {\n if (show) {\n const loadAnimations = async () => {\n const [meterLottie, needleLottie] = await Promise.all([\n fetch(LOTTIE.ACCURACY_METER),\n fetch(LOTTIE.ACCURACY_NEEDLE),\n ]);\n const [meterLottieData, needleLottieData] = await Promise.all([\n meterLottie.json(),\n needleLottie.json(),\n ]);\n\n accuracyMeterAnimationRef.current = Lottie.loadAnimation({\n container: accuracyMeterRef.current as Element,\n animationData: meterLottieData,\n autoplay: false,\n loop: false,\n renderer: 'svg',\n });\n\n accuracyNeedleAnimationRef.current = Lottie.loadAnimation({\n container: accuracyNeedleRef.current as Element,\n animationData: needleLottieData,\n autoplay: false,\n loop: false,\n renderer: 'svg',\n });\n\n play(CircleSoundKey.ACCURACY_IN);\n accuracyMeterAnimationRef.current?.playSegments(METER.IN_FRAMES, true);\n\n delay(percentStartAnimationDelayInMs).then(() => {\n const frames = getAccuracyFramesToPlay(accuracy);\n\n needleFramesToPlay.current = frames;\n accuracyNeedleAnimationRef.current?.setSpeed(frames / NEEDLE_LOTTIE_FPS);\n accuracyNeedleAnimationRef.current?.playSegments([0, frames], true);\n setShowPercent(true);\n\n accuracyNeedleAnimationRef.current?.addEventListener('complete', () => {\n delay(NEEDLE_HOLD_TIME).then(() => playExitAnimation());\n });\n });\n };\n\n loadAnimations();\n\n return () => {\n accuracyMeterAnimationRef.current?.destroy();\n accuracyNeedleAnimationRef.current?.destroy();\n };\n }\n }, [show, accuracy, percentStartAnimationDelayInMs, playExitAnimation, play]);\n\n if (show) {\n return (\n <Styled.Accuracy>\n <Styled.AccuracyMeterLottie ref={accuracyMeterRef} />\n {showAccuracy && (\n <Styled.AnimatedAccuracyNeedleContainer>\n <Styled.AccuracyNeedleLottie ref={accuracyNeedleRef} />\n </Styled.AnimatedAccuracyNeedleContainer>\n )}\n {helperText && (\n <Styled.TextWrapper\n $delay={1000}\n $animationType={fadeOut ? 'fadeout' : 'fadein'}\n $duration={fadeOut ? TEXT_DISAPPEAR_DURATION : TEXT_APPEAR_DURATION}\n >\n {helperText}\n </Styled.TextWrapper>\n )}\n {showPercent && (\n <Styled.PercentTextWrapper\n $animationType={showPercent ? 'fadein' : 'fadeout'}\n $duration={showPercent ? 200 : 200}\n >\n <AnimatedPercentTextInput accuracy={Math.round(accuracy)} time={1000} />\n </Styled.PercentTextWrapper>\n )}\n </Styled.Accuracy>\n );\n }\n\n return null;\n});\n"],"names":["Accuracy","memo","show","onComplete","accuracy","helperText","play","useCircleSounds","accuracyMeterRef","useRef","accuracyNeedleRef","accuracyMeterAnimationRef","accuracyNeedleAnimationRef","showAccuracy","setShowAccuracy","useState","showPercent","setShowPercent","fadeOut","setFadeOut","needleFramesToPlay","percentStartAnimationDelayInMs","NEEDLE","NEEDLE_LOTTIE_FPS","playExitAnimation","useCallback","delay","NEEDLE_HOLD_TIME","CircleSoundKey","_a","METER","TEXT_DISAPPEAR_DELAY","err","useEffect","meterLottie","needleLottie","LOTTIE","meterLottieData","needleLottieData","Lottie","frames","getAccuracyFramesToPlay","_b","_c","jsxs","Styled.Accuracy","jsx","Styled.AccuracyMeterLottie","Styled.AnimatedAccuracyNeedleContainer","Styled.AccuracyNeedleLottie","Styled.TextWrapper","TEXT_DISAPPEAR_DURATION","TEXT_APPEAR_DURATION","Styled.PercentTextWrapper","AnimatedPercentTextInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"accuracy.js","sources":["../../../../src/features/post-game-stats/accuracy/accuracy.tsx"],"sourcesContent":["import type { IAccuracyProps } from './accuracy-types';\nimport type { AnimationItem } from 'lottie-web';\nimport type { FC } from 'react';\n\nimport Lottie from 'lottie-web';\nimport { memo, useEffect, useRef, useState, useCallback } from 'react';\n\nimport { LOTTIE } from '../../../assets/lottie/lottie';\nimport { useCircleSounds } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds';\nimport { CircleSoundKey } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums';\nimport { delay } from '../../utils/utils';\nimport { AnimatedPercentTextInput } from './accuracy-comps';\nimport * as Styled from './accuracy-styled';\nimport { getAccuracyFramesToPlay } from './accuracy-utils';\nimport {\n METER,\n NEEDLE,\n NEEDLE_HOLD_TIME,\n TEXT_APPEAR_DURATION,\n TEXT_DISAPPEAR_DELAY,\n TEXT_DISAPPEAR_DURATION,\n NEEDLE_LOTTIE_FPS,\n} from './constants';\n\nexport const Accuracy: FC<IAccuracyProps> = memo(({ show, onComplete, accuracy, helperText }) => {\n const { play } = useCircleSounds();\n const accuracyMeterRef = useRef<HTMLDivElement>(null);\n const accuracyNeedleRef = useRef<HTMLDivElement>(null);\n const accuracyMeterAnimationRef = useRef<AnimationItem>(undefined);\n const accuracyNeedleAnimationRef = useRef<AnimationItem>(undefined);\n\n const [showAccuracy, setShowAccuracy] = useState(true);\n const [showPercent, setShowPercent] = useState(false);\n const [fadeOut, setFadeOut] = useState(false);\n const needleFramesToPlay = useRef(0);\n\n const timerIdsRef = useRef<(ReturnType<typeof setTimeout> | null)[]>([]);\n\n const percentStartAnimationDelayInMs =\n ((NEEDLE.IN_FRAMES[1] - NEEDLE.IN_FRAMES[0]) / NEEDLE_LOTTIE_FPS) * 1000;\n\n const playExitAnimation = useCallback(async () => {\n try {\n const { promise: needleHoldPromise, timerId: needleHoldTimeId } = delay(NEEDLE_HOLD_TIME);\n\n timerIdsRef.current.push(needleHoldTimeId);\n\n await needleHoldPromise;\n setShowAccuracy(false);\n setShowPercent(false);\n play(CircleSoundKey.ACCURACY_OUT);\n accuracyMeterAnimationRef.current?.playSegments(METER.OUT_FRAMES, true);\n\n const { promise: textDisappearDelayPromise, timerId: textDisappearDelayId } =\n delay(TEXT_DISAPPEAR_DELAY);\n\n timerIdsRef.current?.push(textDisappearDelayId);\n\n await textDisappearDelayPromise;\n setFadeOut(true);\n onComplete?.();\n } catch (err) {\n /* eslint-disable no-console */\n console.log(err);\n }\n }, [onComplete, play]);\n\n useEffect(() => {\n if (!show) {\n return;\n }\n\n const handleExitAnimation = async () => {\n const { promise, timerId } = delay(NEEDLE_HOLD_TIME);\n\n timerIdsRef.current.push(timerId);\n\n await promise;\n playExitAnimation();\n };\n\n const loadAnimations = async () => {\n const [meterLottie, needleLottie] = await Promise.all([\n fetch(LOTTIE.ACCURACY_METER),\n fetch(LOTTIE.ACCURACY_NEEDLE),\n ]);\n const [meterLottieData, needleLottieData] = await Promise.all([\n meterLottie.json(),\n needleLottie.json(),\n ]);\n\n accuracyMeterAnimationRef.current = Lottie.loadAnimation({\n container: accuracyMeterRef.current as Element,\n animationData: meterLottieData,\n autoplay: false,\n loop: false,\n renderer: 'svg',\n });\n\n accuracyNeedleAnimationRef.current = Lottie.loadAnimation({\n container: accuracyNeedleRef.current as Element,\n animationData: needleLottieData,\n autoplay: false,\n loop: false,\n renderer: 'svg',\n });\n\n play(CircleSoundKey.ACCURACY_IN);\n accuracyMeterAnimationRef.current?.playSegments(METER.IN_FRAMES, true);\n\n const { promise, timerId } = delay(percentStartAnimationDelayInMs);\n\n timerIdsRef.current.push(timerId);\n\n await promise;\n\n const frames = getAccuracyFramesToPlay(accuracy);\n\n needleFramesToPlay.current = frames;\n accuracyNeedleAnimationRef.current?.setSpeed(frames / NEEDLE_LOTTIE_FPS);\n accuracyNeedleAnimationRef.current?.playSegments([0, frames], true);\n setShowPercent(true);\n\n accuracyNeedleAnimationRef.current?.addEventListener('complete', handleExitAnimation);\n };\n\n loadAnimations();\n\n return () => {\n accuracyNeedleAnimationRef.current?.removeEventListener('complete', handleExitAnimation);\n accuracyMeterAnimationRef.current?.destroy();\n accuracyNeedleAnimationRef.current?.destroy();\n };\n }, [show, accuracy, percentStartAnimationDelayInMs, playExitAnimation, play]);\n\n useEffect(() => {\n const timerIds = timerIdsRef.current;\n\n return () =>\n timerIds?.forEach(timerId => {\n if (timerId) {\n clearTimeout(timerId);\n }\n });\n }, [timerIdsRef]);\n\n if (!show) {\n return null;\n }\n\n return (\n <Styled.Accuracy>\n <Styled.AccuracyMeterLottie ref={accuracyMeterRef} />\n {showAccuracy && (\n <Styled.AnimatedAccuracyNeedleContainer>\n <Styled.AccuracyNeedleLottie ref={accuracyNeedleRef} />\n </Styled.AnimatedAccuracyNeedleContainer>\n )}\n {helperText && (\n <Styled.TextWrapper\n $delay={1000}\n $animationType={fadeOut ? 'fadeout' : 'fadein'}\n $duration={fadeOut ? TEXT_DISAPPEAR_DURATION : TEXT_APPEAR_DURATION}\n >\n {helperText}\n </Styled.TextWrapper>\n )}\n {showPercent && (\n <Styled.PercentTextWrapper\n $animationType={showPercent ? 'fadein' : 'fadeout'}\n $duration={showPercent ? 200 : 200}\n >\n <AnimatedPercentTextInput accuracy={Math.round(accuracy)} time={1000} />\n </Styled.PercentTextWrapper>\n )}\n </Styled.Accuracy>\n );\n});\n"],"names":["Accuracy","memo","show","onComplete","accuracy","helperText","play","useCircleSounds","accuracyMeterRef","useRef","accuracyNeedleRef","accuracyMeterAnimationRef","accuracyNeedleAnimationRef","showAccuracy","setShowAccuracy","useState","showPercent","setShowPercent","fadeOut","setFadeOut","needleFramesToPlay","timerIdsRef","percentStartAnimationDelayInMs","NEEDLE","NEEDLE_LOTTIE_FPS","playExitAnimation","useCallback","needleHoldPromise","needleHoldTimeId","delay","NEEDLE_HOLD_TIME","CircleSoundKey","_a","METER","textDisappearDelayPromise","textDisappearDelayId","TEXT_DISAPPEAR_DELAY","_b","err","useEffect","handleExitAnimation","promise","timerId","meterLottie","needleLottie","LOTTIE","meterLottieData","needleLottieData","Lottie","frames","getAccuracyFramesToPlay","_c","_d","timerIds","jsxs","Styled.Accuracy","jsx","Styled.AccuracyMeterLottie","Styled.AnimatedAccuracyNeedleContainer","Styled.AccuracyNeedleLottie","Styled.TextWrapper","TEXT_DISAPPEAR_DURATION","TEXT_APPEAR_DURATION","Styled.PercentTextWrapper","AnimatedPercentTextInput"],"mappings":"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"}
|
|
@@ -1,75 +1,98 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { memo as
|
|
4
|
-
import { LOTTIE as
|
|
5
|
-
import { useCircleSounds as
|
|
6
|
-
import { CircleSoundKey as
|
|
7
|
-
import { delay as
|
|
8
|
-
import { Clock as
|
|
9
|
-
import { getClockTimeSpentFramesToPlay as
|
|
10
|
-
import { CLOCK_TIME_SPENT_FPS as
|
|
11
|
-
const
|
|
12
|
-
const { play:
|
|
13
|
-
var t, e;
|
|
14
|
-
const r = Y(f);
|
|
15
|
-
r && (l.current = r, (t = n.current) == null || t.setSpeed(r / H), (e = n.current) == null || e.playSegments([0, r], !0), m.current = !0);
|
|
16
|
-
}, [f]), S = T(async () => {
|
|
1
|
+
import { jsxs as j, jsx as A } from "react/jsx-runtime";
|
|
2
|
+
import h from "lottie-web";
|
|
3
|
+
import { memo as H, useState as U, useRef as a, useCallback as m, useEffect as N } from "react";
|
|
4
|
+
import { LOTTIE as F } from "../../../assets/lottie/lottie.js";
|
|
5
|
+
import { useCircleSounds as $ } from "../../circle-games/hooks/use-circle-sounds/use-circle-sounds.js";
|
|
6
|
+
import { CircleSoundKey as M } from "../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums.js";
|
|
7
|
+
import { delay as x } from "../../utils/utils.js";
|
|
8
|
+
import { Clock as w, ClockLottie as X, ClockTimeSpentLottie as Y, TextWrapper as W } from "./clock-styled.js";
|
|
9
|
+
import { getClockTimeSpentFramesToPlay as b } from "./clock-util.js";
|
|
10
|
+
import { CLOCK_TIME_SPENT_FPS as q, CLOCK as K, CLOCK_INFRAME_LOTTIE_TO_PLAY as z, TIME_LOTTIE_TO_PLAY_IN as B, TEXT_DISAPPEAR_DURATION as G, TEXT_APPEAR_DURATION as J, TIME_SHOWN_HOLD_TIME as Q, TEXT_DISAPPEAR_DELAY as V } from "./constants.js";
|
|
11
|
+
const me = H(({ show: T, onComplete: l, timeInMs: _, helperText: C }) => {
|
|
12
|
+
const { play: u } = $(), [O, g] = U(!1), f = a(!1), d = a(0), y = a(null), I = a(null), c = a(void 0), n = a(void 0), p = a([]), E = m(() => {
|
|
17
13
|
var r, t;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
14
|
+
const e = b(_);
|
|
15
|
+
e && (d.current = e, (r = n.current) == null || r.setSpeed(e / q), (t = n.current) == null || t.playSegments([0, e], !0), f.current = !0);
|
|
16
|
+
}, [_]), P = m(() => {
|
|
17
|
+
var e;
|
|
18
|
+
u(M.CLOCK_OUT), (e = c.current) == null || e.playSegments(K.OUT_FRAMES, !0);
|
|
19
|
+
}, [u]), k = m(async () => {
|
|
20
|
+
var o, i;
|
|
21
|
+
const { promise: e, timerId: r } = x(Q);
|
|
22
|
+
p.current.push(r), await e, (o = n.current) == null || o.playSegments([d.current, 0], !0);
|
|
23
|
+
const { promise: t, timerId: s } = x(V);
|
|
24
|
+
p.current.push(s), await t, g(!0), f.current && ((i = n.current) == null || i.addEventListener("complete", P));
|
|
25
|
+
}, [d, P]), L = m(() => {
|
|
26
|
+
l == null || l();
|
|
27
|
+
}, [l]), S = m(() => {
|
|
28
|
+
f.current ? L() : E();
|
|
29
|
+
}, [L, E]);
|
|
30
|
+
return N(() => {
|
|
31
|
+
if (!T)
|
|
32
|
+
return;
|
|
33
|
+
const e = () => {
|
|
34
|
+
var t;
|
|
35
|
+
(t = n.current) == null || t.removeEventListener("complete"), k();
|
|
36
|
+
};
|
|
37
|
+
return (async () => {
|
|
38
|
+
var D, R, v;
|
|
39
|
+
const [t, s] = await Promise.all([
|
|
40
|
+
fetch(F.TOTAL_TIME),
|
|
41
|
+
fetch(F.TOTAL_TIME_SPENT)
|
|
42
|
+
]), [o, i] = await Promise.all([
|
|
43
|
+
t.json(),
|
|
44
|
+
s.json()
|
|
45
|
+
]);
|
|
46
|
+
c.current = h.loadAnimation({
|
|
47
|
+
container: y.current,
|
|
48
|
+
animationData: o,
|
|
49
|
+
autoplay: !1,
|
|
50
|
+
loop: !1,
|
|
51
|
+
renderer: "canvas"
|
|
52
|
+
}), n.current = h.loadAnimation({
|
|
53
|
+
container: I.current,
|
|
54
|
+
animationData: i,
|
|
55
|
+
autoplay: !1,
|
|
56
|
+
loop: !1,
|
|
57
|
+
renderer: "canvas"
|
|
58
|
+
}), (D = n.current) == null || D.addEventListener(
|
|
59
|
+
"complete",
|
|
60
|
+
e
|
|
61
|
+
), u(M.CLOCK_IN), (R = c.current) == null || R.playSegments(K.IN_FRAMES, !0), (v = c.current) == null || v.addEventListener("complete", S);
|
|
62
|
+
})(), () => {
|
|
63
|
+
var t, s, o, i;
|
|
64
|
+
(t = c.current) == null || t.removeEventListener("complete", S), (s = n.current) == null || s.removeEventListener(
|
|
65
|
+
"complete",
|
|
66
|
+
e
|
|
67
|
+
), (o = n.current) == null || o.destroy(), (i = c.current) == null || i.destroy();
|
|
68
|
+
};
|
|
69
|
+
}, [
|
|
70
|
+
T,
|
|
71
|
+
E,
|
|
72
|
+
L,
|
|
73
|
+
k,
|
|
74
|
+
u,
|
|
75
|
+
S
|
|
76
|
+
]), N(() => {
|
|
77
|
+
const e = p.current;
|
|
78
|
+
return () => e == null ? void 0 : e.forEach((r) => {
|
|
79
|
+
r && clearTimeout(r);
|
|
80
|
+
});
|
|
81
|
+
}, [p]), T ? /* @__PURE__ */ j(w, { children: [
|
|
82
|
+
/* @__PURE__ */ A(X, { ref: y }),
|
|
83
|
+
/* @__PURE__ */ A(Y, { ref: I }),
|
|
84
|
+
C && /* @__PURE__ */ A(
|
|
85
|
+
W,
|
|
63
86
|
{
|
|
64
|
-
$delay:
|
|
65
|
-
$animationType:
|
|
66
|
-
$duration:
|
|
67
|
-
children:
|
|
87
|
+
$delay: z + B,
|
|
88
|
+
$animationType: O ? "fadeout" : "fadein",
|
|
89
|
+
$duration: O ? G : J,
|
|
90
|
+
children: C
|
|
68
91
|
}
|
|
69
92
|
)
|
|
70
93
|
] }) : null;
|
|
71
94
|
});
|
|
72
95
|
export {
|
|
73
|
-
|
|
96
|
+
me as Clock
|
|
74
97
|
};
|
|
75
98
|
//# sourceMappingURL=clock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock.js","sources":["../../../../src/features/post-game-stats/clock/clock.tsx"],"sourcesContent":["import type { IClockProps } from './clock-types';\nimport type { AnimationItem } from 'lottie-web';\nimport type { FC } from 'react';\n\nimport Lottie from 'lottie-web';\nimport { memo, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { LOTTIE } from '../../../assets/lottie/lottie';\nimport { useCircleSounds } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds';\nimport { CircleSoundKey } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums';\nimport { delay } from '../../utils/utils';\nimport * as Styled from './clock-styled';\nimport { getClockTimeSpentFramesToPlay } from './clock-util';\nimport {\n CLOCK,\n CLOCK_TIME_SPENT_FPS,\n TIME_SHOWN_HOLD_TIME,\n TEXT_APPEAR_DURATION,\n TEXT_DISAPPEAR_DELAY,\n TEXT_DISAPPEAR_DURATION,\n CLOCK_INFRAME_LOTTIE_TO_PLAY,\n TIME_LOTTIE_TO_PLAY_IN,\n} from './constants';\n\nexport const Clock: FC<IClockProps> = memo(({ show, onComplete, timeInMs, helperText }) => {\n const { play } = useCircleSounds();\n const [fadeOut, setFadeOut] = useState(false);\n const isClockTimeSpentShown = useRef(false);\n const framesToPlay = useRef(0);\n\n const clockLottieContainerRef = useRef<HTMLDivElement>(null);\n const clockTimeSpentLottieContainerRef = useRef<HTMLDivElement>(null);\n const clockLottieAnimationRef = useRef<AnimationItem>(undefined);\n const clockTimeSpentLottieAnimationRef = useRef<AnimationItem>(undefined);\n\n const setClockTimeSpentFrames = useCallback(() => {\n const frames = getClockTimeSpentFramesToPlay(timeInMs);\n\n if (frames) {\n framesToPlay.current = frames;\n // Speed adjustment\n clockTimeSpentLottieAnimationRef.current?.setSpeed(frames / CLOCK_TIME_SPENT_FPS);\n clockTimeSpentLottieAnimationRef.current?.playSegments([0, frames], true);\n isClockTimeSpentShown.current = true;\n }\n }, [timeInMs]);\n\n const onClockTimeSpentExitAnimationFinished = useCallback(async () => {\n await delay(TIME_SHOWN_HOLD_TIME);\n\n // Reverse play time spent animation\n clockTimeSpentLottieAnimationRef.current?.playSegments([framesToPlay.current, 0], true);\n\n await delay(TEXT_DISAPPEAR_DELAY);\n setFadeOut(true);\n\n if (isClockTimeSpentShown.current) {\n clockTimeSpentLottieAnimationRef.current?.addEventListener('complete', () => {\n play(CircleSoundKey.CLOCK_OUT);\n clockLottieAnimationRef.current?.playSegments(CLOCK.OUT_FRAMES, true);\n });\n }\n }, [framesToPlay, play]);\n\n const onAnimationEnd = useCallback(() => {\n onComplete?.();\n }, [onComplete]);\n\n // Play entry animation\n useEffect(() => {\n if (show) {\n const loadAnimations = async () => {\n const [timeLottiePath, timeSpentLottiePath] = await Promise.all([\n fetch(LOTTIE.TOTAL_TIME),\n fetch(LOTTIE.TOTAL_TIME_SPENT),\n ]);\n const [timeLottieData, timeSpentLottieData] = await Promise.all([\n timeLottiePath.json(),\n timeSpentLottiePath.json(),\n ]);\n\n // Clock Lottie\n clockLottieAnimationRef.current = Lottie.loadAnimation({\n container: clockLottieContainerRef.current as Element,\n animationData: timeLottieData,\n autoplay: false,\n loop: false,\n renderer: 'canvas',\n });\n\n // Clock Time Spent Lottie\n clockTimeSpentLottieAnimationRef.current = Lottie.loadAnimation({\n container: clockTimeSpentLottieContainerRef.current as Element,\n animationData: timeSpentLottieData,\n autoplay: false,\n loop: false,\n renderer: 'canvas',\n });\n\n // Play clock in animation sounds and lottie\n play(CircleSoundKey.CLOCK_IN);\n clockLottieAnimationRef.current?.playSegments(CLOCK.IN_FRAMES, true);\n\n clockLottieAnimationRef.current?.addEventListener('complete', () => {\n if (!isClockTimeSpentShown.current) {\n setClockTimeSpentFrames();\n } else {\n onAnimationEnd();\n }\n });\n\n // Setup event listener for time spent animation\n clockTimeSpentLottieAnimationRef.current?.addEventListener('complete', () => {\n clockTimeSpentLottieAnimationRef.current?.removeEventListener('complete');\n onClockTimeSpentExitAnimationFinished();\n });\n };\n\n loadAnimations();\n\n return () => {\n clockLottieAnimationRef.current?.destroy();\n clockTimeSpentLottieAnimationRef.current?.destroy();\n };\n }\n }, [show, setClockTimeSpentFrames, onAnimationEnd, onClockTimeSpentExitAnimationFinished, play]);\n\n if (show) {\n return (\n <Styled.Clock>\n <Styled.ClockLottie ref={clockLottieContainerRef} />\n <Styled.ClockTimeSpentLottie ref={clockTimeSpentLottieContainerRef} />\n {helperText && (\n <Styled.TextWrapper\n $delay={CLOCK_INFRAME_LOTTIE_TO_PLAY + TIME_LOTTIE_TO_PLAY_IN}\n $animationType={fadeOut ? 'fadeout' : 'fadein'}\n $duration={fadeOut ? TEXT_DISAPPEAR_DURATION : TEXT_APPEAR_DURATION}\n >\n {helperText}\n </Styled.TextWrapper>\n )}\n </Styled.Clock>\n );\n }\n\n return null;\n});\n"],"names":["Clock","memo","show","onComplete","timeInMs","helperText","play","useCircleSounds","fadeOut","setFadeOut","useState","isClockTimeSpentShown","useRef","framesToPlay","clockLottieContainerRef","clockTimeSpentLottieContainerRef","clockLottieAnimationRef","clockTimeSpentLottieAnimationRef","setClockTimeSpentFrames","useCallback","frames","getClockTimeSpentFramesToPlay","_a","CLOCK_TIME_SPENT_FPS","_b","onClockTimeSpentExitAnimationFinished","delay","TIME_SHOWN_HOLD_TIME","TEXT_DISAPPEAR_DELAY","CircleSoundKey","CLOCK","onAnimationEnd","useEffect","timeLottiePath","timeSpentLottiePath","LOTTIE","timeLottieData","timeSpentLottieData","Lottie","_c","jsxs","Styled.Clock","jsx","Styled.ClockLottie","Styled.ClockTimeSpentLottie","Styled.TextWrapper","CLOCK_INFRAME_LOTTIE_TO_PLAY","TIME_LOTTIE_TO_PLAY_IN","TEXT_DISAPPEAR_DURATION","TEXT_APPEAR_DURATION"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clock.js","sources":["../../../../src/features/post-game-stats/clock/clock.tsx"],"sourcesContent":["import type { IClockProps } from './clock-types';\nimport type { AnimationItem } from 'lottie-web';\nimport type { FC } from 'react';\n\nimport Lottie from 'lottie-web';\nimport { memo, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { LOTTIE } from '../../../assets/lottie/lottie';\nimport { useCircleSounds } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds';\nimport { CircleSoundKey } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums';\nimport { delay } from '../../utils/utils';\nimport * as Styled from './clock-styled';\nimport { getClockTimeSpentFramesToPlay } from './clock-util';\nimport {\n CLOCK,\n CLOCK_TIME_SPENT_FPS,\n TIME_SHOWN_HOLD_TIME,\n TEXT_APPEAR_DURATION,\n TEXT_DISAPPEAR_DELAY,\n TEXT_DISAPPEAR_DURATION,\n CLOCK_INFRAME_LOTTIE_TO_PLAY,\n TIME_LOTTIE_TO_PLAY_IN,\n} from './constants';\n\nexport const Clock: FC<IClockProps> = memo(({ show, onComplete, timeInMs, helperText }) => {\n const { play } = useCircleSounds();\n const [fadeOut, setFadeOut] = useState(false);\n const isClockTimeSpentShown = useRef(false);\n const framesToPlay = useRef(0);\n\n const clockLottieContainerRef = useRef<HTMLDivElement>(null);\n const clockTimeSpentLottieContainerRef = useRef<HTMLDivElement>(null);\n const clockLottieAnimationRef = useRef<AnimationItem>(undefined);\n const clockTimeSpentLottieAnimationRef = useRef<AnimationItem>(undefined);\n\n const timerIdsRef = useRef<(ReturnType<typeof setTimeout> | null)[]>([]);\n\n const setClockTimeSpentFrames = useCallback(() => {\n const frames = getClockTimeSpentFramesToPlay(timeInMs);\n\n if (frames) {\n framesToPlay.current = frames;\n // Speed adjustment\n clockTimeSpentLottieAnimationRef.current?.setSpeed(frames / CLOCK_TIME_SPENT_FPS);\n clockTimeSpentLottieAnimationRef.current?.playSegments([0, frames], true);\n isClockTimeSpentShown.current = true;\n }\n }, [timeInMs]);\n\n const handleAniamtionExit = useCallback(() => {\n play(CircleSoundKey.CLOCK_OUT);\n clockLottieAnimationRef.current?.playSegments(CLOCK.OUT_FRAMES, true);\n }, [play]);\n\n const onClockTimeSpentExitAnimationFinished = useCallback(async () => {\n const { promise: clockTimeSpentHoldPromise, timerId: clockTimeSpentHoldTimeId } =\n delay(TIME_SHOWN_HOLD_TIME);\n\n timerIdsRef.current.push(clockTimeSpentHoldTimeId);\n await clockTimeSpentHoldPromise;\n\n // Reverse play time spent animation\n clockTimeSpentLottieAnimationRef.current?.playSegments([framesToPlay.current, 0], true);\n\n const { promise: textDisappearDelayPromise, timerId: textDisappearDelayId } =\n delay(TEXT_DISAPPEAR_DELAY);\n\n timerIdsRef.current.push(textDisappearDelayId);\n await textDisappearDelayPromise;\n setFadeOut(true);\n\n if (isClockTimeSpentShown.current) {\n clockTimeSpentLottieAnimationRef.current?.addEventListener('complete', handleAniamtionExit);\n }\n }, [framesToPlay, handleAniamtionExit]);\n\n const onAnimationEnd = useCallback(() => {\n onComplete?.();\n }, [onComplete]);\n\n const handleTimeSpentAnimation = useCallback(() => {\n if (!isClockTimeSpentShown.current) {\n setClockTimeSpentFrames();\n } else {\n onAnimationEnd();\n }\n }, [onAnimationEnd, setClockTimeSpentFrames]);\n\n // Play entry animation\n useEffect(() => {\n if (!show) {\n return;\n }\n\n const handleTimeSpentAnimationComplete = () => {\n clockTimeSpentLottieAnimationRef.current?.removeEventListener('complete');\n onClockTimeSpentExitAnimationFinished();\n };\n\n const loadAnimations = async () => {\n const [timeLottiePath, timeSpentLottiePath] = await Promise.all([\n fetch(LOTTIE.TOTAL_TIME),\n fetch(LOTTIE.TOTAL_TIME_SPENT),\n ]);\n const [timeLottieData, timeSpentLottieData] = await Promise.all([\n timeLottiePath.json(),\n timeSpentLottiePath.json(),\n ]);\n\n // Clock Lottie\n clockLottieAnimationRef.current = Lottie.loadAnimation({\n container: clockLottieContainerRef.current as Element,\n animationData: timeLottieData,\n autoplay: false,\n loop: false,\n renderer: 'canvas',\n });\n\n // Clock Time Spent Lottie\n clockTimeSpentLottieAnimationRef.current = Lottie.loadAnimation({\n container: clockTimeSpentLottieContainerRef.current as Element,\n animationData: timeSpentLottieData,\n autoplay: false,\n loop: false,\n renderer: 'canvas',\n });\n\n // Setup event listener for time spent animation\n clockTimeSpentLottieAnimationRef.current?.addEventListener(\n 'complete',\n handleTimeSpentAnimationComplete,\n );\n\n // Play clock in animation sounds and lottie\n play(CircleSoundKey.CLOCK_IN);\n clockLottieAnimationRef.current?.playSegments(CLOCK.IN_FRAMES, true);\n\n clockLottieAnimationRef.current?.addEventListener('complete', handleTimeSpentAnimation);\n };\n\n loadAnimations();\n\n return () => {\n clockLottieAnimationRef.current?.removeEventListener('complete', handleTimeSpentAnimation);\n clockTimeSpentLottieAnimationRef.current?.removeEventListener(\n 'complete',\n handleTimeSpentAnimationComplete,\n );\n clockTimeSpentLottieAnimationRef.current?.destroy();\n clockLottieAnimationRef.current?.destroy();\n };\n }, [\n show,\n setClockTimeSpentFrames,\n onAnimationEnd,\n onClockTimeSpentExitAnimationFinished,\n play,\n handleTimeSpentAnimation,\n ]);\n\n useEffect(() => {\n const timerIds = timerIdsRef.current;\n\n return () =>\n timerIds?.forEach(timerId => {\n if (timerId) {\n clearTimeout(timerId);\n }\n });\n }, [timerIdsRef]);\n\n if (!show) {\n return null;\n }\n\n return (\n <Styled.Clock>\n <Styled.ClockLottie ref={clockLottieContainerRef} />\n <Styled.ClockTimeSpentLottie ref={clockTimeSpentLottieContainerRef} />\n {helperText && (\n <Styled.TextWrapper\n $delay={CLOCK_INFRAME_LOTTIE_TO_PLAY + TIME_LOTTIE_TO_PLAY_IN}\n $animationType={fadeOut ? 'fadeout' : 'fadein'}\n $duration={fadeOut ? TEXT_DISAPPEAR_DURATION : TEXT_APPEAR_DURATION}\n >\n {helperText}\n </Styled.TextWrapper>\n )}\n </Styled.Clock>\n );\n});\n"],"names":["Clock","memo","show","onComplete","timeInMs","helperText","play","useCircleSounds","fadeOut","setFadeOut","useState","isClockTimeSpentShown","useRef","framesToPlay","clockLottieContainerRef","clockTimeSpentLottieContainerRef","clockLottieAnimationRef","clockTimeSpentLottieAnimationRef","timerIdsRef","setClockTimeSpentFrames","useCallback","frames","getClockTimeSpentFramesToPlay","_a","CLOCK_TIME_SPENT_FPS","_b","handleAniamtionExit","CircleSoundKey","CLOCK","onClockTimeSpentExitAnimationFinished","clockTimeSpentHoldPromise","clockTimeSpentHoldTimeId","delay","TIME_SHOWN_HOLD_TIME","textDisappearDelayPromise","textDisappearDelayId","TEXT_DISAPPEAR_DELAY","onAnimationEnd","handleTimeSpentAnimation","useEffect","handleTimeSpentAnimationComplete","timeLottiePath","timeSpentLottiePath","LOTTIE","timeLottieData","timeSpentLottieData","Lottie","_c","_d","timerIds","timerId","jsxs","Styled.Clock","jsx","Styled.ClockLottie","Styled.ClockTimeSpentLottie","Styled.TextWrapper","CLOCK_INFRAME_LOTTIE_TO_PLAY","TIME_LOTTIE_TO_PLAY_IN","TEXT_DISAPPEAR_DURATION","TEXT_APPEAR_DURATION"],"mappings":"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"}
|
|
@@ -1,79 +1,85 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { memo as
|
|
3
|
-
import { LOTTIE as
|
|
4
|
-
import { useCircleSounds as
|
|
5
|
-
import { CircleSoundKey as
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import { delay as
|
|
9
|
-
import { SCORE_DISAPPEAR_ANIMATION_DURATION_HIGH_SCORE as
|
|
10
|
-
import { HighScore as
|
|
11
|
-
const
|
|
1
|
+
import { jsx as o, jsxs as H } from "react/jsx-runtime";
|
|
2
|
+
import { memo as W, useState as f, useRef as S, useCallback as j, useMemo as C, useEffect as g } from "react";
|
|
3
|
+
import { LOTTIE as y } from "../../../assets/lottie/lottie.js";
|
|
4
|
+
import { useCircleSounds as v } from "../../circle-games/hooks/use-circle-sounds/use-circle-sounds.js";
|
|
5
|
+
import { CircleSoundKey as N } from "../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums.js";
|
|
6
|
+
import x from "../../ui/lottie-animation/lottie-animation.js";
|
|
7
|
+
import X from "../../ui/text/text.js";
|
|
8
|
+
import { delay as Y } from "../../utils/utils.js";
|
|
9
|
+
import { SCORE_DISAPPEAR_ANIMATION_DURATION_HIGH_SCORE as F, SCORE_APPEAR_ANIMATION_DURATION as G, SCORE_DISAPPEAR_ANIMATION_DURATION_YOUR_SCORE as B } from "./constants.js";
|
|
10
|
+
import { HighScore as K, HighScoreConfetti as Q, HighScoreValueWrapper as V, ScoreText as z, HighScoreTextAnimation as J } from "./score-styled.js";
|
|
11
|
+
const Z = {
|
|
12
12
|
autoplay: !0,
|
|
13
13
|
loop: !1,
|
|
14
14
|
renderer: "canvas"
|
|
15
|
-
},
|
|
15
|
+
}, ee = {
|
|
16
16
|
autoplay: !1,
|
|
17
17
|
loop: !1,
|
|
18
18
|
renderer: "canvas"
|
|
19
|
-
},
|
|
20
|
-
const { currentScore:
|
|
21
|
-
|
|
22
|
-
}, [
|
|
23
|
-
() => /* @__PURE__ */
|
|
24
|
-
|
|
19
|
+
}, fe = W((D) => {
|
|
20
|
+
const { currentScore: i, highScore: M, show: c, onComplete: s } = D, { play: m } = v(), n = i > M, [L, T] = f(0), [h, P] = f(!1), [U, E] = f(!1), p = S(null), _ = S(null), a = S([]), I = j(() => {
|
|
21
|
+
P(!0), E(!1), s == null || s();
|
|
22
|
+
}, [s]), $ = C(
|
|
23
|
+
() => /* @__PURE__ */ o(
|
|
24
|
+
x,
|
|
25
25
|
{
|
|
26
|
-
ref:
|
|
27
|
-
src:
|
|
28
|
-
settings:
|
|
26
|
+
ref: p,
|
|
27
|
+
src: y.HIGH_SCORE_CONFETTI,
|
|
28
|
+
settings: ee
|
|
29
29
|
}
|
|
30
30
|
),
|
|
31
31
|
[]
|
|
32
|
-
),
|
|
33
|
-
() => /* @__PURE__ */
|
|
34
|
-
|
|
32
|
+
), b = C(
|
|
33
|
+
() => /* @__PURE__ */ o(
|
|
34
|
+
x,
|
|
35
35
|
{
|
|
36
|
-
ref:
|
|
37
|
-
src:
|
|
38
|
-
settings:
|
|
36
|
+
ref: _,
|
|
37
|
+
src: y.HIGH_SCORE_TEXT,
|
|
38
|
+
settings: Z
|
|
39
39
|
}
|
|
40
40
|
),
|
|
41
41
|
[]
|
|
42
42
|
);
|
|
43
|
-
return
|
|
44
|
-
var
|
|
45
|
-
if (!
|
|
46
|
-
let
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
var
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
)
|
|
43
|
+
return g(() => {
|
|
44
|
+
var R;
|
|
45
|
+
if (!c) return;
|
|
46
|
+
let e, r = null, O = !1;
|
|
47
|
+
const k = (t) => 1 - Math.pow(1 - t, 2);
|
|
48
|
+
n && (E(!0), (R = _.current) == null || R.play());
|
|
49
|
+
const d = (t) => {
|
|
50
|
+
var A;
|
|
51
|
+
r === null && (r = t);
|
|
52
|
+
const l = t - r, u = Math.min(l / G, 1), w = k(u);
|
|
53
|
+
T(Math.floor(w * i)), u < 1 ? e = requestAnimationFrame(d) : (T(i), q()), !O && u >= 0.9 && n && ((A = p.current) == null || A.play(), m(n ? N.HIGH_SCORE : N.YOUR_SCORE), O = !0);
|
|
54
|
+
}, q = async () => {
|
|
55
|
+
const { promise: t, timerId: l } = Y(
|
|
56
|
+
n ? F : B
|
|
57
|
+
);
|
|
58
|
+
a.current.push(l), await t, I();
|
|
58
59
|
};
|
|
59
|
-
return
|
|
60
|
-
}, [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
return e = requestAnimationFrame(d), () => cancelAnimationFrame(e);
|
|
61
|
+
}, [i, c, I, n, m]), g(() => {
|
|
62
|
+
const e = a.current;
|
|
63
|
+
return () => e == null ? void 0 : e.forEach((r) => {
|
|
64
|
+
r && clearTimeout(r);
|
|
65
|
+
});
|
|
66
|
+
}, [a]), c ? /* @__PURE__ */ H(K, { children: [
|
|
67
|
+
/* @__PURE__ */ o(Q, { children: $ }),
|
|
68
|
+
/* @__PURE__ */ H(
|
|
69
|
+
V,
|
|
64
70
|
{
|
|
65
|
-
$animationType:
|
|
66
|
-
$duration:
|
|
71
|
+
$animationType: h ? "fadeout" : "fadein",
|
|
72
|
+
$duration: h ? F : G,
|
|
67
73
|
children: [
|
|
68
|
-
/* @__PURE__ */
|
|
69
|
-
/* @__PURE__ */
|
|
74
|
+
/* @__PURE__ */ o(X, { $renderAs: "ah2", $color: "WHITE", children: L }),
|
|
75
|
+
/* @__PURE__ */ o(z, { $renderAs: "ac4-black", $color: "WHITE_T_60", children: "SCORE" })
|
|
70
76
|
]
|
|
71
77
|
}
|
|
72
78
|
),
|
|
73
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ o(J, { opacity: U ? 1 : 0, children: b })
|
|
74
80
|
] }) : null;
|
|
75
81
|
});
|
|
76
82
|
export {
|
|
77
|
-
|
|
83
|
+
fe as Score
|
|
78
84
|
};
|
|
79
85
|
//# sourceMappingURL=score.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"score.js","sources":["../../../../src/features/post-game-stats/score/score.tsx"],"sourcesContent":["import type { ILottieAnimationRef } from '../../ui/lottie-animation/types';\nimport type { IHighScoreProps } from './score-types';\nimport type { FC } from 'react';\n\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { LOTTIE } from '../../../assets/lottie/lottie';\nimport { useCircleSounds } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds';\nimport { CircleSoundKey } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums';\nimport LottieAnimation from '../../ui/lottie-animation/lottie-animation';\nimport Text from '../../ui/text/text';\nimport { delay } from '../../utils/utils';\nimport {\n SCORE_APPEAR_ANIMATION_DURATION,\n SCORE_DISAPPEAR_ANIMATION_DURATION_HIGH_SCORE,\n SCORE_DISAPPEAR_ANIMATION_DURATION_YOUR_SCORE,\n} from './constants';\nimport * as Styled from './score-styled';\n\nconst HIGH_SCORE_TEXT_LOTTIE_SETTINGS = {\n autoplay: true,\n loop: false,\n renderer: 'canvas',\n};\n\nconst HIGH_SCORE_CONFETTI_LOTTIE_SETTINGS = {\n autoplay: false,\n loop: false,\n renderer: 'canvas',\n};\n\nexport const Score: FC<IHighScoreProps> = memo(props => {\n const { currentScore, highScore, show, onComplete } = props;\n\n const { play } = useCircleSounds();\n\n const hasUserBrokenCurrentHighScore = currentScore > highScore;\n\n const [displayScore, setDisplayScore] = useState(0);\n const [fadeOut, setFadeout] = useState(false);\n const [displayHighScoreTxt, setDisplayHighScoreText] = useState(false);\n\n const highScoreConfettiRef = useRef<ILottieAnimationRef>(null);\n const highScoreTextRef = useRef<ILottieAnimationRef>(null);\n\n const onEndAnimationFinished = useCallback(() => {\n setFadeout(true);\n setDisplayHighScoreText(false);\n onComplete?.();\n }, [onComplete]);\n\n const HighScoreConfettiLottie = useMemo(\n () => (\n <LottieAnimation\n ref={highScoreConfettiRef}\n src={LOTTIE.HIGH_SCORE_CONFETTI}\n settings={HIGH_SCORE_CONFETTI_LOTTIE_SETTINGS}\n />\n ),\n [],\n );\n\n const HighScoreTextLottie = useMemo(\n () => (\n <LottieAnimation\n ref={highScoreTextRef}\n src={LOTTIE.HIGH_SCORE_TEXT}\n settings={HIGH_SCORE_TEXT_LOTTIE_SETTINGS}\n />\n ),\n [],\n );\n\n // Animate the score from 0 to the current score\n useEffect(() => {\n if (!show) return;\n\n let animationFrameId: number;\n let startTime: number | null = null;\n let hasCrossedFirstQuater = false; // 🔸 Flag to track 50% trigger\n\n const easeOutCubic = (t: number) => 1 - Math.pow(1 - t, 2);\n\n if (hasUserBrokenCurrentHighScore) {\n setDisplayHighScoreText(true);\n highScoreTextRef.current?.play();\n }\n\n const animate = (timestamp: number) => {\n if (startTime === null) startTime = timestamp;\n\n const elapsed = timestamp - startTime;\n const progress = Math.min(elapsed / SCORE_APPEAR_ANIMATION_DURATION, 1);\n const eased = easeOutCubic(progress);\n\n setDisplayScore(Math.floor(eased * currentScore));\n\n if (progress < 1) {\n animationFrameId = requestAnimationFrame(animate);\n } else {\n setDisplayScore(currentScore);\n runExitSequence();\n }\n\n if (!hasCrossedFirstQuater && progress >= 0.9 && hasUserBrokenCurrentHighScore) {\n highScoreConfettiRef.current?.play();\n play(hasUserBrokenCurrentHighScore ? CircleSoundKey.HIGH_SCORE : CircleSoundKey.YOUR_SCORE);\n hasCrossedFirstQuater = true;\n }\n };\n\n // ✅ Async function outside animate()\n const runExitSequence = async () => {\n
|
|
1
|
+
{"version":3,"file":"score.js","sources":["../../../../src/features/post-game-stats/score/score.tsx"],"sourcesContent":["import type { ILottieAnimationRef } from '../../ui/lottie-animation/types';\nimport type { IHighScoreProps } from './score-types';\nimport type { FC } from 'react';\n\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { LOTTIE } from '../../../assets/lottie/lottie';\nimport { useCircleSounds } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds';\nimport { CircleSoundKey } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums';\nimport LottieAnimation from '../../ui/lottie-animation/lottie-animation';\nimport Text from '../../ui/text/text';\nimport { delay } from '../../utils/utils';\nimport {\n SCORE_APPEAR_ANIMATION_DURATION,\n SCORE_DISAPPEAR_ANIMATION_DURATION_HIGH_SCORE,\n SCORE_DISAPPEAR_ANIMATION_DURATION_YOUR_SCORE,\n} from './constants';\nimport * as Styled from './score-styled';\n\nconst HIGH_SCORE_TEXT_LOTTIE_SETTINGS = {\n autoplay: true,\n loop: false,\n renderer: 'canvas',\n};\n\nconst HIGH_SCORE_CONFETTI_LOTTIE_SETTINGS = {\n autoplay: false,\n loop: false,\n renderer: 'canvas',\n};\n\nexport const Score: FC<IHighScoreProps> = memo(props => {\n const { currentScore, highScore, show, onComplete } = props;\n\n const { play } = useCircleSounds();\n\n const hasUserBrokenCurrentHighScore = currentScore > highScore;\n\n const [displayScore, setDisplayScore] = useState(0);\n const [fadeOut, setFadeout] = useState(false);\n const [displayHighScoreTxt, setDisplayHighScoreText] = useState(false);\n\n const highScoreConfettiRef = useRef<ILottieAnimationRef>(null);\n const highScoreTextRef = useRef<ILottieAnimationRef>(null);\n\n const timerIdsRef = useRef<(ReturnType<typeof setTimeout> | null)[]>([]);\n\n const onEndAnimationFinished = useCallback(() => {\n setFadeout(true);\n setDisplayHighScoreText(false);\n onComplete?.();\n }, [onComplete]);\n\n const HighScoreConfettiLottie = useMemo(\n () => (\n <LottieAnimation\n ref={highScoreConfettiRef}\n src={LOTTIE.HIGH_SCORE_CONFETTI}\n settings={HIGH_SCORE_CONFETTI_LOTTIE_SETTINGS}\n />\n ),\n [],\n );\n\n const HighScoreTextLottie = useMemo(\n () => (\n <LottieAnimation\n ref={highScoreTextRef}\n src={LOTTIE.HIGH_SCORE_TEXT}\n settings={HIGH_SCORE_TEXT_LOTTIE_SETTINGS}\n />\n ),\n [],\n );\n\n // Animate the score from 0 to the current score\n useEffect(() => {\n if (!show) return;\n\n let animationFrameId: number;\n let startTime: number | null = null;\n let hasCrossedFirstQuater = false; // 🔸 Flag to track 50% trigger\n\n const easeOutCubic = (t: number) => 1 - Math.pow(1 - t, 2);\n\n if (hasUserBrokenCurrentHighScore) {\n setDisplayHighScoreText(true);\n highScoreTextRef.current?.play();\n }\n\n const animate = (timestamp: number) => {\n if (startTime === null) startTime = timestamp;\n\n const elapsed = timestamp - startTime;\n const progress = Math.min(elapsed / SCORE_APPEAR_ANIMATION_DURATION, 1);\n const eased = easeOutCubic(progress);\n\n setDisplayScore(Math.floor(eased * currentScore));\n\n if (progress < 1) {\n animationFrameId = requestAnimationFrame(animate);\n } else {\n setDisplayScore(currentScore);\n runExitSequence();\n }\n\n if (!hasCrossedFirstQuater && progress >= 0.9 && hasUserBrokenCurrentHighScore) {\n highScoreConfettiRef.current?.play();\n play(hasUserBrokenCurrentHighScore ? CircleSoundKey.HIGH_SCORE : CircleSoundKey.YOUR_SCORE);\n hasCrossedFirstQuater = true;\n }\n };\n\n // ✅ Async function outside animate()\n const runExitSequence = async () => {\n const { promise, timerId } = delay(\n hasUserBrokenCurrentHighScore\n ? SCORE_DISAPPEAR_ANIMATION_DURATION_HIGH_SCORE\n : SCORE_DISAPPEAR_ANIMATION_DURATION_YOUR_SCORE,\n );\n\n timerIdsRef.current.push(timerId);\n await promise;\n onEndAnimationFinished();\n };\n\n animationFrameId = requestAnimationFrame(animate);\n\n return () => cancelAnimationFrame(animationFrameId);\n }, [currentScore, show, onEndAnimationFinished, hasUserBrokenCurrentHighScore, play]);\n\n useEffect(() => {\n const timerIds = timerIdsRef.current;\n\n return () =>\n timerIds?.forEach(timerId => {\n if (timerId) {\n clearTimeout(timerId);\n }\n });\n }, [timerIdsRef]);\n\n if (!show) return null;\n\n return (\n <Styled.HighScore>\n <Styled.HighScoreConfetti>{HighScoreConfettiLottie}</Styled.HighScoreConfetti>\n\n <Styled.HighScoreValueWrapper\n $animationType={fadeOut ? 'fadeout' : 'fadein'}\n $duration={\n fadeOut ? SCORE_DISAPPEAR_ANIMATION_DURATION_HIGH_SCORE : SCORE_APPEAR_ANIMATION_DURATION\n }\n >\n <Text $renderAs=\"ah2\" $color=\"WHITE\">\n {displayScore}\n </Text>\n <Styled.ScoreText $renderAs=\"ac4-black\" $color=\"WHITE_T_60\">\n SCORE\n </Styled.ScoreText>\n </Styled.HighScoreValueWrapper>\n\n <Styled.HighScoreTextAnimation opacity={displayHighScoreTxt ? 1 : 0}>\n {HighScoreTextLottie}\n </Styled.HighScoreTextAnimation>\n </Styled.HighScore>\n );\n});\n"],"names":["HIGH_SCORE_TEXT_LOTTIE_SETTINGS","HIGH_SCORE_CONFETTI_LOTTIE_SETTINGS","Score","memo","props","currentScore","highScore","show","onComplete","play","useCircleSounds","hasUserBrokenCurrentHighScore","displayScore","setDisplayScore","useState","fadeOut","setFadeout","displayHighScoreTxt","setDisplayHighScoreText","highScoreConfettiRef","useRef","highScoreTextRef","timerIdsRef","onEndAnimationFinished","useCallback","HighScoreConfettiLottie","useMemo","jsx","LottieAnimation","LOTTIE","HighScoreTextLottie","useEffect","animationFrameId","startTime","hasCrossedFirstQuater","easeOutCubic","_a","animate","timestamp","elapsed","progress","SCORE_APPEAR_ANIMATION_DURATION","eased","runExitSequence","CircleSoundKey","promise","timerId","delay","SCORE_DISAPPEAR_ANIMATION_DURATION_HIGH_SCORE","SCORE_DISAPPEAR_ANIMATION_DURATION_YOUR_SCORE","timerIds","jsxs","Styled.HighScore","Styled.HighScoreConfetti","Styled.HighScoreValueWrapper","Text","Styled.ScoreText","Styled.HighScoreTextAnimation"],"mappings":"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"}
|
|
@@ -1,77 +1,82 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { memo as
|
|
4
|
-
import { LOTTIE as
|
|
5
|
-
import { useCircleSounds as
|
|
6
|
-
import { CircleSoundKey as
|
|
7
|
-
import { fetchLottie as
|
|
1
|
+
import { jsxs as D, jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import U from "lottie-web";
|
|
3
|
+
import { memo as w, useState as O, useRef as d, useCallback as W, useEffect as k } from "react";
|
|
4
|
+
import { LOTTIE as C } from "../../../assets/lottie/lottie.js";
|
|
5
|
+
import { useCircleSounds as b } from "../../circle-games/hooks/use-circle-sounds/use-circle-sounds.js";
|
|
6
|
+
import { CircleSoundKey as y } from "../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums.js";
|
|
7
|
+
import { fetchLottie as F } from "../../ui/lottie-animation/helper.js";
|
|
8
8
|
import { delay as l } from "../../utils/utils.js";
|
|
9
|
-
import { TEXT_DISAPPEAR_DELAY as
|
|
10
|
-
import { Streak as
|
|
11
|
-
const
|
|
12
|
-
const { currStreak:
|
|
13
|
-
var
|
|
9
|
+
import { TEXT_DISAPPEAR_DELAY as M, OUT_FRAMES as S, STREAK_DISAPPEAR_ANIMATION_DURATION as V, STREAK_APPEAR_ANIMATION_DURATION as g, STREAK_SCROLL_ANIMATION_DURATION as P, STREAK_WAIT_DURATION as h, TEXT_DISAPPEAR_DURATION as X, TEXT_APPEAR_DURATION as j, IN_FRAMES as H } from "./constants.js";
|
|
10
|
+
import { Streak as v, SVGImgContainer as G, StreakLottieView as Y, StreakValueWrapper as q, StreakValueContainer as z, StreakValue as N, TextWrapper as B } from "./streak-styled.js";
|
|
11
|
+
const st = w(($) => {
|
|
12
|
+
const { currStreak: I, show: u, onReveal: o, onComplete: i, helperText: f } = $, { play: n } = b(), [x, L] = O(0), E = d(null), s = d(void 0), [c, K] = O(!1), r = d([]), R = W(async () => {
|
|
13
|
+
var e;
|
|
14
14
|
try {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
),
|
|
15
|
+
const { promise: t, timerId: A } = l(M);
|
|
16
|
+
r.current.push(A), await t, K(!0), n(y.STREAK_OUT), (e = s.current) == null || e.playSegments(S, !0);
|
|
17
|
+
const T = (S[1] - S[0]) * 1e3 / 30, { promise: p, timerId: m } = l(T);
|
|
18
|
+
r.current.push(m), await p, i == null || i();
|
|
18
19
|
} catch (t) {
|
|
19
20
|
console.log(t);
|
|
20
21
|
}
|
|
21
|
-
}, [
|
|
22
|
-
return
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
22
|
+
}, [i, n]);
|
|
23
|
+
return k(() => u ? ((async () => {
|
|
24
|
+
var m;
|
|
25
|
+
const t = await F(C.TOTAL_STREAK);
|
|
26
|
+
s.current = U.loadAnimation({
|
|
27
|
+
container: E.current,
|
|
28
|
+
animationData: t,
|
|
29
|
+
autoplay: !1,
|
|
30
|
+
loop: !1,
|
|
31
|
+
renderer: "canvas"
|
|
32
|
+
}), n(y.STREAK_IN), (m = s.current) == null || m.playSegments(H, !0), o == null || o();
|
|
33
|
+
const { promise: A, timerId: _ } = l(h);
|
|
34
|
+
r.current.push(_), await A, L(1);
|
|
35
|
+
const { promise: T, timerId: p } = l(
|
|
36
|
+
P
|
|
37
|
+
);
|
|
38
|
+
r.current.push(p), await T, R();
|
|
39
|
+
})(), () => {
|
|
40
|
+
var t;
|
|
41
|
+
(t = s.current) == null || t.destroy();
|
|
42
|
+
}) : void 0, [u, R, n, o]), k(() => {
|
|
43
|
+
const e = r.current;
|
|
44
|
+
return () => e == null ? void 0 : e.forEach((t) => {
|
|
45
|
+
t && clearTimeout(t);
|
|
46
|
+
});
|
|
47
|
+
}, [r]), u ? /* @__PURE__ */ D(v, { children: [
|
|
48
|
+
/* @__PURE__ */ a(G, {}),
|
|
49
|
+
/* @__PURE__ */ a(Y, { ref: E }),
|
|
50
|
+
/* @__PURE__ */ a(
|
|
51
|
+
q,
|
|
47
52
|
{
|
|
48
|
-
$animationType:
|
|
49
|
-
$duration:
|
|
50
|
-
children: /* @__PURE__ */
|
|
51
|
-
|
|
53
|
+
$animationType: c ? "fadeout" : "fadein",
|
|
54
|
+
$duration: c ? V : g,
|
|
55
|
+
children: /* @__PURE__ */ D(
|
|
56
|
+
z,
|
|
52
57
|
{
|
|
53
|
-
$translate:
|
|
54
|
-
$translateDuration:
|
|
58
|
+
$translate: x > 0,
|
|
59
|
+
$translateDuration: P,
|
|
55
60
|
children: [
|
|
56
|
-
/* @__PURE__ */
|
|
57
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ a(N, { $color: "WHITE", $renderAs: "ab1-bold", children: I }),
|
|
62
|
+
/* @__PURE__ */ a(N, { $color: "WHITE", $renderAs: "ab1-bold", children: I + 1 })
|
|
58
63
|
]
|
|
59
64
|
}
|
|
60
65
|
)
|
|
61
66
|
}
|
|
62
67
|
),
|
|
63
|
-
|
|
64
|
-
|
|
68
|
+
f && /* @__PURE__ */ a(
|
|
69
|
+
B,
|
|
65
70
|
{
|
|
66
|
-
$delay:
|
|
67
|
-
$animationType:
|
|
68
|
-
$duration:
|
|
69
|
-
children:
|
|
71
|
+
$delay: h,
|
|
72
|
+
$animationType: c ? "fadeout" : "fadein",
|
|
73
|
+
$duration: c ? X : j,
|
|
74
|
+
children: f
|
|
70
75
|
}
|
|
71
76
|
)
|
|
72
77
|
] }) : null;
|
|
73
78
|
});
|
|
74
79
|
export {
|
|
75
|
-
|
|
80
|
+
st as Streak
|
|
76
81
|
};
|
|
77
82
|
//# sourceMappingURL=streak.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streak.js","sources":["../../../../src/features/post-game-stats/streak/streak.tsx"],"sourcesContent":["import type { IStreakProps } from './streak-types';\nimport type { AnimationItem } from 'lottie-web';\nimport type { FC } from 'react';\n\nimport Lottie from 'lottie-web';\nimport { memo, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { LOTTIE } from '../../../assets/lottie/lottie';\nimport { useCircleSounds } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds';\nimport { CircleSoundKey } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums';\nimport { fetchLottie } from '../../ui/lottie-animation/helper';\nimport { delay } from '../../utils/utils';\nimport {\n IN_FRAMES,\n OUT_FRAMES,\n STREAK_APPEAR_ANIMATION_DURATION,\n STREAK_DISAPPEAR_ANIMATION_DURATION,\n STREAK_SCROLL_ANIMATION_DURATION,\n STREAK_WAIT_DURATION,\n TEXT_APPEAR_DURATION,\n TEXT_DISAPPEAR_DELAY,\n TEXT_DISAPPEAR_DURATION,\n} from './constants';\nimport * as Styled from './streak-styled';\n\nexport const Streak: FC<IStreakProps> = memo(props => {\n const { currStreak, show, onReveal, onComplete, helperText } = props;\n const { play } = useCircleSounds();\n const [displayStreak, setDisplayStreak] = useState(0);\n const lottieContainerRef = useRef<HTMLDivElement>(null);\n const lottieAnimationRef = useRef<AnimationItem>(undefined);\n const [fadeOut, setFadeout] = useState(false);\n\n const playExitAnimation = useCallback(async () => {\n try {\n
|
|
1
|
+
{"version":3,"file":"streak.js","sources":["../../../../src/features/post-game-stats/streak/streak.tsx"],"sourcesContent":["import type { IStreakProps } from './streak-types';\nimport type { AnimationItem } from 'lottie-web';\nimport type { FC } from 'react';\n\nimport Lottie from 'lottie-web';\nimport { memo, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { LOTTIE } from '../../../assets/lottie/lottie';\nimport { useCircleSounds } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds';\nimport { CircleSoundKey } from '../../circle-games/hooks/use-circle-sounds/use-circle-sounds-enums';\nimport { fetchLottie } from '../../ui/lottie-animation/helper';\nimport { delay } from '../../utils/utils';\nimport {\n IN_FRAMES,\n OUT_FRAMES,\n STREAK_APPEAR_ANIMATION_DURATION,\n STREAK_DISAPPEAR_ANIMATION_DURATION,\n STREAK_SCROLL_ANIMATION_DURATION,\n STREAK_WAIT_DURATION,\n TEXT_APPEAR_DURATION,\n TEXT_DISAPPEAR_DELAY,\n TEXT_DISAPPEAR_DURATION,\n} from './constants';\nimport * as Styled from './streak-styled';\n\nexport const Streak: FC<IStreakProps> = memo(props => {\n const { currStreak, show, onReveal, onComplete, helperText } = props;\n const { play } = useCircleSounds();\n const [displayStreak, setDisplayStreak] = useState(0);\n const lottieContainerRef = useRef<HTMLDivElement>(null);\n const lottieAnimationRef = useRef<AnimationItem>(undefined);\n const [fadeOut, setFadeout] = useState(false);\n\n const timerIdsRef = useRef<(ReturnType<typeof setTimeout> | null)[]>([]);\n\n const playExitAnimation = useCallback(async () => {\n try {\n const { promise: textDisappearPromise, timerId: textDisappearTimeId } =\n delay(TEXT_DISAPPEAR_DELAY);\n\n timerIdsRef.current.push(textDisappearTimeId);\n await textDisappearPromise;\n setFadeout(true);\n play(CircleSoundKey.STREAK_OUT);\n lottieAnimationRef.current?.playSegments(OUT_FRAMES, true);\n const LOTTIE_FPS = 30;\n\n const exitAnimationDuration =\n (((OUT_FRAMES[1] as unknown as number) - (OUT_FRAMES[0] as unknown as number)) * 1000) /\n LOTTIE_FPS;\n const { promise: exitAnimationPromise, timerId: exitAnimationTimeId } =\n delay(exitAnimationDuration);\n\n timerIdsRef.current.push(exitAnimationTimeId);\n await exitAnimationPromise;\n onComplete?.();\n } catch (err) {\n /* eslint-disable no-console */\n console.log(err);\n }\n }, [onComplete, play]);\n\n // play entry animation\n useEffect(() => {\n if (!show) {\n return;\n }\n\n const loadAnimation = async () => {\n const streakLottieAnimationData = await fetchLottie(LOTTIE.TOTAL_STREAK);\n\n lottieAnimationRef.current = Lottie.loadAnimation({\n container: lottieContainerRef.current as Element,\n animationData: streakLottieAnimationData,\n autoplay: false,\n loop: false,\n renderer: 'canvas',\n });\n\n play(CircleSoundKey.STREAK_IN);\n lottieAnimationRef.current?.playSegments(IN_FRAMES, true);\n onReveal?.();\n\n const { promise: streakWaitPromise, timerId: streakWaitTimeId } = delay(STREAK_WAIT_DURATION);\n\n timerIdsRef.current.push(streakWaitTimeId);\n await streakWaitPromise;\n setDisplayStreak(1);\n\n const { promise: streakScrollPromise, timerId: streakScrollTimeId } = delay(\n STREAK_SCROLL_ANIMATION_DURATION,\n );\n\n timerIdsRef.current.push(streakScrollTimeId);\n await streakScrollPromise;\n playExitAnimation();\n };\n\n loadAnimation();\n\n return () => {\n lottieAnimationRef.current?.destroy();\n };\n }, [show, playExitAnimation, play, onReveal]);\n\n useEffect(() => {\n const timerIds = timerIdsRef.current;\n\n return () =>\n timerIds?.forEach(timerId => {\n if (timerId) {\n clearTimeout(timerId);\n }\n });\n }, [timerIdsRef]);\n\n if (!show) {\n return null;\n }\n\n return (\n <Styled.Streak>\n <Styled.SVGImgContainer />\n <Styled.StreakLottieView ref={lottieContainerRef} />\n\n <Styled.StreakValueWrapper\n $animationType={fadeOut ? 'fadeout' : 'fadein'}\n $duration={fadeOut ? STREAK_DISAPPEAR_ANIMATION_DURATION : STREAK_APPEAR_ANIMATION_DURATION}\n >\n <Styled.StreakValueContainer\n $translate={displayStreak > 0}\n $translateDuration={STREAK_SCROLL_ANIMATION_DURATION}\n >\n <Styled.StreakValue $color=\"WHITE\" $renderAs=\"ab1-bold\">\n {currStreak}\n </Styled.StreakValue>\n <Styled.StreakValue $color=\"WHITE\" $renderAs=\"ab1-bold\">\n {currStreak + 1}\n </Styled.StreakValue>\n </Styled.StreakValueContainer>\n </Styled.StreakValueWrapper>\n\n {helperText && (\n <Styled.TextWrapper\n $delay={STREAK_WAIT_DURATION}\n $animationType={fadeOut ? 'fadeout' : 'fadein'}\n $duration={fadeOut ? TEXT_DISAPPEAR_DURATION : TEXT_APPEAR_DURATION}\n >\n {helperText}\n </Styled.TextWrapper>\n )}\n </Styled.Streak>\n );\n});\n"],"names":["Streak","memo","props","currStreak","show","onReveal","onComplete","helperText","play","useCircleSounds","displayStreak","setDisplayStreak","useState","lottieContainerRef","useRef","lottieAnimationRef","fadeOut","setFadeout","timerIdsRef","playExitAnimation","useCallback","textDisappearPromise","textDisappearTimeId","delay","TEXT_DISAPPEAR_DELAY","CircleSoundKey","_a","OUT_FRAMES","exitAnimationDuration","exitAnimationPromise","exitAnimationTimeId","err","useEffect","streakLottieAnimationData","fetchLottie","LOTTIE","Lottie","IN_FRAMES","streakWaitPromise","streakWaitTimeId","STREAK_WAIT_DURATION","streakScrollPromise","streakScrollTimeId","STREAK_SCROLL_ANIMATION_DURATION","timerIds","timerId","jsxs","Styled.Streak","jsx","Styled.SVGImgContainer","Styled.StreakLottieView","Styled.StreakValueWrapper","STREAK_DISAPPEAR_ANIMATION_DURATION","STREAK_APPEAR_ANIMATION_DURATION","Styled.StreakValueContainer","Styled.StreakValue","Styled.TextWrapper","TEXT_DISAPPEAR_DURATION","TEXT_APPEAR_DURATION"],"mappings":"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"}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { addYears as s } from "../../node_modules/date-fns/addYears.js";
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
return
|
|
5
|
-
},
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
const i = (r) => Array.isArray(r) && r.length > 0, c = (r) => {
|
|
3
|
+
const t = (a) => a.toString().padStart(2, "0"), o = Math.floor(r / 3600), e = Math.floor(r % 3600 / 60), n = r % 60;
|
|
4
|
+
return o > 0 ? `${t(o)}:${t(e)}:${t(n)}` : `${t(e)}:${t(n)}`;
|
|
5
|
+
}, l = (r) => {
|
|
6
|
+
let t = null;
|
|
7
|
+
return { promise: new Promise((e) => {
|
|
8
|
+
t = setTimeout(() => {
|
|
9
|
+
e("resolved");
|
|
10
|
+
}, r);
|
|
11
|
+
}), timerId: t };
|
|
12
|
+
}, p = () => {
|
|
13
|
+
const t = s(/* @__PURE__ */ new Date(), 1);
|
|
14
|
+
return Math.floor(t.getTime() / 1e3);
|
|
12
15
|
};
|
|
13
16
|
export {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
l as delay,
|
|
18
|
+
p as epochTimestampAfterOneYear,
|
|
19
|
+
c as formatTimeInHHMMSS,
|
|
20
|
+
i as isNonEmptyArray
|
|
18
21
|
};
|
|
19
22
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/features/utils/utils.ts"],"sourcesContent":["import { addYears } from 'date-fns';\n\nconst isNonEmptyArray = (array: unknown) => {\n return Array.isArray(array) && array.length > 0;\n};\n\n// format the time in HH:MM:SS\nconst formatTimeInHHMMSS = (seconds: number) => {\n const pad = (num: number) => num.toString().padStart(2, '0');\n\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n\n return h > 0 ? `${pad(h)}:${pad(m)}:${pad(s)}` : `${pad(m)}:${pad(s)}`;\n};\n\nconst delay =
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/features/utils/utils.ts"],"sourcesContent":["import { addYears } from 'date-fns';\n\nconst isNonEmptyArray = (array: unknown) => {\n return Array.isArray(array) && array.length > 0;\n};\n\n// format the time in HH:MM:SS\nconst formatTimeInHHMMSS = (seconds: number) => {\n const pad = (num: number) => num.toString().padStart(2, '0');\n\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n\n return h > 0 ? `${pad(h)}:${pad(m)}:${pad(s)}` : `${pad(m)}:${pad(s)}`;\n};\n\nconst delay = (delayInMs: number) => {\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const promise = new Promise(res => {\n timerId = setTimeout(() => {\n res('resolved');\n }, delayInMs);\n });\n\n return { promise, timerId };\n};\n\nconst epochTimestampAfterOneYear = () => {\n const today = new Date();\n const oneYearLater = addYears(today, 1);\n\n return Math.floor(oneYearLater.getTime() / 1000);\n};\n\nexport { isNonEmptyArray, formatTimeInHHMMSS, delay, epochTimestampAfterOneYear };\n"],"names":["isNonEmptyArray","array","formatTimeInHHMMSS","seconds","pad","num","h","m","s","delay","delayInMs","timerId","res","epochTimestampAfterOneYear","oneYearLater","addYears"],"mappings":";AAEM,MAAAA,IAAkB,CAACC,MAChB,MAAM,QAAQA,CAAK,KAAKA,EAAM,SAAS,GAI1CC,IAAqB,CAACC,MAAoB;AACxC,QAAAC,IAAM,CAACC,MAAgBA,EAAI,WAAW,SAAS,GAAG,GAAG,GAErDC,IAAI,KAAK,MAAMH,IAAU,IAAI,GAC7BI,IAAI,KAAK,MAAOJ,IAAU,OAAQ,EAAE,GACpCK,IAAIL,IAAU;AAEb,SAAAG,IAAI,IAAI,GAAGF,EAAIE,CAAC,CAAC,IAAIF,EAAIG,CAAC,CAAC,IAAIH,EAAII,CAAC,CAAC,KAAK,GAAGJ,EAAIG,CAAC,CAAC,IAAIH,EAAII,CAAC,CAAC;AACtE,GAEMC,IAAQ,CAACC,MAAsB;AACnC,MAAIC,IAAgD;AAO7C,SAAA,EAAE,SANO,IAAI,QAAQ,CAAOC,MAAA;AACjC,IAAAD,IAAU,WAAW,MAAM;AACzB,MAAAC,EAAI,UAAU;AAAA,OACbF,CAAS;AAAA,EAAA,CACb,GAEiB,SAAAC;AACpB,GAEME,IAA6B,MAAM;AAEjC,QAAAC,IAAeC,sBADH,QACmB,CAAC;AAEtC,SAAO,KAAK,MAAMD,EAAa,YAAY,GAAI;AACjD;"}
|