@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.
- package/dist/commonjs/features/voice/constants.js +42 -3
- package/dist/commonjs/features/voice/constants.js.map +1 -1
- package/dist/commonjs/features/voice/helpers.js +67 -1
- package/dist/commonjs/features/voice/helpers.js.map +1 -1
- package/dist/commonjs/features/voice/index.js +77 -0
- package/dist/commonjs/features/voice/index.js.map +1 -1
- package/dist/commonjs/features/voice/playing/components/VoiceTranscriptContent.js +22 -9
- package/dist/commonjs/features/voice/playing/components/VoiceTranscriptContent.js.map +1 -1
- package/dist/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.js +4 -27
- package/dist/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.js.map +1 -1
- package/dist/commonjs/features/voice/recording/components/VoiceRecordWithTranscript.js +49 -0
- package/dist/commonjs/features/voice/recording/components/VoiceRecordWithTranscript.js.map +1 -0
- package/dist/commonjs/features/voice/recording/components/VoiceTranscriptPanel.js +253 -0
- package/dist/commonjs/features/voice/recording/components/VoiceTranscriptPanel.js.map +1 -0
- package/dist/commonjs/features/voice/recording/components/VoiceWaveform.js +93 -0
- package/dist/commonjs/features/voice/recording/components/VoiceWaveform.js.map +1 -0
- package/dist/commonjs/features/voice/recording/hooks/useTranscriptPanelAnimation.js +42 -0
- package/dist/commonjs/features/voice/recording/hooks/useTranscriptPanelAnimation.js.map +1 -0
- package/dist/commonjs/features/voice/recording/hooks/useVoiceRecorder.js +17 -2
- package/dist/commonjs/features/voice/recording/hooks/useVoiceRecorder.js.map +1 -1
- package/dist/commonjs/features/voice/recording/hooks/useVoiceWaveform.js +43 -0
- package/dist/commonjs/features/voice/recording/hooks/useVoiceWaveform.js.map +1 -0
- package/dist/commonjs/features/voice/recording/model/Recorder.model.js +3 -0
- package/dist/commonjs/features/voice/recording/model/Recorder.model.js.map +1 -1
- package/dist/commonjs/features/voice/recording/model/VoiceRecordWithTranscript.model.js +100 -0
- package/dist/commonjs/features/voice/recording/model/VoiceRecordWithTranscript.model.js.map +1 -0
- package/dist/commonjs/features/voice/recording/model/VoiceTranscriptPanel.model.js +115 -0
- package/dist/commonjs/features/voice/recording/model/VoiceTranscriptPanel.model.js.map +1 -0
- package/dist/commonjs/features/voice/transcript.helpers.js +36 -0
- package/dist/commonjs/features/voice/transcript.helpers.js.map +1 -0
- package/dist/commonjs/features/voice/types.js +11 -7
- package/dist/commonjs/features/voice/types.js.map +1 -1
- package/dist/module/features/voice/constants.js +41 -0
- package/dist/module/features/voice/constants.js.map +1 -1
- package/dist/module/features/voice/helpers.js +65 -1
- package/dist/module/features/voice/helpers.js.map +1 -1
- package/dist/module/features/voice/index.js +7 -0
- package/dist/module/features/voice/index.js.map +1 -1
- package/dist/module/features/voice/playing/components/VoiceTranscriptContent.js +20 -9
- package/dist/module/features/voice/playing/components/VoiceTranscriptContent.js.map +1 -1
- package/dist/module/features/voice/playing/model/TranscriptionsDownloader.model.js +4 -27
- package/dist/module/features/voice/playing/model/TranscriptionsDownloader.model.js.map +1 -1
- package/dist/module/features/voice/recording/components/VoiceRecordWithTranscript.js +43 -0
- package/dist/module/features/voice/recording/components/VoiceRecordWithTranscript.js.map +1 -0
- package/dist/module/features/voice/recording/components/VoiceTranscriptPanel.js +246 -0
- package/dist/module/features/voice/recording/components/VoiceTranscriptPanel.js.map +1 -0
- package/dist/module/features/voice/recording/components/VoiceWaveform.js +86 -0
- package/dist/module/features/voice/recording/components/VoiceWaveform.js.map +1 -0
- package/dist/module/features/voice/recording/hooks/useTranscriptPanelAnimation.js +37 -0
- package/dist/module/features/voice/recording/hooks/useTranscriptPanelAnimation.js.map +1 -0
- package/dist/module/features/voice/recording/hooks/useVoiceRecorder.js +20 -3
- package/dist/module/features/voice/recording/hooks/useVoiceRecorder.js.map +1 -1
- package/dist/module/features/voice/recording/hooks/useVoiceWaveform.js +38 -0
- package/dist/module/features/voice/recording/hooks/useVoiceWaveform.js.map +1 -0
- package/dist/module/features/voice/recording/model/Recorder.model.js +3 -0
- package/dist/module/features/voice/recording/model/Recorder.model.js.map +1 -1
- package/dist/module/features/voice/recording/model/VoiceRecordWithTranscript.model.js +95 -0
- package/dist/module/features/voice/recording/model/VoiceRecordWithTranscript.model.js.map +1 -0
- package/dist/module/features/voice/recording/model/VoiceTranscriptPanel.model.js +110 -0
- package/dist/module/features/voice/recording/model/VoiceTranscriptPanel.model.js.map +1 -0
- package/dist/module/features/voice/transcript.helpers.js +31 -0
- package/dist/module/features/voice/transcript.helpers.js.map +1 -0
- package/dist/module/features/voice/types.js +4 -6
- package/dist/module/features/voice/types.js.map +1 -1
- package/dist/typescript/commonjs/features/voice/__tests__/VoiceRecordWithTranscript.model.test.d.ts +2 -0
- package/dist/typescript/commonjs/features/voice/__tests__/VoiceRecordWithTranscript.model.test.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/__tests__/VoiceTranscriptPanel.model.test.d.ts +2 -0
- package/dist/typescript/commonjs/features/voice/__tests__/VoiceTranscriptPanel.model.test.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/constants.d.ts +34 -0
- package/dist/typescript/commonjs/features/voice/constants.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voice/helpers.d.ts +3 -0
- package/dist/typescript/commonjs/features/voice/helpers.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voice/index.d.ts +7 -0
- package/dist/typescript/commonjs/features/voice/index.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptContent.d.ts +3 -1
- package/dist/typescript/commonjs/features/voice/playing/components/VoiceTranscriptContent.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.d.ts +2 -7
- package/dist/typescript/commonjs/features/voice/playing/model/TranscriptionsDownloader.model.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voice/recording/components/VoiceRecordWithTranscript.d.ts +13 -0
- package/dist/typescript/commonjs/features/voice/recording/components/VoiceRecordWithTranscript.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/recording/components/VoiceTranscriptPanel.d.ts +11 -0
- package/dist/typescript/commonjs/features/voice/recording/components/VoiceTranscriptPanel.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/recording/components/VoiceWaveform.d.ts +8 -0
- package/dist/typescript/commonjs/features/voice/recording/components/VoiceWaveform.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/recording/hooks/useTranscriptPanelAnimation.d.ts +18 -0
- package/dist/typescript/commonjs/features/voice/recording/hooks/useTranscriptPanelAnimation.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/recording/hooks/useVoiceRecorder.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voice/recording/hooks/useVoiceWaveform.d.ts +7 -0
- package/dist/typescript/commonjs/features/voice/recording/hooks/useVoiceWaveform.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/recording/model/Recorder.model.d.ts +2 -0
- package/dist/typescript/commonjs/features/voice/recording/model/Recorder.model.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voice/recording/model/VoiceRecordWithTranscript.model.d.ts +16 -0
- package/dist/typescript/commonjs/features/voice/recording/model/VoiceRecordWithTranscript.model.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/recording/model/VoiceTranscriptPanel.model.d.ts +31 -0
- package/dist/typescript/commonjs/features/voice/recording/model/VoiceTranscriptPanel.model.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/transcript.helpers.d.ts +8 -0
- package/dist/typescript/commonjs/features/voice/transcript.helpers.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/voice/types.d.ts +2 -5
- package/dist/typescript/commonjs/features/voice/types.d.ts.map +1 -1
- package/dist/typescript/module/features/voice/__tests__/VoiceRecordWithTranscript.model.test.d.ts +2 -0
- package/dist/typescript/module/features/voice/__tests__/VoiceRecordWithTranscript.model.test.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/__tests__/VoiceTranscriptPanel.model.test.d.ts +2 -0
- package/dist/typescript/module/features/voice/__tests__/VoiceTranscriptPanel.model.test.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/constants.d.ts +34 -0
- package/dist/typescript/module/features/voice/constants.d.ts.map +1 -1
- package/dist/typescript/module/features/voice/helpers.d.ts +3 -0
- package/dist/typescript/module/features/voice/helpers.d.ts.map +1 -1
- package/dist/typescript/module/features/voice/index.d.ts +7 -0
- package/dist/typescript/module/features/voice/index.d.ts.map +1 -1
- package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptContent.d.ts +3 -1
- package/dist/typescript/module/features/voice/playing/components/VoiceTranscriptContent.d.ts.map +1 -1
- package/dist/typescript/module/features/voice/playing/model/TranscriptionsDownloader.model.d.ts +2 -7
- package/dist/typescript/module/features/voice/playing/model/TranscriptionsDownloader.model.d.ts.map +1 -1
- package/dist/typescript/module/features/voice/recording/components/VoiceRecordWithTranscript.d.ts +13 -0
- package/dist/typescript/module/features/voice/recording/components/VoiceRecordWithTranscript.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/recording/components/VoiceTranscriptPanel.d.ts +11 -0
- package/dist/typescript/module/features/voice/recording/components/VoiceTranscriptPanel.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/recording/components/VoiceWaveform.d.ts +8 -0
- package/dist/typescript/module/features/voice/recording/components/VoiceWaveform.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/recording/hooks/useTranscriptPanelAnimation.d.ts +18 -0
- package/dist/typescript/module/features/voice/recording/hooks/useTranscriptPanelAnimation.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/recording/hooks/useVoiceRecorder.d.ts.map +1 -1
- package/dist/typescript/module/features/voice/recording/hooks/useVoiceWaveform.d.ts +7 -0
- package/dist/typescript/module/features/voice/recording/hooks/useVoiceWaveform.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/recording/model/Recorder.model.d.ts +2 -0
- package/dist/typescript/module/features/voice/recording/model/Recorder.model.d.ts.map +1 -1
- package/dist/typescript/module/features/voice/recording/model/VoiceRecordWithTranscript.model.d.ts +16 -0
- package/dist/typescript/module/features/voice/recording/model/VoiceRecordWithTranscript.model.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/recording/model/VoiceTranscriptPanel.model.d.ts +31 -0
- package/dist/typescript/module/features/voice/recording/model/VoiceTranscriptPanel.model.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/transcript.helpers.d.ts +8 -0
- package/dist/typescript/module/features/voice/transcript.helpers.d.ts.map +1 -0
- package/dist/typescript/module/features/voice/types.d.ts +2 -5
- package/dist/typescript/module/features/voice/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/features/voice/__tests__/VoiceRecordWithTranscript.model.test.ts +228 -0
- package/src/features/voice/__tests__/VoiceTranscriptPanel.model.test.ts +237 -0
- package/src/features/voice/constants.ts +43 -0
- package/src/features/voice/helpers.ts +85 -1
- package/src/features/voice/index.ts +7 -0
- package/src/features/voice/playing/components/VoiceTranscriptContent.tsx +27 -8
- package/src/features/voice/playing/model/TranscriptionsDownloader.model.ts +8 -30
- package/src/features/voice/recording/components/VoiceRecordWithTranscript.tsx +52 -0
- package/src/features/voice/recording/components/VoiceTranscriptPanel.tsx +293 -0
- package/src/features/voice/recording/components/VoiceWaveform.tsx +102 -0
- package/src/features/voice/recording/hooks/useTranscriptPanelAnimation.ts +49 -0
- package/src/features/voice/recording/hooks/useVoiceRecorder.ts +26 -3
- package/src/features/voice/recording/hooks/useVoiceWaveform.ts +46 -0
- package/src/features/voice/recording/model/Recorder.model.ts +3 -0
- package/src/features/voice/recording/model/VoiceRecordWithTranscript.model.ts +104 -0
- package/src/features/voice/recording/model/VoiceTranscriptPanel.model.ts +131 -0
- package/src/features/voice/transcript.helpers.ts +37 -0
- package/src/features/voice/types.ts +5 -6
- 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.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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":["
|
|
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
|
|
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;
|
|
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.
|
|
20
|
+
color: LoaderColor.GRAY
|
|
17
21
|
})
|
|
18
22
|
});
|
|
19
23
|
}
|
|
20
|
-
return /*#__PURE__*/_jsx(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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.
|
|
29
|
-
|
|
30
|
-
|
|
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","
|
|
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":[]}
|