@@ -14,7 +14,7 @@ import {
14
14
FaVolumeDown ,
15
15
FaVolumeUp ,
16
16
FaRegTrashAlt ,
17
- FaDownload
17
+ FaDownload ,
18
18
} from 'react-icons/fa' ;
19
19
import { useDispatch , useSelector } from 'react-redux' ;
20
20
import ListGroup from 'react-bootstrap/ListGroup' ;
@@ -89,7 +89,7 @@ function AudioViewer({ src }) {
89
89
height : '1.05em' ,
90
90
cursor : 'pointer' ,
91
91
color : 'red' ,
92
- paddingLeft : '2px'
92
+ paddingLeft : '2px' ,
93
93
} }
94
94
onClick = { toggleVolume }
95
95
/>
@@ -112,7 +112,7 @@ function AudioViewer({ src }) {
112
112
width : '1.23em' ,
113
113
height : '1.23em' ,
114
114
cursor : 'pointer' ,
115
- paddingLeft : '3px'
115
+ paddingLeft : '3px' ,
116
116
} }
117
117
onClick = { toggleVolume }
118
118
/>
@@ -131,7 +131,7 @@ function AudioViewer({ src }) {
131
131
cursorWidth : 3 ,
132
132
height : 200 ,
133
133
barGap : 3 ,
134
- dragToSeek : true
134
+ dragToSeek : true ,
135
135
// plugins:[
136
136
// WaveSurferRegions.create({maxLength: 60}),
137
137
// WaveSurferTimeLinePlugin.create({container: containerT.current})
@@ -161,7 +161,7 @@ function AudioViewer({ src }) {
161
161
flexDirection : 'column' ,
162
162
justifyContent : 'center' ,
163
163
alignItems : 'center' ,
164
- margin : '0 1rem 0 1rem'
164
+ margin : '0 1rem 0 1rem' ,
165
165
} }
166
166
>
167
167
< div
@@ -173,7 +173,7 @@ function AudioViewer({ src }) {
173
173
style = { {
174
174
display : 'flex' ,
175
175
justifyContent : 'center' ,
176
- alignItems : 'center'
176
+ alignItems : 'center' ,
177
177
} }
178
178
>
179
179
< Button
@@ -185,7 +185,7 @@ function AudioViewer({ src }) {
185
185
width : '40px' ,
186
186
height : '40px' ,
187
187
borderRadius : '50%' ,
188
- padding : '0'
188
+ padding : '0' ,
189
189
} }
190
190
onClick = { playPause }
191
191
>
@@ -220,13 +220,13 @@ export default function Recorder({ submit, accompaniment }) {
220
220
221
221
const getSupportedMimeType = ( ) => {
222
222
const types = [
223
+ 'audio/ogg;codecs=opus' ,
223
224
'audio/webm' ,
224
225
'audio/webm;codecs=opus' ,
225
- 'audio/ogg;codecs=opus' ,
226
226
'audio/mp4' ,
227
- 'audio/mpeg'
227
+ 'audio/mpeg' ,
228
228
] ;
229
- return types . find ( type => MediaRecorder . isTypeSupported ( type ) ) || null ;
229
+ return types . find ( ( type ) => MediaRecorder . isTypeSupported ( type ) ) || null ;
230
230
} ;
231
231
const [ min , setMinute ] = useState ( 0 ) ;
232
232
const [ sec , setSecond ] = useState ( 0 ) ;
@@ -236,14 +236,11 @@ export default function Recorder({ submit, accompaniment }) {
236
236
const router = useRouter ( ) ;
237
237
const { slug, piece, actCategory, partType } = router . query ;
238
238
239
- useEffect (
240
- ( ) => {
241
- setBlobInfo ( [ ] ) ;
242
- setBlobURL ( '' ) ;
243
- setBlobData ( ) ;
244
- } ,
245
- [ partType ]
246
- ) ;
239
+ useEffect ( ( ) => {
240
+ setBlobInfo ( [ ] ) ;
241
+ setBlobURL ( '' ) ;
242
+ setBlobData ( ) ;
243
+ } , [ partType ] ) ;
247
244
248
245
const startRecording = ( ) => {
249
246
if ( isBlocked ) {
@@ -263,7 +260,7 @@ export default function Recorder({ submit, accompaniment }) {
263
260
mediaRecorder . stop ( ) ;
264
261
} ;
265
262
266
- const downloadRecording = i => {
263
+ const downloadRecording = ( i ) => {
267
264
const url = window . URL . createObjectURL ( blobInfo [ i ] . data ) ;
268
265
const a = document . createElement ( 'a' ) ;
269
266
a . style . display = 'none' ;
@@ -283,12 +280,19 @@ export default function Recorder({ submit, accompaniment }) {
283
280
} ;
284
281
285
282
const submitRecording = ( i , submissionId ) => {
283
+ const extension = mimeType . includes ( 'webm' )
284
+ ? 'webm'
285
+ : mimeType . includes ( 'ogg' )
286
+ ? 'ogg'
287
+ : mimeType . includes ( 'mp4' )
288
+ ? 'm4a'
289
+ : 'wav' ;
286
290
const formData = new FormData ( ) ; // TODO: make filename reflect assignment
287
291
formData . append (
288
292
'file' ,
289
- new File ( [ blobInfo [ i ] . data ] , ' student-recording' , {
290
- type : mimeType
291
- } )
293
+ new File ( [ blobInfo [ i ] . data ] , ` student-recording- ${ i } . ${ extension } ` , {
294
+ type : mimeType ,
295
+ } ) ,
292
296
) ;
293
297
// dispatch(submit({ audio: formData }));
294
298
submit ( { audio : formData , submissionId } ) ;
@@ -314,10 +318,10 @@ export default function Recorder({ submit, accompaniment }) {
314
318
autoGainControl : false ,
315
319
channelCount : 1 ,
316
320
sampleRate : 48000 ,
317
- latency : 0
318
- }
321
+ latency : 0 ,
322
+ } ,
319
323
} )
320
- . then ( stream => {
324
+ . then ( ( stream ) => {
321
325
const supportedType = getSupportedMimeType ( ) ;
322
326
if ( ! supportedType ) {
323
327
console . error ( 'No supported audio MIME type found' ) ;
@@ -327,10 +331,10 @@ export default function Recorder({ submit, accompaniment }) {
327
331
setMimeType ( supportedType ) ;
328
332
329
333
const recorder = new MediaRecorder ( stream , {
330
- mimeType : supportedType
334
+ mimeType : supportedType ,
331
335
} ) ;
332
336
333
- recorder . ondataavailable = e => {
337
+ recorder . ondataavailable = ( e ) => {
334
338
if ( e . data . size > 0 ) {
335
339
chunksRef . current . push ( e . data ) ;
336
340
}
@@ -341,12 +345,12 @@ export default function Recorder({ submit, accompaniment }) {
341
345
setBlobData ( blob ) ;
342
346
const url = URL . createObjectURL ( blob ) ;
343
347
setBlobURL ( url ) ;
344
- setBlobInfo ( prevInfo => [
348
+ setBlobInfo ( ( prevInfo ) => [
345
349
...prevInfo ,
346
350
{
347
351
url,
348
- data : blob
349
- }
352
+ data : blob ,
353
+ } ,
350
354
] ) ;
351
355
setIsRecording ( false ) ;
352
356
chunksRef . current = [ ] ;
@@ -355,39 +359,36 @@ export default function Recorder({ submit, accompaniment }) {
355
359
setMediaRecorder ( recorder ) ;
356
360
setIsBlocked ( false ) ;
357
361
} )
358
- . catch ( err => {
362
+ . catch ( ( err ) => {
359
363
console . log ( 'Permission Denied' ) ;
360
364
setIsBlocked ( true ) ;
361
365
} ) ;
362
366
}
363
367
} , [ ] ) ;
364
368
365
- useEffect (
366
- ( ) => {
367
- let interval = null ;
368
- if ( isRecording ) {
369
- interval = setInterval ( ( ) => {
370
- setSecond ( sec + 1 ) ;
371
- if ( sec === 59 ) {
372
- setMinute ( min + 1 ) ;
373
- setSecond ( 0 ) ;
374
- }
375
- if ( min === 99 ) {
376
- setMinute ( 0 ) ;
377
- setSecond ( 0 ) ;
378
- }
379
- } , 1000 ) ;
380
- } else if ( ! isRecording && sec !== 0 ) {
381
- setMinute ( 0 ) ;
382
- setSecond ( 0 ) ;
383
- clearInterval ( interval ) ;
384
- }
385
- return ( ) => {
386
- clearInterval ( interval ) ;
387
- } ;
388
- } ,
389
- [ isRecording , sec ]
390
- ) ;
369
+ useEffect ( ( ) => {
370
+ let interval = null ;
371
+ if ( isRecording ) {
372
+ interval = setInterval ( ( ) => {
373
+ setSecond ( sec + 1 ) ;
374
+ if ( sec === 59 ) {
375
+ setMinute ( min + 1 ) ;
376
+ setSecond ( 0 ) ;
377
+ }
378
+ if ( min === 99 ) {
379
+ setMinute ( 0 ) ;
380
+ setSecond ( 0 ) ;
381
+ }
382
+ } , 1000 ) ;
383
+ } else if ( ! isRecording && sec !== 0 ) {
384
+ setMinute ( 0 ) ;
385
+ setSecond ( 0 ) ;
386
+ clearInterval ( interval ) ;
387
+ }
388
+ return ( ) => {
389
+ clearInterval ( interval ) ;
390
+ } ;
391
+ } , [ isRecording , sec ] ) ;
391
392
392
393
return (
393
394
< >
0 commit comments