@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.
- package/dist/commonjs/features/voice/constants.js +39 -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 +17 -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 +245 -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 +83 -0
- package/dist/commonjs/features/voice/recording/model/VoiceRecordWithTranscript.model.js.map +1 -0
- package/dist/commonjs/features/voice/recording/model/VoiceTranscriptPanel.model.js +65 -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 +38 -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 +15 -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 +238 -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 +78 -0
- package/dist/module/features/voice/recording/model/VoiceRecordWithTranscript.model.js.map +1 -0
- package/dist/module/features/voice/recording/model/VoiceTranscriptPanel.model.js +60 -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 +32 -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 +2 -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 +26 -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 +32 -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 +2 -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 +26 -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 +145 -0
- package/src/features/voice/__tests__/VoiceTranscriptPanel.model.test.ts +135 -0
- package/src/features/voice/constants.ts +40 -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 +16 -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 +285 -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 +81 -0
- package/src/features/voice/recording/model/VoiceTranscriptPanel.model.ts +76 -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 @@
|
|
|
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.
|
|
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,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
|
|
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;
|
|
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.
|
|
18
|
+
color: LoaderColor.GRAY
|
|
17
19
|
})
|
|
18
20
|
});
|
|
19
21
|
}
|
|
20
|
-
return /*#__PURE__*/_jsx(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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.
|
|
29
|
-
|
|
30
|
-
|
|
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","
|
|
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 {
|
|
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
|
|
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.
|
|
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.
|
|
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","
|
|
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":[]}
|