@magmamath/students-features 0.9.107-rc.14 → 0.9.107-rc.15
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/voiceRecord/components/VoiceRecord.js +2 -2
- package/dist/commonjs/features/voiceRecord/components/VoiceRecord.js.map +1 -1
- package/dist/commonjs/features/voiceRecord/hooks/useVoiceRecorder.js +5 -14
- package/dist/commonjs/features/voiceRecord/hooks/useVoiceRecorder.js.map +1 -1
- package/dist/commonjs/features/voiceRecord/modal/VoiceRecordDeleteModal.js +1 -1
- package/dist/commonjs/features/voiceRecord/modal/VoiceRecordDeleteModal.js.map +1 -1
- package/dist/commonjs/features/voiceRecord/model/VoiceRecord.model.js +43 -7
- package/dist/commonjs/features/voiceRecord/model/VoiceRecord.model.js.map +1 -1
- package/dist/module/features/voiceRecord/components/VoiceRecord.js +2 -2
- package/dist/module/features/voiceRecord/components/VoiceRecord.js.map +1 -1
- package/dist/module/features/voiceRecord/hooks/useVoiceRecorder.js +5 -14
- package/dist/module/features/voiceRecord/hooks/useVoiceRecorder.js.map +1 -1
- package/dist/module/features/voiceRecord/modal/VoiceRecordDeleteModal.js +1 -1
- package/dist/module/features/voiceRecord/modal/VoiceRecordDeleteModal.js.map +1 -1
- package/dist/module/features/voiceRecord/model/VoiceRecord.model.js +43 -7
- package/dist/module/features/voiceRecord/model/VoiceRecord.model.js.map +1 -1
- package/dist/typescript/commonjs/features/voiceRecord/components/VoiceRecord.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voiceRecord/hooks/useVoiceRecorder.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voiceRecord/modal/VoiceRecordDeleteModal.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voiceRecord/model/VoiceRecord.model.d.ts +8 -4
- package/dist/typescript/commonjs/features/voiceRecord/model/VoiceRecord.model.d.ts.map +1 -1
- package/dist/typescript/module/features/voiceRecord/components/VoiceRecord.d.ts.map +1 -1
- package/dist/typescript/module/features/voiceRecord/hooks/useVoiceRecorder.d.ts.map +1 -1
- package/dist/typescript/module/features/voiceRecord/modal/VoiceRecordDeleteModal.d.ts.map +1 -1
- package/dist/typescript/module/features/voiceRecord/model/VoiceRecord.model.d.ts +8 -4
- package/dist/typescript/module/features/voiceRecord/model/VoiceRecord.model.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/features/voiceRecord/components/VoiceRecord.tsx +6 -2
- package/src/features/voiceRecord/hooks/useVoiceRecorder.ts +5 -14
- package/src/features/voiceRecord/modal/VoiceRecordDeleteModal.tsx +2 -1
- package/src/features/voiceRecord/model/VoiceRecord.model.ts +47 -10
|
@@ -26,9 +26,9 @@ const VoiceRecord = ({
|
|
|
26
26
|
const {
|
|
27
27
|
recorderState
|
|
28
28
|
} = (0, _useVoiceRecorder.useVoiceRecorder)(model);
|
|
29
|
-
const [isRecording,
|
|
29
|
+
const [isRecording, currentRecord] = (0, _effectorReact.useUnit)([model.recorderModel.$voiceRecordState, model.$currentRecord]);
|
|
30
30
|
const isDisabled = (0, _effectorReact.useUnit)(model.$isDisabled);
|
|
31
|
-
const isExpanded = !!(isRecording ||
|
|
31
|
+
const isExpanded = !!(isRecording || currentRecord);
|
|
32
32
|
const {
|
|
33
33
|
containerAnimatedStyle
|
|
34
34
|
} = (0, _useVoiceRecorderAnimation.useVoiceRecorderAnimation)(isExpanded);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_VoiceRecordButton","_react","_interopRequireWildcard","_reactNativeUi","_VoiceRecordDeleteButton","_VoiceRecordDevider","_VoiceRecordTimer","_interopRequireDefault","_reactNativeReanimated","_useVoiceRecorder","_useVoiceRecorderAnimation","_effectorReact","_jsxRuntime","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","VoiceRecord","style","model","recorderState","useVoiceRecorder","isRecording","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_VoiceRecordButton","_react","_interopRequireWildcard","_reactNativeUi","_VoiceRecordDeleteButton","_VoiceRecordDevider","_VoiceRecordTimer","_interopRequireDefault","_reactNativeReanimated","_useVoiceRecorder","_useVoiceRecorderAnimation","_effectorReact","_jsxRuntime","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","VoiceRecord","style","model","recorderState","useVoiceRecorder","isRecording","currentRecord","useUnit","recorderModel","$voiceRecordState","$currentRecord","isDisabled","$isDisabled","isExpanded","containerAnimatedStyle","useVoiceRecorderAnimation","cleanup","recorder","getStatus","stop","reset","useEffect","jsxs","View","styles","container","children","jsx","VoiceRecordButton","entering","FadeIn","exiting","FadeOut","expendedContainer","timer","recordingFileDurationMs","durationMillis","VoiceRecordDevider","VoiceRecordDeleteButton","onPress","events","deleteRecord","exports","StyleSheet","create","alignItems","padding","paddingBottom","backgroundColor","COLORS","NEUTRAL_3","borderRadius","boxShadow","overflow","marginTop","SPACING"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/components/VoiceRecord.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,17 +12,8 @@ var _constants = require("../constants.js");
|
|
|
12
12
|
var _effectorReact = require("effector-react");
|
|
13
13
|
const useVoiceRecorder = model => {
|
|
14
14
|
const player = (0, _expoAudio.useAudioPlayer)();
|
|
15
|
-
const
|
|
16
|
-
const recorder = (0, _expoAudio.useAudioRecorder)(_expoAudio.RecordingPresets.LOW_QUALITY,
|
|
17
|
-
if (status.error) {
|
|
18
|
-
model.notification.error(`Recorder error: ${status.error}`);
|
|
19
|
-
model.recorderModel.clearStopResolver();
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
if (status.isFinished && status.url) {
|
|
23
|
-
model.setUri(status.url);
|
|
24
|
-
}
|
|
25
|
-
});
|
|
15
|
+
const currentRecord = (0, _effectorReact.useUnit)(model.$currentRecord);
|
|
16
|
+
const recorder = (0, _expoAudio.useAudioRecorder)(_expoAudio.RecordingPresets.LOW_QUALITY, model.recordingStatusUpdate);
|
|
26
17
|
const recorderState = (0, _expoAudio.useAudioRecorderState)(recorder);
|
|
27
18
|
(0, _react.useEffect)(() => {
|
|
28
19
|
if (recorderState.durationMillis >= _constants.VOICE_RECORDER_MAX_DURATION_MS && recorderState.isRecording) {
|
|
@@ -43,14 +34,14 @@ const useVoiceRecorder = model => {
|
|
|
43
34
|
return removeListener;
|
|
44
35
|
}, []);
|
|
45
36
|
(0, _react.useEffect)(() => {
|
|
46
|
-
if (
|
|
37
|
+
if (currentRecord?.uri) {
|
|
47
38
|
const getDuration = async () => {
|
|
48
|
-
const durationMs = await (0, _helpers.getAudioDurationMs)(
|
|
39
|
+
const durationMs = await (0, _helpers.getAudioDurationMs)(currentRecord.uri, player);
|
|
49
40
|
model.recorderModel.setAudioFileDurationMs(durationMs || 0);
|
|
50
41
|
};
|
|
51
42
|
getDuration();
|
|
52
43
|
}
|
|
53
|
-
}, [
|
|
44
|
+
}, [currentRecord?.uri]);
|
|
54
45
|
(0, _react.useEffect)(() => {
|
|
55
46
|
if (recorderState.isRecording) {
|
|
56
47
|
model.recorderModel.setVoiceRecordState(_constants.VoiceRecorderState.RECORDING);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_expoAudio","require","_helpers","_react","_reactNativeUi","_constants","_effectorReact","useVoiceRecorder","model","player","useAudioPlayer","
|
|
1
|
+
{"version":3,"names":["_expoAudio","require","_helpers","_react","_reactNativeUi","_constants","_effectorReact","useVoiceRecorder","model","player","useAudioPlayer","currentRecord","useUnit","$currentRecord","recorder","useAudioRecorder","RecordingPresets","LOW_QUALITY","recordingStatusUpdate","recorderState","useAudioRecorderState","useEffect","durationMillis","VOICE_RECORDER_MAX_DURATION_MS","isRecording","recorderModel","stop","IS_WEB","getAvailableInputs","then","inputs","setAvailableInputs","removeListener","addAudioInputsListenerWeb","devices","uri","getDuration","durationMs","getAudioDurationMs","setAudioFileDurationMs","setVoiceRecordState","VoiceRecorderState","RECORDING","PAUSED","IDLE","reset","exports"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorder.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAMA,IAAAC,QAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,cAAA,GAAAL,OAAA;AAEO,MAAMM,gBAAgB,GAAIC,KAAuB,IAAK;EAC3D,MAAMC,MAAM,GAAG,IAAAC,yBAAc,EAAC,CAAC;EAC/B,MAAMC,aAAa,GAAG,IAAAC,sBAAO,EAACJ,KAAK,CAACK,cAAc,CAAC;EAEnD,MAAMC,QAAQ,GAAG,IAAAC,2BAAgB,EAACC,2BAAgB,CAACC,WAAW,EAAET,KAAK,CAACU,qBAAqB,CAAC;EAC5F,MAAMC,aAAa,GAAG,IAAAC,gCAAqB,EAACN,QAAQ,CAAC;EAErD,IAAAO,gBAAS,EAAC,MAAM;IACd,IACEF,aAAa,CAACG,cAAc,IAAIC,yCAA8B,IAC9DJ,aAAa,CAACK,WAAW,EACzB;MACAhB,KAAK,CAACiB,aAAa,CAACC,IAAI,CAAC,CAAC;IAC5B;EACF,CAAC,EAAE,CAACP,aAAa,CAACG,cAAc,CAAC,CAAC;EAElC,IAAAD,gBAAS,EAAC,MAAM;IACd,IAAI,CAACM,qBAAM,EAAE;MACX;MACA,IAAAC,2BAAkB,EAACd,QAAQ,CAAC,CAACe,IAAI,CAAEC,MAAM,IAAK;QAC5CtB,KAAK,CAACiB,aAAa,CAACM,kBAAkB,CAACD,MAAM,CAAC;MAChD,CAAC,CAAC;MACF;IACF;IAEA,MAAME,cAAc,GAAG,IAAAC,kCAAyB,EAAEC,OAAO,IAAK;MAC5D1B,KAAK,CAACiB,aAAa,CAACM,kBAAkB,CAACG,OAAO,CAAC;IACjD,CAAC,CAAC;IAEF,OAAOF,cAAc;EACvB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAAX,gBAAS,EAAC,MAAM;IACd,IAAIV,aAAa,EAAEwB,GAAG,EAAE;MACtB,MAAMC,WAAW,GAAG,MAAAA,CAAA,KAAY;QAC9B,MAAMC,UAAU,GAAG,MAAM,IAAAC,2BAAkB,EAAC3B,aAAa,CAACwB,GAAG,EAAG1B,MAAM,CAAC;QACvED,KAAK,CAACiB,aAAa,CAACc,sBAAsB,CAACF,UAAU,IAAI,CAAC,CAAC;MAC7D,CAAC;MACDD,WAAW,CAAC,CAAC;IACf;EACF,CAAC,EAAE,CAACzB,aAAa,EAAEwB,GAAG,CAAC,CAAC;EAExB,IAAAd,gBAAS,EAAC,MAAM;IACd,IAAIF,aAAa,CAACK,WAAW,EAAE;MAC7BhB,KAAK,CAACiB,aAAa,CAACe,mBAAmB,CAACC,6BAAkB,CAACC,SAAS,CAAC;MACrE;IACF;IACA,IAAIvB,aAAa,CAACG,cAAc,GAAG,CAAC,EAAE;MACpCd,KAAK,CAACiB,aAAa,CAACe,mBAAmB,CAACC,6BAAkB,CAACE,MAAM,CAAC;MAClE;IACF;IACAnC,KAAK,CAACiB,aAAa,CAACe,mBAAmB,CAACC,6BAAkB,CAACG,IAAI,CAAC;IAEhE,OAAO,MAAM;MACXpC,KAAK,CAACiB,aAAa,CAACoB,KAAK,CAAC,CAAC;IAC7B,CAAC;EACH,CAAC,EAAE,CAAC1B,aAAa,CAAC,CAAC;EAEnB,IAAAE,gBAAS,EAAC,MAAM;IACdb,KAAK,CAACiB,aAAa,CAACX,QAAQ,GAAGA,QAAQ;EACzC,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,OAAO;IAAEK;EAAc,CAAC;AAC1B,CAAC;AAAA2B,OAAA,CAAAvC,gBAAA,GAAAA,gBAAA","ignoreList":[]}
|
|
@@ -51,7 +51,7 @@ const VoiceRecordDeleteModal = ({
|
|
|
51
51
|
const isRecordingInProgress = (recorderState === _constants.VoiceRecorderState.PAUSED || recorderState === _constants.VoiceRecorderState.RECORDING) && durationMillis > 0;
|
|
52
52
|
const handleDelete = async () => {
|
|
53
53
|
if (isRecordingInProgress) {
|
|
54
|
-
await model.
|
|
54
|
+
await model.stopAndDiscard();
|
|
55
55
|
}
|
|
56
56
|
model.deleteCurrentRecording();
|
|
57
57
|
closeModal();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNativeUi","_reactNative","_effectorReact","_constants","_index","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","FooterButtons","onClose","onDelete","useText","jsxs","View","style","styles","footerContainer","children","jsx","Button","variant","ButtonVariant","TERTIARY","size","ButtonSize","LARGE","onPress","colorScheme","ButtonColor","RED","PRIMARY","VoiceRecordDeleteModal","modal","closeModal","params","model","recorderState","useUnit","recorderModel","$voiceRecordState","durationMillis","recorder","getStatus","isRecordingInProgress","VoiceRecorderState","PAUSED","RECORDING","handleDelete","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNativeUi","_reactNative","_effectorReact","_constants","_index","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","FooterButtons","onClose","onDelete","useText","jsxs","View","style","styles","footerContainer","children","jsx","Button","variant","ButtonVariant","TERTIARY","size","ButtonSize","LARGE","onPress","colorScheme","ButtonColor","RED","PRIMARY","VoiceRecordDeleteModal","modal","closeModal","params","model","recorderState","useUnit","recorderModel","$voiceRecordState","durationMillis","recorder","getStatus","isRecordingInProgress","VoiceRecorderState","PAUSED","RECORDING","handleDelete","stopAndDiscard","deleteCurrentRecording","useEffect","pause","record","BaseModal","container","modalContainer","header","content","footer","exports","StyleSheet","create","width","height","flexDirection","alignItems","gap","SPACING"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/modal/VoiceRecordDeleteModal.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,15 +9,16 @@ var _helpers = require("../helpers.js");
|
|
|
9
9
|
var _index = require("../../../shared/translation/index.js");
|
|
10
10
|
var _RecorderModel = require("./Recorder.model.js");
|
|
11
11
|
var _VoiceRecordCollection = require("./VoiceRecordCollection.js");
|
|
12
|
+
var _constants = require("../constants.js");
|
|
12
13
|
class VoiceRecordModel {
|
|
14
|
+
shouldDiscardRecording = false;
|
|
13
15
|
setCurrentKey = (0, _effector.createEvent)();
|
|
14
|
-
setUri = (0, _effector.createEvent)();
|
|
15
16
|
setCurrentRecord = (0, _effector.createEvent)();
|
|
16
17
|
reset = (0, _effector.createEvent)();
|
|
17
18
|
setIsDisabled = (0, _effector.createEvent)();
|
|
19
|
+
startAudioUpload = (0, _effector.createEvent)();
|
|
18
20
|
$currentKey = (0, _effector.restore)(this.setCurrentKey, '');
|
|
19
|
-
$currentRecord = (0, _effector.
|
|
20
|
-
$uri = (0, _effector.restore)(this.setUri, '').reset(this.reset);
|
|
21
|
+
$currentRecord = (0, _effector.restore)(this.setCurrentRecord, null).reset(this.reset);
|
|
21
22
|
$isDisabled = (0, _effector.restore)(this.setIsDisabled, false);
|
|
22
23
|
deleteCurrentRecording = (0, _effector.attach)({
|
|
23
24
|
source: this.$currentKey,
|
|
@@ -55,6 +56,26 @@ class VoiceRecordModel {
|
|
|
55
56
|
}
|
|
56
57
|
return this.recorderModel.start();
|
|
57
58
|
});
|
|
59
|
+
stopAndDiscard = (0, _effector.createEffect)(async () => {
|
|
60
|
+
this.shouldDiscardRecording = true;
|
|
61
|
+
await this.recorderModel.stop();
|
|
62
|
+
this.recorderModel.clearStopResolver();
|
|
63
|
+
this.recorderModel.reset();
|
|
64
|
+
});
|
|
65
|
+
recordingStatusUpdate = status => {
|
|
66
|
+
if (status.error) {
|
|
67
|
+
this.notification.error(`Recorder error: ${status.error}`);
|
|
68
|
+
this.recorderModel.clearStopResolver();
|
|
69
|
+
this.shouldDiscardRecording = false;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (status.isFinished && status.url) {
|
|
73
|
+
if (!this.shouldDiscardRecording) {
|
|
74
|
+
this.startAudioUpload(status.url);
|
|
75
|
+
}
|
|
76
|
+
this.shouldDiscardRecording = false;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
58
79
|
constructor({
|
|
59
80
|
api,
|
|
60
81
|
notification,
|
|
@@ -67,6 +88,8 @@ class VoiceRecordModel {
|
|
|
67
88
|
this.collection = new _VoiceRecordCollection.VoiceRecordsCollection();
|
|
68
89
|
this.setupUploadHandler();
|
|
69
90
|
this.setupCurrentRecordSync();
|
|
91
|
+
this.setupUriSync();
|
|
92
|
+
this.resetActiveRecordingOnProblemSwitch();
|
|
70
93
|
}
|
|
71
94
|
abortUploadIfInProgress(recordingItem) {
|
|
72
95
|
if (!recordingItem?.id && recordingItem?.controller) {
|
|
@@ -110,12 +133,13 @@ class VoiceRecordModel {
|
|
|
110
133
|
uri
|
|
111
134
|
};
|
|
112
135
|
this.collection.add(currentKey, collectionItem);
|
|
136
|
+
this.setCurrentRecord(collectionItem);
|
|
113
137
|
this.recorderModel.resolveStopWithCollectionItem(collectionItem);
|
|
114
138
|
return audioUploadPromise;
|
|
115
139
|
}
|
|
116
140
|
setupUploadHandler() {
|
|
117
141
|
(0, _effector.sample)({
|
|
118
|
-
clock: this.
|
|
142
|
+
clock: this.startAudioUpload,
|
|
119
143
|
source: this.$currentKey,
|
|
120
144
|
filter: (currentKey, uri) => !!uri && !!currentKey,
|
|
121
145
|
fn: (currentKey, uri) => ({
|
|
@@ -131,6 +155,13 @@ class VoiceRecordModel {
|
|
|
131
155
|
}))
|
|
132
156
|
});
|
|
133
157
|
}
|
|
158
|
+
setupUriSync() {
|
|
159
|
+
(0, _effector.sample)({
|
|
160
|
+
source: this.$currentRecord,
|
|
161
|
+
fn: record => record?.uri || '',
|
|
162
|
+
target: (0, _effector.createStore)('').reset(this.reset)
|
|
163
|
+
});
|
|
164
|
+
}
|
|
134
165
|
setupCurrentRecordSync() {
|
|
135
166
|
(0, _effector.sample)({
|
|
136
167
|
source: this.$currentKey,
|
|
@@ -144,12 +175,17 @@ class VoiceRecordModel {
|
|
|
144
175
|
if (recordingItem.durationMs) {
|
|
145
176
|
this.recorderModel.setAudioFileDurationMs(recordingItem.durationMs);
|
|
146
177
|
}
|
|
147
|
-
if (recordingItem.uri) {
|
|
148
|
-
this.setUri(recordingItem.uri);
|
|
149
|
-
}
|
|
150
178
|
})
|
|
151
179
|
});
|
|
152
180
|
}
|
|
181
|
+
resetActiveRecordingOnProblemSwitch() {
|
|
182
|
+
(0, _effector.sample)({
|
|
183
|
+
clock: this.$currentKey,
|
|
184
|
+
source: this.recorderModel.$voiceRecordState,
|
|
185
|
+
filter: state => state === _constants.VoiceRecorderState.RECORDING,
|
|
186
|
+
target: this.stopAndDiscard
|
|
187
|
+
});
|
|
188
|
+
}
|
|
153
189
|
}
|
|
154
190
|
exports.VoiceRecordModel = VoiceRecordModel;
|
|
155
191
|
//# sourceMappingURL=VoiceRecord.model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_effector","require","_helpers","_index","_RecorderModel","_VoiceRecordCollection","VoiceRecordModel","
|
|
1
|
+
{"version":3,"names":["_effector","require","_helpers","_index","_RecorderModel","_VoiceRecordCollection","_constants","VoiceRecordModel","shouldDiscardRecording","setCurrentKey","createEvent","setCurrentRecord","reset","setIsDisabled","startAudioUpload","$currentKey","restore","$currentRecord","$isDisabled","deleteCurrentRecording","attach","source","mapParams","props","currentKey","notification","effect","createEffect","recordingItem","collection","get","abortUploadIfInProgress","resetRecordingState","info","t","initializeRecording","hasPermissions","ensureRecordingPermissions","error","inputs","getAvailableInputs","recorderModel","recorder","setAvailableInputs","length","start","stopAndDiscard","stop","clearStopResolver","recordingStatusUpdate","status","isFinished","url","constructor","api","events","RecorderModel","VoiceRecordsCollection","setupUploadHandler","setupCurrentRecordSync","setupUriSync","resetActiveRecordingOnProblemSwitch","id","controller","abort","delete","handleAudioUpload","uri","durationMs","getAudioDurationMs","formData","generateAudioFormData","audioFileUri","uploadAudio","uploadAudioFileRequestGenerator","audioUploadPromise","then","data","update","catch","name","collectionItem","add","resolveStopWithCollectionItem","sample","clock","filter","fn","target","record","createStore","setAudioFileDurationMs","$voiceRecordState","state","VoiceRecorderState","RECORDING","exports"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/VoiceRecord.model.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -19,9 +19,9 @@ export const VoiceRecord = ({
|
|
|
19
19
|
const {
|
|
20
20
|
recorderState
|
|
21
21
|
} = useVoiceRecorder(model);
|
|
22
|
-
const [isRecording,
|
|
22
|
+
const [isRecording, currentRecord] = useUnit([model.recorderModel.$voiceRecordState, model.$currentRecord]);
|
|
23
23
|
const isDisabled = useUnit(model.$isDisabled);
|
|
24
|
-
const isExpanded = !!(isRecording ||
|
|
24
|
+
const isExpanded = !!(isRecording || currentRecord);
|
|
25
25
|
const {
|
|
26
26
|
containerAnimatedStyle
|
|
27
27
|
} = useVoiceRecorderAnimation(isExpanded);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["StyleSheet","VoiceRecordButton","React","useEffect","COLORS","SPACING","VoiceRecordDeleteButton","VoiceRecordDevider","VoiceRecordTimer","Animated","FadeIn","FadeOut","useVoiceRecorder","useVoiceRecorderAnimation","useUnit","jsx","_jsx","jsxs","_jsxs","VoiceRecord","style","model","recorderState","isRecording","
|
|
1
|
+
{"version":3,"names":["StyleSheet","VoiceRecordButton","React","useEffect","COLORS","SPACING","VoiceRecordDeleteButton","VoiceRecordDevider","VoiceRecordTimer","Animated","FadeIn","FadeOut","useVoiceRecorder","useVoiceRecorderAnimation","useUnit","jsx","_jsx","jsxs","_jsxs","VoiceRecord","style","model","recorderState","isRecording","currentRecord","recorderModel","$voiceRecordState","$currentRecord","isDisabled","$isDisabled","isExpanded","containerAnimatedStyle","cleanup","recorder","getStatus","stop","reset","View","styles","container","children","entering","exiting","expendedContainer","timer","recordingFileDurationMs","durationMillis","onPress","events","deleteRecord","create","alignItems","padding","paddingBottom","backgroundColor","NEUTRAL_3","borderRadius","boxShadow","overflow","marginTop"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/components/VoiceRecord.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -8,17 +8,8 @@ import { VOICE_RECORDER_MAX_DURATION_MS, VoiceRecorderState } from "../constants
|
|
|
8
8
|
import { useUnit } from 'effector-react';
|
|
9
9
|
export const useVoiceRecorder = model => {
|
|
10
10
|
const player = useAudioPlayer();
|
|
11
|
-
const
|
|
12
|
-
const recorder = useAudioRecorder(RecordingPresets.LOW_QUALITY,
|
|
13
|
-
if (status.error) {
|
|
14
|
-
model.notification.error(`Recorder error: ${status.error}`);
|
|
15
|
-
model.recorderModel.clearStopResolver();
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
if (status.isFinished && status.url) {
|
|
19
|
-
model.setUri(status.url);
|
|
20
|
-
}
|
|
21
|
-
});
|
|
11
|
+
const currentRecord = useUnit(model.$currentRecord);
|
|
12
|
+
const recorder = useAudioRecorder(RecordingPresets.LOW_QUALITY, model.recordingStatusUpdate);
|
|
22
13
|
const recorderState = useAudioRecorderState(recorder);
|
|
23
14
|
useEffect(() => {
|
|
24
15
|
if (recorderState.durationMillis >= VOICE_RECORDER_MAX_DURATION_MS && recorderState.isRecording) {
|
|
@@ -39,14 +30,14 @@ export const useVoiceRecorder = model => {
|
|
|
39
30
|
return removeListener;
|
|
40
31
|
}, []);
|
|
41
32
|
useEffect(() => {
|
|
42
|
-
if (
|
|
33
|
+
if (currentRecord?.uri) {
|
|
43
34
|
const getDuration = async () => {
|
|
44
|
-
const durationMs = await getAudioDurationMs(
|
|
35
|
+
const durationMs = await getAudioDurationMs(currentRecord.uri, player);
|
|
45
36
|
model.recorderModel.setAudioFileDurationMs(durationMs || 0);
|
|
46
37
|
};
|
|
47
38
|
getDuration();
|
|
48
39
|
}
|
|
49
|
-
}, [
|
|
40
|
+
}, [currentRecord?.uri]);
|
|
50
41
|
useEffect(() => {
|
|
51
42
|
if (recorderState.isRecording) {
|
|
52
43
|
model.recorderModel.setVoiceRecordState(VoiceRecorderState.RECORDING);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RecordingPresets","useAudioPlayer","useAudioRecorder","useAudioRecorderState","addAudioInputsListenerWeb","getAudioDurationMs","getAvailableInputs","useEffect","IS_WEB","VOICE_RECORDER_MAX_DURATION_MS","VoiceRecorderState","useUnit","useVoiceRecorder","model","player","
|
|
1
|
+
{"version":3,"names":["RecordingPresets","useAudioPlayer","useAudioRecorder","useAudioRecorderState","addAudioInputsListenerWeb","getAudioDurationMs","getAvailableInputs","useEffect","IS_WEB","VOICE_RECORDER_MAX_DURATION_MS","VoiceRecorderState","useUnit","useVoiceRecorder","model","player","currentRecord","$currentRecord","recorder","LOW_QUALITY","recordingStatusUpdate","recorderState","durationMillis","isRecording","recorderModel","stop","then","inputs","setAvailableInputs","removeListener","devices","uri","getDuration","durationMs","setAudioFileDurationMs","setVoiceRecordState","RECORDING","PAUSED","IDLE","reset"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorder.ts"],"mappings":";;AAAA,SACEA,gBAAgB,EAChBC,cAAc,EACdC,gBAAgB,EAChBC,qBAAqB,QAChB,YAAY;AACnB,SAASC,yBAAyB,EAAEC,kBAAkB,EAAEC,kBAAkB,QAAQ,eAAY;AAE9F,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SAASC,8BAA8B,EAAEC,kBAAkB,QAAQ,iBAAc;AACjF,SAASC,OAAO,QAAQ,gBAAgB;AAExC,OAAO,MAAMC,gBAAgB,GAAIC,KAAuB,IAAK;EAC3D,MAAMC,MAAM,GAAGb,cAAc,CAAC,CAAC;EAC/B,MAAMc,aAAa,GAAGJ,OAAO,CAACE,KAAK,CAACG,cAAc,CAAC;EAEnD,MAAMC,QAAQ,GAAGf,gBAAgB,CAACF,gBAAgB,CAACkB,WAAW,EAAEL,KAAK,CAACM,qBAAqB,CAAC;EAC5F,MAAMC,aAAa,GAAGjB,qBAAqB,CAACc,QAAQ,CAAC;EAErDV,SAAS,CAAC,MAAM;IACd,IACEa,aAAa,CAACC,cAAc,IAAIZ,8BAA8B,IAC9DW,aAAa,CAACE,WAAW,EACzB;MACAT,KAAK,CAACU,aAAa,CAACC,IAAI,CAAC,CAAC;IAC5B;EACF,CAAC,EAAE,CAACJ,aAAa,CAACC,cAAc,CAAC,CAAC;EAElCd,SAAS,CAAC,MAAM;IACd,IAAI,CAACC,MAAM,EAAE;MACX;MACAF,kBAAkB,CAACW,QAAQ,CAAC,CAACQ,IAAI,CAAEC,MAAM,IAAK;QAC5Cb,KAAK,CAACU,aAAa,CAACI,kBAAkB,CAACD,MAAM,CAAC;MAChD,CAAC,CAAC;MACF;IACF;IAEA,MAAME,cAAc,GAAGxB,yBAAyB,CAAEyB,OAAO,IAAK;MAC5DhB,KAAK,CAACU,aAAa,CAACI,kBAAkB,CAACE,OAAO,CAAC;IACjD,CAAC,CAAC;IAEF,OAAOD,cAAc;EACvB,CAAC,EAAE,EAAE,CAAC;EAENrB,SAAS,CAAC,MAAM;IACd,IAAIQ,aAAa,EAAEe,GAAG,EAAE;MACtB,MAAMC,WAAW,GAAG,MAAAA,CAAA,KAAY;QAC9B,MAAMC,UAAU,GAAG,MAAM3B,kBAAkB,CAACU,aAAa,CAACe,GAAG,EAAGhB,MAAM,CAAC;QACvED,KAAK,CAACU,aAAa,CAACU,sBAAsB,CAACD,UAAU,IAAI,CAAC,CAAC;MAC7D,CAAC;MACDD,WAAW,CAAC,CAAC;IACf;EACF,CAAC,EAAE,CAAChB,aAAa,EAAEe,GAAG,CAAC,CAAC;EAExBvB,SAAS,CAAC,MAAM;IACd,IAAIa,aAAa,CAACE,WAAW,EAAE;MAC7BT,KAAK,CAACU,aAAa,CAACW,mBAAmB,CAACxB,kBAAkB,CAACyB,SAAS,CAAC;MACrE;IACF;IACA,IAAIf,aAAa,CAACC,cAAc,GAAG,CAAC,EAAE;MACpCR,KAAK,CAACU,aAAa,CAACW,mBAAmB,CAACxB,kBAAkB,CAAC0B,MAAM,CAAC;MAClE;IACF;IACAvB,KAAK,CAACU,aAAa,CAACW,mBAAmB,CAACxB,kBAAkB,CAAC2B,IAAI,CAAC;IAEhE,OAAO,MAAM;MACXxB,KAAK,CAACU,aAAa,CAACe,KAAK,CAAC,CAAC;IAC7B,CAAC;EACH,CAAC,EAAE,CAAClB,aAAa,CAAC,CAAC;EAEnBb,SAAS,CAAC,MAAM;IACdM,KAAK,CAACU,aAAa,CAACN,QAAQ,GAAGA,QAAQ;EACzC,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,OAAO;IAAEG;EAAc,CAAC;AAC1B,CAAC","ignoreList":[]}
|
|
@@ -45,7 +45,7 @@ export const VoiceRecordDeleteModal = ({
|
|
|
45
45
|
const isRecordingInProgress = (recorderState === VoiceRecorderState.PAUSED || recorderState === VoiceRecorderState.RECORDING) && durationMillis > 0;
|
|
46
46
|
const handleDelete = async () => {
|
|
47
47
|
if (isRecordingInProgress) {
|
|
48
|
-
await model.
|
|
48
|
+
await model.stopAndDiscard();
|
|
49
49
|
}
|
|
50
50
|
model.deleteCurrentRecording();
|
|
51
51
|
closeModal();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","BaseModal","Button","ButtonColor","ButtonSize","ButtonVariant","SPACING","View","StyleSheet","useUnit","VoiceRecorderState","useText","jsx","_jsx","jsxs","_jsxs","FooterButtons","onClose","onDelete","t","style","styles","footerContainer","children","variant","TERTIARY","size","LARGE","onPress","colorScheme","RED","PRIMARY","VoiceRecordDeleteModal","modal","closeModal","params","model","recorderState","recorderModel","$voiceRecordState","durationMillis","recorder","getStatus","isRecordingInProgress","PAUSED","RECORDING","handleDelete","
|
|
1
|
+
{"version":3,"names":["React","useEffect","BaseModal","Button","ButtonColor","ButtonSize","ButtonVariant","SPACING","View","StyleSheet","useUnit","VoiceRecorderState","useText","jsx","_jsx","jsxs","_jsxs","FooterButtons","onClose","onDelete","t","style","styles","footerContainer","children","variant","TERTIARY","size","LARGE","onPress","colorScheme","RED","PRIMARY","VoiceRecordDeleteModal","modal","closeModal","params","model","recorderState","recorderModel","$voiceRecordState","durationMillis","recorder","getStatus","isRecordingInProgress","PAUSED","RECORDING","handleDelete","stopAndDiscard","deleteCurrentRecording","pause","record","container","modalContainer","header","content","footer","create","width","height","flexDirection","alignItems","gap"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/modal/VoiceRecordDeleteModal.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,15 +5,16 @@ import { ensureRecordingPermissions, generateAudioFormData, getAudioDurationMs,
|
|
|
5
5
|
import { t } from "../../../shared/translation/index.js";
|
|
6
6
|
import { RecorderModel } from "./Recorder.model.js";
|
|
7
7
|
import { VoiceRecordsCollection } from "./VoiceRecordCollection.js";
|
|
8
|
+
import { VoiceRecorderState } from "../constants.js";
|
|
8
9
|
export class VoiceRecordModel {
|
|
10
|
+
shouldDiscardRecording = false;
|
|
9
11
|
setCurrentKey = createEvent();
|
|
10
|
-
setUri = createEvent();
|
|
11
12
|
setCurrentRecord = createEvent();
|
|
12
13
|
reset = createEvent();
|
|
13
14
|
setIsDisabled = createEvent();
|
|
15
|
+
startAudioUpload = createEvent();
|
|
14
16
|
$currentKey = restore(this.setCurrentKey, '');
|
|
15
|
-
$currentRecord =
|
|
16
|
-
$uri = restore(this.setUri, '').reset(this.reset);
|
|
17
|
+
$currentRecord = restore(this.setCurrentRecord, null).reset(this.reset);
|
|
17
18
|
$isDisabled = restore(this.setIsDisabled, false);
|
|
18
19
|
deleteCurrentRecording = attach({
|
|
19
20
|
source: this.$currentKey,
|
|
@@ -51,6 +52,26 @@ export class VoiceRecordModel {
|
|
|
51
52
|
}
|
|
52
53
|
return this.recorderModel.start();
|
|
53
54
|
});
|
|
55
|
+
stopAndDiscard = createEffect(async () => {
|
|
56
|
+
this.shouldDiscardRecording = true;
|
|
57
|
+
await this.recorderModel.stop();
|
|
58
|
+
this.recorderModel.clearStopResolver();
|
|
59
|
+
this.recorderModel.reset();
|
|
60
|
+
});
|
|
61
|
+
recordingStatusUpdate = status => {
|
|
62
|
+
if (status.error) {
|
|
63
|
+
this.notification.error(`Recorder error: ${status.error}`);
|
|
64
|
+
this.recorderModel.clearStopResolver();
|
|
65
|
+
this.shouldDiscardRecording = false;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (status.isFinished && status.url) {
|
|
69
|
+
if (!this.shouldDiscardRecording) {
|
|
70
|
+
this.startAudioUpload(status.url);
|
|
71
|
+
}
|
|
72
|
+
this.shouldDiscardRecording = false;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
54
75
|
constructor({
|
|
55
76
|
api,
|
|
56
77
|
notification,
|
|
@@ -63,6 +84,8 @@ export class VoiceRecordModel {
|
|
|
63
84
|
this.collection = new VoiceRecordsCollection();
|
|
64
85
|
this.setupUploadHandler();
|
|
65
86
|
this.setupCurrentRecordSync();
|
|
87
|
+
this.setupUriSync();
|
|
88
|
+
this.resetActiveRecordingOnProblemSwitch();
|
|
66
89
|
}
|
|
67
90
|
abortUploadIfInProgress(recordingItem) {
|
|
68
91
|
if (!recordingItem?.id && recordingItem?.controller) {
|
|
@@ -106,12 +129,13 @@ export class VoiceRecordModel {
|
|
|
106
129
|
uri
|
|
107
130
|
};
|
|
108
131
|
this.collection.add(currentKey, collectionItem);
|
|
132
|
+
this.setCurrentRecord(collectionItem);
|
|
109
133
|
this.recorderModel.resolveStopWithCollectionItem(collectionItem);
|
|
110
134
|
return audioUploadPromise;
|
|
111
135
|
}
|
|
112
136
|
setupUploadHandler() {
|
|
113
137
|
sample({
|
|
114
|
-
clock: this.
|
|
138
|
+
clock: this.startAudioUpload,
|
|
115
139
|
source: this.$currentKey,
|
|
116
140
|
filter: (currentKey, uri) => !!uri && !!currentKey,
|
|
117
141
|
fn: (currentKey, uri) => ({
|
|
@@ -127,6 +151,13 @@ export class VoiceRecordModel {
|
|
|
127
151
|
}))
|
|
128
152
|
});
|
|
129
153
|
}
|
|
154
|
+
setupUriSync() {
|
|
155
|
+
sample({
|
|
156
|
+
source: this.$currentRecord,
|
|
157
|
+
fn: record => record?.uri || '',
|
|
158
|
+
target: createStore('').reset(this.reset)
|
|
159
|
+
});
|
|
160
|
+
}
|
|
130
161
|
setupCurrentRecordSync() {
|
|
131
162
|
sample({
|
|
132
163
|
source: this.$currentKey,
|
|
@@ -140,11 +171,16 @@ export class VoiceRecordModel {
|
|
|
140
171
|
if (recordingItem.durationMs) {
|
|
141
172
|
this.recorderModel.setAudioFileDurationMs(recordingItem.durationMs);
|
|
142
173
|
}
|
|
143
|
-
if (recordingItem.uri) {
|
|
144
|
-
this.setUri(recordingItem.uri);
|
|
145
|
-
}
|
|
146
174
|
})
|
|
147
175
|
});
|
|
148
176
|
}
|
|
177
|
+
resetActiveRecordingOnProblemSwitch() {
|
|
178
|
+
sample({
|
|
179
|
+
clock: this.$currentKey,
|
|
180
|
+
source: this.recorderModel.$voiceRecordState,
|
|
181
|
+
filter: state => state === VoiceRecorderState.RECORDING,
|
|
182
|
+
target: this.stopAndDiscard
|
|
183
|
+
});
|
|
184
|
+
}
|
|
149
185
|
}
|
|
150
186
|
//# sourceMappingURL=VoiceRecord.model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["attach","createEffect","createEvent","createStore","restore","sample","ensureRecordingPermissions","generateAudioFormData","getAudioDurationMs","getAvailableInputs","uploadAudioFileRequestGenerator","t","RecorderModel","VoiceRecordsCollection","VoiceRecordModel","
|
|
1
|
+
{"version":3,"names":["attach","createEffect","createEvent","createStore","restore","sample","ensureRecordingPermissions","generateAudioFormData","getAudioDurationMs","getAvailableInputs","uploadAudioFileRequestGenerator","t","RecorderModel","VoiceRecordsCollection","VoiceRecorderState","VoiceRecordModel","shouldDiscardRecording","setCurrentKey","setCurrentRecord","reset","setIsDisabled","startAudioUpload","$currentKey","$currentRecord","$isDisabled","deleteCurrentRecording","source","mapParams","props","currentKey","notification","effect","recordingItem","collection","get","abortUploadIfInProgress","resetRecordingState","info","initializeRecording","hasPermissions","error","inputs","recorderModel","recorder","setAvailableInputs","length","start","stopAndDiscard","stop","clearStopResolver","recordingStatusUpdate","status","isFinished","url","constructor","api","events","setupUploadHandler","setupCurrentRecordSync","setupUriSync","resetActiveRecordingOnProblemSwitch","id","controller","abort","delete","handleAudioUpload","uri","durationMs","formData","audioFileUri","uploadAudio","audioUploadPromise","then","data","update","catch","name","collectionItem","add","resolveStopWithCollectionItem","clock","filter","fn","target","record","setAudioFileDurationMs","$voiceRecordState","state","RECORDING"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/VoiceRecord.model.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceRecord.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/components/VoiceRecord.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAc,MAAM,cAAc,CAAA;AAE/D,OAAO,KAAoB,MAAM,OAAO,CAAA;AAMxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAK7D,KAAK,gBAAgB,GAAG;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAC5B,KAAK,EAAE,gBAAgB,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,WAAW,qBAAsB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"VoiceRecord.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/components/VoiceRecord.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAc,MAAM,cAAc,CAAA;AAE/D,OAAO,KAAoB,MAAM,OAAO,CAAA;AAMxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAK7D,KAAK,gBAAgB,GAAG;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAC5B,KAAK,EAAE,gBAAgB,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,WAAW,qBAAsB,gBAAgB,sBA0C7D,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAM7D,eAAO,MAAM,gBAAgB,UAAW,gBAAgB;;
|
|
1
|
+
{"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAM7D,eAAO,MAAM,gBAAgB,UAAW,gBAAgB;;CA+DvD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceRecordDeleteModal.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/modal/VoiceRecordDeleteModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAWxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAI7D,KAAK,oCAAoC,GAAG;IAC1C,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,IAAI,CAAA;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,gBAAgB,CAAA;SACxB,CAAA;KACF,CAAA;CACF,CAAA;AA2BD,eAAO,MAAM,sBAAsB,uCAEhC,oCAAoC,
|
|
1
|
+
{"version":3,"file":"VoiceRecordDeleteModal.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/modal/VoiceRecordDeleteModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAWxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAI7D,KAAK,oCAAoC,GAAG;IAC1C,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,IAAI,CAAA;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,gBAAgB,CAAA;SACxB,CAAA;KACF,CAAA;CACF,CAAA;AA2BD,eAAO,MAAM,sBAAsB,uCAEhC,oCAAoC,sBA2CtC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AudioApi, VoiceRecordNotificationTypes
|
|
1
|
+
import { AudioApi, VoiceRecordNotificationTypes } from '../types';
|
|
2
2
|
import { RecorderModel } from './Recorder.model';
|
|
3
3
|
import { VoiceRecordsCollection } from './VoiceRecordCollection';
|
|
4
4
|
type VoiceRecordModelParams = {
|
|
@@ -19,23 +19,27 @@ export declare class VoiceRecordModel {
|
|
|
19
19
|
readonly api: AudioApi;
|
|
20
20
|
readonly notification: VoiceRecordNotificationTypes;
|
|
21
21
|
readonly events: VoiceRecordEvents;
|
|
22
|
+
private shouldDiscardRecording;
|
|
22
23
|
readonly setCurrentKey: import("effector").EventCallable<string>;
|
|
23
|
-
readonly setUri: import("effector").EventCallable<string>;
|
|
24
24
|
readonly setCurrentRecord: import("effector").EventCallable<any>;
|
|
25
25
|
readonly reset: import("effector").EventCallable<void>;
|
|
26
26
|
readonly setIsDisabled: import("effector").EventCallable<boolean>;
|
|
27
|
+
readonly startAudioUpload: import("effector").EventCallable<string>;
|
|
27
28
|
readonly $currentKey: import("effector").StoreWritable<string>;
|
|
28
|
-
readonly $currentRecord: import("effector").StoreWritable<
|
|
29
|
-
readonly $uri: import("effector").StoreWritable<string>;
|
|
29
|
+
readonly $currentRecord: import("effector").StoreWritable<any>;
|
|
30
30
|
readonly $isDisabled: import("effector").StoreWritable<boolean>;
|
|
31
31
|
readonly deleteCurrentRecording: import("effector").Effect<void | DeleteCurrentRecordingProps, void, Error>;
|
|
32
32
|
readonly initializeRecording: import("effector").Effect<void, void, Error>;
|
|
33
|
+
readonly stopAndDiscard: import("effector").Effect<void, void, Error>;
|
|
34
|
+
readonly recordingStatusUpdate: (status: any) => void;
|
|
33
35
|
constructor({ api, notification, events }: VoiceRecordModelParams);
|
|
34
36
|
private abortUploadIfInProgress;
|
|
35
37
|
private resetRecordingState;
|
|
36
38
|
private handleAudioUpload;
|
|
37
39
|
private setupUploadHandler;
|
|
40
|
+
private setupUriSync;
|
|
38
41
|
private setupCurrentRecordSync;
|
|
42
|
+
private resetActiveRecordingOnProblemSwitch;
|
|
39
43
|
}
|
|
40
44
|
export {};
|
|
41
45
|
//# sourceMappingURL=VoiceRecord.model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceRecord.model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/model/VoiceRecord.model.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,4BAA4B,
|
|
1
|
+
{"version":3,"file":"VoiceRecord.model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/model/VoiceRecord.model.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,4BAA4B,EAA6B,MAAM,UAAU,CAAA;AAE5F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAGhE,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,QAAQ,CAAA;IACb,YAAY,EAAE,4BAA4B,CAAA;IAC1C,MAAM,EAAE,iBAAiB,CAAA;CAC1B,CAAA;AAOD,KAAK,iBAAiB,GAAG;IACvB,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,IAAI,CAAA;CACvB,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAMD,qBAAa,gBAAgB;IAC3B,SAAgB,aAAa,EAAE,aAAa,CAAA;IAC5C,SAAgB,UAAU,EAAE,sBAAsB,CAAA;IAClD,SAAgB,GAAG,EAAE,QAAQ,CAAA;IAC7B,SAAgB,YAAY,EAAE,4BAA4B,CAAA;IAC1D,SAAgB,MAAM,EAAE,iBAAiB,CAAA;IACzC,OAAO,CAAC,sBAAsB,CAAQ;IAEtC,SAAgB,aAAa,2CAAwB;IACrD,SAAgB,gBAAgB,wCAAqB;IACrD,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,aAAa,4CAAyB;IACtD,SAAgB,gBAAgB,2CAAwB;IAExD,SAAgB,WAAW,2CAAkC;IAC7D,SAAgB,cAAc,wCAAyD;IAEvF,SAAgB,WAAW,4CAAqC;IAEhE,SAAgB,sBAAsB,6EAiBpC;IAEF,SAAgB,mBAAmB,+CAkBjC;IAEF,SAAgB,cAAc,+CAK5B;IAEF,SAAgB,qBAAqB,WAAY,GAAG,UAanD;gBAEW,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,sBAAsB;IAajE,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,mBAAmB;YAMb,iBAAiB;IAgC/B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,mCAAmC;CAQ5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceRecord.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/components/VoiceRecord.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAc,MAAM,cAAc,CAAA;AAE/D,OAAO,KAAoB,MAAM,OAAO,CAAA;AAMxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAK7D,KAAK,gBAAgB,GAAG;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAC5B,KAAK,EAAE,gBAAgB,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,WAAW,qBAAsB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"VoiceRecord.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/components/VoiceRecord.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAc,MAAM,cAAc,CAAA;AAE/D,OAAO,KAAoB,MAAM,OAAO,CAAA;AAMxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAK7D,KAAK,gBAAgB,GAAG;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAC5B,KAAK,EAAE,gBAAgB,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,WAAW,qBAAsB,gBAAgB,sBA0C7D,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAM7D,eAAO,MAAM,gBAAgB,UAAW,gBAAgB;;
|
|
1
|
+
{"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAM7D,eAAO,MAAM,gBAAgB,UAAW,gBAAgB;;CA+DvD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceRecordDeleteModal.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/modal/VoiceRecordDeleteModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAWxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAI7D,KAAK,oCAAoC,GAAG;IAC1C,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,IAAI,CAAA;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,gBAAgB,CAAA;SACxB,CAAA;KACF,CAAA;CACF,CAAA;AA2BD,eAAO,MAAM,sBAAsB,uCAEhC,oCAAoC,
|
|
1
|
+
{"version":3,"file":"VoiceRecordDeleteModal.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/modal/VoiceRecordDeleteModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAWxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAI7D,KAAK,oCAAoC,GAAG;IAC1C,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,IAAI,CAAA;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,gBAAgB,CAAA;SACxB,CAAA;KACF,CAAA;CACF,CAAA;AA2BD,eAAO,MAAM,sBAAsB,uCAEhC,oCAAoC,sBA2CtC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AudioApi, VoiceRecordNotificationTypes
|
|
1
|
+
import { AudioApi, VoiceRecordNotificationTypes } from '../types';
|
|
2
2
|
import { RecorderModel } from './Recorder.model';
|
|
3
3
|
import { VoiceRecordsCollection } from './VoiceRecordCollection';
|
|
4
4
|
type VoiceRecordModelParams = {
|
|
@@ -19,23 +19,27 @@ export declare class VoiceRecordModel {
|
|
|
19
19
|
readonly api: AudioApi;
|
|
20
20
|
readonly notification: VoiceRecordNotificationTypes;
|
|
21
21
|
readonly events: VoiceRecordEvents;
|
|
22
|
+
private shouldDiscardRecording;
|
|
22
23
|
readonly setCurrentKey: import("effector").EventCallable<string>;
|
|
23
|
-
readonly setUri: import("effector").EventCallable<string>;
|
|
24
24
|
readonly setCurrentRecord: import("effector").EventCallable<any>;
|
|
25
25
|
readonly reset: import("effector").EventCallable<void>;
|
|
26
26
|
readonly setIsDisabled: import("effector").EventCallable<boolean>;
|
|
27
|
+
readonly startAudioUpload: import("effector").EventCallable<string>;
|
|
27
28
|
readonly $currentKey: import("effector").StoreWritable<string>;
|
|
28
|
-
readonly $currentRecord: import("effector").StoreWritable<
|
|
29
|
-
readonly $uri: import("effector").StoreWritable<string>;
|
|
29
|
+
readonly $currentRecord: import("effector").StoreWritable<any>;
|
|
30
30
|
readonly $isDisabled: import("effector").StoreWritable<boolean>;
|
|
31
31
|
readonly deleteCurrentRecording: import("effector").Effect<void | DeleteCurrentRecordingProps, void, Error>;
|
|
32
32
|
readonly initializeRecording: import("effector").Effect<void, void, Error>;
|
|
33
|
+
readonly stopAndDiscard: import("effector").Effect<void, void, Error>;
|
|
34
|
+
readonly recordingStatusUpdate: (status: any) => void;
|
|
33
35
|
constructor({ api, notification, events }: VoiceRecordModelParams);
|
|
34
36
|
private abortUploadIfInProgress;
|
|
35
37
|
private resetRecordingState;
|
|
36
38
|
private handleAudioUpload;
|
|
37
39
|
private setupUploadHandler;
|
|
40
|
+
private setupUriSync;
|
|
38
41
|
private setupCurrentRecordSync;
|
|
42
|
+
private resetActiveRecordingOnProblemSwitch;
|
|
39
43
|
}
|
|
40
44
|
export {};
|
|
41
45
|
//# sourceMappingURL=VoiceRecord.model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceRecord.model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/model/VoiceRecord.model.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,4BAA4B,
|
|
1
|
+
{"version":3,"file":"VoiceRecord.model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/model/VoiceRecord.model.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,4BAA4B,EAA6B,MAAM,UAAU,CAAA;AAE5F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAGhE,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,QAAQ,CAAA;IACb,YAAY,EAAE,4BAA4B,CAAA;IAC1C,MAAM,EAAE,iBAAiB,CAAA;CAC1B,CAAA;AAOD,KAAK,iBAAiB,GAAG;IACvB,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,IAAI,CAAA;CACvB,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAMD,qBAAa,gBAAgB;IAC3B,SAAgB,aAAa,EAAE,aAAa,CAAA;IAC5C,SAAgB,UAAU,EAAE,sBAAsB,CAAA;IAClD,SAAgB,GAAG,EAAE,QAAQ,CAAA;IAC7B,SAAgB,YAAY,EAAE,4BAA4B,CAAA;IAC1D,SAAgB,MAAM,EAAE,iBAAiB,CAAA;IACzC,OAAO,CAAC,sBAAsB,CAAQ;IAEtC,SAAgB,aAAa,2CAAwB;IACrD,SAAgB,gBAAgB,wCAAqB;IACrD,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,aAAa,4CAAyB;IACtD,SAAgB,gBAAgB,2CAAwB;IAExD,SAAgB,WAAW,2CAAkC;IAC7D,SAAgB,cAAc,wCAAyD;IAEvF,SAAgB,WAAW,4CAAqC;IAEhE,SAAgB,sBAAsB,6EAiBpC;IAEF,SAAgB,mBAAmB,+CAkBjC;IAEF,SAAgB,cAAc,+CAK5B;IAEF,SAAgB,qBAAqB,WAAY,GAAG,UAanD;gBAEW,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,sBAAsB;IAajE,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,mBAAmB;YAMb,iBAAiB;IAgC/B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,mCAAmC;CAQ5C"}
|
package/package.json
CHANGED
|
@@ -18,10 +18,14 @@ type VoiceRecordProps = {
|
|
|
18
18
|
|
|
19
19
|
export const VoiceRecord = ({ style, model }: VoiceRecordProps) => {
|
|
20
20
|
const { recorderState } = useVoiceRecorder(model)
|
|
21
|
-
const [isRecording,
|
|
21
|
+
const [isRecording, currentRecord] = useUnit([
|
|
22
|
+
model.recorderModel.$voiceRecordState,
|
|
23
|
+
model.$currentRecord,
|
|
24
|
+
])
|
|
25
|
+
|
|
22
26
|
const isDisabled = useUnit(model.$isDisabled)
|
|
23
27
|
|
|
24
|
-
const isExpanded = !!(isRecording ||
|
|
28
|
+
const isExpanded = !!(isRecording || currentRecord)
|
|
25
29
|
|
|
26
30
|
const { containerAnimatedStyle } = useVoiceRecorderAnimation(isExpanded)
|
|
27
31
|
|
|
@@ -13,18 +13,9 @@ import { useUnit } from 'effector-react'
|
|
|
13
13
|
|
|
14
14
|
export const useVoiceRecorder = (model: VoiceRecordModel) => {
|
|
15
15
|
const player = useAudioPlayer()
|
|
16
|
-
const
|
|
16
|
+
const currentRecord = useUnit(model.$currentRecord)
|
|
17
17
|
|
|
18
|
-
const recorder = useAudioRecorder(RecordingPresets.LOW_QUALITY,
|
|
19
|
-
if (status.error) {
|
|
20
|
-
model.notification.error(`Recorder error: ${status.error}`)
|
|
21
|
-
model.recorderModel.clearStopResolver()
|
|
22
|
-
return
|
|
23
|
-
}
|
|
24
|
-
if (status.isFinished && status.url) {
|
|
25
|
-
model.setUri(status.url)
|
|
26
|
-
}
|
|
27
|
-
})
|
|
18
|
+
const recorder = useAudioRecorder(RecordingPresets.LOW_QUALITY, model.recordingStatusUpdate)
|
|
28
19
|
const recorderState = useAudioRecorderState(recorder)
|
|
29
20
|
|
|
30
21
|
useEffect(() => {
|
|
@@ -53,14 +44,14 @@ export const useVoiceRecorder = (model: VoiceRecordModel) => {
|
|
|
53
44
|
}, [])
|
|
54
45
|
|
|
55
46
|
useEffect(() => {
|
|
56
|
-
if (
|
|
47
|
+
if (currentRecord?.uri) {
|
|
57
48
|
const getDuration = async () => {
|
|
58
|
-
const durationMs = await getAudioDurationMs(
|
|
49
|
+
const durationMs = await getAudioDurationMs(currentRecord.uri!, player)
|
|
59
50
|
model.recorderModel.setAudioFileDurationMs(durationMs || 0)
|
|
60
51
|
}
|
|
61
52
|
getDuration()
|
|
62
53
|
}
|
|
63
|
-
}, [
|
|
54
|
+
}, [currentRecord?.uri])
|
|
64
55
|
|
|
65
56
|
useEffect(() => {
|
|
66
57
|
if (recorderState.isRecording) {
|
|
@@ -10,6 +10,7 @@ import { AudioApi, VoiceRecordNotificationTypes, VoiceRecordCollectionItem } fro
|
|
|
10
10
|
import { t } from '../../../shared/translation'
|
|
11
11
|
import { RecorderModel } from './Recorder.model'
|
|
12
12
|
import { VoiceRecordsCollection } from './VoiceRecordCollection'
|
|
13
|
+
import { VoiceRecorderState } from '../constants'
|
|
13
14
|
|
|
14
15
|
type VoiceRecordModelParams = {
|
|
15
16
|
api: AudioApi
|
|
@@ -41,18 +42,16 @@ export class VoiceRecordModel {
|
|
|
41
42
|
public readonly api: AudioApi
|
|
42
43
|
public readonly notification: VoiceRecordNotificationTypes
|
|
43
44
|
public readonly events: VoiceRecordEvents
|
|
45
|
+
private shouldDiscardRecording = false
|
|
44
46
|
|
|
45
47
|
public readonly setCurrentKey = createEvent<string>()
|
|
46
|
-
public readonly setUri = createEvent<string>()
|
|
47
48
|
public readonly setCurrentRecord = createEvent<any>()
|
|
48
49
|
public readonly reset = createEvent()
|
|
49
50
|
public readonly setIsDisabled = createEvent<boolean>()
|
|
51
|
+
public readonly startAudioUpload = createEvent<string>()
|
|
50
52
|
|
|
51
53
|
public readonly $currentKey = restore(this.setCurrentKey, '')
|
|
52
|
-
public readonly $currentRecord =
|
|
53
|
-
this.reset,
|
|
54
|
-
)
|
|
55
|
-
public readonly $uri = restore(this.setUri, '').reset(this.reset)
|
|
54
|
+
public readonly $currentRecord = restore(this.setCurrentRecord, null).reset(this.reset)
|
|
56
55
|
|
|
57
56
|
public readonly $isDisabled = restore(this.setIsDisabled, false)
|
|
58
57
|
|
|
@@ -95,6 +94,28 @@ export class VoiceRecordModel {
|
|
|
95
94
|
return this.recorderModel.start()
|
|
96
95
|
})
|
|
97
96
|
|
|
97
|
+
public readonly stopAndDiscard = createEffect(async () => {
|
|
98
|
+
this.shouldDiscardRecording = true
|
|
99
|
+
await this.recorderModel.stop()
|
|
100
|
+
this.recorderModel.clearStopResolver()
|
|
101
|
+
this.recorderModel.reset()
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
public readonly recordingStatusUpdate = (status: any) => {
|
|
105
|
+
if (status.error) {
|
|
106
|
+
this.notification.error(`Recorder error: ${status.error}`)
|
|
107
|
+
this.recorderModel.clearStopResolver()
|
|
108
|
+
this.shouldDiscardRecording = false
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
if (status.isFinished && status.url) {
|
|
112
|
+
if (!this.shouldDiscardRecording) {
|
|
113
|
+
this.startAudioUpload(status.url)
|
|
114
|
+
}
|
|
115
|
+
this.shouldDiscardRecording = false
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
98
119
|
constructor({ api, notification, events }: VoiceRecordModelParams) {
|
|
99
120
|
this.api = api
|
|
100
121
|
this.notification = notification
|
|
@@ -104,6 +125,8 @@ export class VoiceRecordModel {
|
|
|
104
125
|
|
|
105
126
|
this.setupUploadHandler()
|
|
106
127
|
this.setupCurrentRecordSync()
|
|
128
|
+
this.setupUriSync()
|
|
129
|
+
this.resetActiveRecordingOnProblemSwitch()
|
|
107
130
|
}
|
|
108
131
|
|
|
109
132
|
private abortUploadIfInProgress(recordingItem: ReturnType<VoiceRecordsCollection['get']>) {
|
|
@@ -144,6 +167,7 @@ export class VoiceRecordModel {
|
|
|
144
167
|
}
|
|
145
168
|
|
|
146
169
|
this.collection.add(currentKey, collectionItem)
|
|
170
|
+
this.setCurrentRecord(collectionItem)
|
|
147
171
|
this.recorderModel.resolveStopWithCollectionItem(collectionItem)
|
|
148
172
|
|
|
149
173
|
return audioUploadPromise
|
|
@@ -151,7 +175,7 @@ export class VoiceRecordModel {
|
|
|
151
175
|
|
|
152
176
|
private setupUploadHandler() {
|
|
153
177
|
sample({
|
|
154
|
-
clock: this.
|
|
178
|
+
clock: this.startAudioUpload,
|
|
155
179
|
source: this.$currentKey,
|
|
156
180
|
filter: (currentKey, uri) => !!uri && !!currentKey,
|
|
157
181
|
fn: (currentKey, uri) => ({ currentKey, uri }),
|
|
@@ -161,6 +185,14 @@ export class VoiceRecordModel {
|
|
|
161
185
|
})
|
|
162
186
|
}
|
|
163
187
|
|
|
188
|
+
private setupUriSync() {
|
|
189
|
+
sample({
|
|
190
|
+
source: this.$currentRecord,
|
|
191
|
+
fn: (record) => record?.uri || '',
|
|
192
|
+
target: createStore<string>('').reset(this.reset),
|
|
193
|
+
})
|
|
194
|
+
}
|
|
195
|
+
|
|
164
196
|
private setupCurrentRecordSync() {
|
|
165
197
|
sample({
|
|
166
198
|
source: this.$currentKey,
|
|
@@ -176,11 +208,16 @@ export class VoiceRecordModel {
|
|
|
176
208
|
if (recordingItem.durationMs) {
|
|
177
209
|
this.recorderModel.setAudioFileDurationMs(recordingItem.durationMs)
|
|
178
210
|
}
|
|
179
|
-
|
|
180
|
-
if (recordingItem.uri) {
|
|
181
|
-
this.setUri(recordingItem.uri)
|
|
182
|
-
}
|
|
183
211
|
}),
|
|
184
212
|
})
|
|
185
213
|
}
|
|
214
|
+
|
|
215
|
+
private resetActiveRecordingOnProblemSwitch() {
|
|
216
|
+
sample({
|
|
217
|
+
clock: this.$currentKey,
|
|
218
|
+
source: this.recorderModel.$voiceRecordState,
|
|
219
|
+
filter: (state) => state === VoiceRecorderState.RECORDING,
|
|
220
|
+
target: this.stopAndDiscard,
|
|
221
|
+
})
|
|
222
|
+
}
|
|
186
223
|
}
|