blob: c267af4a23e3affec50e90392e784254466ee498 [file] [log] [blame]
simond47ef9e2022-09-28 22:24:28 -04001import { useState } from 'react';
Adrien Béraudab519ff2022-05-03 15:34:48 -04002
simond47ef9e2022-09-28 22:24:28 -04003import {
4 List,
5 ListItem,
6 ListItemIcon,
7 ListItemSecondaryAction,
8 ListItemText,
9 ListSubheader,
10 Switch,
11 Typography,
12 Grid,
13 Paper,
14 CardContent,
15 Card,
16 Toolbar,
17 IconButton,
18 ListItemAvatar,
19 TextField,
20} from '@mui/material';
21import { PhoneCallbackRounded, GroupRounded, DeleteRounded, AddCircle } from '@mui/icons-material';
Adrien Béraud6ecaa402021-04-06 17:37:25 -040022
simond47ef9e2022-09-28 22:24:28 -040023import Account from '../../../model/Account';
24import JamiIdCard from './JamiIdCard';
25import ConversationAvatar from './ConversationAvatar';
26import ConversationsOverviewCard from './ConversationsOverviewCard';
Adrien Béraud6ecaa402021-04-06 17:37:25 -040027
simond47ef9e2022-09-28 22:24:28 -040028import authManager from '../AuthManager';
29import { motion } from 'framer-motion';
Adrien Béraud4e287b92021-04-24 16:15:56 -040030
simond47ef9e2022-09-28 22:24:28 -040031const transition = { duration: 0.3, ease: [0.43, 0.13, 0.23, 0.96] };
Adrien Béraud6c934962021-06-07 10:13:26 -040032
33const thumbnailVariants = {
34 initial: { scale: 0.9, opacity: 0 },
35 enter: { scale: 1, opacity: 1, transition },
36 exit: {
37 scale: 0.5,
38 opacity: 0,
simond47ef9e2022-09-28 22:24:28 -040039 transition: { duration: 1.5, ...transition },
40 },
41};
Adrien Béraud6c934962021-06-07 10:13:26 -040042
Adrien Béraud150b4782021-04-21 19:40:59 -040043export default function AccountPreferences(props) {
ervinanohf1758a42022-09-14 14:52:51 -040044 const account = props.account;
45 let devices = [];
46 for (var i in account.devices) devices.push([i, account.devices[i]]);
Adrien Béraud4e287b92021-04-24 16:15:56 -040047
simond47ef9e2022-09-28 22:24:28 -040048 console.log(devices);
ervinanohf1758a42022-09-14 14:52:51 -040049
50 const isJamiAccount = account.getType() === Account.TYPE_JAMI;
simond47ef9e2022-09-28 22:24:28 -040051 const alias = isJamiAccount ? 'Jami account' : 'SIP account';
ervinanohf1758a42022-09-14 14:52:51 -040052 const moderators = account.getDefaultModerators();
simond47ef9e2022-09-28 22:24:28 -040053 const [defaultModeratorUri, setDefaultModeratorUri] = useState('');
ervinanohf1758a42022-09-14 14:52:51 -040054
55 const [details, setDetails] = useState(account.getDetails());
Adrien Béraud86986032021-04-25 12:04:53 -040056
Adrien Béraud4e287b92021-04-24 16:15:56 -040057 const addModerator = () => {
58 if (defaultModeratorUri) {
simond47ef9e2022-09-28 22:24:28 -040059 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${defaultModeratorUri}`, { method: 'PUT' });
60 setDefaultModeratorUri('');
Adrien Béraud4e287b92021-04-24 16:15:56 -040061 }
ervinanohf1758a42022-09-14 14:52:51 -040062 };
Adrien Béraud4e287b92021-04-24 16:15:56 -040063
64 const removeModerator = (uri) =>
simond47ef9e2022-09-28 22:24:28 -040065 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${uri}`, { method: 'DELETE' });
Adrien Béraud4e287b92021-04-24 16:15:56 -040066
Adrien Béraud86986032021-04-25 12:04:53 -040067 const handleToggle = (key, value) => {
ervinanohf1758a42022-09-14 14:52:51 -040068 console.log(`handleToggle ${key} ${value}`);
69 const newDetails = {};
simond47ef9e2022-09-28 22:24:28 -040070 newDetails[key] = value ? 'true' : 'false';
ervinanohf1758a42022-09-14 14:52:51 -040071 console.log(newDetails);
Adrien Béraud86986032021-04-25 12:04:53 -040072 authManager.fetch(`/api/accounts/${account.getId()}`, {
simond47ef9e2022-09-28 22:24:28 -040073 method: 'POST',
Adrien Béraud86986032021-04-25 12:04:53 -040074 headers: {
simond47ef9e2022-09-28 22:24:28 -040075 Accept: 'application/json',
76 'Content-Type': 'application/json',
Adrien Béraud86986032021-04-25 12:04:53 -040077 },
ervinanohf1758a42022-09-14 14:52:51 -040078 body: JSON.stringify(newDetails),
79 });
80 setDetails({ ...account.updateDetails(newDetails) });
81 };
Adrien Béraud86986032021-04-25 12:04:53 -040082
Adrien Béraud150b4782021-04-21 19:40:59 -040083 return (
Adrien Béraud6c934962021-06-07 10:13:26 -040084 <motion.div
ervinanohf1758a42022-09-14 14:52:51 -040085 initial="initial"
86 animate="enter"
87 exit="exit"
88 variants={{
89 enter: { transition: { staggerChildren: 0.05 } },
90 exit: { transition: { staggerChildren: 0.02 } },
91 }}
92 >
93 <motion.div variants={thumbnailVariants}>
94 <Typography variant="h2" component="h2" gutterBottom>
95 {alias}
96 </Typography>
97 </motion.div>
Adrien Béraud21c53cf2021-04-22 00:04:32 -040098 <Grid container spacing={3} style={{ marginBottom: 16 }}>
ervinanohf1758a42022-09-14 14:52:51 -040099 {isJamiAccount && (
100 <Grid item xs={12}>
101 <motion.div variants={thumbnailVariants}>
102 <JamiIdCard account={account} />
103 </motion.div>
104 </Grid>
105 )}
Adrien Béraud150b4782021-04-21 19:40:59 -0400106
107 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400108 <motion.div variants={thumbnailVariants}>
109 <ConversationsOverviewCard accountId={account.getId()} />
Adrien Béraud6c934962021-06-07 10:13:26 -0400110 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400111 </Grid>
112
113 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400114 <motion.div variants={thumbnailVariants}>
115 <Card>
116 <CardContent>
117 <Typography color="textSecondary" gutterBottom>
118 Current calls
119 </Typography>
120 <Typography gutterBottom variant="h5" component="h2">
121 0
122 </Typography>
123 </CardContent>
124 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -0400125 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400126 </Grid>
Adrien Béraud6c934962021-06-07 10:13:26 -0400127
ervinanohf1758a42022-09-14 14:52:51 -0400128 <Grid item xs={12} sm={6}>
129 <motion.div variants={thumbnailVariants}>
130 <Card>
131 <CardContent>
132 <Typography color="textSecondary" gutterBottom>
133 Appareils associés
134 </Typography>
135 <Typography gutterBottom variant="h5" component="h2">
136 {devices.map((device) => (
137 <ListItem>
138 <GroupRounded />
simond47ef9e2022-09-28 22:24:28 -0400139 <ListItemText id="switch-list-label-rendezvous" primary={device[1]} secondary={device[0]} />
ervinanohf1758a42022-09-14 14:52:51 -0400140 </ListItem>
141 ))}
142 {/* <ListItemTextsion> */}
143 </Typography>
144 </CardContent>
145 </Card>
146 </motion.div>
147 </Grid>
Adrien Béraud150b4782021-04-21 19:40:59 -0400148 </Grid>
149
ervinanohf1758a42022-09-14 14:52:51 -0400150 <List
151 subheader={
152 <motion.div variants={thumbnailVariants}>
153 <ListSubheader>Settings</ListSubheader>
154 </motion.div>
155 }
156 >
157 <motion.div variants={thumbnailVariants}>
158 <ListItem>
159 <ListItemIcon>
160 <GroupRounded />
161 </ListItemIcon>
simond47ef9e2022-09-28 22:24:28 -0400162 <ListItemText id="switch-list-label-rendezvous" primary="Rendez-Vous point" />
ervinanohf1758a42022-09-14 14:52:51 -0400163 <ListItemSecondaryAction>
164 <Switch
165 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400166 onChange={(e) => handleToggle('Account.rendezVous', e.target.checked)}
167 checked={details['Account.rendezVous'] === 'true'}
ervinanohf1758a42022-09-14 14:52:51 -0400168 inputProps={{
simond47ef9e2022-09-28 22:24:28 -0400169 'aria-labelledby': 'switch-list-label-rendezvous',
ervinanohf1758a42022-09-14 14:52:51 -0400170 }}
171 />
172 </ListItemSecondaryAction>
173 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400174 </motion.div>
175 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400176 <ListItem>
177 <ListItemIcon>
178 <PhoneCallbackRounded />
179 </ListItemIcon>
simond47ef9e2022-09-28 22:24:28 -0400180 <ListItemText id="switch-list-label-publicin" primary="Allow connection from unkown peers" />
ervinanohf1758a42022-09-14 14:52:51 -0400181 <ListItemSecondaryAction>
182 <Switch
183 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400184 onChange={(e) => handleToggle('DHT.PublicInCalls', e.target.checked)}
185 checked={details['DHT.PublicInCalls'] === 'true'}
186 inputProps={{ 'aria-labelledby': 'switch-list-label-publicin' }}
ervinanohf1758a42022-09-14 14:52:51 -0400187 />
188 </ListItemSecondaryAction>
189 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400190 </motion.div>
191 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400192 <Paper>
193 <Toolbar>
194 <Typography variant="h6">Default moderators</Typography>
195 </Toolbar>
196 <List>
197 <ListItem key="add">
198 <TextField
199 variant="outlined"
200 value={defaultModeratorUri}
201 onChange={(e) => setDefaultModeratorUri(e.target.value)}
202 label="Add new default moderator"
203 placeholder="Enter new moderator name or URI"
204 fullWidth
205 />
206 <ListItemSecondaryAction>
207 <IconButton onClick={addModerator} size="large">
208 <AddCircle />
209 </IconButton>
210 </ListItemSecondaryAction>
211 </ListItem>
212 {!moderators || moderators.length === 0 ? (
213 <ListItem key="placeholder">
214 <ListItemText primary="No default moderator" />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400215 </ListItem>
ervinanohf1758a42022-09-14 14:52:51 -0400216 ) : (
217 moderators.map((moderator) => (
218 <ListItem key={moderator.uri}>
219 <ListItemAvatar>
220 <ConversationAvatar name={moderator.getDisplayName()} />
221 </ListItemAvatar>
222 <ListItemText primary={moderator.getDisplayName()} />
223 <ListItemSecondaryAction>
simond47ef9e2022-09-28 22:24:28 -0400224 <IconButton onClick={(e) => removeModerator(moderator.uri)} size="large">
ervinanohf1758a42022-09-14 14:52:51 -0400225 <DeleteRounded />
226 </IconButton>
227 </ListItemSecondaryAction>
228 </ListItem>
229 ))
230 )}
231 </List>
232 </Paper>
Adrien Béraud6c934962021-06-07 10:13:26 -0400233 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400234 </List>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400235 </motion.div>
236 );
Adrien Béraud150b4782021-04-21 19:40:59 -0400237}