2020-06-16 16:54:50 +02:00
import React , { useState , useEffect } from 'react' ;
2020-08-27 17:21:34 +02:00
import { Access , Room , Permission , RoomShare , api , Restriction } from '../Common/Api' ;
2020-06-04 14:01:31 +02:00
import Dialog from './Dialog' ;
2020-06-15 17:23:53 +02:00
import ShareWith from './ShareWith' ;
2020-06-04 14:01:31 +02:00
import { SubmitInput } from './SubmitInput' ;
2020-08-27 17:21:34 +02:00
import { AccessOptions } from '../Common/Translation' ;
2020-06-04 14:01:31 +02:00
const descriptions : { [ key : string ] : string } = {
name : t ( 'bbb' , 'Descriptive name of this room.' ) ,
welcome : t ( 'bbb' , 'This message is shown to all users in the chat area after they joined.' ) ,
maxParticipants : t ( 'bbb' , 'Sets a limit on the number of participants for this room. Zero means there is no limit.' ) ,
recording : t ( 'bbb' , 'If enabled, the moderator is able to start the recording.' ) ,
2020-06-04 18:56:55 +02:00
access : t ( 'bbb' , 'Public: Everyone knowing the link is able to join. Password: Guests have to provide a password. Waiting room: A moderator has to accept every guest before they can join. Internal: Only Nextcloud users can join.' ) ,
2020-06-17 08:19:54 +02:00
moderator : t ( 'bbb' , 'A moderator is able to manage all participants in a meeting including kicking, muting or selecting a presenter. Users with the role moderator are also able to close a meeting or change the default settings.' ) ,
2020-08-29 14:37:50 +02:00
requireModerator : t ( 'bbb' , 'If enabled, normal users have to wait until a moderator is in the room.' ) ,
2020-06-04 14:01:31 +02:00
} ;
type Props = {
2020-06-16 16:54:50 +02:00
room : Room ;
2020-08-27 17:21:34 +02:00
restriction? : Restriction ;
2020-06-16 16:54:50 +02:00
updateProperty : ( key : string , value : string | boolean | number ) = > Promise < void > ;
open : boolean ;
setOpen : ( open : boolean ) = > void ;
2020-06-04 14:01:31 +02:00
}
2020-08-27 17:21:34 +02:00
const EditRoomDialog : React.FC < Props > = ( { room , restriction , updateProperty , open , setOpen } ) = > {
2020-06-16 16:54:50 +02:00
const [ shares , setShares ] = useState < RoomShare [ ] > ( ) ;
2020-08-27 17:21:34 +02:00
const maxParticipantsLimit = ( restriction ? . maxParticipants || 0 ) < 0 ? undefined : restriction ? . maxParticipants ;
const minParticipantsLimit = ( restriction ? . maxParticipants || - 1 ) < 1 ? 0 : 1 ;
2020-06-16 16:54:50 +02:00
useEffect ( ( ) = > {
if ( ! open ) {
return ;
}
api . getRoomShares ( room . id ) . then ( roomShares = > {
console . log ( room . name , roomShares ) ;
setShares ( roomShares ) ;
} ) . catch ( err = > {
console . warn ( 'Could not load room shares.' , err ) ;
setShares ( [ ] ) ;
} ) ;
} , [ room . id , open ] ) ;
2020-06-04 14:01:31 +02:00
2020-09-08 17:01:50 +02:00
useEffect ( ( ) = > {
if ( ! shares ) {
return ;
}
updateProperty ( 'shared' , shares . filter ( share = > share . permission === Permission . Admin ) . length > 0 ) ;
} , [ shares ] ) ;
2020-06-04 18:56:55 +02:00
function inputElement ( label : string , field : string , type : 'text' | 'number' = 'text' ) {
2020-06-04 14:01:31 +02:00
return (
< div className = "bbb-form-element" >
< label htmlFor = { ` bbb- ${ field } ` } >
2020-06-04 18:56:55 +02:00
< h3 > { label } < / h3 >
2020-06-04 14:01:31 +02:00
< / label >
2020-08-27 17:21:34 +02:00
< SubmitInput initialValue = { room [ field ] } type = { type } name = { field } onSubmitValue = { value = > updateProperty ( field , value ) } min = { minParticipantsLimit } max = { maxParticipantsLimit } / >
2020-06-04 14:01:31 +02:00
{ descriptions [ field ] && < em > { descriptions [ field ] } < / em > }
< / div >
) ;
}
2020-06-16 16:54:50 +02:00
function selectElement ( label : string , field : string , value : string , options : { [ key : string ] : string } , onChange : ( value : string ) = > void ) {
2020-06-04 18:56:55 +02:00
return (
< div className = "bbb-form-element" >
< label htmlFor = { ` bbb- ${ field } ` } >
< h3 > { label } < / h3 >
< / label >
< select name = { field } value = { value } onChange = { ( event ) = > onChange ( event . target . value ) } >
{ Object . keys ( options ) . map ( key = > {
const label = options [ key ] ;
return < option key = { key } value = { key } > { label } < / option > ;
} ) }
< / select >
{ ( value === Access . Password && room . password ) && < input type = "text" readOnly = { true } value = { room . password } / > }
{ descriptions [ field ] && < em > { descriptions [ field ] } < / em > }
< / div >
) ;
}
2020-08-27 17:21:34 +02:00
const accessOptions = { . . . AccessOptions } ;
for ( const roomType of restriction ? . roomTypes || [ ] ) {
if ( roomType !== room . access ) {
delete accessOptions [ roomType ] ;
}
}
2020-06-04 14:01:31 +02:00
return (
2020-06-16 16:54:50 +02:00
< Dialog open = { open } onClose = { ( ) = > setOpen ( false ) } title = { t ( 'bbb' , 'Edit "{room}"' , { room : room.name } ) } >
{ inputElement ( t ( 'bbb' , 'Name' ) , 'name' ) }
{ inputElement ( t ( 'bbb' , 'Welcome' ) , 'welcome' ) }
{ inputElement ( t ( 'bbb' , 'Participant limit' ) , 'maxParticipants' , 'number' ) }
2020-08-27 17:21:34 +02:00
{ selectElement ( t ( 'bbb' , 'Access' ) , 'access' , room . access , accessOptions , ( value ) = > {
2020-06-16 16:54:50 +02:00
console . log ( 'access' , value ) ;
updateProperty ( 'access' , value ) ;
} ) }
{ room . access === Access . InternalRestricted && < div className = "bbb-form-element bbb-form-shareWith" >
< ShareWith permission = { Permission . User } room = { room } shares = { shares } setShares = { setShares } / >
< / div > }
2020-06-15 17:23:53 +02:00
2020-06-16 16:54:50 +02:00
< div className = "bbb-form-element" >
< label htmlFor = { 'bbb-moderator' } >
< h3 > Moderator < / h3 >
< / label >
2020-06-17 08:19:54 +02:00
{ ! room . everyoneIsModerator && < ShareWith permission = { Permission . Moderator } room = { room } shares = { shares } setShares = { setShares } / > }
< div className = "bbb-mt-1" >
< input id = { ` bbb-everyoneIsModerator- ${ room . id } ` }
type = "checkbox"
className = "checkbox"
checked = { room . everyoneIsModerator }
onChange = { ( event ) = > updateProperty ( 'everyoneIsModerator' , event . target . checked ) } / >
< label htmlFor = { ` bbb-everyoneIsModerator- ${ room . id } ` } > { t ( 'bbb' , 'Every participant is moderator' ) } < / label >
< / div >
< em > { descriptions . moderator } < / em >
2020-06-16 16:54:50 +02:00
< / div >
< h3 > { t ( 'bbb' , 'Miscellaneous' ) } < / h3 >
< div >
2020-06-04 14:01:31 +02:00
< div >
2020-06-16 16:54:50 +02:00
< input id = { ` bbb-record- ${ room . id } ` }
type = "checkbox"
className = "checkbox"
checked = { room . record }
2020-08-27 17:21:34 +02:00
disabled = { ! restriction ? . allowRecording }
2020-06-16 16:54:50 +02:00
onChange = { ( event ) = > updateProperty ( 'record' , event . target . checked ) } / >
< label htmlFor = { ` bbb-record- ${ room . id } ` } > { t ( 'bbb' , 'Recording' ) } < / label >
2020-06-04 14:01:31 +02:00
< / div >
2020-08-29 14:37:50 +02:00
< p > < em > { descriptions . recording } < / em > < / p >
< / div >
< div >
< div >
< input id = { ` bbb-requireModerator- ${ room . id } ` }
type = "checkbox"
className = "checkbox"
checked = { room . requireModerator }
onChange = { ( event ) = > updateProperty ( 'requireModerator' , event . target . checked ) } / >
< label htmlFor = { ` bbb-requireModerator- ${ room . id } ` } > { t ( 'bbb' , 'Require moderator to start room' ) } < / label >
< / div >
< p > < em > { descriptions . requireModerator } < / em > < / p >
2020-06-16 16:54:50 +02:00
< / div >
< / Dialog >
2020-06-04 14:01:31 +02:00
) ;
} ;
2020-08-27 17:21:34 +02:00
export default EditRoomDialog ;