@cuemath/leap 3.1.42-hg1 → 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/circle-games/games/web-view/web-view-types.js.map +1 -1
- package/dist/features/circle-games/games/web-view/web-view.js +54 -64
- package/dist/features/circle-games/games/web-view/web-view.js.map +1 -1
- 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/dist/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-view-types.js","sources":["../../../../../src/features/circle-games/games/web-view/web-view-types.ts"],"sourcesContent":["import type { IAvatarLayer } from '../../../ui/avatar/avatar-types';\nimport type { TUserTypes } from '../../../ui/types';\nimport type { WebViewEvent, ProjectOutcome, ProjectType } from './enums';\nimport type { WEBVIEW_ANALYTICS_EVENTS } from './web-view-analytics-events';\nimport type { IframeHTMLAttributes } from 'react';\n\nexport interface IPlayer {\n id: string;\n username: string;\n grade?: string;\n avatar?: IAvatarLayer[] | null;\n playerType: TUserTypes;\n countryCode: string;\n isAdmin?: boolean;\n}\n\ninterface ISyncableWebGameProps {\n joinByRoomId?: string;\n enableSync?: boolean; // applicable for all except multiplayer games and tables\n}\n\ninterface IBaseWebGameProps {\n projectId: string;\n variant: string;\n projectType: ProjectType;\n enableCloseButton?: boolean;\n}\n\nexport interface IMultiplayerWebGameProps extends IBaseWebGameProps, ISyncableWebGameProps {\n enablePlayerTurnIndicators?: boolean;\n}\n\nexport interface IPuzzleWebGameProps extends IBaseWebGameProps, ISyncableWebGameProps {\n question: string;\n askHintPermission?: boolean;\n}\n\nexport interface ILessonWebGameProps extends IBaseWebGameProps, ISyncableWebGameProps {\n miniGameIdentifier: string;\n sessionId: string;\n targetQuestions: number;\n}\n\nexport interface ITableWebGameProps extends IBaseWebGameProps {\n tableNumber: number;\n infiniteModeHighScore?: number;\n}\n\nexport interface IVibrationPattern {\n pattern: number[] | number;\n}\n\nexport enum IStatsToAwardErrorCode {\n DEFAULT = 'default',\n SUCCESS = 'success',\n FAIL = 'fail',\n}\n\nexport interface IPlayerStats {\n points: number;\n accuracy: number;\n timeSpent: number;\n streakDays: number;\n streakStatusToday: 'pending' | 'completed';\n errorCode: IStatsToAwardErrorCode;\n outcome: ProjectOutcome;\n value: string;\n starEligibleTime?: number;\n starEligibleAccuracy?: number;\n starRewarded?: boolean;\n}\n\nexport interface IInfoMessage {\n message: string;\n position: 'top' | 'bottom';\n}\n\nexport interface ITrackEvent {\n eventName: typeof WEBVIEW_ANALYTICS_EVENTS;\n properties: Record<string, unknown>;\n}\n\nexport interface IWebViewProps extends IframeHTMLAttributes<HTMLIFrameElement> {\n baseUrl: string;\n projectDetails:\n | IMultiplayerWebGameProps\n | IPuzzleWebGameProps\n | ILessonWebGameProps\n | ITableWebGameProps;\n parentDomain: string;\n playerDetails: IPlayer;\n onBack?: () => void;\n onGameLoad?: () => void;\n onGamePlayFinish?: (playerStats: IPlayerStats) => void;\n handleInfoMessage?: (infoMessage: IInfoMessage) => void;\n}\n\nexport interface IMessageProps {\n event: `${WebViewEvent}`;\n payload: IVibrationPattern | IPlayerStats | IInfoMessage |
|
|
1
|
+
{"version":3,"file":"web-view-types.js","sources":["../../../../../src/features/circle-games/games/web-view/web-view-types.ts"],"sourcesContent":["import type { IAvatarLayer } from '../../../ui/avatar/avatar-types';\nimport type { TUserTypes } from '../../../ui/types';\nimport type { WebViewEvent, ProjectOutcome, ProjectType } from './enums';\nimport type { WEBVIEW_ANALYTICS_EVENTS } from './web-view-analytics-events';\nimport type { IframeHTMLAttributes } from 'react';\n\nexport interface IPlayer {\n id: string;\n username: string;\n grade?: string;\n avatar?: IAvatarLayer[] | null;\n playerType: TUserTypes;\n countryCode: string;\n isAdmin?: boolean;\n}\n\ninterface ISyncableWebGameProps {\n joinByRoomId?: string;\n enableSync?: boolean; // applicable for all except multiplayer games and tables\n}\n\ninterface IBaseWebGameProps {\n projectId: string;\n variant: string;\n projectType: ProjectType;\n enableCloseButton?: boolean;\n}\n\nexport interface IMultiplayerWebGameProps extends IBaseWebGameProps, ISyncableWebGameProps {\n enablePlayerTurnIndicators?: boolean;\n}\n\nexport interface IPuzzleWebGameProps extends IBaseWebGameProps, ISyncableWebGameProps {\n question: string;\n askHintPermission?: boolean;\n}\n\nexport interface ILessonWebGameProps extends IBaseWebGameProps, ISyncableWebGameProps {\n miniGameIdentifier: string;\n sessionId: string;\n targetQuestions: number;\n}\n\nexport interface ITableWebGameProps extends IBaseWebGameProps {\n tableNumber: number;\n infiniteModeHighScore?: number;\n}\n\nexport interface IVibrationPattern {\n pattern: number[] | number;\n}\n\nexport enum IStatsToAwardErrorCode {\n DEFAULT = 'default',\n SUCCESS = 'success',\n FAIL = 'fail',\n}\n\nexport interface IPlayerStats {\n points: number;\n accuracy: number;\n timeSpent: number;\n streakDays: number;\n streakStatusToday: 'pending' | 'completed';\n errorCode: IStatsToAwardErrorCode;\n outcome: ProjectOutcome;\n value: string;\n starEligibleTime?: number;\n starEligibleAccuracy?: number;\n starRewarded?: boolean;\n}\n\nexport interface IInfoMessage {\n message: string;\n position: 'top' | 'bottom';\n}\n\nexport interface ITrackEvent {\n eventName: typeof WEBVIEW_ANALYTICS_EVENTS;\n properties: Record<string, unknown>;\n}\n\nexport interface IWebViewProps extends IframeHTMLAttributes<HTMLIFrameElement> {\n baseUrl: string;\n projectDetails:\n | IMultiplayerWebGameProps\n | IPuzzleWebGameProps\n | ILessonWebGameProps\n | ITableWebGameProps;\n parentDomain: string;\n playerDetails: IPlayer;\n onBack?: () => void;\n onGameLoad?: () => void;\n onGamePlayFinish?: (playerStats: IPlayerStats) => void;\n handleInfoMessage?: (infoMessage: IInfoMessage) => void;\n}\n\nexport interface IMessageProps {\n event: `${WebViewEvent}`;\n payload: IVibrationPattern | IPlayerStats | IInfoMessage | null;\n}\n"],"names":["IStatsToAwardErrorCode"],"mappings":"AAoDY,IAAAA,sBAAAA,OACVA,EAAA,UAAU,WACVA,EAAA,UAAU,WACVA,EAAA,OAAO,QAHGA,IAAAA,KAAA,CAAA,CAAA;"}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import { useUIContext as
|
|
4
|
-
import
|
|
1
|
+
import { jsxs as h, jsx as v } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as P, useRef as G, useMemo as _, useCallback as T, useImperativeHandle as x, useEffect as B } from "react";
|
|
3
|
+
import { useUIContext as J } from "../../../ui/context/context.js";
|
|
4
|
+
import U from "../../../ui/layout/flex-view.js";
|
|
5
5
|
import C from "../../../ui/separator/separator.js";
|
|
6
|
-
import { ALLOWED_ORIGIN as
|
|
6
|
+
import { ALLOWED_ORIGIN as b } from "./constants.js";
|
|
7
7
|
import { ProjectType as s } from "./enums/project-type-enum.js";
|
|
8
|
-
import { WebViewEvent as
|
|
9
|
-
const
|
|
8
|
+
import { WebViewEvent as o } from "./enums/web-view-events-enum.js";
|
|
9
|
+
const X = P((L, M) => {
|
|
10
10
|
const {
|
|
11
11
|
baseUrl: g,
|
|
12
|
-
projectDetails:
|
|
13
|
-
playerDetails:
|
|
12
|
+
projectDetails: y,
|
|
13
|
+
playerDetails: E,
|
|
14
14
|
onGameLoad: a,
|
|
15
15
|
onGamePlayFinish: c,
|
|
16
16
|
handleInfoMessage: p,
|
|
17
|
-
onBack:
|
|
17
|
+
onBack: f,
|
|
18
18
|
parentDomain: N,
|
|
19
|
-
...
|
|
20
|
-
} =
|
|
21
|
-
let
|
|
22
|
-
const { onEvent:
|
|
23
|
-
t.projectType === s.LESSON && (
|
|
24
|
-
const
|
|
25
|
-
const { enableCloseButton:
|
|
19
|
+
...V
|
|
20
|
+
} = L, m = G(null), O = _(() => E, [E]), t = _(() => y, [y]);
|
|
21
|
+
let A = "";
|
|
22
|
+
const { onEvent: S } = J();
|
|
23
|
+
t.projectType === s.LESSON && (A = t.miniGameIdentifier);
|
|
24
|
+
const l = T(() => {
|
|
25
|
+
const { enableCloseButton: r = !0 } = t;
|
|
26
26
|
let e = {
|
|
27
|
-
enableCloseButton:
|
|
27
|
+
enableCloseButton: r
|
|
28
28
|
};
|
|
29
29
|
return t.projectType === s.GAME && (e = {
|
|
30
30
|
...e,
|
|
@@ -39,75 +39,65 @@ const Y = G((V, h) => {
|
|
|
39
39
|
...e,
|
|
40
40
|
...t
|
|
41
41
|
}), e;
|
|
42
|
-
}, [t]), d =
|
|
43
|
-
var e,
|
|
44
|
-
const
|
|
45
|
-
(
|
|
42
|
+
}, [t]), d = T(() => {
|
|
43
|
+
var e, i;
|
|
44
|
+
const r = l();
|
|
45
|
+
(i = (e = m.current) == null ? void 0 : e.contentWindow) == null || i.postMessage(
|
|
46
46
|
JSON.stringify({
|
|
47
|
-
event:
|
|
48
|
-
payload:
|
|
47
|
+
event: o.GAME_DATA,
|
|
48
|
+
payload: r
|
|
49
49
|
}),
|
|
50
|
-
|
|
50
|
+
b
|
|
51
51
|
);
|
|
52
|
-
}, [
|
|
53
|
-
var e,
|
|
54
|
-
const
|
|
55
|
-
(
|
|
52
|
+
}, [l]), j = T(() => {
|
|
53
|
+
var e, i;
|
|
54
|
+
const r = l();
|
|
55
|
+
(i = (e = m.current) == null ? void 0 : e.contentWindow) == null || i.postMessage(
|
|
56
56
|
JSON.stringify({
|
|
57
|
-
event:
|
|
57
|
+
event: o.SET_CONFIG,
|
|
58
58
|
payload: {
|
|
59
59
|
user: O,
|
|
60
|
-
projectConfig:
|
|
60
|
+
projectConfig: r,
|
|
61
61
|
parentDomain: N
|
|
62
62
|
}
|
|
63
63
|
}),
|
|
64
|
-
|
|
64
|
+
b
|
|
65
65
|
);
|
|
66
|
-
}, [O,
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
typeof
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return e;
|
|
75
|
-
}, []);
|
|
76
|
-
B(h, () => f.current, []), J(() => {
|
|
77
|
-
const i = (e) => {
|
|
78
|
-
var R, b;
|
|
79
|
-
const o = e.data, I = typeof o == "string" ? D(o) : o, { event: n = null, payload: w = null } = I;
|
|
80
|
-
if (n === r.VIBRATE) {
|
|
81
|
-
const { pattern: v } = w;
|
|
82
|
-
window.ReactNativeWebView ? window.ReactNativeWebView.postMessage(JSON.stringify(I)) : (b = (R = window.navigator).vibrate) == null || b.call(R, v);
|
|
66
|
+
}, [O, l, N]);
|
|
67
|
+
x(M, () => m.current, []), B(() => {
|
|
68
|
+
const r = (e) => {
|
|
69
|
+
var R, I;
|
|
70
|
+
const i = e.data, D = typeof i == "string" ? JSON.parse(i) : i, { event: n, payload: w = null } = D;
|
|
71
|
+
if (n === o.VIBRATE) {
|
|
72
|
+
const { pattern: u } = w;
|
|
73
|
+
window.ReactNativeWebView ? window.ReactNativeWebView.postMessage(JSON.stringify(D)) : (I = (R = window.navigator).vibrate) == null || I.call(R, u);
|
|
83
74
|
}
|
|
84
|
-
if (n ===
|
|
85
|
-
const { eventName:
|
|
86
|
-
|
|
75
|
+
if (n === o.GAME_BACK && (f == null || f()), n === o.HIDE_LOADER && (a == null || a()), n === o.LOAD_DATA_FROM_APP && (d == null || d()), n === o.GET_CONFIG && j(), n === o.UPDATE_STATS && (c == null || c(w)), n === o.SHOW_SNACKBAR && (p == null || p(w)), n === o.TRACK_EVENT) {
|
|
76
|
+
const { eventName: u, properties: $ } = w;
|
|
77
|
+
S(u, $);
|
|
87
78
|
}
|
|
88
79
|
};
|
|
89
|
-
return window.addEventListener("message",
|
|
90
|
-
window.removeEventListener("message",
|
|
80
|
+
return window.addEventListener("message", r), () => {
|
|
81
|
+
window.removeEventListener("message", r);
|
|
91
82
|
};
|
|
92
83
|
}, [
|
|
93
84
|
p,
|
|
94
|
-
|
|
85
|
+
f,
|
|
95
86
|
c,
|
|
96
87
|
a,
|
|
97
|
-
S,
|
|
98
|
-
d,
|
|
99
88
|
j,
|
|
100
|
-
|
|
89
|
+
d,
|
|
90
|
+
S
|
|
101
91
|
]);
|
|
102
|
-
const W =
|
|
103
|
-
return /* @__PURE__ */
|
|
104
|
-
/* @__PURE__ */
|
|
105
|
-
/* @__PURE__ */
|
|
92
|
+
const W = E.isAdmin ? g : `${g}/play-game/${t.projectId}/${t.variant}${A ? `/${A}` : ""}`;
|
|
93
|
+
return /* @__PURE__ */ h(U, { $height: "100%", $width: "100%", children: [
|
|
94
|
+
/* @__PURE__ */ v(C, { height: window.ReactNativeTopInset || 0 }),
|
|
95
|
+
/* @__PURE__ */ v("iframe", { ...V, ref: m, src: `${W}?version=2`, allow: "autoplay" }),
|
|
106
96
|
";",
|
|
107
|
-
/* @__PURE__ */
|
|
97
|
+
/* @__PURE__ */ v(C, { height: window.ReactNativeBottomInset || 0 })
|
|
108
98
|
] });
|
|
109
99
|
});
|
|
110
100
|
export {
|
|
111
|
-
|
|
101
|
+
X as WebView
|
|
112
102
|
};
|
|
113
103
|
//# sourceMappingURL=web-view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-view.js","sources":["../../../../../src/features/circle-games/games/web-view/web-view.tsx"],"sourcesContent":["import type {\n IInfoMessage,\n ILessonWebGameProps,\n IMessageProps,\n IMultiplayerWebGameProps,\n IPlayerStats,\n IPuzzleWebGameProps,\n ITableWebGameProps,\n
|
|
1
|
+
{"version":3,"file":"web-view.js","sources":["../../../../../src/features/circle-games/games/web-view/web-view.tsx"],"sourcesContent":["import type {\n IInfoMessage,\n ILessonWebGameProps,\n IMessageProps,\n IMultiplayerWebGameProps,\n IPlayerStats,\n IPuzzleWebGameProps,\n ITableWebGameProps,\n IVibrationPattern,\n IWebViewProps,\n} from './web-view-types';\nimport type { ForwardedRef } from 'react';\n\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react';\n\nimport { useUIContext } from '../../../ui/context/context';\nimport FlexView from '../../../ui/layout/flex-view';\nimport Separator from '../../../ui/separator/separator';\nimport { ALLOWED_ORIGIN } from './constants';\nimport { ProjectType, WebViewEvent } from './enums';\n\nexport const WebView = forwardRef((props: IWebViewProps, ref: ForwardedRef<HTMLIFrameElement>) => {\n const {\n baseUrl,\n projectDetails,\n playerDetails,\n onGameLoad,\n onGamePlayFinish,\n handleInfoMessage,\n onBack,\n parentDomain,\n ...rest\n } = props;\n const webViewRef = useRef<HTMLIFrameElement>(null);\n const memoizedPlayerDetails = useMemo(() => playerDetails, [playerDetails]);\n const memoizedProjectDetails = useMemo(() => projectDetails, [projectDetails]);\n\n let miniGameIdentifier = '';\n const { onEvent: trackEvent } = useUIContext();\n\n if (memoizedProjectDetails.projectType === ProjectType.LESSON) {\n miniGameIdentifier = (memoizedProjectDetails as ILessonWebGameProps).miniGameIdentifier;\n }\n\n const getProjectDetails = useCallback(() => {\n const { enableCloseButton = true } = memoizedProjectDetails;\n\n let payload = {\n enableCloseButton,\n } as IMultiplayerWebGameProps | IPuzzleWebGameProps | ILessonWebGameProps;\n\n if (memoizedProjectDetails.projectType === ProjectType.GAME) {\n payload = {\n ...payload,\n ...memoizedProjectDetails,\n } as IMultiplayerWebGameProps;\n }\n\n if (memoizedProjectDetails.projectType === ProjectType.PUZZLE) {\n payload = {\n ...payload,\n ...memoizedProjectDetails,\n } as IPuzzleWebGameProps;\n }\n\n if (memoizedProjectDetails.projectType === ProjectType.LESSON) {\n payload = {\n ...payload,\n ...memoizedProjectDetails,\n } as ILessonWebGameProps;\n }\n\n if (memoizedProjectDetails.projectType === ProjectType.TABLE) {\n payload = {\n ...payload,\n ...memoizedProjectDetails,\n } as ITableWebGameProps;\n }\n\n return payload;\n }, [memoizedProjectDetails]);\n\n const sendGamesData = useCallback(() => {\n const payload = getProjectDetails();\n\n webViewRef.current?.contentWindow?.postMessage(\n JSON.stringify({\n event: WebViewEvent.GAME_DATA,\n payload,\n }),\n ALLOWED_ORIGIN,\n );\n }, [getProjectDetails]);\n\n const setConfig = useCallback(() => {\n const projectConfig = getProjectDetails();\n\n webViewRef.current?.contentWindow?.postMessage(\n JSON.stringify({\n event: WebViewEvent.SET_CONFIG,\n payload: {\n user: memoizedPlayerDetails,\n projectConfig,\n parentDomain,\n },\n }),\n ALLOWED_ORIGIN,\n );\n }, [memoizedPlayerDetails, getProjectDetails, parentDomain]);\n\n useImperativeHandle(ref, () => webViewRef.current as HTMLIFrameElement, []);\n\n useEffect(() => {\n const handleMessage = (e: MessageEvent) => {\n const data: string = e.data;\n const parsedData = typeof data === 'string' ? JSON.parse(data) : (data as IMessageProps);\n\n const { event, payload = null } = parsedData;\n\n if (event === WebViewEvent.VIBRATE) {\n const { pattern } = payload as IVibrationPattern;\n\n if (window.ReactNativeWebView) {\n window.ReactNativeWebView.postMessage(JSON.stringify(parsedData));\n } else {\n window.navigator.vibrate?.(pattern);\n }\n }\n\n if (event === WebViewEvent.GAME_BACK) {\n onBack?.();\n }\n\n if (event === WebViewEvent.HIDE_LOADER) {\n onGameLoad?.();\n }\n\n if (event === WebViewEvent.LOAD_DATA_FROM_APP) {\n sendGamesData?.();\n }\n\n if (event === WebViewEvent.GET_CONFIG) {\n setConfig();\n }\n\n if (event === WebViewEvent.UPDATE_STATS) {\n onGamePlayFinish?.(payload as IPlayerStats);\n }\n\n if (event === WebViewEvent.SHOW_SNACKBAR) {\n handleInfoMessage?.(payload as IInfoMessage);\n }\n\n if (event === WebViewEvent.TRACK_EVENT) {\n const { eventName, properties } = payload;\n\n trackEvent(eventName, properties);\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [\n handleInfoMessage,\n onBack,\n onGamePlayFinish,\n onGameLoad,\n setConfig,\n sendGamesData,\n trackEvent,\n ]);\n\n const url = playerDetails.isAdmin\n ? baseUrl\n : `${baseUrl}/play-game/${memoizedProjectDetails.projectId}/${memoizedProjectDetails.variant}${\n miniGameIdentifier ? `/${miniGameIdentifier}` : ''\n }`;\n\n return (\n <FlexView $height=\"100%\" $width=\"100%\">\n <Separator height={window.ReactNativeTopInset || 0} />\n <iframe {...rest} ref={webViewRef} src={`${url}?version=2`} allow=\"autoplay\" />;\n <Separator height={window.ReactNativeBottomInset || 0} />\n </FlexView>\n );\n});\n"],"names":["WebView","forwardRef","props","ref","baseUrl","projectDetails","playerDetails","onGameLoad","onGamePlayFinish","handleInfoMessage","onBack","parentDomain","rest","webViewRef","useRef","memoizedPlayerDetails","useMemo","memoizedProjectDetails","miniGameIdentifier","trackEvent","useUIContext","ProjectType","getProjectDetails","useCallback","enableCloseButton","payload","sendGamesData","_b","_a","WebViewEvent","ALLOWED_ORIGIN","setConfig","projectConfig","useImperativeHandle","useEffect","handleMessage","data","parsedData","event","pattern","eventName","properties","url","jsxs","FlexView","jsx","Separator"],"mappings":"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"}
|
|
@@ -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;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2152,7 +2152,7 @@ declare interface IMaintenanceProps {
|
|
|
2152
2152
|
|
|
2153
2153
|
export declare interface IMessageProps {
|
|
2154
2154
|
event: `${WebViewEvent}`;
|
|
2155
|
-
payload: IVibrationPattern | IPlayerStats | IInfoMessage |
|
|
2155
|
+
payload: IVibrationPattern | IPlayerStats | IInfoMessage | null;
|
|
2156
2156
|
}
|
|
2157
2157
|
|
|
2158
2158
|
declare interface IMilestoneActionWidgetProps {
|