@cuemath/leap 3.5.45 → 3.5.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/dist/features/analytics-events/whitelist-events.js +16 -14
  2. package/dist/features/analytics-events/whitelist-events.js.map +1 -1
  3. package/dist/features/circle-games/games/web-view/web-view-analytics-events.js.map +1 -1
  4. package/dist/features/circle-games/hooks/use-circle-sounds/constants.js +7 -4
  5. package/dist/features/circle-games/hooks/use-circle-sounds/constants.js.map +1 -1
  6. package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.js +51 -110
  7. package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.js.map +1 -1
  8. package/dist/features/hooks/use-audio-player/use-audio-player.js +164 -0
  9. package/dist/features/hooks/use-audio-player/use-audio-player.js.map +1 -0
  10. package/dist/features/trial-session/comps/trial-circle-game/trial-circle-game-analytics-events.js +11 -0
  11. package/dist/features/trial-session/comps/trial-circle-game/trial-circle-game-analytics-events.js.map +1 -0
  12. package/dist/features/trial-session/comps/trial-circle-game/trial-circle-game.js +144 -120
  13. package/dist/features/trial-session/comps/trial-circle-game/trial-circle-game.js.map +1 -1
  14. package/dist/features/worksheet/worksheet/hooks/use-create-imperative-handle.js +61 -57
  15. package/dist/features/worksheet/worksheet/hooks/use-create-imperative-handle.js.map +1 -1
  16. package/dist/features/worksheet/worksheet/worksheet-questions-controller/use-handler-callbacks.js +86 -82
  17. package/dist/features/worksheet/worksheet/worksheet-questions-controller/use-handler-callbacks.js.map +1 -1
  18. package/dist/index.d.ts +14 -4
  19. package/package.json +2 -2
  20. package/dist/features/circle-games/hooks/use-circle-sounds/helper.js +0 -19
  21. package/dist/features/circle-games/hooks/use-circle-sounds/helper.js.map +0 -1
  22. package/dist/features/hooks/use-audio-player.js +0 -54
  23. package/dist/features/hooks/use-audio-player.js.map +0 -1
@@ -1,34 +1,36 @@
1
1
  import { PLA_ANALYTICS_WHITELIST_EVENTS as T } from "../auth/pla-signup/pla-analytics-events.js";
2
2
  import { GAME_LAUNCHER_ANALYTICS_WHITELIST_EVENTS as E } from "../circle-games/game-launcher/game-launcher-analytics-events.js";
3
- import { WEBVIEW_ANALYTICS_WHITELIST_EVENTS as S } from "../circle-games/games/web-view/web-view-analytics-events.js";
4
- import { LEADERBOARD_ANALYTICS_WHITELIST_EVENTS as I } from "../circle-games/leaderboard/leaderboard-analytics-events.js";
3
+ import { WEBVIEW_ANALYTICS_WHITELIST_EVENTS as I } from "../circle-games/games/web-view/web-view-analytics-events.js";
4
+ import { LEADERBOARD_ANALYTICS_WHITELIST_EVENTS as S } from "../circle-games/leaderboard/leaderboard-analytics-events.js";
5
5
  import { HOMEWORK_ANALYTICS_WHITELIST_EVENTS as _ } from "../homework/homework-analytics-events.js";
6
6
  import { RESOURCE_ASSIGN_ANALYTICS_WHITELIST_EVENTS as L } from "../milestone/milestone-resources/resources-assign/resource-assign-analytics-events.js";
7
7
  import { TESTS_CREATION_ANALYTICS_WHITELIST_EVENTS as A } from "../milestone/milestone-tests/tests-creation/tests-creation-analytics-events.js";
8
8
  import { PUZZLE_ANALYTICS_WHITELIST_EVENTS as N } from "../puzzles/puzzle-analytics-events.js";
9
9
  import { SHEETS_ANALYTICS_WHITELIST_EVENTS as o } from "../sheets/sheets-analytics-events.js";
10
- import { PLATFORM_WHITELIST_EVENTS_STUDENT as r } from "./platform-events-student.js";
11
- import { PLATFORM_WHITELIST_EVENTS_TEACHER as m } from "./platform-events-teacher.js";
12
- import { DAILY_TIMELINE_WHITELIST_EVENTS as H } from "../timeline/daily-timeline/daily-timeline-events.js";
13
- import { MONTHLY_REPORT_WHITELIST_EVENTS as W } from "../timeline/monthly-timeline/monthly-report/monthly-report-events.js";
14
- const B = {
10
+ import { DAILY_TIMELINE_WHITELIST_EVENTS as r } from "../timeline/daily-timeline/daily-timeline-events.js";
11
+ import { MONTHLY_REPORT_WHITELIST_EVENTS as m } from "../timeline/monthly-timeline/monthly-report/monthly-report-events.js";
12
+ import { TRIAL_CIRCLE_GAME_ANALYTICS_WHITELIST_EVENTS as H } from "../trial-session/comps/trial-circle-game/trial-circle-game-analytics-events.js";
13
+ import { PLATFORM_WHITELIST_EVENTS_STUDENT as W } from "./platform-events-student.js";
14
+ import { PLATFORM_WHITELIST_EVENTS_TEACHER as t } from "./platform-events-teacher.js";
15
+ const F = {
15
16
  //* Global/Platform specific events
16
- ...r,
17
- ...m,
17
+ ...W,
18
+ ...t,
18
19
  //* Feature specific events
19
20
  ...E,
20
- ...I,
21
+ ...S,
21
22
  ...L,
22
23
  ...o,
23
24
  ...A,
24
25
  ..._,
25
- ...S,
26
+ ...I,
26
27
  ...N,
27
28
  ...T,
28
- ...H,
29
- ...W
29
+ ...r,
30
+ ...m,
31
+ ...H
30
32
  };
31
33
  export {
32
- B as WHITELIST_EVENTS
34
+ F as WHITELIST_EVENTS
33
35
  };
34
36
  //# sourceMappingURL=whitelist-events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whitelist-events.js","sources":["../../../src/features/analytics-events/whitelist-events.ts"],"sourcesContent":["import type { PLUGIN_NAME } from '@cuemath/analytics-v2/dist/constants';\n\nimport { PLA_ANALYTICS_WHITELIST_EVENTS } from '../auth/pla-signup/pla-analytics-events';\nimport { GAME_LAUNCHER_ANALYTICS_WHITELIST_EVENTS } from '../circle-games/game-launcher/game-launcher-analytics-events';\nimport { WEBVIEW_ANALYTICS_WHITELIST_EVENTS } from '../circle-games/games/web-view/web-view-analytics-events';\nimport { LEADERBOARD_ANALYTICS_WHITELIST_EVENTS } from '../circle-games/leaderboard/leaderboard-analytics-events';\nimport { HOMEWORK_ANALYTICS_WHITELIST_EVENTS } from '../homework/homework-analytics-events';\nimport { RESOURCE_ASSIGN_ANALYTICS_WHITELIST_EVENTS } from '../milestone/milestone-resources/resources-assign/resource-assign-analytics-events';\nimport { TESTS_CREATION_ANALYTICS_WHITELIST_EVENTS } from '../milestone/milestone-tests/tests-creation/tests-creation-analytics-events';\nimport { PUZZLE_ANALYTICS_WHITELIST_EVENTS } from '../puzzles/puzzle-analytics-events';\nimport { SHEETS_ANALYTICS_WHITELIST_EVENTS } from '../sheets/sheets-analytics-events';\nimport { PLATFORM_WHITELIST_EVENTS_STUDENT } from './platform-events-student';\nimport { PLATFORM_WHITELIST_EVENTS_TEACHER } from './platform-events-teacher';\nimport { DAILY_TIMELINE_WHITELIST_EVENTS } from '../timeline/daily-timeline/daily-timeline-events';\nimport { MONTHLY_REPORT_WHITELIST_EVENTS } from '../timeline/monthly-timeline/monthly-report/monthly-report-events';\n\n/**\n ** Feature specific & Global/Platform specific events are imported here\n */\nconst WHITELIST_EVENTS: Record<string, PLUGIN_NAME[]> = {\n //* Global/Platform specific events\n ...PLATFORM_WHITELIST_EVENTS_STUDENT,\n ...PLATFORM_WHITELIST_EVENTS_TEACHER,\n\n //* Feature specific events\n ...GAME_LAUNCHER_ANALYTICS_WHITELIST_EVENTS,\n ...LEADERBOARD_ANALYTICS_WHITELIST_EVENTS,\n ...RESOURCE_ASSIGN_ANALYTICS_WHITELIST_EVENTS,\n ...SHEETS_ANALYTICS_WHITELIST_EVENTS,\n ...TESTS_CREATION_ANALYTICS_WHITELIST_EVENTS,\n ...HOMEWORK_ANALYTICS_WHITELIST_EVENTS,\n ...WEBVIEW_ANALYTICS_WHITELIST_EVENTS,\n ...PUZZLE_ANALYTICS_WHITELIST_EVENTS,\n ...PLA_ANALYTICS_WHITELIST_EVENTS,\n ...DAILY_TIMELINE_WHITELIST_EVENTS,\n ...MONTHLY_REPORT_WHITELIST_EVENTS,\n};\n\nexport { WHITELIST_EVENTS };\n"],"names":["WHITELIST_EVENTS","PLATFORM_WHITELIST_EVENTS_STUDENT","PLATFORM_WHITELIST_EVENTS_TEACHER","GAME_LAUNCHER_ANALYTICS_WHITELIST_EVENTS","LEADERBOARD_ANALYTICS_WHITELIST_EVENTS","RESOURCE_ASSIGN_ANALYTICS_WHITELIST_EVENTS","SHEETS_ANALYTICS_WHITELIST_EVENTS","TESTS_CREATION_ANALYTICS_WHITELIST_EVENTS","HOMEWORK_ANALYTICS_WHITELIST_EVENTS","WEBVIEW_ANALYTICS_WHITELIST_EVENTS","PUZZLE_ANALYTICS_WHITELIST_EVENTS","PLA_ANALYTICS_WHITELIST_EVENTS","DAILY_TIMELINE_WHITELIST_EVENTS","MONTHLY_REPORT_WHITELIST_EVENTS"],"mappings":";;;;;;;;;;;;;AAmBA,MAAMA,IAAkD;AAAA;AAAA,EAEtD,GAAGC;AAAA,EACH,GAAGC;AAAA;AAAA,EAGH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AACL;"}
1
+ {"version":3,"file":"whitelist-events.js","sources":["../../../src/features/analytics-events/whitelist-events.ts"],"sourcesContent":["import type { PLUGIN_NAME } from '@cuemath/analytics-v2/dist/constants';\n\nimport { PLA_ANALYTICS_WHITELIST_EVENTS } from '../auth/pla-signup/pla-analytics-events';\nimport { GAME_LAUNCHER_ANALYTICS_WHITELIST_EVENTS } from '../circle-games/game-launcher/game-launcher-analytics-events';\nimport { WEBVIEW_ANALYTICS_WHITELIST_EVENTS } from '../circle-games/games/web-view/web-view-analytics-events';\nimport { LEADERBOARD_ANALYTICS_WHITELIST_EVENTS } from '../circle-games/leaderboard/leaderboard-analytics-events';\nimport { HOMEWORK_ANALYTICS_WHITELIST_EVENTS } from '../homework/homework-analytics-events';\nimport { RESOURCE_ASSIGN_ANALYTICS_WHITELIST_EVENTS } from '../milestone/milestone-resources/resources-assign/resource-assign-analytics-events';\nimport { TESTS_CREATION_ANALYTICS_WHITELIST_EVENTS } from '../milestone/milestone-tests/tests-creation/tests-creation-analytics-events';\nimport { PUZZLE_ANALYTICS_WHITELIST_EVENTS } from '../puzzles/puzzle-analytics-events';\nimport { SHEETS_ANALYTICS_WHITELIST_EVENTS } from '../sheets/sheets-analytics-events';\nimport { DAILY_TIMELINE_WHITELIST_EVENTS } from '../timeline/daily-timeline/daily-timeline-events';\nimport { MONTHLY_REPORT_WHITELIST_EVENTS } from '../timeline/monthly-timeline/monthly-report/monthly-report-events';\nimport { TRIAL_CIRCLE_GAME_ANALYTICS_WHITELIST_EVENTS } from '../trial-session/comps/trial-circle-game/trial-circle-game-analytics-events';\nimport { PLATFORM_WHITELIST_EVENTS_STUDENT } from './platform-events-student';\nimport { PLATFORM_WHITELIST_EVENTS_TEACHER } from './platform-events-teacher';\n\n/**\n ** Feature specific & Global/Platform specific events are imported here\n */\nconst WHITELIST_EVENTS: Record<string, PLUGIN_NAME[]> = {\n //* Global/Platform specific events\n ...PLATFORM_WHITELIST_EVENTS_STUDENT,\n ...PLATFORM_WHITELIST_EVENTS_TEACHER,\n\n //* Feature specific events\n ...GAME_LAUNCHER_ANALYTICS_WHITELIST_EVENTS,\n ...LEADERBOARD_ANALYTICS_WHITELIST_EVENTS,\n ...RESOURCE_ASSIGN_ANALYTICS_WHITELIST_EVENTS,\n ...SHEETS_ANALYTICS_WHITELIST_EVENTS,\n ...TESTS_CREATION_ANALYTICS_WHITELIST_EVENTS,\n ...HOMEWORK_ANALYTICS_WHITELIST_EVENTS,\n ...WEBVIEW_ANALYTICS_WHITELIST_EVENTS,\n ...PUZZLE_ANALYTICS_WHITELIST_EVENTS,\n ...PLA_ANALYTICS_WHITELIST_EVENTS,\n ...DAILY_TIMELINE_WHITELIST_EVENTS,\n ...MONTHLY_REPORT_WHITELIST_EVENTS,\n ...TRIAL_CIRCLE_GAME_ANALYTICS_WHITELIST_EVENTS,\n};\n\nexport { WHITELIST_EVENTS };\n"],"names":["WHITELIST_EVENTS","PLATFORM_WHITELIST_EVENTS_STUDENT","PLATFORM_WHITELIST_EVENTS_TEACHER","GAME_LAUNCHER_ANALYTICS_WHITELIST_EVENTS","LEADERBOARD_ANALYTICS_WHITELIST_EVENTS","RESOURCE_ASSIGN_ANALYTICS_WHITELIST_EVENTS","SHEETS_ANALYTICS_WHITELIST_EVENTS","TESTS_CREATION_ANALYTICS_WHITELIST_EVENTS","HOMEWORK_ANALYTICS_WHITELIST_EVENTS","WEBVIEW_ANALYTICS_WHITELIST_EVENTS","PUZZLE_ANALYTICS_WHITELIST_EVENTS","PLA_ANALYTICS_WHITELIST_EVENTS","DAILY_TIMELINE_WHITELIST_EVENTS","MONTHLY_REPORT_WHITELIST_EVENTS","TRIAL_CIRCLE_GAME_ANALYTICS_WHITELIST_EVENTS"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAMA,IAAkD;AAAA;AAAA,EAEtD,GAAGC;AAAA,EACH,GAAGC;AAAA;AAAA,EAGH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AACL;"}
@@ -1 +1 @@
1
- {"version":3,"file":"web-view-analytics-events.js","sources":["../../../../../src/features/circle-games/games/web-view/web-view-analytics-events.ts"],"sourcesContent":["import { PLUGINS } from '@cuemath/analytics-v2/dist/constants';\n\nexport enum WEBVIEW_ANALYTICS_EVENTS {\n GAME_ANALYTICS = 'game_analytics',\n ACTIVITY_SEEN = 'activity_seen',\n ACTIVITY_COMPLETED = 'activity_completed',\n ACTIVITY_CLOSED = 'activity_closed',\n ACTIVITY_MATCHING_COMPLETED = 'activity_matching_completed',\n}\n\nexport const WEBVIEW_ANALYTICS_WHITELIST_EVENTS = {\n [WEBVIEW_ANALYTICS_EVENTS.ACTIVITY_SEEN]: [PLUGINS.MIXPANEL],\n [WEBVIEW_ANALYTICS_EVENTS.ACTIVITY_MATCHING_COMPLETED]: [PLUGINS.MIXPANEL],\n [WEBVIEW_ANALYTICS_EVENTS.ACTIVITY_COMPLETED]: [PLUGINS.MIXPANEL],\n [WEBVIEW_ANALYTICS_EVENTS.ACTIVITY_CLOSED]: [PLUGINS.MIXPANEL],\n};\n"],"names":["WEBVIEW_ANALYTICS_WHITELIST_EVENTS","PLUGINS"],"mappings":";AAUO,MAAMA,IAAqC;AAAA,EAC/C,eAAyC,CAACC,EAAQ,QAAQ;AAAA,EAC1D,6BAAuD,CAACA,EAAQ,QAAQ;AAAA,EACxE,oBAA8C,CAACA,EAAQ,QAAQ;AAAA,EAC/D,iBAA2C,CAACA,EAAQ,QAAQ;AAC/D;"}
1
+ {"version":3,"file":"web-view-analytics-events.js","sources":["../../../../../src/features/circle-games/games/web-view/web-view-analytics-events.ts"],"sourcesContent":["import { PLUGINS } from '@cuemath/analytics-v2/dist/constants';\n\nexport enum WEBVIEW_ANALYTICS_EVENTS {\n GAME_ANALYTICS = 'game_analytics',\n ACTIVITY_SEEN = 'activity_seen',\n ACTIVITY_COMPLETED = 'activity_completed',\n ACTIVITY_CLOSED = 'activity_closed',\n ACTIVITY_MATCHING_COMPLETED = 'activity_matching_completed',\n APP_OPENED = 'app_opened',\n}\n\nexport const WEBVIEW_ANALYTICS_WHITELIST_EVENTS = {\n [WEBVIEW_ANALYTICS_EVENTS.ACTIVITY_SEEN]: [PLUGINS.MIXPANEL],\n [WEBVIEW_ANALYTICS_EVENTS.ACTIVITY_MATCHING_COMPLETED]: [PLUGINS.MIXPANEL],\n [WEBVIEW_ANALYTICS_EVENTS.ACTIVITY_COMPLETED]: [PLUGINS.MIXPANEL],\n [WEBVIEW_ANALYTICS_EVENTS.ACTIVITY_CLOSED]: [PLUGINS.MIXPANEL],\n};\n"],"names":["WEBVIEW_ANALYTICS_WHITELIST_EVENTS","PLUGINS"],"mappings":";AAWO,MAAMA,IAAqC;AAAA,EAC/C,eAAyC,CAACC,EAAQ,QAAQ;AAAA,EAC1D,6BAAuD,CAACA,EAAQ,QAAQ;AAAA,EACxE,oBAA8C,CAACA,EAAQ,QAAQ;AAAA,EAC/D,iBAA2C,CAACA,EAAQ,QAAQ;AAC/D;"}
@@ -35,11 +35,14 @@ const e = "https://cuemath-circle.s3.ap-southeast-1.amazonaws.com/assets/sounds/
35
35
  c.SWIPE_02,
36
36
  c.SWIPE_03,
37
37
  c.SWIPE_01
38
- ], _ = 100, E = 0.1;
38
+ ], _ = /* @__PURE__ */ new Set([
39
+ c.BACKGROUND,
40
+ c.BACKGROUND_RUSHHOUR,
41
+ c.TUTORIAL
42
+ ]);
39
43
  export {
44
+ _ as BACKGROUND_SOUNDS,
40
45
  t as CircleSoundKeyMapper,
41
- i as SWIPE_SOUND_ORDER,
42
- _ as VOLUME_FADE_DURATION,
43
- E as VOLUME_TO_CHANGE
46
+ i as SWIPE_SOUND_ORDER
44
47
  };
45
48
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../../../src/features/circle-games/hooks/use-circle-sounds/constants.ts"],"sourcesContent":["import { CircleSoundKey } from './use-circle-sounds-enums';\n\nconst BASE_URL = 'https://cuemath-circle.s3.ap-southeast-1.amazonaws.com/assets/sounds/production';\n\nconst STATIC_BASE_URL = 'https://static.cuemath.com/static/sounds';\n\nexport const CircleSoundKeyMapper = {\n [CircleSoundKey.BACKGROUND]: `${BASE_URL}/bg-sound.mp3`,\n [CircleSoundKey.BACKGROUND_RUSHHOUR]: `${BASE_URL}/circle-background-rushhour.mp3`,\n [CircleSoundKey.TUTORIAL]: `${BASE_URL}/bg-sound-tutorials.mp3`,\n [CircleSoundKey.SWIPE_01]: `${BASE_URL}/circle-swipe-1.wav`,\n [CircleSoundKey.SWIPE_02]: `${BASE_URL}/circle-swipe-2.wav`,\n [CircleSoundKey.SWIPE_03]: `${BASE_URL}/circle-swipe-3.wav`,\n [CircleSoundKey.SWIPE_04]: `${BASE_URL}/circle-swipe-4.wav`,\n [CircleSoundKey.SWIPE_DOWN]: `${BASE_URL}/circle-swipe-down-1.wav`,\n [CircleSoundKey.TOGGLE]: `${BASE_URL}/circle-button-v3.wav`,\n [CircleSoundKey.POINTS_AWARDED]: `${BASE_URL}/circle-points-v2.wav`,\n [CircleSoundKey.ACTIVITY_COMPLETE]: `${BASE_URL}/circle-activity-complete.wav`,\n [CircleSoundKey.POINTS_ADDED]: `${BASE_URL}/circle-points-add-v1.wav`,\n [CircleSoundKey.GAME_CARD_CLICK]: `${BASE_URL}/circle-gamecard-button-v1.wav`,\n [CircleSoundKey.CLOCK_IN]: `${BASE_URL}/circle-meter-v1.wav`,\n [CircleSoundKey.CLOCK_OUT]: `${BASE_URL}/circle-disappear-v1.wav`,\n [CircleSoundKey.ACCURACY_IN]: `${BASE_URL}/circle-meter-v1.wav`,\n [CircleSoundKey.ACCURACY_OUT]: `${BASE_URL}/circle-disappear-v1.wav`,\n [CircleSoundKey.STREAK_IN]: `${BASE_URL}/circle-streak-v1.wav`,\n [CircleSoundKey.STREAK_OUT]: `${BASE_URL}/circle-disappear-v1.wav`,\n [CircleSoundKey.ACCURACY_INTRO]: `${STATIC_BASE_URL}/accuracy-intro.mp3`,\n [CircleSoundKey.ACCURACY_TARGET]: `${STATIC_BASE_URL}/accuracy-target.mp3`,\n [CircleSoundKey.TIME_INTRO]: `${STATIC_BASE_URL}/timer-intro.mp3`,\n [CircleSoundKey.TIME_TARGET]: `${STATIC_BASE_URL}/timer-target.mp3`,\n [CircleSoundKey.METER_FILL]: `${STATIC_BASE_URL}/meter-fill.mp3`,\n [CircleSoundKey.YOUR_SCORE]: `${BASE_URL}/your-score.mp3`,\n [CircleSoundKey.HIGH_SCORE]: `${BASE_URL}/high-score.mp3`,\n [CircleSoundKey.ALL_ACTIVITIES_COMPLETE]: `${BASE_URL}/circle-all-activities-complete.mp3`,\n [CircleSoundKey.ALL_DONE]: `${BASE_URL}/all-done.mp3`,\n [CircleSoundKey.DOING_GREAT]: `${BASE_URL}/doing-great.mp3`,\n [CircleSoundKey.KEEP_IT_UP]: `${BASE_URL}/keep-it-up.mp3`,\n};\n\nexport const SWIPE_SOUND_ORDER = [\n CircleSoundKey.SWIPE_04,\n CircleSoundKey.SWIPE_02,\n CircleSoundKey.SWIPE_03,\n CircleSoundKey.SWIPE_01,\n];\n\nexport const VOLUME_FADE_DURATION = 100; // in milliseconds\nexport const VOLUME_TO_CHANGE = 0.1; // volume change per fade step\n"],"names":["BASE_URL","STATIC_BASE_URL","CircleSoundKeyMapper","CircleSoundKey","SWIPE_SOUND_ORDER","VOLUME_FADE_DURATION","VOLUME_TO_CHANGE"],"mappings":";AAEA,MAAMA,IAAW,mFAEXC,IAAkB,4CAEXC,IAAuB;AAAA,EAClC,CAACC,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,mBAAmB,GAAG,GAAGH,CAAQ;AAAA,EACjD,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,MAAM,GAAG,GAAGH,CAAQ;AAAA,EACpC,CAACG,EAAe,cAAc,GAAG,GAAGH,CAAQ;AAAA,EAC5C,CAACG,EAAe,iBAAiB,GAAG,GAAGH,CAAQ;AAAA,EAC/C,CAACG,EAAe,YAAY,GAAG,GAAGH,CAAQ;AAAA,EAC1C,CAACG,EAAe,eAAe,GAAG,GAAGH,CAAQ;AAAA,EAC7C,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,SAAS,GAAG,GAAGH,CAAQ;AAAA,EACvC,CAACG,EAAe,WAAW,GAAG,GAAGH,CAAQ;AAAA,EACzC,CAACG,EAAe,YAAY,GAAG,GAAGH,CAAQ;AAAA,EAC1C,CAACG,EAAe,SAAS,GAAG,GAAGH,CAAQ;AAAA,EACvC,CAACG,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,cAAc,GAAG,GAAGF,CAAe;AAAA,EACnD,CAACE,EAAe,eAAe,GAAG,GAAGF,CAAe;AAAA,EACpD,CAACE,EAAe,UAAU,GAAG,GAAGF,CAAe;AAAA,EAC/C,CAACE,EAAe,WAAW,GAAG,GAAGF,CAAe;AAAA,EAChD,CAACE,EAAe,UAAU,GAAG,GAAGF,CAAe;AAAA,EAC/C,CAACE,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,uBAAuB,GAAG,GAAGH,CAAQ;AAAA,EACrD,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,WAAW,GAAG,GAAGH,CAAQ;AAAA,EACzC,CAACG,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAC1C,GAEaI,IAAoB;AAAA,EAC/BD,EAAe;AAAA,EACfA,EAAe;AAAA,EACfA,EAAe;AAAA,EACfA,EAAe;AACjB,GAEaE,IAAuB,KACvBC,IAAmB;"}
1
+ {"version":3,"file":"constants.js","sources":["../../../../../src/features/circle-games/hooks/use-circle-sounds/constants.ts"],"sourcesContent":["import { CircleSoundKey } from './use-circle-sounds-enums';\n\nconst BASE_URL = 'https://cuemath-circle.s3.ap-southeast-1.amazonaws.com/assets/sounds/production';\n\nconst STATIC_BASE_URL = 'https://static.cuemath.com/static/sounds';\n\nexport const CircleSoundKeyMapper = {\n [CircleSoundKey.BACKGROUND]: `${BASE_URL}/bg-sound.mp3`,\n [CircleSoundKey.BACKGROUND_RUSHHOUR]: `${BASE_URL}/circle-background-rushhour.mp3`,\n [CircleSoundKey.TUTORIAL]: `${BASE_URL}/bg-sound-tutorials.mp3`,\n [CircleSoundKey.SWIPE_01]: `${BASE_URL}/circle-swipe-1.wav`,\n [CircleSoundKey.SWIPE_02]: `${BASE_URL}/circle-swipe-2.wav`,\n [CircleSoundKey.SWIPE_03]: `${BASE_URL}/circle-swipe-3.wav`,\n [CircleSoundKey.SWIPE_04]: `${BASE_URL}/circle-swipe-4.wav`,\n [CircleSoundKey.SWIPE_DOWN]: `${BASE_URL}/circle-swipe-down-1.wav`,\n [CircleSoundKey.TOGGLE]: `${BASE_URL}/circle-button-v3.wav`,\n [CircleSoundKey.POINTS_AWARDED]: `${BASE_URL}/circle-points-v2.wav`,\n [CircleSoundKey.ACTIVITY_COMPLETE]: `${BASE_URL}/circle-activity-complete.wav`,\n [CircleSoundKey.POINTS_ADDED]: `${BASE_URL}/circle-points-add-v1.wav`,\n [CircleSoundKey.GAME_CARD_CLICK]: `${BASE_URL}/circle-gamecard-button-v1.wav`,\n [CircleSoundKey.CLOCK_IN]: `${BASE_URL}/circle-meter-v1.wav`,\n [CircleSoundKey.CLOCK_OUT]: `${BASE_URL}/circle-disappear-v1.wav`,\n [CircleSoundKey.ACCURACY_IN]: `${BASE_URL}/circle-meter-v1.wav`,\n [CircleSoundKey.ACCURACY_OUT]: `${BASE_URL}/circle-disappear-v1.wav`,\n [CircleSoundKey.STREAK_IN]: `${BASE_URL}/circle-streak-v1.wav`,\n [CircleSoundKey.STREAK_OUT]: `${BASE_URL}/circle-disappear-v1.wav`,\n [CircleSoundKey.ACCURACY_INTRO]: `${STATIC_BASE_URL}/accuracy-intro.mp3`,\n [CircleSoundKey.ACCURACY_TARGET]: `${STATIC_BASE_URL}/accuracy-target.mp3`,\n [CircleSoundKey.TIME_INTRO]: `${STATIC_BASE_URL}/timer-intro.mp3`,\n [CircleSoundKey.TIME_TARGET]: `${STATIC_BASE_URL}/timer-target.mp3`,\n [CircleSoundKey.METER_FILL]: `${STATIC_BASE_URL}/meter-fill.mp3`,\n [CircleSoundKey.YOUR_SCORE]: `${BASE_URL}/your-score.mp3`,\n [CircleSoundKey.HIGH_SCORE]: `${BASE_URL}/high-score.mp3`,\n [CircleSoundKey.ALL_ACTIVITIES_COMPLETE]: `${BASE_URL}/circle-all-activities-complete.mp3`,\n [CircleSoundKey.ALL_DONE]: `${BASE_URL}/all-done.mp3`,\n [CircleSoundKey.DOING_GREAT]: `${BASE_URL}/doing-great.mp3`,\n [CircleSoundKey.KEEP_IT_UP]: `${BASE_URL}/keep-it-up.mp3`,\n};\n\nexport const SWIPE_SOUND_ORDER = [\n CircleSoundKey.SWIPE_04,\n CircleSoundKey.SWIPE_02,\n CircleSoundKey.SWIPE_03,\n CircleSoundKey.SWIPE_01,\n];\n\nexport const BACKGROUND_SOUNDS = new Set([\n CircleSoundKey.BACKGROUND,\n CircleSoundKey.BACKGROUND_RUSHHOUR,\n CircleSoundKey.TUTORIAL,\n]);\n\nexport const VOLUME_FADE_DURATION = 100; // in milliseconds\nexport const VOLUME_TO_CHANGE = 0.1; // volume change per fade step\n"],"names":["BASE_URL","STATIC_BASE_URL","CircleSoundKeyMapper","CircleSoundKey","SWIPE_SOUND_ORDER","BACKGROUND_SOUNDS"],"mappings":";AAEA,MAAMA,IAAW,mFAEXC,IAAkB,4CAEXC,IAAuB;AAAA,EAClC,CAACC,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,mBAAmB,GAAG,GAAGH,CAAQ;AAAA,EACjD,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,MAAM,GAAG,GAAGH,CAAQ;AAAA,EACpC,CAACG,EAAe,cAAc,GAAG,GAAGH,CAAQ;AAAA,EAC5C,CAACG,EAAe,iBAAiB,GAAG,GAAGH,CAAQ;AAAA,EAC/C,CAACG,EAAe,YAAY,GAAG,GAAGH,CAAQ;AAAA,EAC1C,CAACG,EAAe,eAAe,GAAG,GAAGH,CAAQ;AAAA,EAC7C,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,SAAS,GAAG,GAAGH,CAAQ;AAAA,EACvC,CAACG,EAAe,WAAW,GAAG,GAAGH,CAAQ;AAAA,EACzC,CAACG,EAAe,YAAY,GAAG,GAAGH,CAAQ;AAAA,EAC1C,CAACG,EAAe,SAAS,GAAG,GAAGH,CAAQ;AAAA,EACvC,CAACG,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,cAAc,GAAG,GAAGF,CAAe;AAAA,EACnD,CAACE,EAAe,eAAe,GAAG,GAAGF,CAAe;AAAA,EACpD,CAACE,EAAe,UAAU,GAAG,GAAGF,CAAe;AAAA,EAC/C,CAACE,EAAe,WAAW,GAAG,GAAGF,CAAe;AAAA,EAChD,CAACE,EAAe,UAAU,GAAG,GAAGF,CAAe;AAAA,EAC/C,CAACE,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAAA,EACxC,CAACG,EAAe,uBAAuB,GAAG,GAAGH,CAAQ;AAAA,EACrD,CAACG,EAAe,QAAQ,GAAG,GAAGH,CAAQ;AAAA,EACtC,CAACG,EAAe,WAAW,GAAG,GAAGH,CAAQ;AAAA,EACzC,CAACG,EAAe,UAAU,GAAG,GAAGH,CAAQ;AAC1C,GAEaI,IAAoB;AAAA,EAC/BD,EAAe;AAAA,EACfA,EAAe;AAAA,EACfA,EAAe;AAAA,EACfA,EAAe;AACjB,GAEaE,wBAAwB,IAAI;AAAA,EACvCF,EAAe;AAAA,EACfA,EAAe;AAAA,EACfA,EAAe;AACjB,CAAC;"}
@@ -1,115 +1,56 @@
1
- import { useCallback as s, useRef as T, useEffect as P } from "react";
2
- import { useAutoPlayPermission as m } from "../../../hooks/use-auto-play-permission/use-auto-play-permission.js";
3
- import { CircleSoundKeyMapper as L, SWIPE_SOUND_ORDER as O } from "./constants.js";
4
- import { fadeInSound as R, fadeOutSound as U } from "./helper.js";
5
- import { CircleSoundKey as n } from "./use-circle-sounds-enums.js";
6
- let S = 0;
7
- const c = {
8
- [n.BACKGROUND]: null,
9
- [n.BACKGROUND_RUSHHOUR]: null,
10
- [n.TUTORIAL]: null,
11
- [n.SWIPE_01]: null,
12
- [n.SWIPE_02]: null,
13
- [n.SWIPE_03]: null,
14
- [n.SWIPE_04]: null,
15
- [n.SWIPE_DOWN]: null,
16
- [n.TOGGLE]: null,
17
- [n.POINTS_AWARDED]: null,
18
- [n.POINTS_ADDED]: null,
19
- [n.GAME_CARD_CLICK]: null,
20
- [n.CLOCK_IN]: null,
21
- [n.CLOCK_OUT]: null,
22
- [n.ACCURACY_IN]: null,
23
- [n.ACCURACY_OUT]: null,
24
- [n.STREAK_IN]: null,
25
- [n.STREAK_OUT]: null,
26
- [n.ACCURACY_INTRO]: null,
27
- [n.ACCURACY_TARGET]: null,
28
- [n.TIME_INTRO]: null,
29
- [n.TIME_TARGET]: null,
30
- [n.METER_FILL]: null,
31
- [n.YOUR_SCORE]: null,
32
- [n.HIGH_SCORE]: null,
33
- [n.KEEP_IT_UP]: null,
34
- [n.DOING_GREAT]: null,
35
- [n.ALL_DONE]: null,
36
- [n.ACTIVITY_COMPLETE]: null,
37
- [n.ALL_ACTIVITIES_COMPLETE]: null
38
- }, _ = {}, b = () => {
39
- const { canAutoPlayAudio: f } = m(), C = s((l) => {
40
- if (!c[l]) {
41
- const t = new Audio(L[l]);
42
- c[l] = t;
43
- }
44
- }, []), i = T(/* @__PURE__ */ new Set()), o = T({}), r = s(
45
- (l, t = !0, e = !1) => {
46
- C(l);
47
- const u = c[l];
48
- if (!u || !f) return;
49
- if (e && (u.loop = e), o.current[l] && clearInterval(o.current[l]), !u.paused && u.currentTime > 0 && !u.ended) {
50
- if (t)
51
- u.volume = 1;
52
- else {
53
- const I = R(u);
54
- o.current[l] = I;
55
- }
56
- return u;
57
- }
58
- u.volume = t ? 1 : 0;
59
- const A = u.play();
60
- if (A && (_[l] = A), !t) {
61
- const I = R(u);
62
- o.current[l] = I;
63
- }
64
- return u;
65
- },
66
- [C, f]
67
- ), a = s((l, t) => {
68
- const e = c[l];
69
- if (!e) return;
70
- if (o.current[l] && clearInterval(o.current[l]), t) {
71
- e.pause();
72
- return;
73
- }
74
- const u = U(e);
75
- o.current[l] = u;
76
- }, []), d = s(
77
- (l, t = !0) => {
78
- var e;
79
- if (_[l] !== void 0) {
80
- (e = _[l]) == null || e.then(() => {
81
- a(l, t);
82
- }).catch((u) => {
83
- console.log("sound not playing", u);
84
- });
85
- return;
86
- }
87
- a(l, t);
88
- },
89
- [a]
90
- ), p = s(() => {
91
- const l = O[S] || n.SWIPE_01;
92
- S = (S + 1) % O.length, r(l);
93
- }, [r]), v = s(() => r(n.TOGGLE), [r]), E = s(() => {
94
- const l = document.visibilityState;
95
- l === "hidden" && Object.entries(c).forEach(([t, e]) => {
96
- e && !e.paused && (d(t, !0), i.current.add(t));
97
- }), l === "visible" && (i.current.forEach((t) => {
98
- r(t);
99
- }), i.current.clear());
100
- }, [r, d]);
101
- return P(() => {
102
- document.addEventListener("visibilitychange", E);
103
- const l = o.current;
104
- return () => {
105
- document.removeEventListener("visibilitychange", E), Object.values(l).forEach((t) => {
106
- t && clearInterval(t);
107
- });
1
+ import { useRef as m, useCallback as i, useEffect as f } from "react";
2
+ import { useAutoPlayPermission as S } from "../../../hooks/use-auto-play-permission/use-auto-play-permission.js";
3
+ import { useAudioPlayer as E } from "../../../hooks/use-audio-player/use-audio-player.js";
4
+ import { CircleSoundKey as a } from "./use-circle-sounds-enums.js";
5
+ import { SWIPE_SOUND_ORDER as c, BACKGROUND_SOUNDS as h, CircleSoundKeyMapper as g } from "./constants.js";
6
+ const D = () => {
7
+ const { canAutoPlayAudio: d } = S(), s = m(0), e = E(g, d), o = i(
8
+ async (t, n = !0, r = !1) => e.play(t, {
9
+ loop: r,
10
+ fadeIn: !n,
11
+ fadeDuration: 0.5
12
+ }),
13
+ [e]
14
+ ), l = i(
15
+ async (t, n = !0) => e.stop(t, {
16
+ immediately: n,
17
+ fadeOut: !n,
18
+ fadeDuration: 0.5
19
+ }),
20
+ [e]
21
+ ), p = i(() => {
22
+ const t = c[s.current] || a.SWIPE_01;
23
+ s.current = (s.current + 1) % c.length, o(t);
24
+ }, [o]), y = i(() => {
25
+ o(a.TOGGLE);
26
+ }, [o]), u = i(() => {
27
+ e.handleVisibilityChange(h, !0);
28
+ }, [e]);
29
+ return f(() => {
30
+ const t = ["pointerdown", "touchstart"], n = () => {
31
+ e.resumeAudioContext();
108
32
  };
109
- }, [E]), { playSwipeSound: p, play: r, stop: d, playButtonSound: v };
33
+ return t.forEach((r) => {
34
+ window.addEventListener(r, n, { once: !0 });
35
+ }), document.addEventListener("visibilitychange", u), () => {
36
+ t.forEach((r) => {
37
+ window.removeEventListener(r, n);
38
+ }), document.removeEventListener("visibilitychange", u);
39
+ };
40
+ }, [e, u]), {
41
+ playSwipeSound: p,
42
+ playButtonSound: y,
43
+ play: o,
44
+ stop: l,
45
+ audioManager: {
46
+ stopAll: e.stopAll,
47
+ isPlaying: e.isPlaying,
48
+ setVolume: e.setVolume,
49
+ loadSound: e.loadSound
50
+ }
51
+ };
110
52
  };
111
53
  export {
112
- c as soundMapper,
113
- b as useCircleSounds
54
+ D as useCircleSounds
114
55
  };
115
56
  //# sourceMappingURL=use-circle-sounds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-circle-sounds.js","sources":["../../../../../src/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { useAutoPlayPermission } from '../../../hooks/use-auto-play-permission/use-auto-play-permission';\nimport { CircleSoundKeyMapper, SWIPE_SOUND_ORDER } from './constants';\nimport { fadeInSound, fadeOutSound } from './helper';\nimport type { TimeoutMap } from './use-circle-sound-types';\nimport { CircleSoundKey } from './use-circle-sounds-enums';\n\nlet swipeSoundIndex = 0;\n\nexport const soundMapper: Record<keyof typeof CircleSoundKeyMapper, null | HTMLAudioElement> = {\n [CircleSoundKey.BACKGROUND]: null,\n [CircleSoundKey.BACKGROUND_RUSHHOUR]: null,\n [CircleSoundKey.TUTORIAL]: null,\n [CircleSoundKey.SWIPE_01]: null,\n [CircleSoundKey.SWIPE_02]: null,\n [CircleSoundKey.SWIPE_03]: null,\n [CircleSoundKey.SWIPE_04]: null,\n [CircleSoundKey.SWIPE_DOWN]: null,\n [CircleSoundKey.TOGGLE]: null,\n [CircleSoundKey.POINTS_AWARDED]: null,\n [CircleSoundKey.POINTS_ADDED]: null,\n [CircleSoundKey.GAME_CARD_CLICK]: null,\n [CircleSoundKey.CLOCK_IN]: null,\n [CircleSoundKey.CLOCK_OUT]: null,\n [CircleSoundKey.ACCURACY_IN]: null,\n [CircleSoundKey.ACCURACY_OUT]: null,\n [CircleSoundKey.STREAK_IN]: null,\n [CircleSoundKey.STREAK_OUT]: null,\n [CircleSoundKey.ACCURACY_INTRO]: null,\n [CircleSoundKey.ACCURACY_TARGET]: null,\n [CircleSoundKey.TIME_INTRO]: null,\n [CircleSoundKey.TIME_TARGET]: null,\n [CircleSoundKey.METER_FILL]: null,\n [CircleSoundKey.YOUR_SCORE]: null,\n [CircleSoundKey.HIGH_SCORE]: null,\n [CircleSoundKey.KEEP_IT_UP]: null,\n [CircleSoundKey.DOING_GREAT]: null,\n [CircleSoundKey.ALL_DONE]: null,\n [CircleSoundKey.ACTIVITY_COMPLETE]: null,\n [CircleSoundKey.ALL_ACTIVITIES_COMPLETE]: null,\n};\n\nconst soundInstancePromise: Partial<Record<keyof typeof CircleSoundKeyMapper, Promise<void>>> = {};\n\nexport const useCircleSounds = () => {\n const { canAutoPlayAudio: canPlayAudio } = useAutoPlayPermission();\n\n const loadSound = useCallback((key: CircleSoundKey) => {\n if (!soundMapper[key]) {\n const loadedSound = new Audio(CircleSoundKeyMapper[key]);\n\n soundMapper[key] = loadedSound;\n }\n }, []);\n\n const pausedSoundsRef = useRef<Set<CircleSoundKey>>(new Set());\n const timeoutRefs = useRef<TimeoutMap>({});\n\n const play = useCallback(\n (key: CircleSoundKey, immediately: boolean = true, loop = false) => {\n loadSound(key);\n const soundInstance = soundMapper[key];\n\n if (!soundInstance || !canPlayAudio) return;\n\n // this makes sure that it keeps the default loop value at the time it was requested to be loaded\n // helps in visibility change where we only want to resume\n if (loop) {\n soundInstance.loop = loop;\n }\n\n if (timeoutRefs.current[key]) {\n clearInterval(timeoutRefs.current[key]);\n }\n\n // resume sound\n if (!soundInstance.paused && soundInstance.currentTime > 0 && !soundInstance.ended) {\n if (!immediately) {\n const intervalId = fadeInSound(soundInstance);\n\n timeoutRefs.current[key] = intervalId;\n } else {\n soundInstance.volume = 1;\n }\n\n return soundInstance;\n }\n\n // play sound\n soundInstance.volume = immediately ? 1 : 0;\n const promise = soundInstance.play();\n\n if (promise) {\n soundInstancePromise[key] = promise;\n }\n\n if (!immediately) {\n const intervalId = fadeInSound(soundInstance);\n\n timeoutRefs.current[key] = intervalId;\n }\n\n return soundInstance;\n },\n [loadSound, canPlayAudio],\n );\n\n const handleSoundStop = useCallback((key: CircleSoundKey, immediately: boolean) => {\n const soundInstance = soundMapper[key];\n\n if (!soundInstance) return;\n\n if (timeoutRefs.current[key]) {\n clearInterval(timeoutRefs.current[key]);\n }\n\n if (immediately) {\n soundInstance.pause();\n\n return;\n }\n\n const intervalId = fadeOutSound(soundInstance);\n\n timeoutRefs.current[key] = intervalId;\n }, []);\n\n const stop = useCallback(\n (key: CircleSoundKey, immediately: boolean = true) => {\n // if play returned a promise\n if (soundInstancePromise[key] !== undefined) {\n soundInstancePromise[key]\n ?.then(() => {\n handleSoundStop(key, immediately);\n })\n .catch(err => {\n // eslint-disable-next-line no-console\n console.log('sound not playing', err);\n });\n\n return;\n }\n\n handleSoundStop(key, immediately);\n },\n [handleSoundStop],\n );\n\n const playSwipeSound = useCallback(() => {\n const key = SWIPE_SOUND_ORDER[swipeSoundIndex] || CircleSoundKey.SWIPE_01;\n\n swipeSoundIndex = (swipeSoundIndex + 1) % SWIPE_SOUND_ORDER.length;\n\n play(key);\n }, [play]);\n\n const playButtonSound = useCallback(() => {\n const sound = play(CircleSoundKey.TOGGLE);\n\n return sound;\n }, [play]);\n\n const handleVisibilityChange = useCallback(() => {\n const visibilityState = document.visibilityState;\n\n if (visibilityState === 'hidden') {\n Object.entries(soundMapper).forEach(([key, sound]) => {\n if (sound && !sound.paused) {\n stop(key as CircleSoundKey, true);\n pausedSoundsRef.current.add(key as CircleSoundKey);\n }\n });\n }\n\n if (visibilityState === 'visible') {\n pausedSoundsRef.current.forEach(key => {\n play(key);\n });\n pausedSoundsRef.current.clear();\n }\n }, [play, stop]);\n\n useEffect(() => {\n document.addEventListener('visibilitychange', handleVisibilityChange);\n const timeouts = timeoutRefs.current;\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n Object.values(timeouts).forEach(id => {\n if (id) {\n clearInterval(id);\n }\n });\n };\n }, [handleVisibilityChange]);\n\n return { playSwipeSound, play, stop, playButtonSound };\n};\n"],"names":["swipeSoundIndex","soundMapper","CircleSoundKey","soundInstancePromise","useCircleSounds","canPlayAudio","useAutoPlayPermission","loadSound","useCallback","key","loadedSound","CircleSoundKeyMapper","pausedSoundsRef","useRef","timeoutRefs","play","immediately","loop","soundInstance","intervalId","fadeInSound","promise","handleSoundStop","fadeOutSound","stop","_a","err","playSwipeSound","SWIPE_SOUND_ORDER","playButtonSound","handleVisibilityChange","visibilityState","sound","useEffect","timeouts","id"],"mappings":"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"}
1
+ {"version":3,"file":"use-circle-sounds.js","sources":["../../../../../src/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { useAutoPlayPermission } from '../../../hooks/use-auto-play-permission/use-auto-play-permission';\nimport { useAudioPlayer } from '../../../hooks/use-audio-player/use-audio-player';\nimport { CircleSoundKey } from './use-circle-sounds-enums';\nimport { BACKGROUND_SOUNDS, CircleSoundKeyMapper, SWIPE_SOUND_ORDER } from './constants';\n\nexport const useCircleSounds = () => {\n const { canAutoPlayAudio } = useAutoPlayPermission();\n const swipeIndexRef = useRef(0);\n\n const audioManager = useAudioPlayer(CircleSoundKeyMapper, canAutoPlayAudio);\n\n const play = useCallback(\n async (key: CircleSoundKey, immediately = true, loop = false) => {\n return audioManager.play(key, {\n loop,\n fadeIn: !immediately,\n fadeDuration: 0.5,\n });\n },\n [audioManager],\n );\n\n const stop = useCallback(\n async (key: CircleSoundKey, immediately = true) => {\n return audioManager.stop(key, {\n immediately,\n fadeOut: !immediately,\n fadeDuration: 0.5,\n });\n },\n [audioManager],\n );\n\n const playSwipeSound = useCallback(() => {\n const key = SWIPE_SOUND_ORDER[swipeIndexRef.current] || CircleSoundKey.SWIPE_01;\n\n swipeIndexRef.current = (swipeIndexRef.current + 1) % SWIPE_SOUND_ORDER.length;\n play(key);\n }, [play]);\n\n const playButtonSound = useCallback(() => {\n play(CircleSoundKey.TOGGLE);\n }, [play]);\n\n const handleVisibilityChange = useCallback(() => {\n audioManager.handleVisibilityChange(BACKGROUND_SOUNDS, true);\n }, [audioManager]);\n\n useEffect(() => {\n const interactionEvents = ['pointerdown', 'touchstart'];\n\n const tryResume = () => {\n audioManager.resumeAudioContext();\n };\n\n interactionEvents.forEach(event => {\n window.addEventListener(event, tryResume, { once: true });\n });\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n interactionEvents.forEach(event => {\n window.removeEventListener(event, tryResume);\n });\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, [audioManager, handleVisibilityChange]);\n\n return {\n playSwipeSound,\n playButtonSound,\n play,\n stop,\n\n audioManager: {\n stopAll: audioManager.stopAll,\n isPlaying: audioManager.isPlaying,\n setVolume: audioManager.setVolume,\n loadSound: audioManager.loadSound,\n },\n };\n};\n"],"names":["useCircleSounds","canAutoPlayAudio","useAutoPlayPermission","swipeIndexRef","useRef","audioManager","useAudioPlayer","CircleSoundKeyMapper","play","useCallback","key","immediately","loop","stop","playSwipeSound","SWIPE_SOUND_ORDER","CircleSoundKey","playButtonSound","handleVisibilityChange","BACKGROUND_SOUNDS","useEffect","interactionEvents","tryResume","event"],"mappings":";;;;;AAOO,MAAMA,IAAkB,MAAM;AAC7B,QAAA,EAAE,kBAAAC,MAAqBC,KACvBC,IAAgBC,EAAO,CAAC,GAExBC,IAAeC,EAAeC,GAAsBN,CAAgB,GAEpEO,IAAOC;AAAA,IACX,OAAOC,GAAqBC,IAAc,IAAMC,IAAO,OAC9CP,EAAa,KAAKK,GAAK;AAAA,MAC5B,MAAAE;AAAA,MACA,QAAQ,CAACD;AAAA,MACT,cAAc;AAAA,IAAA,CACf;AAAA,IAEH,CAACN,CAAY;AAAA,EAAA,GAGTQ,IAAOJ;AAAA,IACX,OAAOC,GAAqBC,IAAc,OACjCN,EAAa,KAAKK,GAAK;AAAA,MAC5B,aAAAC;AAAA,MACA,SAAS,CAACA;AAAA,MACV,cAAc;AAAA,IAAA,CACf;AAAA,IAEH,CAACN,CAAY;AAAA,EAAA,GAGTS,IAAiBL,EAAY,MAAM;AACvC,UAAMC,IAAMK,EAAkBZ,EAAc,OAAO,KAAKa,EAAe;AAEvE,IAAAb,EAAc,WAAWA,EAAc,UAAU,KAAKY,EAAkB,QACxEP,EAAKE,CAAG;AAAA,EAAA,GACP,CAACF,CAAI,CAAC,GAEHS,IAAkBR,EAAY,MAAM;AACxC,IAAAD,EAAKQ,EAAe,MAAM;AAAA,EAAA,GACzB,CAACR,CAAI,CAAC,GAEHU,IAAyBT,EAAY,MAAM;AAClC,IAAAJ,EAAA,uBAAuBc,GAAmB,EAAI;AAAA,EAAA,GAC1D,CAACd,CAAY,CAAC;AAEjB,SAAAe,EAAU,MAAM;AACR,UAAAC,IAAoB,CAAC,eAAe,YAAY,GAEhDC,IAAY,MAAM;AACtB,MAAAjB,EAAa,mBAAmB;AAAA,IAAA;AAGlC,WAAAgB,EAAkB,QAAQ,CAASE,MAAA;AACjC,aAAO,iBAAiBA,GAAOD,GAAW,EAAE,MAAM,IAAM;AAAA,IAAA,CACzD,GAEQ,SAAA,iBAAiB,oBAAoBJ,CAAsB,GAE7D,MAAM;AACX,MAAAG,EAAkB,QAAQ,CAASE,MAAA;AAC1B,eAAA,oBAAoBA,GAAOD,CAAS;AAAA,MAAA,CAC5C,GACQ,SAAA,oBAAoB,oBAAoBJ,CAAsB;AAAA,IAAA;AAAA,EACzE,GACC,CAACb,GAAca,CAAsB,CAAC,GAElC;AAAA,IACL,gBAAAJ;AAAA,IACA,iBAAAG;AAAA,IACA,MAAAT;AAAA,IACA,MAAAK;AAAA,IAEA,cAAc;AAAA,MACZ,SAASR,EAAa;AAAA,MACtB,WAAWA,EAAa;AAAA,MACxB,WAAWA,EAAa;AAAA,MACxB,WAAWA,EAAa;AAAA,IAC1B;AAAA,EAAA;AAEJ;"}
@@ -0,0 +1,164 @@
1
+ import { useRef as h, useEffect as x, useCallback as i } from "react";
2
+ const R = (V, p = !0) => {
3
+ const n = h(null), T = h({}), c = h({}), a = h({});
4
+ x(() => {
5
+ try {
6
+ const e = window.AudioContext || window.webkitAudioContext;
7
+ n.current = new e();
8
+ } catch (e) {
9
+ console.warn("Failed to create AudioContext:", e);
10
+ }
11
+ return () => {
12
+ n.current && n.current.state !== "closed" && n.current.close();
13
+ };
14
+ }, []);
15
+ const m = i(async () => {
16
+ var e;
17
+ if (((e = n.current) == null ? void 0 : e.state) === "suspended")
18
+ try {
19
+ await n.current.resume();
20
+ } catch (t) {
21
+ console.warn("Failed to resume AudioContext:", t);
22
+ }
23
+ }, []), A = i(
24
+ async (e) => {
25
+ if (!(!n.current || T.current[e]))
26
+ try {
27
+ const t = V[e];
28
+ if (!t) throw new Error(`No URL found for sound key: ${e}`);
29
+ const r = await fetch(t, {
30
+ mode: "cors",
31
+ credentials: "omit"
32
+ });
33
+ if (!r.ok)
34
+ throw new Error(`HTTP error! status: ${r.status}`);
35
+ const o = await r.arrayBuffer(), u = await n.current.decodeAudioData(o);
36
+ T.current[e] = u;
37
+ } catch (t) {
38
+ console.error(`Failed to load sound "${e}":`, t), T.current[e] = null;
39
+ }
40
+ },
41
+ [V]
42
+ ), g = i((e, t = 0.5) => {
43
+ if (!n.current) return;
44
+ const r = n.current.currentTime;
45
+ e.gain.cancelScheduledValues(r), e.gain.setValueAtTime(e.gain.value, r), e.gain.linearRampToValueAtTime(1, r + t);
46
+ }, []), w = i(
47
+ (e, t, r = 0.5, o = !0) => {
48
+ if (!n.current) return;
49
+ a.current[e] && (clearTimeout(a.current[e]), delete a.current[e]);
50
+ const u = n.current.currentTime;
51
+ t.gainNode.gain.cancelScheduledValues(u), t.gainNode.gain.setValueAtTime(t.gainNode.gain.value, u), t.gainNode.gain.linearRampToValueAtTime(0, u + r), o && (a.current[e] = window.setTimeout(() => {
52
+ var l;
53
+ try {
54
+ t.source.stop();
55
+ } catch (f) {
56
+ console.warn("Error stopping sound:", f);
57
+ }
58
+ ((l = c.current[e]) == null ? void 0 : l.source) === t.source && delete c.current[e], delete a.current[e];
59
+ }, r * 1e3));
60
+ },
61
+ []
62
+ ), N = i(
63
+ async (e, t = {}) => {
64
+ const {
65
+ loop: r = !1,
66
+ volume: o = 1,
67
+ fadeIn: u = !1,
68
+ fadeDuration: l = 0.5
69
+ } = t;
70
+ if (!n.current || !p) {
71
+ console.warn("Cannot play sound:", {
72
+ key: e,
73
+ hasContext: !!n.current,
74
+ canPlayAudio: p
75
+ });
76
+ return;
77
+ }
78
+ await m(), await A(e);
79
+ const f = T.current[e];
80
+ if (!f) {
81
+ console.warn(`No buffer available for sound: ${e}`);
82
+ return;
83
+ }
84
+ if (c.current[e] && r) {
85
+ a.current[e] && (clearTimeout(a.current[e]), delete a.current[e]), g(c.current[e].gainNode, l);
86
+ return;
87
+ }
88
+ if (c.current[e]) {
89
+ const s = c.current[e];
90
+ try {
91
+ s.source.stop();
92
+ } catch (d) {
93
+ console.warn("Error stopping existing sound:", d);
94
+ }
95
+ delete c.current[e];
96
+ }
97
+ try {
98
+ const s = n.current.createBufferSource(), d = n.current.createGain();
99
+ s.buffer = f, s.loop = r, s.connect(d).connect(n.current.destination), u ? (d.gain.setValueAtTime(0, n.current.currentTime), g(d, l)) : d.gain.setValueAtTime(o, n.current.currentTime), s.start(), c.current[e] = { source: s, gainNode: d, loop: r }, r || (s.onended = () => {
100
+ var C;
101
+ ((C = c.current[e]) == null ? void 0 : C.source) === s && delete c.current[e];
102
+ });
103
+ } catch (s) {
104
+ console.error(`Failed to play sound "${e}":`, s);
105
+ }
106
+ },
107
+ [p, m, A, g]
108
+ ), b = i(
109
+ async (e, t = {}) => {
110
+ const { immediately: r = !0, fadeOut: o = !1, fadeDuration: u = 0.5 } = t, l = c.current[e];
111
+ if (l)
112
+ if (r && !o) {
113
+ try {
114
+ l.source.stop();
115
+ } catch (f) {
116
+ console.warn("Error stopping sound:", f);
117
+ }
118
+ delete c.current[e], a.current[e] && (clearTimeout(a.current[e]), delete a.current[e]);
119
+ } else
120
+ w(e, l, u);
121
+ },
122
+ [w]
123
+ ), E = i(
124
+ (e = {}) => {
125
+ Object.keys(c.current).forEach((r) => b(r, e));
126
+ },
127
+ [b]
128
+ ), v = i((e) => !!c.current[e], []), S = i((e, t, r = 0) => {
129
+ const o = c.current[e];
130
+ if (!o || !n.current) return;
131
+ const u = n.current.currentTime;
132
+ r > 0 ? (o.gainNode.gain.cancelScheduledValues(u), o.gainNode.gain.setValueAtTime(o.gainNode.gain.value, u), o.gainNode.gain.linearRampToValueAtTime(t, u + r)) : o.gainNode.gain.setValueAtTime(t, u);
133
+ }, []), O = i(
134
+ (e = /* @__PURE__ */ new Set(), t = !0) => {
135
+ t && (document.visibilityState === "visible" ? (m(), Object.values(c.current).forEach((r) => {
136
+ r && g(r.gainNode);
137
+ })) : Object.entries(c.current).forEach(([r, o]) => {
138
+ o && (e.has(r) ? w(r, o, 0.5, !1) : w(r, o));
139
+ }));
140
+ },
141
+ [m, g, w]
142
+ );
143
+ return x(() => {
144
+ const e = a.current;
145
+ return () => {
146
+ Object.values(e).forEach((t) => {
147
+ t && clearTimeout(t);
148
+ });
149
+ };
150
+ }, []), {
151
+ play: N,
152
+ stop: b,
153
+ stopAll: E,
154
+ isPlaying: v,
155
+ setVolume: S,
156
+ handleVisibilityChange: O,
157
+ loadSound: A,
158
+ resumeAudioContext: m
159
+ };
160
+ };
161
+ export {
162
+ R as useAudioPlayer
163
+ };
164
+ //# sourceMappingURL=use-audio-player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-audio-player.js","sources":["../../../../src/features/hooks/use-audio-player/use-audio-player.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { type IActiveSound, type IAudioConfig, type IAudioOptions } from './use-audio-player-types';\n\ndeclare global {\n interface Window {\n webkitAudioContext?: typeof AudioContext;\n }\n}\n\nexport const useAudioPlayer = (audioConfig: IAudioConfig, canPlayAudio: boolean = true) => {\n const audioContext = useRef<AudioContext | null>(null);\n const bufferCache = useRef<Record<string, AudioBuffer | null>>({});\n const activeSounds = useRef<Partial<Record<string, IActiveSound>>>({});\n const fadeTimeouts = useRef<Partial<Record<string, number>>>({});\n\n useEffect(() => {\n try {\n const AudioContextClass = window.AudioContext || window.webkitAudioContext;\n\n audioContext.current = new AudioContextClass();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Failed to create AudioContext:', error);\n }\n\n return () => {\n if (audioContext.current && audioContext.current.state !== 'closed') {\n audioContext.current.close();\n }\n };\n }, []);\n\n const resumeAudioContext = useCallback(async () => {\n if (audioContext.current?.state === 'suspended') {\n try {\n await audioContext.current.resume();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Failed to resume AudioContext:', error);\n }\n }\n }, []);\n\n const loadSound = useCallback(\n async (key: string): Promise<void> => {\n if (!audioContext.current || bufferCache.current[key]) return;\n\n try {\n const url = audioConfig[key];\n\n if (!url) throw new Error(`No URL found for sound key: ${key}`);\n\n const response = await fetch(url, {\n mode: 'cors',\n credentials: 'omit',\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const audioBuffer = await audioContext.current.decodeAudioData(arrayBuffer);\n\n bufferCache.current[key] = audioBuffer;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to load sound \"${key}\":`, error);\n bufferCache.current[key] = null;\n }\n },\n [audioConfig],\n );\n\n const fadeIn = useCallback((gainNode: GainNode, duration: number = 0.5) => {\n if (!audioContext.current) return;\n\n const now = audioContext.current.currentTime;\n\n gainNode.gain.cancelScheduledValues(now);\n gainNode.gain.setValueAtTime(gainNode.gain.value, now);\n gainNode.gain.linearRampToValueAtTime(1, now + duration);\n }, []);\n\n const fadeOut = useCallback(\n (key: string, sound: IActiveSound, duration: number = 0.5, shouldStop: boolean = true) => {\n if (!audioContext.current) return;\n\n if (fadeTimeouts.current[key]) {\n clearTimeout(fadeTimeouts.current[key]);\n delete fadeTimeouts.current[key];\n }\n\n const now = audioContext.current.currentTime;\n\n sound.gainNode.gain.cancelScheduledValues(now);\n sound.gainNode.gain.setValueAtTime(sound.gainNode.gain.value, now);\n sound.gainNode.gain.linearRampToValueAtTime(0, now + duration);\n\n if (shouldStop) {\n fadeTimeouts.current[key] = window.setTimeout(() => {\n try {\n sound.source.stop();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Error stopping sound:', error);\n }\n\n if (activeSounds.current[key]?.source === sound.source) {\n delete activeSounds.current[key];\n }\n delete fadeTimeouts.current[key];\n }, duration * 1000);\n }\n },\n [],\n );\n\n const play = useCallback(\n async (key: string, options: IAudioOptions = {}): Promise<void> => {\n const {\n loop = false,\n volume = 1,\n fadeIn: shouldFadeIn = false,\n fadeDuration = 0.5,\n } = options;\n\n if (!audioContext.current || !canPlayAudio) {\n // eslint-disable-next-line no-console\n console.warn('Cannot play sound:', {\n key,\n hasContext: !!audioContext.current,\n canPlayAudio,\n });\n\n return;\n }\n\n await resumeAudioContext();\n await loadSound(key);\n\n const buffer = bufferCache.current[key];\n\n if (!buffer) {\n // eslint-disable-next-line no-console\n console.warn(`No buffer available for sound: ${key}`);\n\n return;\n }\n\n if (activeSounds.current[key] && loop) {\n if (fadeTimeouts.current[key]) {\n clearTimeout(fadeTimeouts.current[key]);\n delete fadeTimeouts.current[key];\n }\n fadeIn(activeSounds.current[key]!.gainNode, fadeDuration);\n\n return;\n }\n\n if (activeSounds.current[key]) {\n const existingSound = activeSounds.current[key];\n\n try {\n existingSound!.source.stop();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Error stopping existing sound:', error);\n }\n delete activeSounds.current[key];\n }\n\n try {\n const source = audioContext.current.createBufferSource();\n const gainNode = audioContext.current.createGain();\n\n source.buffer = buffer;\n source.loop = loop;\n source.connect(gainNode).connect(audioContext.current.destination);\n\n if (shouldFadeIn) {\n gainNode.gain.setValueAtTime(0, audioContext.current.currentTime);\n fadeIn(gainNode, fadeDuration);\n } else {\n gainNode.gain.setValueAtTime(volume, audioContext.current.currentTime);\n }\n\n source.start();\n activeSounds.current[key] = { source, gainNode, loop };\n\n if (!loop) {\n source.onended = () => {\n if (activeSounds.current[key]?.source === source) {\n delete activeSounds.current[key];\n }\n };\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to play sound \"${key}\":`, error);\n }\n },\n [canPlayAudio, resumeAudioContext, loadSound, fadeIn],\n );\n\n const stop = useCallback(\n async (\n key: string,\n options: { immediately?: boolean; fadeOut?: boolean; fadeDuration?: number } = {},\n ): Promise<void> => {\n const { immediately = true, fadeOut: shouldFadeOut = false, fadeDuration = 0.5 } = options;\n\n const sound = activeSounds.current[key];\n\n if (!sound) return;\n\n if (immediately && !shouldFadeOut) {\n try {\n sound.source.stop();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Error stopping sound:', error);\n }\n\n delete activeSounds.current[key];\n if (fadeTimeouts.current[key]) {\n clearTimeout(fadeTimeouts.current[key]);\n delete fadeTimeouts.current[key];\n }\n } else {\n fadeOut(key, sound, fadeDuration);\n }\n },\n [fadeOut],\n );\n\n const stopAll = useCallback(\n (options: { immediately?: boolean; fadeOut?: boolean } = {}) => {\n const soundKeys = Object.keys(activeSounds.current);\n\n soundKeys.forEach(key => stop(key, options));\n },\n [stop],\n );\n\n const isPlaying = useCallback((key: string): boolean => {\n return !!activeSounds.current[key];\n }, []);\n\n const setVolume = useCallback((key: string, volume: number, duration: number = 0) => {\n const sound = activeSounds.current[key];\n\n if (!sound || !audioContext.current) return;\n\n const now = audioContext.current.currentTime;\n\n if (duration > 0) {\n sound.gainNode.gain.cancelScheduledValues(now);\n sound.gainNode.gain.setValueAtTime(sound.gainNode.gain.value, now);\n sound.gainNode.gain.linearRampToValueAtTime(volume, now + duration);\n } else {\n sound.gainNode.gain.setValueAtTime(volume, now);\n }\n }, []);\n\n const handleVisibilityChange = useCallback(\n (backgroundSounds: Set<string> = new Set(), fadeOnHide: boolean = true) => {\n if (!fadeOnHide) return;\n\n if (document.visibilityState === 'visible') {\n resumeAudioContext();\n Object.values(activeSounds.current).forEach(sound => {\n if (sound) {\n fadeIn(sound.gainNode);\n }\n });\n } else {\n Object.entries(activeSounds.current).forEach(([key, sound]) => {\n if (sound) {\n if (backgroundSounds.has(key)) {\n fadeOut(key, sound, 0.5, false);\n } else {\n fadeOut(key, sound);\n }\n }\n });\n }\n },\n [resumeAudioContext, fadeIn, fadeOut],\n );\n\n useEffect(() => {\n const timeouts = fadeTimeouts.current;\n\n return () => {\n Object.values(timeouts).forEach(id => {\n if (id) clearTimeout(id);\n });\n };\n }, []);\n\n return {\n play,\n stop,\n stopAll,\n isPlaying,\n setVolume,\n handleVisibilityChange,\n loadSound,\n resumeAudioContext,\n };\n};\n"],"names":["useAudioPlayer","audioConfig","canPlayAudio","audioContext","useRef","bufferCache","activeSounds","fadeTimeouts","useEffect","AudioContextClass","error","resumeAudioContext","useCallback","_a","loadSound","key","url","response","arrayBuffer","audioBuffer","fadeIn","gainNode","duration","now","fadeOut","sound","shouldStop","play","options","loop","volume","shouldFadeIn","fadeDuration","buffer","existingSound","source","stop","immediately","shouldFadeOut","stopAll","isPlaying","setVolume","handleVisibilityChange","backgroundSounds","fadeOnHide","timeouts","id"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { PLUGINS as e } from "../../../../node_modules/@cuemath/analytics-v2/dist/constants.js";
2
+ var c = /* @__PURE__ */ ((_) => (_.CIRCLE_GAME_LOAD_STARTED = "circle_game_load_started", _.CIRCLE_GAME_LOAD_SUCCESS = "circle_game_load_success", _))(c || {});
3
+ const a = {
4
+ circle_game_load_started: [e.MIXPANEL],
5
+ circle_game_load_success: [e.MIXPANEL]
6
+ };
7
+ export {
8
+ c as TRIAL_CIRCLE_GAME_ANALYTICS_EVENTS,
9
+ a as TRIAL_CIRCLE_GAME_ANALYTICS_WHITELIST_EVENTS
10
+ };
11
+ //# sourceMappingURL=trial-circle-game-analytics-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trial-circle-game-analytics-events.js","sources":["../../../../../src/features/trial-session/comps/trial-circle-game/trial-circle-game-analytics-events.ts"],"sourcesContent":["import { PLUGINS } from '@cuemath/analytics-v2/dist/constants';\n\nexport enum TRIAL_CIRCLE_GAME_ANALYTICS_EVENTS {\n CIRCLE_GAME_LOAD_STARTED = 'circle_game_load_started',\n CIRCLE_GAME_LOAD_SUCCESS = 'circle_game_load_success',\n}\n\nexport const TRIAL_CIRCLE_GAME_ANALYTICS_WHITELIST_EVENTS = {\n [TRIAL_CIRCLE_GAME_ANALYTICS_EVENTS.CIRCLE_GAME_LOAD_STARTED]: [PLUGINS.MIXPANEL],\n [TRIAL_CIRCLE_GAME_ANALYTICS_EVENTS.CIRCLE_GAME_LOAD_SUCCESS]: [PLUGINS.MIXPANEL],\n};\n"],"names":["TRIAL_CIRCLE_GAME_ANALYTICS_EVENTS","TRIAL_CIRCLE_GAME_ANALYTICS_WHITELIST_EVENTS","PLUGINS"],"mappings":";AAEY,IAAAA,sBAAAA,OACVA,EAAA,2BAA2B,4BAC3BA,EAAA,2BAA2B,4BAFjBA,IAAAA,KAAA,CAAA,CAAA;AAKL,MAAMC,IAA+C;AAAA,EACzD,0BAA8D,CAACC,EAAQ,QAAQ;AAAA,EAC/E,0BAA8D,CAACA,EAAQ,QAAQ;AAClF;"}