@@ -20,7 +20,6 @@ import {
2020 Box ,
2121 Chip ,
2222 Typography ,
23- Divider ,
2423} from '@mui/material' ;
2524import { useTranslation } from 'react-i18next' ;
2625import GeneralSettingsDialog from './GeneralSettingsDialog.tsx' ;
@@ -295,7 +294,13 @@ function OptionButton(props: OptionButtonProps) {
295294 } ;
296295
297296 const handleRecordingConfirm = ( ) : void => {
298- props ?. startRecord ?.( recordSeparately , serverSideRecordingChecked , localRecordingChecked ) ;
297+ // Recording each participant separately is itself a server-side capability,
298+ // so it must enable server recording even if "Cloud recording" wasn't checked.
299+ props ?. startRecord ?.(
300+ recordSeparately ,
301+ serverSideRecordingChecked || recordSeparately ,
302+ localRecordingChecked ,
303+ ) ;
299304 if ( localRecordingChecked && props . startLocalRecording ) {
300305 props . startLocalRecording ( ) ;
301306 }
@@ -418,41 +423,49 @@ function OptionButton(props: OptionButtonProps) {
418423 label = {
419424 < Box sx = { { pt : 1 } } >
420425 < Box sx = { { display : 'flex' , alignItems : 'center' , gap : 1 } } >
421- < Typography fontWeight = { 600 } > { t ( 'Cloud recording' ) } </ Typography >
426+ < Typography fontWeight = { 600 } > { t ( 'Grid recording' ) } </ Typography >
422427 < Chip label = { t ( 'SERVER-SIDE' ) } size = "small" />
423428 </ Box >
424429 < Typography variant = "body2" color = "text.secondary" >
425430 { t (
426- 'Recorded and stored on Red5 Cloud. Best for sharing, long sessions, and high quality regardless of your connection.' ,
431+ 'Records the meeting grid view as a single MP4 file, stored on Red5 Cloud. Best for sharing, long sessions, and high quality regardless of your connection.' ,
427432 ) }
428433 </ Typography >
429434 </ Box >
430435 }
431436 />
432- { serverSideRecordingChecked && (
433- < >
434- < Divider sx = { { my : 1 } } />
435- < FormControlLabel
436- sx = { { alignItems : 'flex-start' , width : '100%' , m : 0 , pl : 1 } }
437- control = {
438- < Checkbox
439- checked = { recordSeparately }
440- onChange = { ( e ) => setRecordSeparately ( e . target . checked ) }
441- />
442- }
443- label = {
444- < Box sx = { { pt : 1 } } >
445- < Typography > { t ( 'Record participants separately' ) } </ Typography >
446- < Typography variant = "body2" color = "text.secondary" >
447- { t (
448- "Save each participant's audio and video as its own file. Available with cloud recording only." ,
449- ) }
450- </ Typography >
451- </ Box >
452- }
437+ </ Box >
438+ < Box
439+ sx = { {
440+ border : '1px solid' ,
441+ borderColor : recordSeparately ? 'error.main' : 'divider' ,
442+ borderRadius : 2 ,
443+ p : 1 ,
444+ mb : 1.5 ,
445+ } }
446+ >
447+ < FormControlLabel
448+ sx = { { alignItems : 'flex-start' , width : '100%' , m : 0 } }
449+ control = {
450+ < Checkbox
451+ checked = { recordSeparately }
452+ onChange = { ( e ) => setRecordSeparately ( e . target . checked ) }
453453 />
454- </ >
455- ) }
454+ }
455+ label = {
456+ < Box sx = { { pt : 1 } } >
457+ < Box sx = { { display : 'flex' , alignItems : 'center' , gap : 1 } } >
458+ < Typography fontWeight = { 600 } > { t ( 'Record participants separately' ) } </ Typography >
459+ < Chip label = { t ( 'SERVER-SIDE' ) } size = "small" />
460+ </ Box >
461+ < Typography variant = "body2" color = "text.secondary" >
462+ { t (
463+ "Records each participant's audio and video as an independent MP4 file, stored on Red5 Cloud." ,
464+ ) }
465+ </ Typography >
466+ </ Box >
467+ }
468+ />
456469 </ Box >
457470 < Box
458471 sx = { {
@@ -491,7 +504,7 @@ function OptionButton(props: OptionButtonProps) {
491504 < Button
492505 onClick = { handleRecordingConfirm }
493506 variant = "contained"
494- disabled = { ! serverSideRecordingChecked && ! localRecordingChecked }
507+ disabled = { ! serverSideRecordingChecked && ! recordSeparately && ! localRecordingChecked }
495508 >
496509 { t ( 'Start Recording' ) }
497510 </ Button >
0 commit comments