blob: edf1588c4f9e9ce18a7c098dd828428f891ad1c2 [file] [log] [blame]
Adrien Béraud4e287b92021-04-24 16:15:56 -04001import React, { useState } from 'react'
Adrien Béraudab519ff2022-05-03 15:34:48 -04002
Adrien Béraudab519ff2022-05-03 15:34:48 -04003import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, ListSubheader, Switch, Typography, Grid, Paper, CardContent, Card, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Toolbar, IconButton, ListItemAvatar, Input, TextField } from '@mui/material'
4import { PhoneCallbackRounded, GroupRounded, DeleteRounded, AddCircle } from '@mui/icons-material'
Adrien Béraud6ecaa402021-04-06 17:37:25 -04005
Adrien Béraud21c53cf2021-04-22 00:04:32 -04006import Account from '../../../model/Account'
7import JamiIdCard from './JamiIdCard'
8import ConversationAvatar from './ConversationAvatar'
9import ConversationsOverviewCard from './ConversationsOverviewCard'
Adrien Béraud6ecaa402021-04-06 17:37:25 -040010
Adrien Béraud4e287b92021-04-24 16:15:56 -040011import authManager from '../AuthManager'
Adrien Béraud6c934962021-06-07 10:13:26 -040012import { motion } from 'framer-motion'
Adrien Béraud4e287b92021-04-24 16:15:56 -040013
Adrien Béraud6c934962021-06-07 10:13:26 -040014const transition = { duration: 0.3, ease: [0.43, 0.13, 0.23, 0.96] }
15
16const thumbnailVariants = {
17 initial: { scale: 0.9, opacity: 0 },
18 enter: { scale: 1, opacity: 1, transition },
19 exit: {
20 scale: 0.5,
21 opacity: 0,
22 transition: { duration: 1.5, ...transition }
23 }
24}
25
Adrien Béraud150b4782021-04-21 19:40:59 -040026export default function AccountPreferences(props) {
Adrien Béraud150b4782021-04-21 19:40:59 -040027 const account = props.account
28 const isJamiAccount = account.getType() === Account.TYPE_JAMI
29 const alias = isJamiAccount ? "Jami account" : "SIP account"
Adrien Béraud21c53cf2021-04-22 00:04:32 -040030 const moderators = account.getDefaultModerators()
Adrien Béraud4e287b92021-04-24 16:15:56 -040031 const [defaultModeratorUri, setDefaultModeratorUri] = useState('')
32
Adrien Béraud86986032021-04-25 12:04:53 -040033 const [details, setDetails] = useState(account.getDetails())
34
Adrien Béraud4e287b92021-04-24 16:15:56 -040035 const addModerator = () => {
36 if (defaultModeratorUri) {
37 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${defaultModeratorUri}`, {method: "PUT"})
38 setDefaultModeratorUri('')
39 }
40 }
41
42 const removeModerator = (uri) =>
43 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${uri}`, {method: "DELETE"})
44
Adrien Béraud86986032021-04-25 12:04:53 -040045 const handleToggle = (key, value) => {
46 console.log(`handleToggle ${key} ${value}`)
47 const newDetails = {}
48 newDetails[key] = value ? "true" : "false"
49 console.log(newDetails)
50 authManager.fetch(`/api/accounts/${account.getId()}`, {
51 method: "POST",
52 headers: {
53 'Accept': 'application/json',
54 'Content-Type': 'application/json'
55 },
56 body: JSON.stringify(newDetails)
57 })
58 setDetails({...account.updateDetails(newDetails)})
59 }
60
Adrien Béraud150b4782021-04-21 19:40:59 -040061 return (
Adrien Béraud6c934962021-06-07 10:13:26 -040062 <motion.div
63 initial="initial"
64 animate="enter"
65 exit="exit"
66 variants={{
67 enter: { transition: { staggerChildren: 0.05 } },
68 exit: { transition: { staggerChildren: 0.02 } }
69 }}
70 >
71 <motion.div variants={thumbnailVariants}><Typography variant="h2" component="h2" gutterBottom>{alias}</Typography></motion.div>
Adrien Béraud21c53cf2021-04-22 00:04:32 -040072 <Grid container spacing={3} style={{ marginBottom: 16 }}>
Adrien Béraud150b4782021-04-21 19:40:59 -040073 {isJamiAccount &&
Adrien Béraud6c934962021-06-07 10:13:26 -040074 <Grid item xs={12}><motion.div variants={thumbnailVariants}><JamiIdCard account={account} /></motion.div></Grid>}
Adrien Béraud150b4782021-04-21 19:40:59 -040075
76 <Grid item xs={12} sm={6}>
Adrien Béraud6c934962021-06-07 10:13:26 -040077 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -040078 <ConversationsOverviewCard accountId={account.getId()} />
Adrien Béraud6c934962021-06-07 10:13:26 -040079 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -040080 </Grid>
81
82 <Grid item xs={12} sm={6}>
Adrien Béraud6c934962021-06-07 10:13:26 -040083 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -040084 <Card>
85 <CardContent>
idillonfb2af5b2022-09-16 13:40:08 -040086 <Typography color="textSecondary" gutterBottom>
Adrien Béraud150b4782021-04-21 19:40:59 -040087 Current calls
88 </Typography>
89 <Typography gutterBottom variant="h5" component="h2">
90 0
91 </Typography>
92 </CardContent>
93 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -040094 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -040095 </Grid>
Adrien Béraud6c934962021-06-07 10:13:26 -040096
Adrien Béraud150b4782021-04-21 19:40:59 -040097 </Grid>
98
Adrien Béraud6c934962021-06-07 10:13:26 -040099 <List subheader={<motion.div variants={thumbnailVariants}><ListSubheader>Settings</ListSubheader></motion.div>}>
100 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400101 <ListItem>
102 <ListItemIcon>
103 <GroupRounded />
104 </ListItemIcon>
105 <ListItemText id="switch-list-label-rendezvous" primary="Rendez-Vous point" />
106 <ListItemSecondaryAction>
107 <Switch
108 edge="end"
Adrien Béraud86986032021-04-25 12:04:53 -0400109 onChange={e => handleToggle('Account.rendezVous', e.target.checked)}
110 checked={details['Account.rendezVous'] === 'true'}
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400111 inputProps={{ 'aria-labelledby': 'switch-list-label-rendezvous' }}
Adrien Béraud150b4782021-04-21 19:40:59 -0400112 />
113 </ListItemSecondaryAction>
114 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400115 </motion.div>
116 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400117 <ListItem>
118 <ListItemIcon>
119 <PhoneCallbackRounded />
120 </ListItemIcon>
121 <ListItemText id="switch-list-label-publicin" primary="Allow connection from unkown peers" />
122 <ListItemSecondaryAction>
123 <Switch
124 edge="end"
Adrien Béraud86986032021-04-25 12:04:53 -0400125 onChange={e => handleToggle('DHT.PublicInCalls', e.target.checked)}
126 checked={details['DHT.PublicInCalls'] === 'true'}
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400127 inputProps={{ 'aria-labelledby': 'switch-list-label-publicin' }}
Adrien Béraud150b4782021-04-21 19:40:59 -0400128 />
129 </ListItemSecondaryAction>
130 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400131 </motion.div>
132 <motion.div variants={thumbnailVariants}>
idillonfb2af5b2022-09-16 13:40:08 -0400133 <Paper>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400134 <Toolbar>
idillonfb2af5b2022-09-16 13:40:08 -0400135 <Typography variant="h6">
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400136 Default moderators
137 </Typography>
138 </Toolbar>
139 <List>
140 <ListItem key="add">
Adrien Béraud4e287b92021-04-24 16:15:56 -0400141 <TextField variant="outlined"
Adrien Béraud4e287b92021-04-24 16:15:56 -0400142 value={defaultModeratorUri}
143 onChange={e => setDefaultModeratorUri(e.target.value)}
144 label="Add new default moderator"
145 placeholder="Enter new moderator name or URI"
146 fullWidth />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400147 <ListItemSecondaryAction>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400148 <IconButton onClick={addModerator} size="large"><AddCircle /></IconButton>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400149 </ListItemSecondaryAction>
150 </ListItem>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400151 {!moderators || moderators.length === 0 ?
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400152 <ListItem key="placeholder">
153 <ListItemText primary="No default moderator" /></ListItem> :
154 moderators.map((moderator) => (
Adrien Béraud4e287b92021-04-24 16:15:56 -0400155 <ListItem key={moderator.uri}>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400156 <ListItemAvatar>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400157 <ConversationAvatar name={moderator.getDisplayName()} />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400158 </ListItemAvatar>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400159 <ListItemText primary={moderator.getDisplayName()} />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400160 <ListItemSecondaryAction>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400161 <IconButton onClick={e => removeModerator(moderator.uri)} size="large"><DeleteRounded /></IconButton>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400162 </ListItemSecondaryAction>
163 </ListItem>
164 ))}
165 </List>
166 </Paper>
Adrien Béraud6c934962021-06-07 10:13:26 -0400167 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400168 </List>
169
Adrien Béraudab519ff2022-05-03 15:34:48 -0400170 </motion.div>
171 );
Adrien Béraud150b4782021-04-21 19:40:59 -0400172}