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

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 +39 -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 +17 -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 +245 -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 +83 -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 +65 -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 +38 -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 +15 -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 +238 -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 +78 -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 +60 -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 +32 -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 +2 -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 +26 -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 +32 -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 +2 -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 +26 -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 +145 -0
  137. package/src/features/voice/__tests__/VoiceTranscriptPanel.model.test.ts +135 -0
  138. package/src/features/voice/constants.ts +40 -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 +16 -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 +285 -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 +81 -0
  151. package/src/features/voice/recording/model/VoiceTranscriptPanel.model.ts +76 -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 @@
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","discard","isFetchedRecordCurrent","currentRecord","params","$currentRecord","updates","source","$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,65 @@
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 _constants = require("../../constants.js");
9
+ var _DropdownModel = require("../../playing/model/Dropdown.model.js");
10
+ // Phase machine for the recording-flow panel: open → RECORDING (waveform),
11
+ // confirm → PROCESSING (loader), complete/fail → DONE (transcript text).
12
+ // The transcript shows inside a collapsible dropdown (same UX as the playing
13
+ // side): collapsed to a short preview by default, expandable via the caret.
14
+ // Transcript fetching itself is wired externally
15
+ // (see VoiceRecordWithTranscriptModel).
16
+ class VoiceTranscriptPanelModel {
17
+ reset = (0, _effector.createEvent)();
18
+ dropdown = new _DropdownModel.DropdownModel();
19
+ open = (0, _effector.createEvent)();
20
+ confirm = (0, _effector.createEvent)();
21
+ complete = (0, _effector.createEvent)();
22
+ fail = (0, _effector.createEvent)();
23
+ discard = (0, _effector.createEvent)();
24
+ $phase = (0, _effector.createStore)(null);
25
+ $transcript = (0, _effector.createStore)('');
26
+ $hasError = (0, _effector.createStore)(false);
27
+ $flags = this.$phase.map(phase => ({
28
+ isOpen: phase !== null,
29
+ isRecording: phase === _constants.VoicePanelPhase.RECORDING,
30
+ isProcessing: phase === _constants.VoicePanelPhase.PROCESSING,
31
+ isDone: phase === _constants.VoicePanelPhase.DONE
32
+ }));
33
+ constructor() {
34
+ this.setupPhaseTransitions();
35
+ }
36
+
37
+ // The event passes through only while the panel is in the given phase —
38
+ // e.g. a transcript that arrives after a discard must not reopen the panel
39
+ allowInPhase(clock, phase) {
40
+ return (0, _effector.sample)({
41
+ clock,
42
+ source: this.$phase,
43
+ filter: currentPhase => currentPhase === phase,
44
+ fn: (_, payload) => payload
45
+ });
46
+ }
47
+ setupPhaseTransitions() {
48
+ const confirmed = this.allowInPhase(this.confirm, _constants.VoicePanelPhase.RECORDING);
49
+ const completed = this.allowInPhase(this.complete, _constants.VoicePanelPhase.PROCESSING);
50
+ const failed = this.allowInPhase(this.fail, _constants.VoicePanelPhase.PROCESSING);
51
+ 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);
52
+ this.$transcript.on(completed, (_, transcript) => transcript).reset(this.reset);
53
+ this.$hasError.on(failed, () => true).reset(this.reset);
54
+ (0, _effector.sample)({
55
+ clock: this.discard,
56
+ target: this.reset
57
+ });
58
+ (0, _effector.sample)({
59
+ clock: this.reset,
60
+ target: this.dropdown.reset
61
+ });
62
+ }
63
+ }
64
+ exports.VoiceTranscriptPanelModel = VoiceTranscriptPanelModel;
65
+ //# sourceMappingURL=VoiceTranscriptPanel.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_effector","require","_constants","_DropdownModel","VoiceTranscriptPanelModel","reset","createEvent","dropdown","DropdownModel","open","confirm","complete","fail","discard","$phase","createStore","$transcript","$hasError","$flags","map","phase","isOpen","isRecording","VoicePanelPhase","RECORDING","isProcessing","PROCESSING","isDone","DONE","constructor","setupPhaseTransitions","allowInPhase","clock","sample","source","filter","currentPhase","fn","_","payload","confirmed","completed","failed","on","transcript","target","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,48 @@ 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
+ };
31
69
  //# 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"],"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;AACnB,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,37 @@
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';
6
7
  import { jsx as _jsx } from "react/jsx-runtime";
7
8
  export const VoiceTranscriptContent = ({
8
9
  text,
9
- isLoading
10
+ isLoading,
11
+ numberOfLines
10
12
  }) => {
11
13
  if (isLoading) {
12
14
  return /*#__PURE__*/_jsx(View, {
13
15
  style: styles.loaderContainer,
14
16
  children: /*#__PURE__*/_jsx(Loader, {
15
17
  size: LoaderSize.SMALL,
16
- color: LoaderColor.BLUE
18
+ color: LoaderColor.GRAY
17
19
  })
18
20
  });
19
21
  }
20
- return /*#__PURE__*/_jsx(Typography, {
21
- variant: "h8",
22
- style: styles.text,
23
- children: text
22
+ return /*#__PURE__*/_jsx(Animated.View, {
23
+ entering: FadeIn.duration(400),
24
+ children: /*#__PURE__*/_jsx(Typography, {
25
+ variant: "h8",
26
+ style: styles.text,
27
+ numberOfLines: numberOfLines,
28
+ children: text
29
+ })
24
30
  });
25
31
  };
26
32
  const styles = StyleSheet.create({
27
33
  text: {
28
- color: COLORS.NEUTRAL_7,
29
- paddingHorizontal: SPACING[200],
30
- paddingVertical: SPACING[200]
34
+ color: COLORS.NEUTRAL_9,
35
+ paddingVertical: SPACING[100],
36
+ marginRight: SPACING[200]
31
37
  },
32
38
  loaderContainer: {
33
39
  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","jsx","_jsx","VoiceTranscriptContent","text","isLoading","numberOfLines","style","styles","loaderContainer","children","size","SMALL","color","GRAY","entering","duration","variant","create","NEUTRAL_9","paddingVertical","marginRight","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;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAQ1D,OAAO,MAAMC,sBAAsB,GAAGA,CAAC;EACrCC,IAAI;EACJC,SAAS;EACTC;AAC2B,CAAC,KAAK;EACjC,IAAID,SAAS,EAAE;IACb,oBACEH,IAAA,CAACJ,IAAI;MAACS,KAAK,EAAEC,MAAM,CAACC,eAAgB;MAAAC,QAAA,eAClCR,IAAA,CAACX,MAAM;QAACoB,IAAI,EAAElB,UAAU,CAACmB,KAAM;QAACC,KAAK,EAAErB,WAAW,CAACsB;MAAK,CAAE;IAAC,CACvD,CAAC;EAEX;EAEA,oBACEZ,IAAA,CAACH,QAAQ,CAACD,IAAI;IAACiB,QAAQ,EAAEf,MAAM,CAACgB,QAAQ,CAAC,GAAG,CAAE;IAAAN,QAAA,eAC5CR,IAAA,CAACP,UAAU;MAACsB,OAAO,EAAC,IAAI;MAACV,KAAK,EAAEC,MAAM,CAACJ,IAAK;MAACE,aAAa,EAAEA,aAAc;MAAAI,QAAA,EACvEN;IAAI,CACK;EAAC,CACA,CAAC;AAEpB,CAAC;AAED,MAAMI,MAAM,GAAGX,UAAU,CAACqB,MAAM,CAAC;EAC/Bd,IAAI,EAAE;IACJS,KAAK,EAAEvB,MAAM,CAAC6B,SAAS;IACvBC,eAAe,EAAE1B,OAAO,CAAC,GAAG,CAAC;IAC7B2B,WAAW,EAAE3B,OAAO,CAAC,GAAG;EAC1B,CAAC;EACDe,eAAe,EAAE;IACfa,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBH,eAAe,EAAE1B,OAAO,CAAC,GAAG;EAC9B;AACF,CAAC,CAAC","ignoreList":[]}
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { createEffect } from 'effector';
4
- import { TranscriptionStatus } from "../../types.js";
5
- import { NO_AUDIO_BE_MESSAGE, TRANSCRIPT_MAX_RETRIES, TRANSCRIPT_RETRY_INTERVAL_MS } from "../../constants.js";
4
+ import { fetchTranscriptWithRetry } from "../../transcript.helpers.js";
6
5
  export class TranscriptionsDownloaderModel {
7
6
  inflightFetches = new Map();
8
7
  transcriptCache = new Map();
@@ -10,12 +9,12 @@ export class TranscriptionsDownloaderModel {
10
9
  this.collection = collection;
11
10
  this.api = api;
12
11
  }
13
- async fetchTranscriptWithRetry(audioFileId) {
12
+ async fetchTranscript(audioFileId) {
14
13
  const cached = this.transcriptCache.get(audioFileId);
15
14
  if (cached) return cached;
16
15
  const existing = this.inflightFetches.get(audioFileId);
17
16
  if (existing) return existing;
18
- const promise = this.runFetchWithRetry(audioFileId).then(result => {
17
+ const promise = fetchTranscriptWithRetry(id => this.api.getAudioFileTranscript(id), audioFileId).then(result => {
19
18
  this.transcriptCache.set(audioFileId, result);
20
19
  return result;
21
20
  }).finally(() => {
@@ -24,28 +23,6 @@ export class TranscriptionsDownloaderModel {
24
23
  this.inflightFetches.set(audioFileId, promise);
25
24
  return promise;
26
25
  }
27
- async runFetchWithRetry(audioFileId) {
28
- for (let attempt = 0; attempt < TRANSCRIPT_MAX_RETRIES; attempt++) {
29
- const response = await this.api.getAudioFileTranscript(audioFileId);
30
- if (response.status === TranscriptionStatus.COMPLETED) {
31
- return {
32
- text: response.text,
33
- language: response.language
34
- };
35
- }
36
- if (response.status === TranscriptionStatus.FAILED) {
37
- return {
38
- text: NO_AUDIO_BE_MESSAGE
39
- };
40
- }
41
- if (attempt < TRANSCRIPT_MAX_RETRIES - 1) {
42
- await new Promise(resolve => setTimeout(resolve, TRANSCRIPT_RETRY_INTERVAL_MS));
43
- }
44
- }
45
- return {
46
- text: NO_AUDIO_BE_MESSAGE
47
- };
48
- }
49
26
  loadTranscriptForAttempt = createEffect(async attemptNumber => {
50
27
  const item = this.collection.get(attemptNumber);
51
28
  if (!item?.audioFileId) return;
@@ -57,7 +34,7 @@ export class TranscriptionsDownloaderModel {
57
34
  const {
58
35
  text,
59
36
  language
60
- } = await this.fetchTranscriptWithRetry(item.audioFileId);
37
+ } = await this.fetchTranscript(item.audioFileId);
61
38
  this.collection.update(attemptNumber, {
62
39
  transcript: text,
63
40
  transcriptLanguage: language,
@@ -1 +1 @@
1
- {"version":3,"names":["createEffect","TranscriptionStatus","NO_AUDIO_BE_MESSAGE","TRANSCRIPT_MAX_RETRIES","TRANSCRIPT_RETRY_INTERVAL_MS","TranscriptionsDownloaderModel","inflightFetches","Map","transcriptCache","constructor","collection","api","fetchTranscriptWithRetry","audioFileId","cached","get","existing","promise","runFetchWithRetry","then","result","set","finally","delete","attempt","response","getAudioFileTranscript","status","COMPLETED","text","language","FAILED","Promise","resolve","setTimeout","loadTranscriptForAttempt","attemptNumber","item","transcript","transcriptLoading","update","transcriptLanguage","transcriptError","undefined","error","Error","message","getCachedTranscript"],"sourceRoot":"../../../../../../src","sources":["features/voice/playing/model/TranscriptionsDownloader.model.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createEffect","fetchTranscriptWithRetry","TranscriptionsDownloaderModel","inflightFetches","Map","transcriptCache","constructor","collection","api","fetchTranscript","audioFileId","cached","get","existing","promise","id","getAudioFileTranscript","then","result","set","finally","delete","loadTranscriptForAttempt","attemptNumber","item","transcript","transcriptLoading","update","text","language","transcriptLanguage","transcriptError","undefined","error","Error","message","getCachedTranscript"],"sourceRoot":"../../../../../../src","sources":["features/voice/playing/model/TranscriptionsDownloader.model.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,UAAU;AAGvC,SAASC,wBAAwB,QAA0B,6BAA0B;AAErF,OAAO,MAAMC,6BAA6B,CAAC;EAGxBC,eAAe,GAAG,IAAIC,GAAG,CAAoC,CAAC;EAC9DC,eAAe,GAAG,IAAID,GAAG,CAA2B,CAAC;EAEtEE,WAAWA,CAACC,UAAoC,EAAEC,GAAmB,EAAE;IACrE,IAAI,CAACD,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,GAAG,GAAGA,GAAG;EAChB;EAEA,MAAcC,eAAeA,CAACC,WAAmB,EAA6B;IAC5E,MAAMC,MAAM,GAAG,IAAI,CAACN,eAAe,CAACO,GAAG,CAACF,WAAW,CAAC;IACpD,IAAIC,MAAM,EAAE,OAAOA,MAAM;IAEzB,MAAME,QAAQ,GAAG,IAAI,CAACV,eAAe,CAACS,GAAG,CAACF,WAAW,CAAC;IACtD,IAAIG,QAAQ,EAAE,OAAOA,QAAQ;IAE7B,MAAMC,OAAO,GAAGb,wBAAwB,CACrCc,EAAE,IAAK,IAAI,CAACP,GAAG,CAACQ,sBAAsB,CAACD,EAAE,CAAC,EAC3CL,WACF,CAAC,CACEO,IAAI,CAAEC,MAAM,IAAK;MAChB,IAAI,CAACb,eAAe,CAACc,GAAG,CAACT,WAAW,EAAEQ,MAAM,CAAC;MAC7C,OAAOA,MAAM;IACf,CAAC,CAAC,CACDE,OAAO,CAAC,MAAM;MACb,IAAI,CAACjB,eAAe,CAACkB,MAAM,CAACX,WAAW,CAAC;IAC1C,CAAC,CAAC;IACJ,IAAI,CAACP,eAAe,CAACgB,GAAG,CAACT,WAAW,EAAEI,OAAO,CAAC;IAC9C,OAAOA,OAAO;EAChB;EAEgBQ,wBAAwB,GAAGtB,YAAY,CAAC,MAAOuB,aAAqB,IAAK;IACvF,MAAMC,IAAI,GAAG,IAAI,CAACjB,UAAU,CAACK,GAAG,CAACW,aAAa,CAAC;IAC/C,IAAI,CAACC,IAAI,EAAEd,WAAW,EAAE;IACxB,IAAIc,IAAI,CAACC,UAAU,IAAID,IAAI,CAACE,iBAAiB,EAAE;IAE/C,IAAI,CAACnB,UAAU,CAACoB,MAAM,CAACJ,aAAa,EAAE;MAAEG,iBAAiB,EAAE;IAAK,CAAC,CAAC;IAElE,IAAI;MACF,MAAM;QAAEE,IAAI;QAAEC;MAAS,CAAC,GAAG,MAAM,IAAI,CAACpB,eAAe,CAACe,IAAI,CAACd,WAAW,CAAC;MAEvE,IAAI,CAACH,UAAU,CAACoB,MAAM,CAACJ,aAAa,EAAE;QACpCE,UAAU,EAAEG,IAAI;QAChBE,kBAAkB,EAAED,QAAQ;QAC5BH,iBAAiB,EAAE,KAAK;QACxBK,eAAe,EAAEC;MACnB,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,IAAI,CAAC1B,UAAU,CAACoB,MAAM,CAACJ,aAAa,EAAE;QACpCG,iBAAiB,EAAE,KAAK;QACxBK,eAAe,EAAEE,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAACE,OAAO,GAAG;MAC5D,CAAC,CAAC;IACJ;EACF,CAAC,CAAC;EAEKC,mBAAmBA,CAAC1B,WAAmB,EAAgC;IAC5E,OAAO,IAAI,CAACL,eAAe,CAACO,GAAG,CAACF,WAAW,CAAC;EAC9C;AACF","ignoreList":[]}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ import React from 'react';
4
+ import { StyleSheet, View } from 'react-native';
5
+ import { SPACING } from '@magmamath/react-native-ui';
6
+ import { useUnit } from 'effector-react';
7
+ import { VoiceRecord } from "./VoiceRecord.js";
8
+ import { VoiceTranscriptPanel } from "./VoiceTranscriptPanel.js";
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ // Drop-in replacement for VoiceRecord that opens the waveform/transcript panel
11
+ // to the right of the record control (per the "Voice on Drawboard" design).
12
+ export const VoiceRecordWithTranscript = ({
13
+ model,
14
+ buttonVariant,
15
+ style,
16
+ panelStyle
17
+ }) => {
18
+ const metering = useUnit(model.record.recorderModel.$metering);
19
+ return /*#__PURE__*/_jsxs(View, {
20
+ style: [styles.container, style],
21
+ children: [/*#__PURE__*/_jsx(VoiceRecord, {
22
+ model: model.record,
23
+ buttonVariant: buttonVariant
24
+ }), /*#__PURE__*/_jsx(VoiceTranscriptPanel, {
25
+ model: model.panel,
26
+ metering: metering,
27
+ style: [styles.panel, panelStyle]
28
+ })]
29
+ });
30
+ };
31
+ const styles = StyleSheet.create({
32
+ // Hug the record control so the panel's `left: 100%` lands right next to it
33
+ container: {
34
+ alignSelf: 'flex-start'
35
+ },
36
+ panel: {
37
+ position: 'absolute',
38
+ left: '100%',
39
+ top: 0,
40
+ marginLeft: SPACING[200]
41
+ }
42
+ });
43
+ //# sourceMappingURL=VoiceRecordWithTranscript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","StyleSheet","View","SPACING","useUnit","VoiceRecord","VoiceTranscriptPanel","jsx","_jsx","jsxs","_jsxs","VoiceRecordWithTranscript","model","buttonVariant","style","panelStyle","metering","record","recorderModel","$metering","styles","container","children","panel","create","alignSelf","position","left","top","marginLeft"],"sourceRoot":"../../../../../../src","sources":["features/voice/recording/components/VoiceRecordWithTranscript.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAAoBC,UAAU,EAAEC,IAAI,QAAmB,cAAc;AAErE,SAASC,OAAO,QAAQ,4BAA4B;AACpD,SAASC,OAAO,QAAQ,gBAAgB;AAIxC,SAASC,WAAW,QAAQ,kBAAe;AAC3C,SAASC,oBAAoB,QAAQ,2BAAwB;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAS7D;AACA;AACA,OAAO,MAAMC,yBAAyB,GAAGA,CAAC;EACxCC,KAAK;EACLC,aAAa;EACbC,KAAK;EACLC;AAC8B,CAAC,KAAK;EACpC,MAAMC,QAAQ,GAAGZ,OAAO,CAACQ,KAAK,CAACK,MAAM,CAACC,aAAa,CAACC,SAAS,CAAC;EAE9D,oBACET,KAAA,CAACR,IAAI;IAACY,KAAK,EAAE,CAACM,MAAM,CAACC,SAAS,EAAEP,KAAK,CAAE;IAAAQ,QAAA,gBACrCd,IAAA,CAACH,WAAW;MAACO,KAAK,EAAEA,KAAK,CAACK,MAAO;MAACJ,aAAa,EAAEA;IAAc,CAAE,CAAC,eAClEL,IAAA,CAACF,oBAAoB;MACnBM,KAAK,EAAEA,KAAK,CAACW,KAAM;MACnBP,QAAQ,EAAEA,QAAS;MACnBF,KAAK,EAAE,CAACM,MAAM,CAACG,KAAK,EAAER,UAAU;IAAE,CACnC,CAAC;EAAA,CACE,CAAC;AAEX,CAAC;AAED,MAAMK,MAAM,GAAGnB,UAAU,CAACuB,MAAM,CAAC;EAC/B;EACAH,SAAS,EAAE;IACTI,SAAS,EAAE;EACb,CAAC;EACDF,KAAK,EAAE;IACLG,QAAQ,EAAE,UAAU;IACpBC,IAAI,EAAE,MAAM;IACZC,GAAG,EAAE,CAAC;IACNC,UAAU,EAAE1B,OAAO,CAAC,GAAG;EACzB;AACF,CAAC,CAAC","ignoreList":[]}