@magmamath/students-features 1.7.9 → 1.7.10-rc.2

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 (154) hide show
  1. package/dist/commonjs/features/voice/constants.js +42 -3
  2. package/dist/commonjs/features/voice/constants.js.map +1 -1
  3. package/dist/commonjs/features/voice/helpers.js +67 -1
  4. package/dist/commonjs/features/voice/helpers.js.map +1 -1
  5. package/dist/commonjs/features/voice/index.js +77 -0
  6. package/dist/commonjs/features/voice/index.js.map +1 -1
  7. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptContent.js +22 -9
  8. package/dist/commonjs/features/voice/playing/components/VoiceTranscriptContent.js.map +1 -1
  9. package/dist/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.js +4 -27
  10. package/dist/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.js.map +1 -1
  11. package/dist/commonjs/features/voice/recording/components/VoiceRecordWithTranscript.js +49 -0
  12. package/dist/commonjs/features/voice/recording/components/VoiceRecordWithTranscript.js.map +1 -0
  13. package/dist/commonjs/features/voice/recording/components/VoiceTranscriptPanel.js +253 -0
  14. package/dist/commonjs/features/voice/recording/components/VoiceTranscriptPanel.js.map +1 -0
  15. package/dist/commonjs/features/voice/recording/components/VoiceWaveform.js +93 -0
  16. package/dist/commonjs/features/voice/recording/components/VoiceWaveform.js.map +1 -0
  17. package/dist/commonjs/features/voice/recording/hooks/useTranscriptPanelAnimation.js +42 -0
  18. package/dist/commonjs/features/voice/recording/hooks/useTranscriptPanelAnimation.js.map +1 -0
  19. package/dist/commonjs/features/voice/recording/hooks/useVoiceRecorder.js +17 -2
  20. package/dist/commonjs/features/voice/recording/hooks/useVoiceRecorder.js.map +1 -1
  21. package/dist/commonjs/features/voice/recording/hooks/useVoiceWaveform.js +43 -0
  22. package/dist/commonjs/features/voice/recording/hooks/useVoiceWaveform.js.map +1 -0
  23. package/dist/commonjs/features/voice/recording/model/Recorder.model.js +3 -0
  24. package/dist/commonjs/features/voice/recording/model/Recorder.model.js.map +1 -1
  25. package/dist/commonjs/features/voice/recording/model/VoiceRecordWithTranscript.model.js +100 -0
  26. package/dist/commonjs/features/voice/recording/model/VoiceRecordWithTranscript.model.js.map +1 -0
  27. package/dist/commonjs/features/voice/recording/model/VoiceTranscriptPanel.model.js +115 -0
  28. package/dist/commonjs/features/voice/recording/model/VoiceTranscriptPanel.model.js.map +1 -0
  29. package/dist/commonjs/features/voice/transcript.helpers.js +36 -0
  30. package/dist/commonjs/features/voice/transcript.helpers.js.map +1 -0
  31. package/dist/commonjs/features/voice/types.js +11 -7
  32. package/dist/commonjs/features/voice/types.js.map +1 -1
  33. package/dist/module/features/voice/constants.js +41 -0
  34. package/dist/module/features/voice/constants.js.map +1 -1
  35. package/dist/module/features/voice/helpers.js +65 -1
  36. package/dist/module/features/voice/helpers.js.map +1 -1
  37. package/dist/module/features/voice/index.js +7 -0
  38. package/dist/module/features/voice/index.js.map +1 -1
  39. package/dist/module/features/voice/playing/components/VoiceTranscriptContent.js +20 -9
  40. package/dist/module/features/voice/playing/components/VoiceTranscriptContent.js.map +1 -1
  41. package/dist/module/features/voice/playing/model/TranscriptionsDownloader.model.js +4 -27
  42. package/dist/module/features/voice/playing/model/TranscriptionsDownloader.model.js.map +1 -1
  43. package/dist/module/features/voice/recording/components/VoiceRecordWithTranscript.js +43 -0
  44. package/dist/module/features/voice/recording/components/VoiceRecordWithTranscript.js.map +1 -0
  45. package/dist/module/features/voice/recording/components/VoiceTranscriptPanel.js +246 -0
  46. package/dist/module/features/voice/recording/components/VoiceTranscriptPanel.js.map +1 -0
  47. package/dist/module/features/voice/recording/components/VoiceWaveform.js +86 -0
  48. package/dist/module/features/voice/recording/components/VoiceWaveform.js.map +1 -0
  49. package/dist/module/features/voice/recording/hooks/useTranscriptPanelAnimation.js +37 -0
  50. package/dist/module/features/voice/recording/hooks/useTranscriptPanelAnimation.js.map +1 -0
  51. package/dist/module/features/voice/recording/hooks/useVoiceRecorder.js +20 -3
  52. package/dist/module/features/voice/recording/hooks/useVoiceRecorder.js.map +1 -1
  53. package/dist/module/features/voice/recording/hooks/useVoiceWaveform.js +38 -0
  54. package/dist/module/features/voice/recording/hooks/useVoiceWaveform.js.map +1 -0
  55. package/dist/module/features/voice/recording/model/Recorder.model.js +3 -0
  56. package/dist/module/features/voice/recording/model/Recorder.model.js.map +1 -1
  57. package/dist/module/features/voice/recording/model/VoiceRecordWithTranscript.model.js +95 -0
  58. package/dist/module/features/voice/recording/model/VoiceRecordWithTranscript.model.js.map +1 -0
  59. package/dist/module/features/voice/recording/model/VoiceTranscriptPanel.model.js +110 -0
  60. package/dist/module/features/voice/recording/model/VoiceTranscriptPanel.model.js.map +1 -0
  61. package/dist/module/features/voice/transcript.helpers.js +31 -0
  62. package/dist/module/features/voice/transcript.helpers.js.map +1 -0
  63. package/dist/module/features/voice/types.js +4 -6
  64. package/dist/module/features/voice/types.js.map +1 -1
  65. package/dist/typescript/commonjs/features/voice/__tests__/VoiceRecordWithTranscript.model.test.d.ts +2 -0
  66. package/dist/typescript/commonjs/features/voice/__tests__/VoiceRecordWithTranscript.model.test.d.ts.map +1 -0
  67. package/dist/typescript/commonjs/features/voice/__tests__/VoiceTranscriptPanel.model.test.d.ts +2 -0
  68. package/dist/typescript/commonjs/features/voice/__tests__/VoiceTranscriptPanel.model.test.d.ts.map +1 -0
  69. package/dist/typescript/commonjs/features/voice/constants.d.ts +34 -0
  70. package/dist/typescript/commonjs/features/voice/constants.d.ts.map +1 -1
  71. package/dist/typescript/commonjs/features/voice/helpers.d.ts +3 -0
  72. package/dist/typescript/commonjs/features/voice/helpers.d.ts.map +1 -1
  73. package/dist/typescript/commonjs/features/voice/index.d.ts +7 -0
  74. package/dist/typescript/commonjs/features/voice/index.d.ts.map +1 -1
  75. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptContent.d.ts +3 -1
  76. package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptContent.d.ts.map +1 -1
  77. package/dist/typescript/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.d.ts +2 -7
  78. package/dist/typescript/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.d.ts.map +1 -1
  79. package/dist/typescript/commonjs/features/voice/recording/components/VoiceRecordWithTranscript.d.ts +13 -0
  80. package/dist/typescript/commonjs/features/voice/recording/components/VoiceRecordWithTranscript.d.ts.map +1 -0
  81. package/dist/typescript/commonjs/features/voice/recording/components/VoiceTranscriptPanel.d.ts +11 -0
  82. package/dist/typescript/commonjs/features/voice/recording/components/VoiceTranscriptPanel.d.ts.map +1 -0
  83. package/dist/typescript/commonjs/features/voice/recording/components/VoiceWaveform.d.ts +8 -0
  84. package/dist/typescript/commonjs/features/voice/recording/components/VoiceWaveform.d.ts.map +1 -0
  85. package/dist/typescript/commonjs/features/voice/recording/hooks/useTranscriptPanelAnimation.d.ts +18 -0
  86. package/dist/typescript/commonjs/features/voice/recording/hooks/useTranscriptPanelAnimation.d.ts.map +1 -0
  87. package/dist/typescript/commonjs/features/voice/recording/hooks/useVoiceRecorder.d.ts.map +1 -1
  88. package/dist/typescript/commonjs/features/voice/recording/hooks/useVoiceWaveform.d.ts +7 -0
  89. package/dist/typescript/commonjs/features/voice/recording/hooks/useVoiceWaveform.d.ts.map +1 -0
  90. package/dist/typescript/commonjs/features/voice/recording/model/Recorder.model.d.ts +2 -0
  91. package/dist/typescript/commonjs/features/voice/recording/model/Recorder.model.d.ts.map +1 -1
  92. package/dist/typescript/commonjs/features/voice/recording/model/VoiceRecordWithTranscript.model.d.ts +16 -0
  93. package/dist/typescript/commonjs/features/voice/recording/model/VoiceRecordWithTranscript.model.d.ts.map +1 -0
  94. package/dist/typescript/commonjs/features/voice/recording/model/VoiceTranscriptPanel.model.d.ts +31 -0
  95. package/dist/typescript/commonjs/features/voice/recording/model/VoiceTranscriptPanel.model.d.ts.map +1 -0
  96. package/dist/typescript/commonjs/features/voice/transcript.helpers.d.ts +8 -0
  97. package/dist/typescript/commonjs/features/voice/transcript.helpers.d.ts.map +1 -0
  98. package/dist/typescript/commonjs/features/voice/types.d.ts +2 -5
  99. package/dist/typescript/commonjs/features/voice/types.d.ts.map +1 -1
  100. package/dist/typescript/module/features/voice/__tests__/VoiceRecordWithTranscript.model.test.d.ts +2 -0
  101. package/dist/typescript/module/features/voice/__tests__/VoiceRecordWithTranscript.model.test.d.ts.map +1 -0
  102. package/dist/typescript/module/features/voice/__tests__/VoiceTranscriptPanel.model.test.d.ts +2 -0
  103. package/dist/typescript/module/features/voice/__tests__/VoiceTranscriptPanel.model.test.d.ts.map +1 -0
  104. package/dist/typescript/module/features/voice/constants.d.ts +34 -0
  105. package/dist/typescript/module/features/voice/constants.d.ts.map +1 -1
  106. package/dist/typescript/module/features/voice/helpers.d.ts +3 -0
  107. package/dist/typescript/module/features/voice/helpers.d.ts.map +1 -1
  108. package/dist/typescript/module/features/voice/index.d.ts +7 -0
  109. package/dist/typescript/module/features/voice/index.d.ts.map +1 -1
  110. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptContent.d.ts +3 -1
  111. package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptContent.d.ts.map +1 -1
  112. package/dist/typescript/module/features/voice/playing/model/TranscriptionsDownloader.model.d.ts +2 -7
  113. package/dist/typescript/module/features/voice/playing/model/TranscriptionsDownloader.model.d.ts.map +1 -1
  114. package/dist/typescript/module/features/voice/recording/components/VoiceRecordWithTranscript.d.ts +13 -0
  115. package/dist/typescript/module/features/voice/recording/components/VoiceRecordWithTranscript.d.ts.map +1 -0
  116. package/dist/typescript/module/features/voice/recording/components/VoiceTranscriptPanel.d.ts +11 -0
  117. package/dist/typescript/module/features/voice/recording/components/VoiceTranscriptPanel.d.ts.map +1 -0
  118. package/dist/typescript/module/features/voice/recording/components/VoiceWaveform.d.ts +8 -0
  119. package/dist/typescript/module/features/voice/recording/components/VoiceWaveform.d.ts.map +1 -0
  120. package/dist/typescript/module/features/voice/recording/hooks/useTranscriptPanelAnimation.d.ts +18 -0
  121. package/dist/typescript/module/features/voice/recording/hooks/useTranscriptPanelAnimation.d.ts.map +1 -0
  122. package/dist/typescript/module/features/voice/recording/hooks/useVoiceRecorder.d.ts.map +1 -1
  123. package/dist/typescript/module/features/voice/recording/hooks/useVoiceWaveform.d.ts +7 -0
  124. package/dist/typescript/module/features/voice/recording/hooks/useVoiceWaveform.d.ts.map +1 -0
  125. package/dist/typescript/module/features/voice/recording/model/Recorder.model.d.ts +2 -0
  126. package/dist/typescript/module/features/voice/recording/model/Recorder.model.d.ts.map +1 -1
  127. package/dist/typescript/module/features/voice/recording/model/VoiceRecordWithTranscript.model.d.ts +16 -0
  128. package/dist/typescript/module/features/voice/recording/model/VoiceRecordWithTranscript.model.d.ts.map +1 -0
  129. package/dist/typescript/module/features/voice/recording/model/VoiceTranscriptPanel.model.d.ts +31 -0
  130. package/dist/typescript/module/features/voice/recording/model/VoiceTranscriptPanel.model.d.ts.map +1 -0
  131. package/dist/typescript/module/features/voice/transcript.helpers.d.ts +8 -0
  132. package/dist/typescript/module/features/voice/transcript.helpers.d.ts.map +1 -0
  133. package/dist/typescript/module/features/voice/types.d.ts +2 -5
  134. package/dist/typescript/module/features/voice/types.d.ts.map +1 -1
  135. package/package.json +1 -1
  136. package/src/features/voice/__tests__/VoiceRecordWithTranscript.model.test.ts +228 -0
  137. package/src/features/voice/__tests__/VoiceTranscriptPanel.model.test.ts +237 -0
  138. package/src/features/voice/constants.ts +43 -0
  139. package/src/features/voice/helpers.ts +85 -1
  140. package/src/features/voice/index.ts +7 -0
  141. package/src/features/voice/playing/components/VoiceTranscriptContent.tsx +27 -8
  142. package/src/features/voice/playing/model/TranscriptionsDownloader.model.ts +8 -30
  143. package/src/features/voice/recording/components/VoiceRecordWithTranscript.tsx +52 -0
  144. package/src/features/voice/recording/components/VoiceTranscriptPanel.tsx +293 -0
  145. package/src/features/voice/recording/components/VoiceWaveform.tsx +102 -0
  146. package/src/features/voice/recording/hooks/useTranscriptPanelAnimation.ts +49 -0
  147. package/src/features/voice/recording/hooks/useVoiceRecorder.ts +26 -3
  148. package/src/features/voice/recording/hooks/useVoiceWaveform.ts +46 -0
  149. package/src/features/voice/recording/model/Recorder.model.ts +3 -0
  150. package/src/features/voice/recording/model/VoiceRecordWithTranscript.model.ts +104 -0
  151. package/src/features/voice/recording/model/VoiceTranscriptPanel.model.ts +131 -0
  152. package/src/features/voice/transcript.helpers.ts +37 -0
  153. package/src/features/voice/types.ts +5 -6
  154. package/src/i18n/.generated/schema.json +6 -5
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.VoiceRecordWithTranscriptModel = void 0;
7
+ var _effector = require("effector");
8
+ var _constants = require("../../constants.js");
9
+ var _transcriptHelpers = require("../../transcript.helpers.js");
10
+ var _VoiceTranscriptPanelModel = require("./VoiceTranscriptPanel.model.js");
11
+ // Wires the existing recording flow to the transcript panel:
12
+ // recording starts → panel opens with the waveform; the recording is confirmed
13
+ // (upload kicks off) → panel shows the loader; the uploaded file's transcript
14
+ // arrives → panel shows the text. Deleting/discarding the record closes the panel.
15
+ class VoiceRecordWithTranscriptModel {
16
+ panel = new _VoiceTranscriptPanelModel.VoiceTranscriptPanelModel();
17
+ constructor({
18
+ recordModel,
19
+ getTranscript
20
+ }) {
21
+ this.record = recordModel;
22
+ this.resolveTranscriptFx = (0, _effector.createEffect)(async record => {
23
+ const upload = await record.audioUploadPromise;
24
+ if (!upload || !upload.id) throw new Error('Audio upload did not return a file id');
25
+ const {
26
+ text
27
+ } = await (0, _transcriptHelpers.fetchTranscriptWithRetry)(getTranscript, upload.id);
28
+ if (text === _constants.NO_AUDIO_BE_MESSAGE) throw new Error('Transcript is not available');
29
+ return text;
30
+ });
31
+ this.setupPanelLifecycle();
32
+ this.setupTranscriptPipeline();
33
+ }
34
+ setupPanelLifecycle() {
35
+ (0, _effector.sample)({
36
+ clock: this.record.recorderModel.$voiceRecordState,
37
+ filter: state => state === _constants.VoiceRecorderState.RECORDING,
38
+ target: this.panel.open
39
+ });
40
+ // startAudioUpload fires exactly when a recording was confirmed (the
41
+ // discard path never uploads), so it doubles as the panel's confirm clock.
42
+ (0, _effector.sample)({
43
+ clock: this.record.startAudioUpload,
44
+ target: this.panel.confirm
45
+ });
46
+ // The record resets as a side effect of a wrong answer (the attempt key
47
+ // rotates to a take with no recording). While the panel is handling its own
48
+ // dismissal — dimming a shown transcript, or waiting for one that is still
49
+ // loading — that incidental reset must not close it early; the panel owns
50
+ // the close.
51
+ (0, _effector.sample)({
52
+ clock: [this.record.reset, this.record.stop.done],
53
+ source: this.panel.$isHandlingDismissal,
54
+ filter: isHandlingDismissal => !isHandlingDismissal,
55
+ target: this.panel.discard
56
+ });
57
+ }
58
+ setupTranscriptPipeline() {
59
+ // A fetch result applies when the record it was fetched for is still the
60
+ // current one — late results from a discarded or re-recorded take are
61
+ // dropped. The exception is a pending dismissal: a wrong answer rotates
62
+ // $currentRecord away from the take it was fetched for, but that take's
63
+ // transcript is exactly the one the panel is waiting to show before it
64
+ // closes, so it must still apply.
65
+ const shouldApplyResult = ({
66
+ currentRecord,
67
+ isDismissPending
68
+ }, {
69
+ params
70
+ }) => isDismissPending || currentRecord === params;
71
+ const resultGuardSource = {
72
+ currentRecord: this.record.$currentRecord,
73
+ isDismissPending: this.panel.$isDismissPending
74
+ };
75
+ (0, _effector.sample)({
76
+ clock: this.record.$currentRecord.updates,
77
+ source: this.panel.$flags,
78
+ filter: (flags, record) => flags.isProcessing && Boolean(record?.audioUploadPromise),
79
+ fn: (_, record) => record,
80
+ target: this.resolveTranscriptFx
81
+ });
82
+ (0, _effector.sample)({
83
+ clock: this.resolveTranscriptFx.done,
84
+ source: resultGuardSource,
85
+ filter: shouldApplyResult,
86
+ fn: (_, {
87
+ result
88
+ }) => result,
89
+ target: this.panel.complete
90
+ });
91
+ (0, _effector.sample)({
92
+ clock: this.resolveTranscriptFx.fail,
93
+ source: resultGuardSource,
94
+ filter: shouldApplyResult,
95
+ target: this.panel.fail
96
+ });
97
+ }
98
+ }
99
+ exports.VoiceRecordWithTranscriptModel = VoiceRecordWithTranscriptModel;
100
+ //# sourceMappingURL=VoiceRecordWithTranscript.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_effector","require","_constants","_transcriptHelpers","_VoiceTranscriptPanelModel","VoiceRecordWithTranscriptModel","panel","VoiceTranscriptPanelModel","constructor","recordModel","getTranscript","record","resolveTranscriptFx","createEffect","upload","audioUploadPromise","id","Error","text","fetchTranscriptWithRetry","NO_AUDIO_BE_MESSAGE","setupPanelLifecycle","setupTranscriptPipeline","sample","clock","recorderModel","$voiceRecordState","filter","state","VoiceRecorderState","RECORDING","target","open","startAudioUpload","confirm","reset","stop","done","source","$isHandlingDismissal","isHandlingDismissal","discard","shouldApplyResult","currentRecord","isDismissPending","params","resultGuardSource","$currentRecord","$isDismissPending","updates","$flags","flags","isProcessing","Boolean","fn","_","result","complete","fail","exports"],"sourceRoot":"../../../../../../src","sources":["features/voice/recording/model/VoiceRecordWithTranscript.model.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.VoiceTranscriptPanelModel = void 0;
7
+ var _effector = require("effector");
8
+ var _patronum = require("patronum");
9
+ var _constants = require("../../constants.js");
10
+ var _DropdownModel = require("../../playing/model/Dropdown.model.js");
11
+ // Phase machine for the recording-flow panel: open → RECORDING (waveform),
12
+ // confirm → PROCESSING (loader), complete/fail → DONE (transcript text).
13
+ // The transcript shows inside a collapsible dropdown (same UX as the playing
14
+ // side): collapsed to a short preview by default, expandable via the caret.
15
+ // Transcript fetching itself is wired externally
16
+ // (see VoiceRecordWithTranscriptModel).
17
+ class VoiceTranscriptPanelModel {
18
+ reset = (0, _effector.createEvent)();
19
+ dropdown = new _DropdownModel.DropdownModel();
20
+ open = (0, _effector.createEvent)();
21
+ confirm = (0, _effector.createEvent)();
22
+ complete = (0, _effector.createEvent)();
23
+ fail = (0, _effector.createEvent)();
24
+ discard = (0, _effector.createEvent)();
25
+ // Ask the panel to dismiss itself gracefully — dim the transcript, linger,
26
+ // then close (vs. discard, which closes immediately). Wired to a wrong answer
27
+ // by the consumer; the panel itself stays domain-agnostic and owns the timing.
28
+ requestDismiss = (0, _effector.createEvent)();
29
+ $phase = (0, _effector.createStore)(null);
30
+ $transcript = (0, _effector.createStore)('');
31
+ $hasError = (0, _effector.createStore)(false);
32
+ $isDimmed = (0, _effector.createStore)(false);
33
+ // A dismissal asked for while the transcript is still loading: there is
34
+ // nothing to dim yet, so we remember it and run the dismissal once the
35
+ // transcript resolves into the DONE phase.
36
+ $isDismissPending = (0, _effector.createStore)(false);
37
+
38
+ // True while the panel owns its own dismissal — either already dimming a
39
+ // shown transcript, or waiting for an in-flight transcript before it can.
40
+ // The consumer reads this so an incidental record reset can't close the
41
+ // panel out from under a dismissal in progress.
42
+ $isHandlingDismissal = (0, _effector.combine)(this.$isDimmed, this.$isDismissPending, (isDimmed, isDismissPending) => isDimmed || isDismissPending);
43
+ $flags = this.$phase.map(phase => ({
44
+ isOpen: phase !== null,
45
+ isRecording: phase === _constants.VoicePanelPhase.RECORDING,
46
+ isProcessing: phase === _constants.VoicePanelPhase.PROCESSING,
47
+ isDone: phase === _constants.VoicePanelPhase.DONE
48
+ }));
49
+ constructor() {
50
+ this.setupPhaseTransitions();
51
+ this.setupDelayedDismissal();
52
+ }
53
+
54
+ // The event passes through only while the panel is in the given phase —
55
+ // e.g. a transcript that arrives after a discard must not reopen the panel
56
+ allowInPhase(clock, phase) {
57
+ return (0, _effector.sample)({
58
+ clock,
59
+ source: this.$phase,
60
+ filter: currentPhase => currentPhase === phase,
61
+ fn: (_, payload) => payload
62
+ });
63
+ }
64
+ setupPhaseTransitions() {
65
+ const confirmed = this.allowInPhase(this.confirm, _constants.VoicePanelPhase.RECORDING);
66
+ const completed = this.allowInPhase(this.complete, _constants.VoicePanelPhase.PROCESSING);
67
+ const failed = this.allowInPhase(this.fail, _constants.VoicePanelPhase.PROCESSING);
68
+ this.$phase.on(this.open, () => _constants.VoicePanelPhase.RECORDING).on(confirmed, () => _constants.VoicePanelPhase.PROCESSING).on(completed, () => _constants.VoicePanelPhase.DONE).on(failed, () => _constants.VoicePanelPhase.DONE).reset(this.reset);
69
+ this.$transcript.on(completed, (_, transcript) => transcript).reset(this.reset);
70
+ this.$hasError.on(failed, () => true).reset(this.reset);
71
+ (0, _effector.sample)({
72
+ clock: this.discard,
73
+ target: this.reset
74
+ });
75
+ (0, _effector.sample)({
76
+ clock: this.reset,
77
+ target: this.dropdown.reset
78
+ });
79
+ }
80
+ setupDelayedDismissal() {
81
+ const beginDismissal = (0, _effector.createEvent)();
82
+
83
+ // Transcript already shown → dim and dismiss right away.
84
+ const dismissWhileDone = this.allowInPhase(this.requestDismiss, _constants.VoicePanelPhase.DONE);
85
+
86
+ // Transcript still loading → there is nothing to dim, so defer the request.
87
+ const dismissWhileProcessing = this.allowInPhase(this.requestDismiss, _constants.VoicePanelPhase.PROCESSING);
88
+ this.$isDismissPending.on(dismissWhileProcessing, () => true).reset([this.reset, this.open]);
89
+
90
+ // A deferred request fires the moment the transcript resolves into DONE.
91
+ const deferredDismiss = (0, _effector.sample)({
92
+ clock: this.$phase.updates,
93
+ source: this.$isDismissPending,
94
+ filter: (isDismissPending, phase) => isDismissPending && phase === _constants.VoicePanelPhase.DONE,
95
+ fn: () => undefined
96
+ });
97
+ (0, _effector.sample)({
98
+ clock: [dismissWhileDone, deferredDismiss],
99
+ target: beginDismissal
100
+ });
101
+ this.$isDimmed.on(beginDismissal, () => true).reset([this.reset, this.open]);
102
+ const dismissTimeout = (0, _patronum.delay)({
103
+ source: beginDismissal,
104
+ timeout: _constants.VOICE_TRANSCRIPT_PANEL.WRONG_ANSWER_DISMISS_DELAY_MS
105
+ });
106
+ // The phase guard drops the timer if the panel was already discarded or a
107
+ // new recording started during the linger window
108
+ (0, _effector.sample)({
109
+ clock: this.allowInPhase(dismissTimeout, _constants.VoicePanelPhase.DONE),
110
+ target: this.reset
111
+ });
112
+ }
113
+ }
114
+ exports.VoiceTranscriptPanelModel = VoiceTranscriptPanelModel;
115
+ //# sourceMappingURL=VoiceTranscriptPanel.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_effector","require","_patronum","_constants","_DropdownModel","VoiceTranscriptPanelModel","reset","createEvent","dropdown","DropdownModel","open","confirm","complete","fail","discard","requestDismiss","$phase","createStore","$transcript","$hasError","$isDimmed","$isDismissPending","$isHandlingDismissal","combine","isDimmed","isDismissPending","$flags","map","phase","isOpen","isRecording","VoicePanelPhase","RECORDING","isProcessing","PROCESSING","isDone","DONE","constructor","setupPhaseTransitions","setupDelayedDismissal","allowInPhase","clock","sample","source","filter","currentPhase","fn","_","payload","confirmed","completed","failed","on","transcript","target","beginDismissal","dismissWhileDone","dismissWhileProcessing","deferredDismiss","updates","undefined","dismissTimeout","delay","timeout","VOICE_TRANSCRIPT_PANEL","WRONG_ANSWER_DISMISS_DELAY_MS","exports"],"sourceRoot":"../../../../../../src","sources":["features/voice/recording/model/VoiceTranscriptPanel.model.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.fetchTranscriptWithRetry = void 0;
7
+ var _constants = require("./constants.js");
8
+ const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
9
+
10
+ // Polls the transcript endpoint until the BE finishes processing. FAILED and
11
+ // exhausted retries both resolve to the NO_AUDIO sentinel — same contract the
12
+ // playing side relies on.
13
+ const fetchTranscriptWithRetry = async (getTranscript, audioFileId) => {
14
+ for (let attempt = 0; attempt < _constants.TRANSCRIPT_MAX_RETRIES; attempt++) {
15
+ const response = await getTranscript(audioFileId);
16
+ if (response.status === _constants.TranscriptionStatus.COMPLETED) {
17
+ return {
18
+ text: response.text,
19
+ language: response.language
20
+ };
21
+ }
22
+ if (response.status === _constants.TranscriptionStatus.FAILED) {
23
+ return {
24
+ text: _constants.NO_AUDIO_BE_MESSAGE
25
+ };
26
+ }
27
+ if (attempt < _constants.TRANSCRIPT_MAX_RETRIES - 1) {
28
+ await delay(_constants.TRANSCRIPT_RETRY_INTERVAL_MS);
29
+ }
30
+ }
31
+ return {
32
+ text: _constants.NO_AUDIO_BE_MESSAGE
33
+ };
34
+ };
35
+ exports.fetchTranscriptWithRetry = fetchTranscriptWithRetry;
36
+ //# sourceMappingURL=transcript.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_constants","require","delay","ms","Promise","resolve","setTimeout","fetchTranscriptWithRetry","getTranscript","audioFileId","attempt","TRANSCRIPT_MAX_RETRIES","response","status","TranscriptionStatus","COMPLETED","text","language","FAILED","NO_AUDIO_BE_MESSAGE","TRANSCRIPT_RETRY_INTERVAL_MS","exports"],"sourceRoot":"../../../../src","sources":["features/voice/transcript.helpers.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAWA,MAAMC,KAAK,GAAIC,EAAU,IAAK,IAAIC,OAAO,CAAEC,OAAO,IAAKC,UAAU,CAACD,OAAO,EAAEF,EAAE,CAAC,CAAC;;AAE/E;AACA;AACA;AACO,MAAMI,wBAAwB,GAAG,MAAAA,CACtCC,aAAqC,EACrCC,WAAmB,KACW;EAC9B,KAAK,IAAIC,OAAO,GAAG,CAAC,EAAEA,OAAO,GAAGC,iCAAsB,EAAED,OAAO,EAAE,EAAE;IACjE,MAAME,QAAQ,GAAG,MAAMJ,aAAa,CAACC,WAAW,CAAC;IAEjD,IAAIG,QAAQ,CAACC,MAAM,KAAKC,8BAAmB,CAACC,SAAS,EAAE;MACrD,OAAO;QAAEC,IAAI,EAAEJ,QAAQ,CAACI,IAAI;QAAEC,QAAQ,EAAEL,QAAQ,CAACK;MAAS,CAAC;IAC7D;IAEA,IAAIL,QAAQ,CAACC,MAAM,KAAKC,8BAAmB,CAACI,MAAM,EAAE;MAClD,OAAO;QAAEF,IAAI,EAAEG;MAAoB,CAAC;IACtC;IAEA,IAAIT,OAAO,GAAGC,iCAAsB,GAAG,CAAC,EAAE;MACxC,MAAMT,KAAK,CAACkB,uCAA4B,CAAC;IAC3C;EACF;EACA,OAAO;IAAEJ,IAAI,EAAEG;EAAoB,CAAC;AACtC,CAAC;AAAAE,OAAA,CAAAd,wBAAA,GAAAA,wBAAA","ignoreList":[]}
@@ -3,13 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.VoiceTranscriptionVariant = exports.TranscriptionStatus = exports.RecordButtonVariant = void 0;
7
- let TranscriptionStatus = exports.TranscriptionStatus = /*#__PURE__*/function (TranscriptionStatus) {
8
- TranscriptionStatus["PENDING"] = "pending";
9
- TranscriptionStatus["COMPLETED"] = "completed";
10
- TranscriptionStatus["FAILED"] = "failed";
11
- return TranscriptionStatus;
12
- }({});
6
+ exports.RecordButtonVariant = void 0;
7
+ Object.defineProperty(exports, "TranscriptionStatus", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _constants.TranscriptionStatus;
11
+ }
12
+ });
13
+ exports.VoiceTranscriptionVariant = void 0;
14
+ var _constants = require("./constants.js");
15
+ // The enum moved to constants.ts (jest-safe import chain for transcript helpers);
16
+ // re-exported here to keep the public surface unchanged.
13
17
  let RecordButtonVariant = exports.RecordButtonVariant = /*#__PURE__*/function (RecordButtonVariant) {
14
18
  RecordButtonVariant["DEFAULT"] = "default";
15
19
  RecordButtonVariant["ADVANCED"] = "advanced";
@@ -1 +1 @@
1
- {"version":3,"names":["TranscriptionStatus","exports","RecordButtonVariant","VoiceTranscriptionVariant"],"sourceRoot":"../../../../src","sources":["features/voice/types.ts"],"mappings":";;;;;;IA8DYA,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,0BAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAA,OAAnBA,mBAAmB;AAAA;AAAA,IAqCnBE,mBAAmB,GAAAD,OAAA,CAAAC,mBAAA,0BAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAA,OAAnBA,mBAAmB;AAAA;AAAA,IAKnBC,yBAAyB,GAAAF,OAAA,CAAAE,yBAAA,0BAAzBA,yBAAyB;EAAzBA,yBAAyB;EAAzBA,yBAAyB;EAAA,OAAzBA,yBAAyB;AAAA","ignoreList":[]}
1
+ {"version":3,"names":["_constants","require","RecordButtonVariant","exports","VoiceTranscriptionVariant"],"sourceRoot":"../../../../src","sources":["features/voice/types.ts"],"mappings":";;;;;;;;;;;;;AACA,IAAAA,UAAA,GAAAC,OAAA;AAKA;AACA;AAAA,IA2FYC,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,0BAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAA,OAAnBA,mBAAmB;AAAA;AAAA,IAKnBE,yBAAyB,GAAAD,OAAA,CAAAC,yBAAA,0BAAzBA,yBAAyB;EAAzBA,yBAAyB;EAAzBA,yBAAyB;EAAA,OAAzBA,yBAAyB;AAAA","ignoreList":[]}
@@ -22,10 +22,51 @@ export const DROPDOWN_MAX_CONTENT_HEIGHT = 330;
22
22
  export const TRANSCRIPT_RETRY_INTERVAL_MS = 4000;
23
23
  export const TRANSCRIPT_MAX_RETRIES = 15;
24
24
  export const NO_AUDIO_BE_MESSAGE = 'No audio';
25
+ export let TranscriptionStatus = /*#__PURE__*/function (TranscriptionStatus) {
26
+ TranscriptionStatus["PENDING"] = "pending";
27
+ TranscriptionStatus["COMPLETED"] = "completed";
28
+ TranscriptionStatus["FAILED"] = "failed";
29
+ return TranscriptionStatus;
30
+ }({});
25
31
 
26
32
  //todo: remove native shadows from rn-ui and set from WEB for both platforms
27
33
  export const VOICE_RECORD_SHADOWS = {
28
34
  default: '0 1px 3px 0 rgba(51, 51, 51, 0.10), 0 0 1px 0 rgba(51, 51, 51, 0.40)',
29
35
  advanced: '0 0 1px 0 rgba(51, 51, 51, 0.20), 0 3px 10px 0 rgba(51, 51, 51, 0.16)'
30
36
  };
37
+ export let VoicePanelPhase = /*#__PURE__*/function (VoicePanelPhase) {
38
+ VoicePanelPhase["RECORDING"] = "recording";
39
+ VoicePanelPhase["PROCESSING"] = "processing";
40
+ VoicePanelPhase["DONE"] = "done";
41
+ return VoicePanelPhase;
42
+ }({});
43
+ export const VOICE_WAVEFORM = {
44
+ BAR_WIDTH: 3,
45
+ BAR_GAP: 3,
46
+ MIN_BAR_HEIGHT: 2,
47
+ HEIGHT: 40,
48
+ AMPLITUDE_PADDING: 12,
49
+ MIN_LEVEL: 0.04,
50
+ MIN_BARS: 16,
51
+ BUFFER_SIZE: 120,
52
+ SAMPLE_INTERVAL_MS: 80,
53
+ FADE_RATIO: 0.22,
54
+ METERING_FLOOR_DB: -60,
55
+ // Low-pass factor for bar levels: 1 = raw values, lower = smoother flow
56
+ LEVEL_SMOOTHING: 0.55
57
+ };
58
+
59
+ // expo-audio polls recorder status every 500ms by default — too coarse for a
60
+ // live waveform. The same cadence drives the web Audio API meter.
61
+ export const METERING_UPDATE_INTERVAL_MS = 100;
62
+ export const WEB_METERING_FFT_SIZE = 1024;
63
+ export const VOICE_TRANSCRIPT_PANEL = {
64
+ WIDTH: 240,
65
+ WIDTH_DONE: 360,
66
+ TRANSCRIPT_MAX_HEIGHT: 200,
67
+ SCROLLBAR_WIDTH: 8,
68
+ // After a wrong answer the transcript fades out, lingers, then auto-dismisses
69
+ WRONG_ANSWER_DISMISS_DELAY_MS: 5000,
70
+ DIMMED_OPACITY: 0.4
71
+ };
31
72
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VOICE_RECORDER_CONTAINER_SIZES","COLLAPSED","default","advanced","EXPANDED","VOICE_RECORDER_MAX_DURATION_MS","VOICE_RECORDER_MIN_DURATION_MS","VoiceRecorderState","DROPDOWN_MAX_CONTENT_HEIGHT","TRANSCRIPT_RETRY_INTERVAL_MS","TRANSCRIPT_MAX_RETRIES","NO_AUDIO_BE_MESSAGE","VOICE_RECORD_SHADOWS"],"sourceRoot":"../../../../src","sources":["features/voice/constants.ts"],"mappings":";;AAAA,OAAO,MAAMA,8BAA8B,GAAG;EAC5CC,SAAS,EAAE;IACTC,OAAO,EAAE,EAAE;IACXC,QAAQ,EAAE;EACZ,CAAC;EACDC,QAAQ,EAAE;IACRF,OAAO,EAAE,GAAG;IACZC,QAAQ,EAAE;EACZ;AACF,CAAC;AACD,OAAO,MAAME,8BAA8B,GAAG,KAAK,EAAC;AACpD,OAAO,MAAMC,8BAA8B,GAAG,GAAG;AACjD,WAAYC,kBAAkB,0BAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAA,OAAlBA,kBAAkB;AAAA;AAK9B,OAAO,MAAMC,2BAA2B,GAAG,GAAG;AAC9C,OAAO,MAAMC,4BAA4B,GAAG,IAAI;AAChD,OAAO,MAAMC,sBAAsB,GAAG,EAAE;AACxC,OAAO,MAAMC,mBAAmB,GAAG,UAAU;;AAE7C;AACA,OAAO,MAAMC,oBAAoB,GAAG;EAClCV,OAAO,EAAE,sEAAsE;EAC/EC,QAAQ,EAAE;AACZ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["VOICE_RECORDER_CONTAINER_SIZES","COLLAPSED","default","advanced","EXPANDED","VOICE_RECORDER_MAX_DURATION_MS","VOICE_RECORDER_MIN_DURATION_MS","VoiceRecorderState","DROPDOWN_MAX_CONTENT_HEIGHT","TRANSCRIPT_RETRY_INTERVAL_MS","TRANSCRIPT_MAX_RETRIES","NO_AUDIO_BE_MESSAGE","TranscriptionStatus","VOICE_RECORD_SHADOWS","VoicePanelPhase","VOICE_WAVEFORM","BAR_WIDTH","BAR_GAP","MIN_BAR_HEIGHT","HEIGHT","AMPLITUDE_PADDING","MIN_LEVEL","MIN_BARS","BUFFER_SIZE","SAMPLE_INTERVAL_MS","FADE_RATIO","METERING_FLOOR_DB","LEVEL_SMOOTHING","METERING_UPDATE_INTERVAL_MS","WEB_METERING_FFT_SIZE","VOICE_TRANSCRIPT_PANEL","WIDTH","WIDTH_DONE","TRANSCRIPT_MAX_HEIGHT","SCROLLBAR_WIDTH","WRONG_ANSWER_DISMISS_DELAY_MS","DIMMED_OPACITY"],"sourceRoot":"../../../../src","sources":["features/voice/constants.ts"],"mappings":";;AAAA,OAAO,MAAMA,8BAA8B,GAAG;EAC5CC,SAAS,EAAE;IACTC,OAAO,EAAE,EAAE;IACXC,QAAQ,EAAE;EACZ,CAAC;EACDC,QAAQ,EAAE;IACRF,OAAO,EAAE,GAAG;IACZC,QAAQ,EAAE;EACZ;AACF,CAAC;AACD,OAAO,MAAME,8BAA8B,GAAG,KAAK,EAAC;AACpD,OAAO,MAAMC,8BAA8B,GAAG,GAAG;AACjD,WAAYC,kBAAkB,0BAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAlBA,kBAAkB,CAAlBA,kBAAkB;EAAA,OAAlBA,kBAAkB;AAAA;AAK9B,OAAO,MAAMC,2BAA2B,GAAG,GAAG;AAC9C,OAAO,MAAMC,4BAA4B,GAAG,IAAI;AAChD,OAAO,MAAMC,sBAAsB,GAAG,EAAE;AACxC,OAAO,MAAMC,mBAAmB,GAAG,UAAU;AAE7C,WAAYC,mBAAmB,0BAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAA,OAAnBA,mBAAmB;AAAA;;AAM/B;AACA,OAAO,MAAMC,oBAAoB,GAAG;EAClCX,OAAO,EAAE,sEAAsE;EAC/EC,QAAQ,EAAE;AACZ,CAAC;AAED,WAAYW,eAAe,0BAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA;AAM3B,OAAO,MAAMC,cAAc,GAAG;EAC5BC,SAAS,EAAE,CAAC;EACZC,OAAO,EAAE,CAAC;EACVC,cAAc,EAAE,CAAC;EACjBC,MAAM,EAAE,EAAE;EACVC,iBAAiB,EAAE,EAAE;EACrBC,SAAS,EAAE,IAAI;EACfC,QAAQ,EAAE,EAAE;EACZC,WAAW,EAAE,GAAG;EAChBC,kBAAkB,EAAE,EAAE;EACtBC,UAAU,EAAE,IAAI;EAChBC,iBAAiB,EAAE,CAAC,EAAE;EACtB;EACAC,eAAe,EAAE;AACnB,CAAU;;AAEV;AACA;AACA,OAAO,MAAMC,2BAA2B,GAAG,GAAG;AAC9C,OAAO,MAAMC,qBAAqB,GAAG,IAAI;AAEzC,OAAO,MAAMC,sBAAsB,GAAG;EACpCC,KAAK,EAAE,GAAG;EACVC,UAAU,EAAE,GAAG;EACfC,qBAAqB,EAAE,GAAG;EAC1BC,eAAe,EAAE,CAAC;EAClB;EACAC,6BAA6B,EAAE,IAAI;EACnCC,cAAc,EAAE;AAClB,CAAU","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  import { IS_MOBILE, IS_WEB } from '@magmamath/react-native-ui';
4
4
  import { createAudioPlayer, getRecordingPermissionsAsync, requestRecordingPermissionsAsync } from 'expo-audio';
5
5
  import * as FileSystem from 'expo-file-system';
6
- import { VOICE_RECORDER_MAX_DURATION_MS } from "./constants.js";
6
+ import { METERING_UPDATE_INTERVAL_MS, VOICE_RECORDER_MAX_DURATION_MS, VOICE_WAVEFORM, WEB_METERING_FFT_SIZE } from "./constants.js";
7
7
  import { PlayerState } from "./playing/model/index.js";
8
8
  import { AudioStatus } from "../chatbot/index.js";
9
9
  export const formatDuration = ms => {
@@ -12,6 +12,70 @@ export const formatDuration = ms => {
12
12
  const seconds = totalSeconds % 60;
13
13
  return `${minutes}:${seconds.toString().padStart(2, '0')}`;
14
14
  };
15
+
16
+ // Maps a metering value (dBFS, roughly -160..0) to a 0..1 bar level.
17
+ // Anything at or below the floor reads as silence (MIN_LEVEL dots).
18
+ export const normalizeMetering = metering => {
19
+ if (metering === null || metering === undefined || Number.isNaN(metering)) {
20
+ return VOICE_WAVEFORM.MIN_LEVEL;
21
+ }
22
+ const range = -VOICE_WAVEFORM.METERING_FLOOR_DB;
23
+ const ratio = (metering - VOICE_WAVEFORM.METERING_FLOOR_DB) / range;
24
+ return Math.max(VOICE_WAVEFORM.MIN_LEVEL, Math.min(1, ratio));
25
+ };
26
+ // expo-audio's web AudioRecorder keeps its MediaRecorder on a public (but
27
+ // untyped) field. Reach for it defensively — if the internals change after an
28
+ // upgrade, we fall back to our own getUserMedia stream.
29
+ const hasWebMediaRecorder = value => {
30
+ if (typeof value !== 'object' || value === null) return false;
31
+ if (typeof MediaRecorder === 'undefined') return false;
32
+ return 'mediaRecorder' in value && value.mediaRecorder instanceof MediaRecorder;
33
+ };
34
+ const computeStreamDecibels = (analyser, samples) => {
35
+ analyser.getFloatTimeDomainData(samples);
36
+ const sumOfSquares = samples.reduce((acc, value) => acc + value * value, 0);
37
+ const rms = Math.sqrt(sumOfSquares / samples.length);
38
+ return rms > 0 ? 20 * Math.log10(rms) : VOICE_WAVEFORM.METERING_FLOOR_DB;
39
+ };
40
+
41
+ // expo-audio does not implement metering on web, so we measure the input level
42
+ // ourselves with the Web Audio API. Prefers the recorder's own MediaStream;
43
+ // falls back to a dedicated getUserMedia capture (permission is already
44
+ // granted at this point because recording is in progress).
45
+ export const createWebMeteringMonitor = (recorder, onMetering) => {
46
+ if (!IS_WEB || typeof AudioContext === 'undefined') return () => {};
47
+ let isDisposed = false;
48
+ let context = null;
49
+ let ownedStream = null;
50
+ let intervalId = null;
51
+ const start = async () => {
52
+ const recorderStream = hasWebMediaRecorder(recorder) ? recorder.mediaRecorder.stream : null;
53
+ const stream = recorderStream ?? (await navigator.mediaDevices.getUserMedia({
54
+ audio: true
55
+ }));
56
+ if (isDisposed) {
57
+ if (!recorderStream) stream.getTracks().forEach(track => track.stop());
58
+ return;
59
+ }
60
+ if (!recorderStream) ownedStream = stream;
61
+ context = new AudioContext();
62
+ const analyser = context.createAnalyser();
63
+ analyser.fftSize = WEB_METERING_FFT_SIZE;
64
+ context.createMediaStreamSource(stream).connect(analyser);
65
+ const samples = new Float32Array(analyser.fftSize);
66
+ intervalId = setInterval(() => {
67
+ onMetering(computeStreamDecibels(analyser, samples));
68
+ }, METERING_UPDATE_INTERVAL_MS);
69
+ };
70
+ start().catch(() => onMetering(null));
71
+ return () => {
72
+ isDisposed = true;
73
+ if (intervalId) clearInterval(intervalId);
74
+ ownedStream?.getTracks().forEach(track => track.stop());
75
+ context?.close().catch(() => {});
76
+ onMetering(null);
77
+ };
78
+ };
15
79
  export const ensureRecordingPermissions = async () => {
16
80
  const {
17
81
  status
@@ -1 +1 @@
1
- {"version":3,"names":["IS_MOBILE","IS_WEB","createAudioPlayer","getRecordingPermissionsAsync","requestRecordingPermissionsAsync","FileSystem","VOICE_RECORDER_MAX_DURATION_MS","PlayerState","AudioStatus","formatDuration","ms","totalSeconds","Math","floor","minutes","seconds","toString","padStart","ensureRecordingPermissions","status","granted","getAvailableInputsWeb","navigator","mediaDevices","enumerateDevices","devices","filter","d","kind","getAvailableInputs","recorder","addAudioInputsListenerWeb","callback","addEventListener","handleDeviceChange","removeEventListener","getAudioDurationMs","fileUri","externalPlayer","Promise","resolve","undefined","player","isInternalPlayer","replace","reject","subscription","addListener","duration","remove","durationMs","round","setTimeout","Error","generateAudioFormData","audioFileUri","fileName","formData","FormData","min","response","fetch","blob","filename","type","append","file","uri","name","uploadAudioFileRequestGenerator","audioFileFormData","api","controller","AbortController","uploadAudio","uploadAudioFile","signal","downloadAudioMobile","audioFileId","config","url","startsWith","baseURL","cacheDirectory","authHeader","headers","Authorization","authorization","downloadResult","downloadAsync","fileType","downloadAudioWeb","data","Blob","URL","createObjectURL","downloadAudioFileRequestGenerator","downloadAudio","downloadAudioFile","getActiveAttempt","attemptOffset","attemptsCount","getAudioStatus","state","PLAYING","PAUSED","is400Error","error","httpError"],"sourceRoot":"../../../../src","sources":["features/voice/helpers.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["IS_MOBILE","IS_WEB","createAudioPlayer","getRecordingPermissionsAsync","requestRecordingPermissionsAsync","FileSystem","METERING_UPDATE_INTERVAL_MS","VOICE_RECORDER_MAX_DURATION_MS","VOICE_WAVEFORM","WEB_METERING_FFT_SIZE","PlayerState","AudioStatus","formatDuration","ms","totalSeconds","Math","floor","minutes","seconds","toString","padStart","normalizeMetering","metering","undefined","Number","isNaN","MIN_LEVEL","range","METERING_FLOOR_DB","ratio","max","min","hasWebMediaRecorder","value","MediaRecorder","mediaRecorder","computeStreamDecibels","analyser","samples","getFloatTimeDomainData","sumOfSquares","reduce","acc","rms","sqrt","length","log10","createWebMeteringMonitor","recorder","onMetering","AudioContext","isDisposed","context","ownedStream","intervalId","start","recorderStream","stream","navigator","mediaDevices","getUserMedia","audio","getTracks","forEach","track","stop","createAnalyser","fftSize","createMediaStreamSource","connect","Float32Array","setInterval","catch","clearInterval","close","ensureRecordingPermissions","status","granted","getAvailableInputsWeb","enumerateDevices","devices","filter","d","kind","getAvailableInputs","addAudioInputsListenerWeb","callback","addEventListener","handleDeviceChange","removeEventListener","getAudioDurationMs","fileUri","externalPlayer","Promise","resolve","player","isInternalPlayer","replace","reject","subscription","addListener","duration","remove","durationMs","round","setTimeout","Error","generateAudioFormData","audioFileUri","fileName","formData","FormData","response","fetch","blob","filename","type","append","file","uri","name","uploadAudioFileRequestGenerator","audioFileFormData","api","controller","AbortController","uploadAudio","uploadAudioFile","signal","downloadAudioMobile","audioFileId","config","url","startsWith","baseURL","cacheDirectory","authHeader","headers","Authorization","authorization","downloadResult","downloadAsync","fileType","downloadAudioWeb","data","Blob","URL","createObjectURL","downloadAudioFileRequestGenerator","downloadAudio","downloadAudioFile","getActiveAttempt","attemptOffset","attemptsCount","getAudioStatus","state","PLAYING","PAUSED","is400Error","error","httpError"],"sourceRoot":"../../../../src","sources":["features/voice/helpers.ts"],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,16 @@
1
1
  "use strict";
2
2
 
3
3
  export * from "./recording/components/VoiceRecord.js";
4
+ export * from "./recording/components/VoiceRecordWithTranscript.js";
5
+ export * from "./recording/components/VoiceWaveform.js";
6
+ export * from "./recording/components/VoiceTranscriptPanel.js";
7
+ export * from "./recording/hooks/useVoiceWaveform.js";
4
8
  export * from "./recording/model/VoiceRecord.model.js";
9
+ export * from "./recording/model/VoiceRecordWithTranscript.model.js";
10
+ export * from "./recording/model/VoiceTranscriptPanel.model.js";
5
11
  export * from "./recording/modal/VoiceRecordDeleteModal.js";
6
12
  export * from "./recording/modal/VoiceRecordUndoModal.js";
13
+ export * from "./transcript.helpers.js";
7
14
  export * from "./playing/model/VoicePlayer.model.js";
8
15
  export * from "./playing/components/VoiceTranscription.js";
9
16
  export * from "./playing/hooks/useVoicePlayerLifecycle.js";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["features/voice/index.ts"],"mappings":";;AAAA,cAAc,uCAAoC;AAClD,cAAc,wCAAqC;AACnD,cAAc,6CAA0C;AACxD,cAAc,2CAAwC;AAEtD,cAAc,sCAAmC;AACjD,cAAc,4CAAyC;AACvD,cAAc,4CAAyC;AAEvD,cAAc,mCAAgC;AAC9C,cAAc,gBAAa;AAC3B,cAAc,YAAS","ignoreList":[]}
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["features/voice/index.ts"],"mappings":";;AAAA,cAAc,uCAAoC;AAClD,cAAc,qDAAkD;AAChE,cAAc,yCAAsC;AACpD,cAAc,gDAA6C;AAC3D,cAAc,uCAAoC;AAClD,cAAc,wCAAqC;AACnD,cAAc,sDAAmD;AACjE,cAAc,iDAA8C;AAC5D,cAAc,6CAA0C;AACxD,cAAc,2CAAwC;AACtD,cAAc,yBAAsB;AAEpC,cAAc,sCAAmC;AACjD,cAAc,4CAAyC;AACvD,cAAc,4CAAyC;AAEvD,cAAc,mCAAgC;AAC9C,cAAc,gBAAa;AAC3B,cAAc,YAAS","ignoreList":[]}
@@ -3,31 +3,42 @@
3
3
  import { COLORS, Loader, LoaderColor, LoaderSize, SPACING, Typography } from '@magmamath/react-native-ui';
4
4
  import React from 'react';
5
5
  import { StyleSheet, View } from 'react-native';
6
+ import Animated, { FadeIn } from 'react-native-reanimated';
7
+ import { VOICE_TRANSCRIPT_PANEL } from "../../constants.js";
6
8
  import { jsx as _jsx } from "react/jsx-runtime";
7
9
  export const VoiceTranscriptContent = ({
8
10
  text,
9
- isLoading
11
+ isLoading,
12
+ numberOfLines,
13
+ dimmed
10
14
  }) => {
11
15
  if (isLoading) {
12
16
  return /*#__PURE__*/_jsx(View, {
13
17
  style: styles.loaderContainer,
14
18
  children: /*#__PURE__*/_jsx(Loader, {
15
19
  size: LoaderSize.SMALL,
16
- color: LoaderColor.BLUE
20
+ color: LoaderColor.GRAY
17
21
  })
18
22
  });
19
23
  }
20
- return /*#__PURE__*/_jsx(Typography, {
21
- variant: "h8",
22
- style: styles.text,
23
- children: text
24
+ return /*#__PURE__*/_jsx(Animated.View, {
25
+ entering: FadeIn.duration(400),
26
+ children: /*#__PURE__*/_jsx(Typography, {
27
+ variant: "h8",
28
+ style: [styles.text, dimmed && styles.dimmed],
29
+ numberOfLines: numberOfLines,
30
+ children: text
31
+ })
24
32
  });
25
33
  };
26
34
  const styles = StyleSheet.create({
27
35
  text: {
28
- color: COLORS.NEUTRAL_7,
29
- paddingHorizontal: SPACING[200],
30
- paddingVertical: SPACING[200]
36
+ color: COLORS.NEUTRAL_9,
37
+ paddingVertical: SPACING[100],
38
+ marginRight: SPACING[200]
39
+ },
40
+ dimmed: {
41
+ opacity: VOICE_TRANSCRIPT_PANEL.DIMMED_OPACITY
31
42
  },
32
43
  loaderContainer: {
33
44
  justifyContent: 'center',
@@ -1 +1 @@
1
- {"version":3,"names":["COLORS","Loader","LoaderColor","LoaderSize","SPACING","Typography","React","StyleSheet","View","jsx","_jsx","VoiceTranscriptContent","text","isLoading","style","styles","loaderContainer","children","size","SMALL","color","BLUE","variant","create","NEUTRAL_7","paddingHorizontal","paddingVertical","justifyContent","alignItems"],"sourceRoot":"../../../../../../src","sources":["features/voice/playing/components/VoiceTranscriptContent.tsx"],"mappings":";;AAAA,SACEA,MAAM,EACNC,MAAM,EACNC,WAAW,EACXC,UAAU,EACVC,OAAO,EACPC,UAAU,QACL,4BAA4B;AACnC,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAO/C,OAAO,MAAMC,sBAAsB,GAAGA,CAAC;EAAEC,IAAI;EAAEC;AAAuC,CAAC,KAAK;EAC1F,IAAIA,SAAS,EAAE;IACb,oBACEH,IAAA,CAACF,IAAI;MAACM,KAAK,EAAEC,MAAM,CAACC,eAAgB;MAAAC,QAAA,eAClCP,IAAA,CAACT,MAAM;QAACiB,IAAI,EAAEf,UAAU,CAACgB,KAAM;QAACC,KAAK,EAAElB,WAAW,CAACmB;MAAK,CAAE;IAAC,CACvD,CAAC;EAEX;EAEA,oBACEX,IAAA,CAACL,UAAU;IAACiB,OAAO,EAAC,IAAI;IAACR,KAAK,EAAEC,MAAM,CAACH,IAAK;IAAAK,QAAA,EACzCL;EAAI,CACK,CAAC;AAEjB,CAAC;AAED,MAAMG,MAAM,GAAGR,UAAU,CAACgB,MAAM,CAAC;EAC/BX,IAAI,EAAE;IACJQ,KAAK,EAAEpB,MAAM,CAACwB,SAAS;IACvBC,iBAAiB,EAAErB,OAAO,CAAC,GAAG,CAAC;IAC/BsB,eAAe,EAAEtB,OAAO,CAAC,GAAG;EAC9B,CAAC;EACDY,eAAe,EAAE;IACfW,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBF,eAAe,EAAEtB,OAAO,CAAC,GAAG;EAC9B;AACF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["COLORS","Loader","LoaderColor","LoaderSize","SPACING","Typography","React","StyleSheet","View","Animated","FadeIn","VOICE_TRANSCRIPT_PANEL","jsx","_jsx","VoiceTranscriptContent","text","isLoading","numberOfLines","dimmed","style","styles","loaderContainer","children","size","SMALL","color","GRAY","entering","duration","variant","create","NEUTRAL_9","paddingVertical","marginRight","opacity","DIMMED_OPACITY","justifyContent","alignItems"],"sourceRoot":"../../../../../../src","sources":["features/voice/playing/components/VoiceTranscriptContent.tsx"],"mappings":";;AAAA,SACEA,MAAM,EACNC,MAAM,EACNC,WAAW,EACXC,UAAU,EACVC,OAAO,EACPC,UAAU,QACL,4BAA4B;AACnC,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,OAAOC,QAAQ,IAAIC,MAAM,QAAQ,yBAAyB;AAE1D,SAASC,sBAAsB,QAAQ,oBAAiB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AASxD,OAAO,MAAMC,sBAAsB,GAAGA,CAAC;EACrCC,IAAI;EACJC,SAAS;EACTC,aAAa;EACbC;AAC2B,CAAC,KAAK;EACjC,IAAIF,SAAS,EAAE;IACb,oBACEH,IAAA,CAACL,IAAI;MAACW,KAAK,EAAEC,MAAM,CAACC,eAAgB;MAAAC,QAAA,eAClCT,IAAA,CAACZ,MAAM;QAACsB,IAAI,EAAEpB,UAAU,CAACqB,KAAM;QAACC,KAAK,EAAEvB,WAAW,CAACwB;MAAK,CAAE;IAAC,CACvD,CAAC;EAEX;EAEA,oBACEb,IAAA,CAACJ,QAAQ,CAACD,IAAI;IAACmB,QAAQ,EAAEjB,MAAM,CAACkB,QAAQ,CAAC,GAAG,CAAE;IAAAN,QAAA,eAC5CT,IAAA,CAACR,UAAU;MACTwB,OAAO,EAAC,IAAI;MACZV,KAAK,EAAE,CAACC,MAAM,CAACL,IAAI,EAAEG,MAAM,IAAIE,MAAM,CAACF,MAAM,CAAE;MAC9CD,aAAa,EAAEA,aAAc;MAAAK,QAAA,EAE5BP;IAAI,CACK;EAAC,CACA,CAAC;AAEpB,CAAC;AAED,MAAMK,MAAM,GAAGb,UAAU,CAACuB,MAAM,CAAC;EAC/Bf,IAAI,EAAE;IACJU,KAAK,EAAEzB,MAAM,CAAC+B,SAAS;IACvBC,eAAe,EAAE5B,OAAO,CAAC,GAAG,CAAC;IAC7B6B,WAAW,EAAE7B,OAAO,CAAC,GAAG;EAC1B,CAAC;EACDc,MAAM,EAAE;IACNgB,OAAO,EAAEvB,sBAAsB,CAACwB;EAClC,CAAC;EACDd,eAAe,EAAE;IACfe,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBL,eAAe,EAAE5B,OAAO,CAAC,GAAG;EAC9B;AACF,CAAC,CAAC","ignoreList":[]}