@magmamath/students-features 0.9.107-rc.30 → 0.9.107-rc.32
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/helpers.js +1 -4
- package/dist/commonjs/features/voiceRecord/helpers.js.map +1 -1
- package/dist/commonjs/features/voiceRecord/hooks/useVoiceRecorder.js +4 -0
- package/dist/commonjs/features/voiceRecord/hooks/useVoiceRecorder.js.map +1 -1
- package/dist/commonjs/features/voiceRecord/model/Recorder.model.js +2 -0
- package/dist/commonjs/features/voiceRecord/model/Recorder.model.js.map +1 -1
- package/dist/commonjs/features/voiceRecord/model/VoiceRecord.model.js +17 -13
- package/dist/commonjs/features/voiceRecord/model/VoiceRecord.model.js.map +1 -1
- package/dist/module/features/voiceRecord/helpers.js +1 -4
- package/dist/module/features/voiceRecord/helpers.js.map +1 -1
- package/dist/module/features/voiceRecord/hooks/useVoiceRecorder.js +4 -0
- package/dist/module/features/voiceRecord/hooks/useVoiceRecorder.js.map +1 -1
- package/dist/module/features/voiceRecord/model/Recorder.model.js +2 -0
- package/dist/module/features/voiceRecord/model/Recorder.model.js.map +1 -1
- package/dist/module/features/voiceRecord/model/VoiceRecord.model.js +18 -14
- package/dist/module/features/voiceRecord/model/VoiceRecord.model.js.map +1 -1
- package/dist/typescript/commonjs/features/voiceRecord/helpers.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voiceRecord/hooks/useVoiceRecorder.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voiceRecord/model/Recorder.model.d.ts +2 -0
- package/dist/typescript/commonjs/features/voiceRecord/model/Recorder.model.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/voiceRecord/model/VoiceRecord.model.d.ts.map +1 -1
- package/dist/typescript/module/features/voiceRecord/helpers.d.ts.map +1 -1
- package/dist/typescript/module/features/voiceRecord/hooks/useVoiceRecorder.d.ts.map +1 -1
- package/dist/typescript/module/features/voiceRecord/model/Recorder.model.d.ts +2 -0
- package/dist/typescript/module/features/voiceRecord/model/Recorder.model.d.ts.map +1 -1
- package/dist/typescript/module/features/voiceRecord/model/VoiceRecord.model.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/features/voiceRecord/helpers.ts +1 -5
- package/src/features/voiceRecord/hooks/useVoiceRecorder.ts +4 -0
- package/src/features/voiceRecord/model/Recorder.model.ts +2 -0
- package/src/features/voiceRecord/model/VoiceRecord.model.ts +11 -9
|
@@ -17,6 +17,7 @@ const ensureRecordingPermissions = async () => {
|
|
|
17
17
|
const {
|
|
18
18
|
status
|
|
19
19
|
} = await (0, _expoAudio.getRecordingPermissionsAsync)();
|
|
20
|
+
console.log('permission status: ', status);
|
|
20
21
|
if (status !== 'granted') {
|
|
21
22
|
const {
|
|
22
23
|
granted
|
|
@@ -64,15 +65,11 @@ const addAudioInputsListenerWeb = callback => {
|
|
|
64
65
|
exports.addAudioInputsListenerWeb = addAudioInputsListenerWeb;
|
|
65
66
|
const getAudioDurationMs = (fileUri, externalPlayer) => {
|
|
66
67
|
if (!fileUri) return Promise.resolve(undefined);
|
|
67
|
-
console.log('fileUri: ', fileUri);
|
|
68
68
|
const player = externalPlayer ?? (0, _expoAudio.createAudioPlayer)();
|
|
69
|
-
console.log('player: ', player);
|
|
70
69
|
const isInternalPlayer = !externalPlayer;
|
|
71
|
-
console.log('isInternalPlayer: ', isInternalPlayer);
|
|
72
70
|
player.replace(fileUri);
|
|
73
71
|
return new Promise((resolve, reject) => {
|
|
74
72
|
const subscription = player.addListener('playbackStatusUpdate', () => {
|
|
75
|
-
console.log('player.duration: ', player.duration);
|
|
76
73
|
if (player.duration !== undefined && player.duration > 0) {
|
|
77
74
|
subscription.remove();
|
|
78
75
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeUi","require","_expoAudio","formatDuration","ms","totalSeconds","Math","floor","minutes","seconds","toString","padStart","exports","ensureRecordingPermissions","status","getRecordingPermissionsAsync","granted","requestRecordingPermissionsAsync","getAvailableInputsWeb","navigator","mediaDevices","enumerateDevices","devices","filter","d","kind","getAvailableInputs","recorder","IS_WEB","IS_MOBILE","addAudioInputsListenerWeb","callback","addEventListener","handleDeviceChange","removeEventListener","getAudioDurationMs","fileUri","externalPlayer","Promise","resolve","undefined","
|
|
1
|
+
{"version":3,"names":["_reactNativeUi","require","_expoAudio","formatDuration","ms","totalSeconds","Math","floor","minutes","seconds","toString","padStart","exports","ensureRecordingPermissions","status","getRecordingPermissionsAsync","console","log","granted","requestRecordingPermissionsAsync","getAvailableInputsWeb","navigator","mediaDevices","enumerateDevices","devices","filter","d","kind","getAvailableInputs","recorder","IS_WEB","IS_MOBILE","addAudioInputsListenerWeb","callback","addEventListener","handleDeviceChange","removeEventListener","getAudioDurationMs","fileUri","externalPlayer","Promise","resolve","undefined","player","createAudioPlayer","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"],"sourceRoot":"../../../../src","sources":["features/voiceRecord/helpers.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,6 +16,10 @@ const useVoiceRecorder = model => {
|
|
|
16
16
|
if (recorderState.durationMillis >= _constants.VOICE_RECORDER_MAX_DURATION_MS && recorderState.isRecording) {
|
|
17
17
|
model.recorderModel.stop();
|
|
18
18
|
}
|
|
19
|
+
// Track the last known duration while recording (for old browsers where getAudioDurationMs returns Infinity)
|
|
20
|
+
if (recorderState.isRecording && recorderState.durationMillis > 0) {
|
|
21
|
+
model.recorderModel.setLastKnownDurationMs(recorderState.durationMillis);
|
|
22
|
+
}
|
|
19
23
|
}, [recorderState.durationMillis]);
|
|
20
24
|
(0, _react.useEffect)(() => {
|
|
21
25
|
if (!_reactNativeUi.IS_WEB) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_expoAudio","require","_helpers","_react","_reactNativeUi","_constants","useVoiceRecorder","model","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","setVoiceRecordState","VoiceRecorderState","RECORDING","PAUSED","IDLE","reset","exports"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorder.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AAEO,MAAMK,gBAAgB,GAAIC,KAAuB,IAAK;EAC3D,MAAMC,QAAQ,GAAG,IAAAC,2BAAgB,EAACC,2BAAgB,CAACC,WAAW,EAAEJ,KAAK,CAACK,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;MACAX,KAAK,CAACY,aAAa,CAACC,IAAI,CAAC,CAAC;IAC5B;EACF,CAAC,EAAE,
|
|
1
|
+
{"version":3,"names":["_expoAudio","require","_helpers","_react","_reactNativeUi","_constants","useVoiceRecorder","model","recorder","useAudioRecorder","RecordingPresets","LOW_QUALITY","recordingStatusUpdate","recorderState","useAudioRecorderState","useEffect","durationMillis","VOICE_RECORDER_MAX_DURATION_MS","isRecording","recorderModel","stop","setLastKnownDurationMs","IS_WEB","getAvailableInputs","then","inputs","setAvailableInputs","removeListener","addAudioInputsListenerWeb","devices","setVoiceRecordState","VoiceRecorderState","RECORDING","PAUSED","IDLE","reset","exports"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorder.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AAEO,MAAMK,gBAAgB,GAAIC,KAAuB,IAAK;EAC3D,MAAMC,QAAQ,GAAG,IAAAC,2BAAgB,EAACC,2BAAgB,CAACC,WAAW,EAAEJ,KAAK,CAACK,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;MACAX,KAAK,CAACY,aAAa,CAACC,IAAI,CAAC,CAAC;IAC5B;IACA;IACA,IAAIP,aAAa,CAACK,WAAW,IAAIL,aAAa,CAACG,cAAc,GAAG,CAAC,EAAE;MACjET,KAAK,CAACY,aAAa,CAACE,sBAAsB,CAACR,aAAa,CAACG,cAAc,CAAC;IAC1E;EACF,CAAC,EAAE,CAACH,aAAa,CAACG,cAAc,CAAC,CAAC;EAElC,IAAAD,gBAAS,EAAC,MAAM;IACd,IAAI,CAACO,qBAAM,EAAE;MACX;MACA,IAAAC,2BAAkB,EAACf,QAAQ,CAAC,CAACgB,IAAI,CAAEC,MAAM,IAAK;QAC5ClB,KAAK,CAACY,aAAa,CAACO,kBAAkB,CAACD,MAAM,CAAC;MAChD,CAAC,CAAC;MACF;IACF;IAEA,MAAME,cAAc,GAAG,IAAAC,kCAAyB,EAAEC,OAAO,IAAK;MAC5DtB,KAAK,CAACY,aAAa,CAACO,kBAAkB,CAACG,OAAO,CAAC;IACjD,CAAC,CAAC;IAEF,OAAOF,cAAc;EACvB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAAZ,gBAAS,EAAC,MAAM;IACd,IAAIF,aAAa,CAACK,WAAW,EAAE;MAC7BX,KAAK,CAACY,aAAa,CAACW,mBAAmB,CAACC,6BAAkB,CAACC,SAAS,CAAC;MACrE;IACF;IACA,IAAInB,aAAa,CAACG,cAAc,GAAG,CAAC,EAAE;MACpCT,KAAK,CAACY,aAAa,CAACW,mBAAmB,CAACC,6BAAkB,CAACE,MAAM,CAAC;MAClE;IACF;IACA1B,KAAK,CAACY,aAAa,CAACW,mBAAmB,CAACC,6BAAkB,CAACG,IAAI,CAAC;IAEhE,OAAO,MAAM;MACX3B,KAAK,CAACY,aAAa,CAACgB,KAAK,CAAC,CAAC;IAC7B,CAAC;EACH,CAAC,EAAE,CAACtB,aAAa,CAAC,CAAC;EAEnB,IAAAE,gBAAS,EAAC,MAAM;IACdR,KAAK,CAACY,aAAa,CAACX,QAAQ,GAAGA,QAAQ;EACzC,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,OAAO;IAAEK;EAAc,CAAC;AAC1B,CAAC;AAAAuB,OAAA,CAAA9B,gBAAA,GAAAA,gBAAA","ignoreList":[]}
|
|
@@ -16,8 +16,10 @@ class RecorderModel {
|
|
|
16
16
|
reset = (0, _effector.createEvent)();
|
|
17
17
|
setVoiceRecordState = (0, _effector.createEvent)();
|
|
18
18
|
setAvailableInputs = (0, _effector.createEvent)();
|
|
19
|
+
setLastKnownDurationMs = (0, _effector.createEvent)();
|
|
19
20
|
$voiceRecordState = (0, _effector.restore)(this.setVoiceRecordState, _constants.VoiceRecorderState.IDLE).reset(this.reset);
|
|
20
21
|
$availableInputs = (0, _effector.restore)(this.setAvailableInputs, []);
|
|
22
|
+
$lastKnownDurationMs = (0, _effector.restore)(this.setLastKnownDurationMs, 0).reset(this.reset);
|
|
21
23
|
start = (0, _effector.createEffect)(async () => {
|
|
22
24
|
try {
|
|
23
25
|
await (0, _expoAudio.setAudioModeAsync)(AUDIO_MODE_CONFIG);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_effector","require","_expoAudio","_constants","AUDIO_MODE_CONFIG","playsInSilentMode","allowsRecording","RecorderModel","stopResolver","reset","createEvent","setVoiceRecordState","setAvailableInputs","$voiceRecordState","restore","VoiceRecorderState","IDLE","$availableInputs","start","createEffect","setAudioModeAsync","recorder","prepareToRecordAsync","record","error","console","stop","getStatus","isRecording","Promise","resolve","stopAndGetCollectionItem","resolveStopWithCollectionItem","item","clearStopResolver","exports"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/Recorder.model.ts"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AAGA,MAAMG,iBAAiB,GAAG;EACxBC,iBAAiB,EAAE,IAAI;EACvBC,eAAe,EAAE;AACnB,CAAU;AAIH,MAAMC,aAAa,CAAC;EAEjBC,YAAY,GAAwB,IAAI;EAEhCC,KAAK,GAAG,IAAAC,qBAAW,EAAC,CAAC;EACrBC,mBAAmB,GAAG,IAAAD,qBAAW,EAAqB,CAAC;EACvDE,kBAAkB,GAAG,IAAAF,qBAAW,EAAuB,CAAC;
|
|
1
|
+
{"version":3,"names":["_effector","require","_expoAudio","_constants","AUDIO_MODE_CONFIG","playsInSilentMode","allowsRecording","RecorderModel","stopResolver","reset","createEvent","setVoiceRecordState","setAvailableInputs","setLastKnownDurationMs","$voiceRecordState","restore","VoiceRecorderState","IDLE","$availableInputs","$lastKnownDurationMs","start","createEffect","setAudioModeAsync","recorder","prepareToRecordAsync","record","error","console","stop","getStatus","isRecording","Promise","resolve","stopAndGetCollectionItem","resolveStopWithCollectionItem","item","clearStopResolver","exports"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/Recorder.model.ts"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AAGA,MAAMG,iBAAiB,GAAG;EACxBC,iBAAiB,EAAE,IAAI;EACvBC,eAAe,EAAE;AACnB,CAAU;AAIH,MAAMC,aAAa,CAAC;EAEjBC,YAAY,GAAwB,IAAI;EAEhCC,KAAK,GAAG,IAAAC,qBAAW,EAAC,CAAC;EACrBC,mBAAmB,GAAG,IAAAD,qBAAW,EAAqB,CAAC;EACvDE,kBAAkB,GAAG,IAAAF,qBAAW,EAAuB,CAAC;EACxDG,sBAAsB,GAAG,IAAAH,qBAAW,EAAS,CAAC;EAE9CI,iBAAiB,GAAG,IAAAC,iBAAO,EACzC,IAAI,CAACJ,mBAAmB,EACxBK,6BAAkB,CAACC,IACrB,CAAC,CAACR,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;EACHS,gBAAgB,GAAG,IAAAH,iBAAO,EAAC,IAAI,CAACH,kBAAkB,EAAE,EAAE,CAAC;EACvDO,oBAAoB,GAAG,IAAAJ,iBAAO,EAAC,IAAI,CAACF,sBAAsB,EAAE,CAAC,CAAC,CAACJ,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;EAEhFW,KAAK,GAAG,IAAAC,sBAAY,EAAC,YAAY;IAC/C,IAAI;MACF,MAAM,IAAAC,4BAAiB,EAAClB,iBAAiB,CAAC;MAC1C,MAAM,IAAI,CAACmB,QAAQ,CAACC,oBAAoB,CAAC,CAAC;MAC1C,IAAI,CAACD,QAAQ,CAACE,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;MACjD,MAAMA,KAAK;IACb;EACF,CAAC,CAAC;EAEcE,IAAI,GAAG,IAAAP,sBAAY,EAAC,MAAM;IACxC,IAAI,CAAC,IAAI,CAACE,QAAQ,CAACM,SAAS,CAAC,CAAC,CAACC,WAAW,EAAE,OAAOC,OAAO,CAACC,OAAO,CAAC,CAAC;IACpE,OAAO,IAAI,CAACT,QAAQ,CAACK,IAAI,CAAC,CAAC;EAC7B,CAAC,CAAC;EAEKK,wBAAwBA,CAAA,EAAuC;IACpE,OAAO,IAAIF,OAAO,CAAEC,OAAO,IAAK;MAC9B,IAAI,CAACxB,YAAY,GAAGwB,OAAO;MAC3B,IAAI,CAACT,QAAQ,CAACM,SAAS,CAAC,CAAC,CAACC,WAAW,IAAI,IAAI,CAACP,QAAQ,CAACK,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC;EACJ;EAEOM,6BAA6BA,CAACC,IAA+B,EAAQ;IAC1E,IAAI,IAAI,CAAC3B,YAAY,EAAE;MACrB,IAAI,CAACA,YAAY,CAAC2B,IAAI,CAAC;MACvB,IAAI,CAAC3B,YAAY,GAAG,IAAI;IAC1B;EACF;EAEO4B,iBAAiBA,CAAA,EAAS;IAC/B,IAAI,CAAC5B,YAAY,GAAG,IAAI;EAC1B;AACF;AAAC6B,OAAA,CAAA9B,aAAA,GAAAA,aAAA","ignoreList":[]}
|
|
@@ -30,7 +30,6 @@ class VoiceRecordModel {
|
|
|
30
30
|
currentKey,
|
|
31
31
|
notification
|
|
32
32
|
}) => {
|
|
33
|
-
console.log('Deleting recording with key:', currentKey);
|
|
34
33
|
const recordingItem = this.collection.get(currentKey);
|
|
35
34
|
this.abortUploadIfInProgress(recordingItem);
|
|
36
35
|
this.resetRecordingState(currentKey);
|
|
@@ -106,9 +105,11 @@ class VoiceRecordModel {
|
|
|
106
105
|
}
|
|
107
106
|
async handleAudioUpload({
|
|
108
107
|
uri,
|
|
109
|
-
currentKey
|
|
108
|
+
currentKey,
|
|
109
|
+
durationMs
|
|
110
110
|
}) {
|
|
111
|
-
|
|
111
|
+
// Use the last known duration from recorder state (more reliable for old browsers like Chrome 93
|
|
112
|
+
// where getAudioDurationMs can return Infinity)
|
|
112
113
|
const formData = await (0, _helpers.generateAudioFormData)({
|
|
113
114
|
audioFileUri: uri,
|
|
114
115
|
durationMs,
|
|
@@ -146,19 +147,22 @@ class VoiceRecordModel {
|
|
|
146
147
|
setupUploadHandler() {
|
|
147
148
|
(0, _effector.sample)({
|
|
148
149
|
clock: this.startAudioUpload,
|
|
149
|
-
source:
|
|
150
|
-
|
|
151
|
-
|
|
150
|
+
source: {
|
|
151
|
+
currentKey: this.$currentKey,
|
|
152
|
+
durationMs: this.recorderModel.$lastKnownDurationMs
|
|
153
|
+
},
|
|
154
|
+
filter: ({
|
|
155
|
+
currentKey
|
|
156
|
+
}, uri) => !!uri && !!currentKey,
|
|
157
|
+
fn: ({
|
|
158
|
+
currentKey,
|
|
159
|
+
durationMs
|
|
160
|
+
}, uri) => ({
|
|
152
161
|
currentKey,
|
|
162
|
+
durationMs,
|
|
153
163
|
uri
|
|
154
164
|
}),
|
|
155
|
-
target: (0, _effector.createEffect)((
|
|
156
|
-
uri,
|
|
157
|
-
currentKey
|
|
158
|
-
}) => this.handleAudioUpload({
|
|
159
|
-
uri,
|
|
160
|
-
currentKey
|
|
161
|
-
}))
|
|
165
|
+
target: (0, _effector.createEffect)(params => this.handleAudioUpload(params))
|
|
162
166
|
});
|
|
163
167
|
}
|
|
164
168
|
setupCurrentRecordSync() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_effector","require","_helpers","_index","_RecorderModel","_VoiceRecordCollection","VoiceRecordModel","shouldDiscardRecording","setCurrentKey","createEvent","setCurrentRecord","reset","setIsDisabled","startAudioUpload","$currentKey","restore","$currentRecord","$isDisabled","deleteCurrentRecording","attach","source","mapParams","props","currentKey","notification","effect","createEffect","
|
|
1
|
+
{"version":3,"names":["_effector","require","_helpers","_index","_RecorderModel","_VoiceRecordCollection","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","catch","name","stopAndDiscard","stop","clearStopResolver","recordingStatusUpdate","status","console","log","isFinished","url","constructor","api","events","RecorderModel","VoiceRecordsCollection","setupUploadHandler","setupCurrentRecordSync","id","controller","abort","delete","handleAudioUpload","uri","durationMs","formData","generateAudioFormData","audioFileUri","fileName","uploadAudio","uploadAudioFileRequestGenerator","audioUploadPromise","then","data","update","collectionItem","add","resolveStopWithCollectionItem","sample","clock","$lastKnownDurationMs","filter","fn","target","params","exports"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/VoiceRecord.model.ts"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAQA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,sBAAA,GAAAJ,OAAA;AA2BO,MAAMK,gBAAgB,CAAC;EAMpBC,sBAAsB,GAAG,KAAK;EAEtBC,aAAa,GAAG,IAAAC,qBAAW,EAAS,CAAC;EACrCC,gBAAgB,GAAG,IAAAD,qBAAW,EAAM,CAAC;EACrCE,KAAK,GAAG,IAAAF,qBAAW,EAAC,CAAC;EACrBG,aAAa,GAAG,IAAAH,qBAAW,EAAU,CAAC;EACtCI,gBAAgB,GAAG,IAAAJ,qBAAW,EAAS,CAAC;EAExCK,WAAW,GAAG,IAAAC,iBAAO,EAAC,IAAI,CAACP,aAAa,EAAE,EAAE,CAAC;EAC7CQ,cAAc,GAAG,IAAAD,iBAAO,EAAC,IAAI,CAACL,gBAAgB,EAAE,IAAI,CAAC,CAACC,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;EAEvEM,WAAW,GAAG,IAAAF,iBAAO,EAAC,IAAI,CAACH,aAAa,EAAE,KAAK,CAAC;EAEhDM,sBAAsB,GAAG,IAAAC,gBAAM,EAAC;IAC9CC,MAAM,EAAE,IAAI,CAACN,WAAW;IACxBO,SAAS,EAAEA,CAACC,KAAyC,EAAEC,UAAU,MAAM;MACrEC,YAAY,EAAE,IAAI;MAClB,GAAGF,KAAK;MACRC;IACF,CAAC,CAAC;IACFE,MAAM,EAAE,IAAAC,sBAAY,EAAC,CAAC;MAAEH,UAAU;MAAEC;IAA2C,CAAC,KAAK;MACnF,MAAMG,aAAa,GAAG,IAAI,CAACC,UAAU,CAACC,GAAG,CAACN,UAAU,CAAC;MAErD,IAAI,CAACO,uBAAuB,CAACH,aAAa,CAAC;MAC3C,IAAI,CAACI,mBAAmB,CAACR,UAAU,CAAC;MAEpC,IAAIC,YAAY,EAAE;QAChB,IAAI,CAACA,YAAY,CAACQ,IAAI,CAAC,IAAAC,QAAC,EAAC,gCAAgC,CAAC,CAAC;MAC7D;IACF,CAAC;EACH,CAAC,CAAC;EAEcC,mBAAmB,GAAG,IAAAR,sBAAY,EAAC,YAAY;IAC7D,IAAI,CAACR,sBAAsB,CAAC;MAAEM,YAAY,EAAE;IAAM,CAAC,CAAC;IAEpD,MAAMW,cAAc,GAAG,MAAM,IAAAC,mCAA0B,EAAC,CAAC;IACzD,IAAI,CAACD,cAAc,EAAE;MACnB,IAAI,CAACX,YAAY,CAACa,KAAK,CAAC,IAAAJ,QAAC,EAAC,kCAAkC,CAAC,CAAC;MAC9D;IACF;IAEA,MAAMK,MAAM,GAAG,MAAM,IAAAC,2BAAkB,EAAC,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC;IACpE,IAAI,CAACD,aAAa,CAACE,kBAAkB,CAACJ,MAAM,CAAC;IAE7C,IAAIA,MAAM,CAACK,MAAM,KAAK,CAAC,EAAE;MACvB,IAAI,CAACnB,YAAY,CAACa,KAAK,CAAC,IAAAJ,QAAC,EAAC,iCAAiC,CAAC,CAAC;MAC7D;IACF;IAEA,OAAO,IAAI,CAACO,aAAa,CAACI,KAAK,CAAC,CAAC,CAACC,KAAK,CAAER,KAAK,IAAK;MACjD,IAAIA,KAAK,CAACS,IAAI,KAAK,iBAAiB,EAAE;QACpC,IAAI,CAACtB,YAAY,CAACa,KAAK,CAAC,IAAAJ,QAAC,EAAC,0CAA0C,CAAC,CAAC;MACxE;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEcc,cAAc,GAAG,IAAArB,sBAAY,EAAC,YAAY;IACxD,IAAI,CAACnB,sBAAsB,GAAG,IAAI;IAClC,MAAM,IAAI,CAACiC,aAAa,CAACQ,IAAI,CAAC,CAAC;IAC/B,IAAI,CAACR,aAAa,CAACS,iBAAiB,CAAC,CAAC;IACtC,IAAI,CAACT,aAAa,CAAC7B,KAAK,CAAC,CAAC;EAC5B,CAAC,CAAC;EAEcuC,qBAAqB,GAAIC,MAAW,IAAK;IACvDC,OAAO,CAACC,GAAG,CAAC,UAAU,EAAEF,MAAM,CAAC;IAC/B,IAAIA,MAAM,CAACd,KAAK,EAAE;MAChB,IAAI,CAACb,YAAY,CAACa,KAAK,CAAC,mBAAmBc,MAAM,CAACd,KAAK,EAAE,CAAC;MAC1D,IAAI,CAACG,aAAa,CAACS,iBAAiB,CAAC,CAAC;MACtC,IAAI,CAAC1C,sBAAsB,GAAG,KAAK;MACnC;IACF;IACA,IAAI4C,MAAM,CAACG,UAAU,IAAIH,MAAM,CAACI,GAAG,EAAE;MACnC,IAAI,CAAC,IAAI,CAAChD,sBAAsB,EAAE;QAChC,IAAI,CAACM,gBAAgB,CAACsC,MAAM,CAACI,GAAG,CAAC;MACnC;MACA,IAAI,CAAChD,sBAAsB,GAAG,KAAK;IACrC;EACF,CAAC;EAEDiD,WAAWA,CAAC;IAAEC,GAAG;IAAEjC,YAAY;IAAEkC;EAA+B,CAAC,EAAE;IACjE,IAAI,CAACD,GAAG,GAAGA,GAAG;IACd,IAAI,CAACjC,YAAY,GAAGA,YAAY;IAChC,IAAI,CAACkC,MAAM,GAAGA,MAAM;IACpB,IAAI,CAAClB,aAAa,GAAG,IAAImB,4BAAa,CAAC,CAAC;IACxC,IAAI,CAAC/B,UAAU,GAAG,IAAIgC,6CAAsB,CAAC,CAAC;IAE9C,IAAI,CAACC,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAACC,sBAAsB,CAAC,CAAC;EAC/B;EAEQhC,uBAAuBA,CAACH,aAAwD,EAAE;IACxF,IAAI,CAACA,aAAa,EAAEoC,EAAE,IAAIpC,aAAa,EAAEqC,UAAU,EAAE;MACnDrC,aAAa,CAACqC,UAAU,CAACC,KAAK,CAAC,CAAC;IAClC;EACF;EAEQlC,mBAAmBA,CAACR,UAAkB,EAAE;IAC9C,IAAI,CAACiB,aAAa,CAAC7B,KAAK,CAAC,CAAC;IAC1B,IAAI,CAACA,KAAK,CAAC,CAAC;IACZ,IAAI,CAACiB,UAAU,CAACsC,MAAM,CAAC3C,UAAU,CAAC;EACpC;EAEA,MAAc4C,iBAAiBA,CAAC;IAAEC,GAAG;IAAE7C,UAAU;IAAE8C;EAAyB,CAAC,EAAE;IAC7E;IACA;IACA,MAAMC,QAAQ,GAAG,MAAM,IAAAC,8BAAqB,EAAC;MAC3CC,YAAY,EAAEJ,GAAG;MACjBC,UAAU;MACVI,QAAQ,EAAElD;IACZ,CAAC,CAAC;IACF,MAAM;MAAEmD,WAAW;MAAEV;IAAW,CAAC,GAAG,IAAAW,wCAA+B,EAACL,QAAQ,EAAE,IAAI,CAACb,GAAG,CAAC;IAEvF,MAAMmB,kBAAkB,GAAGF,WAAW,CAAC,CAAC,CACrCG,IAAI,CAAEC,IAAI,IAAK;MACd;MACA,IAAI,IAAI,CAAClD,UAAU,CAACC,GAAG,CAACN,UAAU,CAAC,EAAE;QACnC,IAAI,CAACK,UAAU,CAACmD,MAAM,CAACxD,UAAU,EAAE;UAAEwC,EAAE,EAAEe,IAAI,CAACf;QAAG,CAAC,CAAC;MACrD;MACA,OAAOe,IAAI;IACb,CAAC,CAAC,CACDjC,KAAK,CAAER,KAAK,IAAK;MAChB,IAAIA,KAAK,CAACS,IAAI,KAAK,eAAe,EAAE;MACpC,IAAI,CAAClB,UAAU,CAACsC,MAAM,CAAC3C,UAAU,CAAC;MAClC,IAAI,CAACZ,KAAK,CAAC,CAAC;MACZ,IAAI,CAACa,YAAY,CAACa,KAAK,CAAC,IAAAJ,QAAC,EAAC,4BAA4B,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEJ,MAAM+C,cAAyC,GAAG;MAChDX,UAAU;MACVO,kBAAkB;MAClBZ,UAAU;MACVI;IACF,CAAC;IAED,IAAI,CAACxC,UAAU,CAACqD,GAAG,CAAC1D,UAAU,EAAEyD,cAAc,CAAC;IAC/C,IAAI,CAACtE,gBAAgB,CAACsE,cAAc,CAAC;IACrC,IAAI,CAACxC,aAAa,CAAC0C,6BAA6B,CAACF,cAAc,CAAC;IAEhE,OAAOJ,kBAAkB;EAC3B;EAEQf,kBAAkBA,CAAA,EAAG;IAC3B,IAAAsB,gBAAM,EAAC;MACLC,KAAK,EAAE,IAAI,CAACvE,gBAAgB;MAC5BO,MAAM,EAAE;QACNG,UAAU,EAAE,IAAI,CAACT,WAAW;QAC5BuD,UAAU,EAAE,IAAI,CAAC7B,aAAa,CAAC6C;MACjC,CAAC;MACDC,MAAM,EAAEA,CAAC;QAAE/D;MAAW,CAAC,EAAE6C,GAAG,KAAK,CAAC,CAACA,GAAG,IAAI,CAAC,CAAC7C,UAAU;MACtDgE,EAAE,EAAEA,CAAC;QAAEhE,UAAU;QAAE8C;MAAW,CAAC,EAAED,GAAG,MAAM;QAAE7C,UAAU;QAAE8C,UAAU;QAAED;MAAI,CAAC,CAAC;MAC1EoB,MAAM,EAAE,IAAA9D,sBAAY,EAAE+D,MAAoB,IAAK,IAAI,CAACtB,iBAAiB,CAACsB,MAAM,CAAC;IAC/E,CAAC,CAAC;EACJ;EAEQ3B,sBAAsBA,CAAA,EAAG;IAC/B,IAAAqB,gBAAM,EAAC;MACL/D,MAAM,EAAE,IAAI,CAACN,WAAW;MACxByE,EAAE,EAAGhE,UAAU,IAAK,IAAI,CAACK,UAAU,CAACC,GAAG,CAACN,UAAU,CAAC;MACnDiE,MAAM,EAAE,IAAA9D,sBAAY,EAAEC,aAAyC,IAAK;QAClE,IAAI,CAACA,aAAa,EAAE;UAClB,IAAI,CAAChB,KAAK,CAAC,CAAC;UACZ;QACF;QAEA,IAAI,CAACD,gBAAgB,CAACiB,aAAa,CAAC;MACtC,CAAC;IACH,CAAC,CAAC;EACJ;AACF;AAAC+D,OAAA,CAAApF,gBAAA,GAAAA,gBAAA","ignoreList":[]}
|
|
@@ -12,6 +12,7 @@ export const ensureRecordingPermissions = async () => {
|
|
|
12
12
|
const {
|
|
13
13
|
status
|
|
14
14
|
} = await getRecordingPermissionsAsync();
|
|
15
|
+
console.log('permission status: ', status);
|
|
15
16
|
if (status !== 'granted') {
|
|
16
17
|
const {
|
|
17
18
|
granted
|
|
@@ -56,15 +57,11 @@ export const addAudioInputsListenerWeb = callback => {
|
|
|
56
57
|
*/
|
|
57
58
|
export const getAudioDurationMs = (fileUri, externalPlayer) => {
|
|
58
59
|
if (!fileUri) return Promise.resolve(undefined);
|
|
59
|
-
console.log('fileUri: ', fileUri);
|
|
60
60
|
const player = externalPlayer ?? createAudioPlayer();
|
|
61
|
-
console.log('player: ', player);
|
|
62
61
|
const isInternalPlayer = !externalPlayer;
|
|
63
|
-
console.log('isInternalPlayer: ', isInternalPlayer);
|
|
64
62
|
player.replace(fileUri);
|
|
65
63
|
return new Promise((resolve, reject) => {
|
|
66
64
|
const subscription = player.addListener('playbackStatusUpdate', () => {
|
|
67
|
-
console.log('player.duration: ', player.duration);
|
|
68
65
|
if (player.duration !== undefined && player.duration > 0) {
|
|
69
66
|
subscription.remove();
|
|
70
67
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["IS_MOBILE","IS_WEB","createAudioPlayer","getRecordingPermissionsAsync","requestRecordingPermissionsAsync","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","
|
|
1
|
+
{"version":3,"names":["IS_MOBILE","IS_WEB","createAudioPlayer","getRecordingPermissionsAsync","requestRecordingPermissionsAsync","formatDuration","ms","totalSeconds","Math","floor","minutes","seconds","toString","padStart","ensureRecordingPermissions","status","console","log","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","response","fetch","blob","filename","type","append","file","uri","name","uploadAudioFileRequestGenerator","audioFileFormData","api","controller","AbortController","uploadAudio","uploadAudioFile","signal"],"sourceRoot":"../../../../src","sources":["features/voiceRecord/helpers.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,4BAA4B;AAC9D,SAGEC,iBAAiB,EACjBC,4BAA4B,EAC5BC,gCAAgC,QAC3B,YAAY;AAGnB,OAAO,MAAMC,cAAc,GAAIC,EAAU,IAAa;EACpD,MAAMC,YAAY,GAAGC,IAAI,CAACC,KAAK,CAACH,EAAE,GAAG,IAAI,CAAC;EAC1C,MAAMI,OAAO,GAAGF,IAAI,CAACC,KAAK,CAACF,YAAY,GAAG,EAAE,CAAC;EAC7C,MAAMI,OAAO,GAAGJ,YAAY,GAAG,EAAE;EACjC,OAAO,GAAGG,OAAO,IAAIC,OAAO,CAACC,QAAQ,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAC5D,CAAC;AAED,OAAO,MAAMC,0BAA0B,GAAG,MAAAA,CAAA,KAAY;EACpD,MAAM;IAAEC;EAAO,CAAC,GAAG,MAAMZ,4BAA4B,CAAC,CAAC;EACvDa,OAAO,CAACC,GAAG,CAAC,qBAAqB,EAAEF,MAAM,CAAC;EAE1C,IAAIA,MAAM,KAAK,SAAS,EAAE;IACxB,MAAM;MAAEG;IAAQ,CAAC,GAAG,MAAMd,gCAAgC,CAAC,CAAC;IAC5D,OAAOc,OAAO;EAChB;EAEA,OAAO,IAAI;AACb,CAAC;AAED,MAAMC,qBAAqB,GAAG,MAAAA,CAAA,KAAY;EACxC,IAAI,CAACC,SAAS,CAACC,YAAY,EAAEC,gBAAgB,EAAE,OAAO,EAAE;EAExD,MAAMC,OAAO,GAAG,MAAMH,SAAS,CAACC,YAAY,CAACC,gBAAgB,CAAC,CAAC;EAC/D,OAAOC,OAAO,CAACC,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAACC,IAAI,KAAK,YAAY,CAAC;AACvD,CAAC;AAED,OAAO,MAAMC,kBAAkB,GAAG,MAAOC,QAAuB,IAAK;EACnE,IAAI3B,MAAM,EAAE;IACV,OAAO,MAAMkB,qBAAqB,CAAC,CAAC;EACtC;EACA,IAAInB,SAAS,EAAE;IACb,OAAO,MAAM4B,QAAQ,CAACD,kBAAkB,CAAC,CAAC;EAC5C;EACA,OAAO,EAAE;AACX,CAAC;AAED,OAAO,MAAME,yBAAyB,GAAIC,QAA8C,IAAK;EAC3F,IAAI,CAAC7B,MAAM,IAAI,CAACmB,SAAS,CAACC,YAAY,EAAEU,gBAAgB,EAAE;IACxD,OAAO,MAAM,CAAC,CAAC;EACjB;EAEA,MAAMC,kBAAkB,GAAG,MAAAA,CAAA,KAAY;IACrC,MAAMT,OAAO,GAAG,MAAMJ,qBAAqB,CAAC,CAAC;IAC7CW,QAAQ,CAACP,OAAO,CAAC;EACnB,CAAC;EAEDS,kBAAkB,CAAC,CAAC;EAEpBZ,SAAS,CAACC,YAAY,CAACU,gBAAgB,CAAC,cAAc,EAAEC,kBAAkB,CAAC;EAE3E,OAAO,MAAM;IACXZ,SAAS,CAACC,YAAY,CAACY,mBAAmB,CAAC,cAAc,EAAED,kBAAkB,CAAC;EAChF,CAAC;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,kBAAkB,GAAGA,CAChCC,OAAe,EACfC,cAA4B,KACI;EAChC,IAAI,CAACD,OAAO,EAAE,OAAOE,OAAO,CAACC,OAAO,CAACC,SAAS,CAAC;EAE/C,MAAMC,MAAM,GAAGJ,cAAc,IAAIlC,iBAAiB,CAAC,CAAC;EACpD,MAAMuC,gBAAgB,GAAG,CAACL,cAAc;EAExCI,MAAM,CAACE,OAAO,CAACP,OAAO,CAAC;EAEvB,OAAO,IAAIE,OAAO,CAAC,CAACC,OAAO,EAAEK,MAAM,KAAK;IACtC,MAAMC,YAAY,GAAGJ,MAAM,CAACK,WAAW,CAAC,sBAAsB,EAAE,MAAM;MACpE,IAAIL,MAAM,CAACM,QAAQ,KAAKP,SAAS,IAAIC,MAAM,CAACM,QAAQ,GAAG,CAAC,EAAE;QACxDF,YAAY,CAACG,MAAM,CAAC,CAAC;;QAErB;QACA,MAAMC,UAAU,GAAGxC,IAAI,CAACyC,KAAK,CAACT,MAAM,CAACM,QAAQ,GAAG,IAAI,CAAC,EAAC;;QAEtD,IAAIL,gBAAgB,EAAE;UACpBD,MAAM,CAACO,MAAM,CAAC,CAAC;QACjB;QAEAT,OAAO,CAACU,UAAU,CAAC;MACrB;IACF,CAAC,CAAC;IAEFE,UAAU,CAAC,MAAM;MACfN,YAAY,CAACG,MAAM,CAAC,CAAC;MAErB,IAAIN,gBAAgB,EAAE;QACpBD,MAAM,CAACO,MAAM,CAAC,CAAC;MACjB;MAEAJ,MAAM,CAAC,IAAIQ,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACrD,CAAC,EAAE,IAAI,CAAC;EACV,CAAC,CAAC;AACJ,CAAC;AAQD,OAAO,MAAMC,qBAAqB,GAAG,MAAAA,CAAO;EAC1CC,YAAY;EACZL,UAAU;EACVM;AAC2B,CAAC,KAAwB;EACpD;;EAEA,MAAMC,QAAQ,GAAG,IAAIC,QAAQ,CAAC,CAAC;EAC/B,MAAMV,QAAQ,GAAGE,UAAU,EAAEpC,QAAQ,CAAC,CAAC,IAAI,GAAG;EAE9C,IAAIX,MAAM,EAAE;IACV,MAAMwD,QAAQ,GAAG,MAAMC,KAAK,CAACL,YAAY,CAAC;IAC1C,MAAMM,IAAI,GAAG,MAAMF,QAAQ,CAACE,IAAI,CAAC,CAAC;IAClC,MAAMC,QAAQ,GAAGN,QAAQ,GAAGK,IAAI,CAACE,IAAI,CAACnB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;IAC5D1B,OAAO,CAACC,GAAG,CAAC,YAAY,EAAE2C,QAAQ,CAAC;IAEnCL,QAAQ,CAACO,MAAM,CAAC,MAAM,EAAEH,IAAI,EAAEC,QAAQ,CAAC;IACvCL,QAAQ,CAACO,MAAM,CAAC,UAAU,EAAEF,QAAQ,CAAC;IACrCL,QAAQ,CAACO,MAAM,CAAC,UAAU,EAAEhB,QAAQ,CAAC;IAErC,OAAOS,QAAQ;EACjB;EAEA,MAAMK,QAAQ,GAAGN,QAAQ,GAAG,MAAM;EAClC,MAAMS,IAAI,GAAG;IACXC,GAAG,EAAEX,YAAY;IACjBQ,IAAI,EAAE,WAAW;IACjBI,IAAI,EAAEL;EACR,CAAQ;EAERL,QAAQ,CAACO,MAAM,CAAC,MAAM,EAAEC,IAAI,EAAEH,QAAQ,CAAC;EACvCL,QAAQ,CAACO,MAAM,CAAC,UAAU,EAAEF,QAAQ,CAAC;EACrCL,QAAQ,CAACO,MAAM,CAAC,UAAU,EAAEhB,QAAQ,CAAC;EAErC,OAAOS,QAAQ;AACjB,CAAC;AAED,OAAO,MAAMW,+BAA+B,GAAGA,CAACC,iBAA2B,EAAEC,GAAa,KAAK;EAC7F,MAAMC,UAAU,GAAG,IAAIC,eAAe,CAAC,CAAC;EAExC,OAAO;IACLC,WAAW,EAAEA,CAAA,KACXH,GAAG,CAACI,eAAe,CACjB;MACEL;IACF,CAAC;IACD;IACA;MACEM,MAAM,EAAEJ,UAAU,CAACI;IACrB,CACF,CAAC;IACHJ;EACF,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -12,6 +12,10 @@ export const useVoiceRecorder = model => {
|
|
|
12
12
|
if (recorderState.durationMillis >= VOICE_RECORDER_MAX_DURATION_MS && recorderState.isRecording) {
|
|
13
13
|
model.recorderModel.stop();
|
|
14
14
|
}
|
|
15
|
+
// Track the last known duration while recording (for old browsers where getAudioDurationMs returns Infinity)
|
|
16
|
+
if (recorderState.isRecording && recorderState.durationMillis > 0) {
|
|
17
|
+
model.recorderModel.setLastKnownDurationMs(recorderState.durationMillis);
|
|
18
|
+
}
|
|
15
19
|
}, [recorderState.durationMillis]);
|
|
16
20
|
useEffect(() => {
|
|
17
21
|
if (!IS_WEB) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RecordingPresets","useAudioRecorder","useAudioRecorderState","addAudioInputsListenerWeb","getAvailableInputs","useEffect","IS_WEB","VOICE_RECORDER_MAX_DURATION_MS","VoiceRecorderState","useVoiceRecorder","model","recorder","LOW_QUALITY","recordingStatusUpdate","recorderState","durationMillis","isRecording","recorderModel","stop","then","inputs","setAvailableInputs","removeListener","devices","setVoiceRecordState","RECORDING","PAUSED","IDLE","reset"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorder.ts"],"mappings":";;AAAA,SAASA,gBAAgB,EAAEC,gBAAgB,EAAEC,qBAAqB,QAAQ,YAAY;AACtF,SAASC,yBAAyB,EAAEC,kBAAkB,QAAQ,eAAY;AAE1E,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SAASC,8BAA8B,EAAEC,kBAAkB,QAAQ,iBAAc;AAEjF,OAAO,MAAMC,gBAAgB,GAAIC,KAAuB,IAAK;EAC3D,MAAMC,QAAQ,GAAGV,gBAAgB,CAACD,gBAAgB,CAACY,WAAW,EAAEF,KAAK,CAACG,qBAAqB,CAAC;EAC5F,MAAMC,aAAa,GAAGZ,qBAAqB,CAACS,QAAQ,CAAC;EAErDN,SAAS,CAAC,MAAM;IACd,IACES,aAAa,CAACC,cAAc,IAAIR,8BAA8B,IAC9DO,aAAa,CAACE,WAAW,EACzB;MACAN,KAAK,CAACO,aAAa,CAACC,IAAI,CAAC,CAAC;IAC5B;EACF,CAAC,EAAE,
|
|
1
|
+
{"version":3,"names":["RecordingPresets","useAudioRecorder","useAudioRecorderState","addAudioInputsListenerWeb","getAvailableInputs","useEffect","IS_WEB","VOICE_RECORDER_MAX_DURATION_MS","VoiceRecorderState","useVoiceRecorder","model","recorder","LOW_QUALITY","recordingStatusUpdate","recorderState","durationMillis","isRecording","recorderModel","stop","setLastKnownDurationMs","then","inputs","setAvailableInputs","removeListener","devices","setVoiceRecordState","RECORDING","PAUSED","IDLE","reset"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/hooks/useVoiceRecorder.ts"],"mappings":";;AAAA,SAASA,gBAAgB,EAAEC,gBAAgB,EAAEC,qBAAqB,QAAQ,YAAY;AACtF,SAASC,yBAAyB,EAAEC,kBAAkB,QAAQ,eAAY;AAE1E,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SAASC,8BAA8B,EAAEC,kBAAkB,QAAQ,iBAAc;AAEjF,OAAO,MAAMC,gBAAgB,GAAIC,KAAuB,IAAK;EAC3D,MAAMC,QAAQ,GAAGV,gBAAgB,CAACD,gBAAgB,CAACY,WAAW,EAAEF,KAAK,CAACG,qBAAqB,CAAC;EAC5F,MAAMC,aAAa,GAAGZ,qBAAqB,CAACS,QAAQ,CAAC;EAErDN,SAAS,CAAC,MAAM;IACd,IACES,aAAa,CAACC,cAAc,IAAIR,8BAA8B,IAC9DO,aAAa,CAACE,WAAW,EACzB;MACAN,KAAK,CAACO,aAAa,CAACC,IAAI,CAAC,CAAC;IAC5B;IACA;IACA,IAAIJ,aAAa,CAACE,WAAW,IAAIF,aAAa,CAACC,cAAc,GAAG,CAAC,EAAE;MACjEL,KAAK,CAACO,aAAa,CAACE,sBAAsB,CAACL,aAAa,CAACC,cAAc,CAAC;IAC1E;EACF,CAAC,EAAE,CAACD,aAAa,CAACC,cAAc,CAAC,CAAC;EAElCV,SAAS,CAAC,MAAM;IACd,IAAI,CAACC,MAAM,EAAE;MACX;MACAF,kBAAkB,CAACO,QAAQ,CAAC,CAACS,IAAI,CAAEC,MAAM,IAAK;QAC5CX,KAAK,CAACO,aAAa,CAACK,kBAAkB,CAACD,MAAM,CAAC;MAChD,CAAC,CAAC;MACF;IACF;IAEA,MAAME,cAAc,GAAGpB,yBAAyB,CAAEqB,OAAO,IAAK;MAC5Dd,KAAK,CAACO,aAAa,CAACK,kBAAkB,CAACE,OAAO,CAAC;IACjD,CAAC,CAAC;IAEF,OAAOD,cAAc;EACvB,CAAC,EAAE,EAAE,CAAC;EAENlB,SAAS,CAAC,MAAM;IACd,IAAIS,aAAa,CAACE,WAAW,EAAE;MAC7BN,KAAK,CAACO,aAAa,CAACQ,mBAAmB,CAACjB,kBAAkB,CAACkB,SAAS,CAAC;MACrE;IACF;IACA,IAAIZ,aAAa,CAACC,cAAc,GAAG,CAAC,EAAE;MACpCL,KAAK,CAACO,aAAa,CAACQ,mBAAmB,CAACjB,kBAAkB,CAACmB,MAAM,CAAC;MAClE;IACF;IACAjB,KAAK,CAACO,aAAa,CAACQ,mBAAmB,CAACjB,kBAAkB,CAACoB,IAAI,CAAC;IAEhE,OAAO,MAAM;MACXlB,KAAK,CAACO,aAAa,CAACY,KAAK,CAAC,CAAC;IAC7B,CAAC;EACH,CAAC,EAAE,CAACf,aAAa,CAAC,CAAC;EAEnBT,SAAS,CAAC,MAAM;IACdK,KAAK,CAACO,aAAa,CAACN,QAAQ,GAAGA,QAAQ;EACzC,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,OAAO;IAAEG;EAAc,CAAC;AAC1B,CAAC","ignoreList":[]}
|
|
@@ -12,8 +12,10 @@ export class RecorderModel {
|
|
|
12
12
|
reset = createEvent();
|
|
13
13
|
setVoiceRecordState = createEvent();
|
|
14
14
|
setAvailableInputs = createEvent();
|
|
15
|
+
setLastKnownDurationMs = createEvent();
|
|
15
16
|
$voiceRecordState = restore(this.setVoiceRecordState, VoiceRecorderState.IDLE).reset(this.reset);
|
|
16
17
|
$availableInputs = restore(this.setAvailableInputs, []);
|
|
18
|
+
$lastKnownDurationMs = restore(this.setLastKnownDurationMs, 0).reset(this.reset);
|
|
17
19
|
start = createEffect(async () => {
|
|
18
20
|
try {
|
|
19
21
|
await setAudioModeAsync(AUDIO_MODE_CONFIG);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createEffect","createEvent","restore","setAudioModeAsync","VoiceRecorderState","AUDIO_MODE_CONFIG","playsInSilentMode","allowsRecording","RecorderModel","stopResolver","reset","setVoiceRecordState","setAvailableInputs","$voiceRecordState","IDLE","$availableInputs","start","recorder","prepareToRecordAsync","record","error","console","stop","getStatus","isRecording","Promise","resolve","stopAndGetCollectionItem","resolveStopWithCollectionItem","item","clearStopResolver"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/Recorder.model.ts"],"mappings":";;AAAA,SAASA,YAAY,EAAEC,WAAW,EAAEC,OAAO,QAAQ,UAAU;AAC7D,SAAwBC,iBAAiB,QAAQ,YAAY;AAC7D,SAASC,kBAAkB,QAAQ,iBAAc;AAGjD,MAAMC,iBAAiB,GAAG;EACxBC,iBAAiB,EAAE,IAAI;EACvBC,eAAe,EAAE;AACnB,CAAU;AAIV,OAAO,MAAMC,aAAa,CAAC;EAEjBC,YAAY,GAAwB,IAAI;EAEhCC,KAAK,GAAGT,WAAW,CAAC,CAAC;EACrBU,mBAAmB,GAAGV,WAAW,CAAqB,CAAC;EACvDW,kBAAkB,GAAGX,WAAW,CAAuB,CAAC;
|
|
1
|
+
{"version":3,"names":["createEffect","createEvent","restore","setAudioModeAsync","VoiceRecorderState","AUDIO_MODE_CONFIG","playsInSilentMode","allowsRecording","RecorderModel","stopResolver","reset","setVoiceRecordState","setAvailableInputs","setLastKnownDurationMs","$voiceRecordState","IDLE","$availableInputs","$lastKnownDurationMs","start","recorder","prepareToRecordAsync","record","error","console","stop","getStatus","isRecording","Promise","resolve","stopAndGetCollectionItem","resolveStopWithCollectionItem","item","clearStopResolver"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/Recorder.model.ts"],"mappings":";;AAAA,SAASA,YAAY,EAAEC,WAAW,EAAEC,OAAO,QAAQ,UAAU;AAC7D,SAAwBC,iBAAiB,QAAQ,YAAY;AAC7D,SAASC,kBAAkB,QAAQ,iBAAc;AAGjD,MAAMC,iBAAiB,GAAG;EACxBC,iBAAiB,EAAE,IAAI;EACvBC,eAAe,EAAE;AACnB,CAAU;AAIV,OAAO,MAAMC,aAAa,CAAC;EAEjBC,YAAY,GAAwB,IAAI;EAEhCC,KAAK,GAAGT,WAAW,CAAC,CAAC;EACrBU,mBAAmB,GAAGV,WAAW,CAAqB,CAAC;EACvDW,kBAAkB,GAAGX,WAAW,CAAuB,CAAC;EACxDY,sBAAsB,GAAGZ,WAAW,CAAS,CAAC;EAE9Ca,iBAAiB,GAAGZ,OAAO,CACzC,IAAI,CAACS,mBAAmB,EACxBP,kBAAkB,CAACW,IACrB,CAAC,CAACL,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;EACHM,gBAAgB,GAAGd,OAAO,CAAC,IAAI,CAACU,kBAAkB,EAAE,EAAE,CAAC;EACvDK,oBAAoB,GAAGf,OAAO,CAAC,IAAI,CAACW,sBAAsB,EAAE,CAAC,CAAC,CAACH,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;EAEhFQ,KAAK,GAAGlB,YAAY,CAAC,YAAY;IAC/C,IAAI;MACF,MAAMG,iBAAiB,CAACE,iBAAiB,CAAC;MAC1C,MAAM,IAAI,CAACc,QAAQ,CAACC,oBAAoB,CAAC,CAAC;MAC1C,IAAI,CAACD,QAAQ,CAACE,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;MACjD,MAAMA,KAAK;IACb;EACF,CAAC,CAAC;EAEcE,IAAI,GAAGxB,YAAY,CAAC,MAAM;IACxC,IAAI,CAAC,IAAI,CAACmB,QAAQ,CAACM,SAAS,CAAC,CAAC,CAACC,WAAW,EAAE,OAAOC,OAAO,CAACC,OAAO,CAAC,CAAC;IACpE,OAAO,IAAI,CAACT,QAAQ,CAACK,IAAI,CAAC,CAAC;EAC7B,CAAC,CAAC;EAEKK,wBAAwBA,CAAA,EAAuC;IACpE,OAAO,IAAIF,OAAO,CAAEC,OAAO,IAAK;MAC9B,IAAI,CAACnB,YAAY,GAAGmB,OAAO;MAC3B,IAAI,CAACT,QAAQ,CAACM,SAAS,CAAC,CAAC,CAACC,WAAW,IAAI,IAAI,CAACP,QAAQ,CAACK,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC;EACJ;EAEOM,6BAA6BA,CAACC,IAA+B,EAAQ;IAC1E,IAAI,IAAI,CAACtB,YAAY,EAAE;MACrB,IAAI,CAACA,YAAY,CAACsB,IAAI,CAAC;MACvB,IAAI,CAACtB,YAAY,GAAG,IAAI;IAC1B;EACF;EAEOuB,iBAAiBA,CAAA,EAAS;IAC/B,IAAI,CAACvB,YAAY,GAAG,IAAI;EAC1B;AACF","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { attach, createEffect, createEvent, restore, sample } from 'effector';
|
|
4
|
-
import { ensureRecordingPermissions, generateAudioFormData,
|
|
4
|
+
import { ensureRecordingPermissions, generateAudioFormData, getAvailableInputs, uploadAudioFileRequestGenerator } from "../helpers.js";
|
|
5
5
|
import { t } from "../../../shared/translation/index.js";
|
|
6
6
|
import { RecorderModel } from "./Recorder.model.js";
|
|
7
7
|
import { VoiceRecordsCollection } from "./VoiceRecordCollection.js";
|
|
@@ -26,7 +26,6 @@ export class VoiceRecordModel {
|
|
|
26
26
|
currentKey,
|
|
27
27
|
notification
|
|
28
28
|
}) => {
|
|
29
|
-
console.log('Deleting recording with key:', currentKey);
|
|
30
29
|
const recordingItem = this.collection.get(currentKey);
|
|
31
30
|
this.abortUploadIfInProgress(recordingItem);
|
|
32
31
|
this.resetRecordingState(currentKey);
|
|
@@ -102,9 +101,11 @@ export class VoiceRecordModel {
|
|
|
102
101
|
}
|
|
103
102
|
async handleAudioUpload({
|
|
104
103
|
uri,
|
|
105
|
-
currentKey
|
|
104
|
+
currentKey,
|
|
105
|
+
durationMs
|
|
106
106
|
}) {
|
|
107
|
-
|
|
107
|
+
// Use the last known duration from recorder state (more reliable for old browsers like Chrome 93
|
|
108
|
+
// where getAudioDurationMs can return Infinity)
|
|
108
109
|
const formData = await generateAudioFormData({
|
|
109
110
|
audioFileUri: uri,
|
|
110
111
|
durationMs,
|
|
@@ -142,19 +143,22 @@ export class VoiceRecordModel {
|
|
|
142
143
|
setupUploadHandler() {
|
|
143
144
|
sample({
|
|
144
145
|
clock: this.startAudioUpload,
|
|
145
|
-
source:
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
source: {
|
|
147
|
+
currentKey: this.$currentKey,
|
|
148
|
+
durationMs: this.recorderModel.$lastKnownDurationMs
|
|
149
|
+
},
|
|
150
|
+
filter: ({
|
|
151
|
+
currentKey
|
|
152
|
+
}, uri) => !!uri && !!currentKey,
|
|
153
|
+
fn: ({
|
|
154
|
+
currentKey,
|
|
155
|
+
durationMs
|
|
156
|
+
}, uri) => ({
|
|
148
157
|
currentKey,
|
|
158
|
+
durationMs,
|
|
149
159
|
uri
|
|
150
160
|
}),
|
|
151
|
-
target: createEffect((
|
|
152
|
-
uri,
|
|
153
|
-
currentKey
|
|
154
|
-
}) => this.handleAudioUpload({
|
|
155
|
-
uri,
|
|
156
|
-
currentKey
|
|
157
|
-
}))
|
|
161
|
+
target: createEffect(params => this.handleAudioUpload(params))
|
|
158
162
|
});
|
|
159
163
|
}
|
|
160
164
|
setupCurrentRecordSync() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["attach","createEffect","createEvent","restore","sample","ensureRecordingPermissions","generateAudioFormData","
|
|
1
|
+
{"version":3,"names":["attach","createEffect","createEvent","restore","sample","ensureRecordingPermissions","generateAudioFormData","getAvailableInputs","uploadAudioFileRequestGenerator","t","RecorderModel","VoiceRecordsCollection","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","catch","name","stopAndDiscard","stop","clearStopResolver","recordingStatusUpdate","status","console","log","isFinished","url","constructor","api","events","setupUploadHandler","setupCurrentRecordSync","id","controller","abort","delete","handleAudioUpload","uri","durationMs","formData","audioFileUri","fileName","uploadAudio","audioUploadPromise","then","data","update","collectionItem","add","resolveStopWithCollectionItem","clock","$lastKnownDurationMs","filter","fn","target","params"],"sourceRoot":"../../../../../src","sources":["features/voiceRecord/model/VoiceRecord.model.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../src/features/voiceRecord/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,aAAa,EAId,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,eAAO,MAAM,cAAc,OAAQ,MAAM,KAAG,MAK3C,CAAA;AAED,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../src/features/voiceRecord/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,aAAa,EAId,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,eAAO,MAAM,cAAc,OAAQ,MAAM,KAAG,MAK3C,CAAA;AAED,eAAO,MAAM,0BAA0B,wBAUtC,CAAA;AASD,eAAO,MAAM,kBAAkB,aAAoB,aAAa,uEAQ/D,CAAA;AAED,eAAO,MAAM,yBAAyB,aAAc,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,IAAI,eAiBvF,CAAA;AACD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,YACpB,MAAM,mBACE,WAAW,KAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAkC5B,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,qBAAqB,4CAI/B,2BAA2B,KAAG,OAAO,CAAC,QAAQ,CA+BhD,CAAA;AAED,eAAO,MAAM,+BAA+B,sBAAuB,QAAQ,OAAO,QAAQ;;;;;;;CAgBzF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAK7D,eAAO,MAAM,gBAAgB,UAAW,gBAAgB;;
|
|
1
|
+
{"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAK7D,eAAO,MAAM,gBAAgB,UAAW,gBAAgB;;CAsDvD,CAAA"}
|
|
@@ -7,8 +7,10 @@ export declare class RecorderModel {
|
|
|
7
7
|
readonly reset: import("effector").EventCallable<void>;
|
|
8
8
|
readonly setVoiceRecordState: import("effector").EventCallable<VoiceRecorderState>;
|
|
9
9
|
readonly setAvailableInputs: import("effector").EventCallable<MediaDeviceInfo[] | import("expo-audio").RecordingInput[]>;
|
|
10
|
+
readonly setLastKnownDurationMs: import("effector").EventCallable<number>;
|
|
10
11
|
readonly $voiceRecordState: import("effector").StoreWritable<VoiceRecorderState>;
|
|
11
12
|
readonly $availableInputs: import("effector").StoreWritable<MediaDeviceInfo[] | import("expo-audio").RecordingInput[]>;
|
|
13
|
+
readonly $lastKnownDurationMs: import("effector").StoreWritable<number>;
|
|
12
14
|
readonly start: import("effector").Effect<void, void, Error>;
|
|
13
15
|
readonly stop: import("effector").Effect<void, void, Error>;
|
|
14
16
|
stopAndGetCollectionItem(): Promise<VoiceRecordCollectionItem>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Recorder.model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/model/Recorder.model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAwB,yBAAyB,EAAE,MAAM,UAAU,CAAA;AAS1E,qBAAa,aAAa;IACjB,QAAQ,EAAG,aAAa,CAAA;IAC/B,OAAO,CAAC,YAAY,CAA4B;IAEhD,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,mBAAmB,uDAAoC;IACvE,SAAgB,kBAAkB,8FAAsC;
|
|
1
|
+
{"version":3,"file":"Recorder.model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/model/Recorder.model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAwB,yBAAyB,EAAE,MAAM,UAAU,CAAA;AAS1E,qBAAa,aAAa;IACjB,QAAQ,EAAG,aAAa,CAAA;IAC/B,OAAO,CAAC,YAAY,CAA4B;IAEhD,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,mBAAmB,uDAAoC;IACvE,SAAgB,kBAAkB,8FAAsC;IACxE,SAAgB,sBAAsB,2CAAwB;IAE9D,SAAgB,iBAAiB,uDAGd;IACnB,SAAgB,gBAAgB,8FAAuC;IACvE,SAAgB,oBAAoB,2CAA4D;IAEhG,SAAgB,KAAK,+CASnB;IAEF,SAAgB,IAAI,+CAGlB;IAEK,wBAAwB,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAO9D,6BAA6B,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI;IAOpE,iBAAiB,IAAI,IAAI;CAGjC"}
|
|
@@ -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,EAA6B,MAAM,UAAU,CAAA;AAE5F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAEhE,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,QAAQ,CAAA;IACb,YAAY,EAAE,4BAA4B,CAAA;IAC1C,MAAM,EAAE,iBAAiB,CAAA;CAC1B,CAAA;
|
|
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;AAEhE,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,QAAQ,CAAA;IACb,YAAY,EAAE,4BAA4B,CAAA;IAC1C,MAAM,EAAE,iBAAiB,CAAA;CAC1B,CAAA;AAQD,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,+CAsBjC;IAEF,SAAgB,cAAc,+CAK5B;IAEF,SAAgB,qBAAqB,WAAY,GAAG,UAcnD;gBAEW,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,sBAAsB;IAWjE,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,mBAAmB;YAMb,iBAAiB;IAuC/B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,sBAAsB;CAc/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../src/features/voiceRecord/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,aAAa,EAId,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,eAAO,MAAM,cAAc,OAAQ,MAAM,KAAG,MAK3C,CAAA;AAED,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../src/features/voiceRecord/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,aAAa,EAId,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,eAAO,MAAM,cAAc,OAAQ,MAAM,KAAG,MAK3C,CAAA;AAED,eAAO,MAAM,0BAA0B,wBAUtC,CAAA;AASD,eAAO,MAAM,kBAAkB,aAAoB,aAAa,uEAQ/D,CAAA;AAED,eAAO,MAAM,yBAAyB,aAAc,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,IAAI,eAiBvF,CAAA;AACD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,YACpB,MAAM,mBACE,WAAW,KAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAkC5B,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,qBAAqB,4CAI/B,2BAA2B,KAAG,OAAO,CAAC,QAAQ,CA+BhD,CAAA;AAED,eAAO,MAAM,+BAA+B,sBAAuB,QAAQ,OAAO,QAAQ;;;;;;;CAgBzF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAK7D,eAAO,MAAM,gBAAgB,UAAW,gBAAgB;;
|
|
1
|
+
{"version":3,"file":"useVoiceRecorder.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/hooks/useVoiceRecorder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAK7D,eAAO,MAAM,gBAAgB,UAAW,gBAAgB;;CAsDvD,CAAA"}
|
|
@@ -7,8 +7,10 @@ export declare class RecorderModel {
|
|
|
7
7
|
readonly reset: import("effector").EventCallable<void>;
|
|
8
8
|
readonly setVoiceRecordState: import("effector").EventCallable<VoiceRecorderState>;
|
|
9
9
|
readonly setAvailableInputs: import("effector").EventCallable<MediaDeviceInfo[] | import("expo-audio").RecordingInput[]>;
|
|
10
|
+
readonly setLastKnownDurationMs: import("effector").EventCallable<number>;
|
|
10
11
|
readonly $voiceRecordState: import("effector").StoreWritable<VoiceRecorderState>;
|
|
11
12
|
readonly $availableInputs: import("effector").StoreWritable<MediaDeviceInfo[] | import("expo-audio").RecordingInput[]>;
|
|
13
|
+
readonly $lastKnownDurationMs: import("effector").StoreWritable<number>;
|
|
12
14
|
readonly start: import("effector").Effect<void, void, Error>;
|
|
13
15
|
readonly stop: import("effector").Effect<void, void, Error>;
|
|
14
16
|
stopAndGetCollectionItem(): Promise<VoiceRecordCollectionItem>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Recorder.model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/model/Recorder.model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAwB,yBAAyB,EAAE,MAAM,UAAU,CAAA;AAS1E,qBAAa,aAAa;IACjB,QAAQ,EAAG,aAAa,CAAA;IAC/B,OAAO,CAAC,YAAY,CAA4B;IAEhD,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,mBAAmB,uDAAoC;IACvE,SAAgB,kBAAkB,8FAAsC;
|
|
1
|
+
{"version":3,"file":"Recorder.model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/voiceRecord/model/Recorder.model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAwB,yBAAyB,EAAE,MAAM,UAAU,CAAA;AAS1E,qBAAa,aAAa;IACjB,QAAQ,EAAG,aAAa,CAAA;IAC/B,OAAO,CAAC,YAAY,CAA4B;IAEhD,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,mBAAmB,uDAAoC;IACvE,SAAgB,kBAAkB,8FAAsC;IACxE,SAAgB,sBAAsB,2CAAwB;IAE9D,SAAgB,iBAAiB,uDAGd;IACnB,SAAgB,gBAAgB,8FAAuC;IACvE,SAAgB,oBAAoB,2CAA4D;IAEhG,SAAgB,KAAK,+CASnB;IAEF,SAAgB,IAAI,+CAGlB;IAEK,wBAAwB,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAO9D,6BAA6B,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI;IAOpE,iBAAiB,IAAI,IAAI;CAGjC"}
|
|
@@ -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,EAA6B,MAAM,UAAU,CAAA;AAE5F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAEhE,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,QAAQ,CAAA;IACb,YAAY,EAAE,4BAA4B,CAAA;IAC1C,MAAM,EAAE,iBAAiB,CAAA;CAC1B,CAAA;
|
|
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;AAEhE,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,QAAQ,CAAA;IACb,YAAY,EAAE,4BAA4B,CAAA;IAC1C,MAAM,EAAE,iBAAiB,CAAA;CAC1B,CAAA;AAQD,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,+CAsBjC;IAEF,SAAgB,cAAc,+CAK5B;IAEF,SAAgB,qBAAqB,WAAY,GAAG,UAcnD;gBAEW,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,sBAAsB;IAWjE,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,mBAAmB;YAMb,iBAAiB;IAuC/B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,sBAAsB;CAc/B"}
|
package/package.json
CHANGED
|
@@ -17,6 +17,7 @@ export const formatDuration = (ms: number): string => {
|
|
|
17
17
|
|
|
18
18
|
export const ensureRecordingPermissions = async () => {
|
|
19
19
|
const { status } = await getRecordingPermissionsAsync()
|
|
20
|
+
console.log('permission status: ', status)
|
|
20
21
|
|
|
21
22
|
if (status !== 'granted') {
|
|
22
23
|
const { granted } = await requestRecordingPermissionsAsync()
|
|
@@ -72,19 +73,14 @@ export const getAudioDurationMs = (
|
|
|
72
73
|
externalPlayer?: AudioPlayer,
|
|
73
74
|
): Promise<number | undefined> => {
|
|
74
75
|
if (!fileUri) return Promise.resolve(undefined)
|
|
75
|
-
console.log('fileUri: ', fileUri)
|
|
76
76
|
|
|
77
77
|
const player = externalPlayer ?? createAudioPlayer()
|
|
78
|
-
console.log('player: ', player)
|
|
79
78
|
const isInternalPlayer = !externalPlayer
|
|
80
|
-
console.log('isInternalPlayer: ', isInternalPlayer)
|
|
81
79
|
|
|
82
80
|
player.replace(fileUri)
|
|
83
81
|
|
|
84
82
|
return new Promise((resolve, reject) => {
|
|
85
83
|
const subscription = player.addListener('playbackStatusUpdate', () => {
|
|
86
|
-
console.log('player.duration: ', player.duration)
|
|
87
|
-
|
|
88
84
|
if (player.duration !== undefined && player.duration > 0) {
|
|
89
85
|
subscription.remove()
|
|
90
86
|
|
|
@@ -16,6 +16,10 @@ export const useVoiceRecorder = (model: VoiceRecordModel) => {
|
|
|
16
16
|
) {
|
|
17
17
|
model.recorderModel.stop()
|
|
18
18
|
}
|
|
19
|
+
// Track the last known duration while recording (for old browsers where getAudioDurationMs returns Infinity)
|
|
20
|
+
if (recorderState.isRecording && recorderState.durationMillis > 0) {
|
|
21
|
+
model.recorderModel.setLastKnownDurationMs(recorderState.durationMillis)
|
|
22
|
+
}
|
|
19
23
|
}, [recorderState.durationMillis])
|
|
20
24
|
|
|
21
25
|
useEffect(() => {
|
|
@@ -17,12 +17,14 @@ export class RecorderModel {
|
|
|
17
17
|
public readonly reset = createEvent()
|
|
18
18
|
public readonly setVoiceRecordState = createEvent<VoiceRecorderState>()
|
|
19
19
|
public readonly setAvailableInputs = createEvent<AvailableAudioInputs>()
|
|
20
|
+
public readonly setLastKnownDurationMs = createEvent<number>()
|
|
20
21
|
|
|
21
22
|
public readonly $voiceRecordState = restore(
|
|
22
23
|
this.setVoiceRecordState,
|
|
23
24
|
VoiceRecorderState.IDLE,
|
|
24
25
|
).reset(this.reset)
|
|
25
26
|
public readonly $availableInputs = restore(this.setAvailableInputs, [])
|
|
27
|
+
public readonly $lastKnownDurationMs = restore(this.setLastKnownDurationMs, 0).reset(this.reset)
|
|
26
28
|
|
|
27
29
|
public readonly start = createEffect(async () => {
|
|
28
30
|
try {
|
|
@@ -20,6 +20,7 @@ type VoiceRecordModelParams = {
|
|
|
20
20
|
type UploadParams = {
|
|
21
21
|
uri: string
|
|
22
22
|
currentKey: string
|
|
23
|
+
durationMs: number
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
type VoiceRecordEvents = {
|
|
@@ -62,7 +63,6 @@ export class VoiceRecordModel {
|
|
|
62
63
|
currentKey,
|
|
63
64
|
}),
|
|
64
65
|
effect: createEffect(({ currentKey, notification }: DeleteCurrentRecordingValues) => {
|
|
65
|
-
console.log('Deleting recording with key:', currentKey)
|
|
66
66
|
const recordingItem = this.collection.get(currentKey)
|
|
67
67
|
|
|
68
68
|
this.abortUploadIfInProgress(recordingItem)
|
|
@@ -144,8 +144,9 @@ export class VoiceRecordModel {
|
|
|
144
144
|
this.collection.delete(currentKey)
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
private async handleAudioUpload({ uri, currentKey }: UploadParams) {
|
|
148
|
-
|
|
147
|
+
private async handleAudioUpload({ uri, currentKey, durationMs }: UploadParams) {
|
|
148
|
+
// Use the last known duration from recorder state (more reliable for old browsers like Chrome 93
|
|
149
|
+
// where getAudioDurationMs can return Infinity)
|
|
149
150
|
const formData = await generateAudioFormData({
|
|
150
151
|
audioFileUri: uri,
|
|
151
152
|
durationMs,
|
|
@@ -185,12 +186,13 @@ export class VoiceRecordModel {
|
|
|
185
186
|
private setupUploadHandler() {
|
|
186
187
|
sample({
|
|
187
188
|
clock: this.startAudioUpload,
|
|
188
|
-
source:
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
),
|
|
189
|
+
source: {
|
|
190
|
+
currentKey: this.$currentKey,
|
|
191
|
+
durationMs: this.recorderModel.$lastKnownDurationMs,
|
|
192
|
+
},
|
|
193
|
+
filter: ({ currentKey }, uri) => !!uri && !!currentKey,
|
|
194
|
+
fn: ({ currentKey, durationMs }, uri) => ({ currentKey, durationMs, uri }),
|
|
195
|
+
target: createEffect((params: UploadParams) => this.handleAudioUpload(params)),
|
|
194
196
|
})
|
|
195
197
|
}
|
|
196
198
|
|