blob: 7ad89da9f36c94649df1eaf16892fdd175b72568 [file] [log] [blame]
simon07b4eb02022-09-29 17:50:26 -04001import { AddCircle, DeleteRounded, GroupRounded, PhoneCallbackRounded } from '@mui/icons-material';
simond47ef9e2022-09-28 22:24:28 -04002import {
simon07b4eb02022-09-29 17:50:26 -04003 Card,
4 CardContent,
5 Grid,
6 IconButton,
simond47ef9e2022-09-28 22:24:28 -04007 List,
8 ListItem,
simon07b4eb02022-09-29 17:50:26 -04009 ListItemAvatar,
simond47ef9e2022-09-28 22:24:28 -040010 ListItemIcon,
11 ListItemSecondaryAction,
12 ListItemText,
13 ListSubheader,
simond47ef9e2022-09-28 22:24:28 -040014 Paper,
simon07b4eb02022-09-29 17:50:26 -040015 Switch,
simond47ef9e2022-09-28 22:24:28 -040016 TextField,
simon07b4eb02022-09-29 17:50:26 -040017 Toolbar,
18 Typography,
simond47ef9e2022-09-28 22:24:28 -040019} from '@mui/material';
simon07b4eb02022-09-29 17:50:26 -040020import { motion } from 'framer-motion';
21import { useState } from 'react';
Adrien Béraud6ecaa402021-04-06 17:37:25 -040022
simond47ef9e2022-09-28 22:24:28 -040023import Account from '../../../model/Account';
simon07b4eb02022-09-29 17:50:26 -040024import authManager from '../AuthManager';
simond47ef9e2022-09-28 22:24:28 -040025import ConversationAvatar from './ConversationAvatar';
26import ConversationsOverviewCard from './ConversationsOverviewCard';
simon07b4eb02022-09-29 17:50:26 -040027import JamiIdCard from './JamiIdCard';
Adrien Béraud4e287b92021-04-24 16:15:56 -040028
simond47ef9e2022-09-28 22:24:28 -040029const transition = { duration: 0.3, ease: [0.43, 0.13, 0.23, 0.96] };
Adrien Béraud6c934962021-06-07 10:13:26 -040030
31const thumbnailVariants = {
32 initial: { scale: 0.9, opacity: 0 },
33 enter: { scale: 1, opacity: 1, transition },
34 exit: {
35 scale: 0.5,
36 opacity: 0,
simond47ef9e2022-09-28 22:24:28 -040037 transition: { duration: 1.5, ...transition },
38 },
39};
Adrien Béraud6c934962021-06-07 10:13:26 -040040
Adrien Béraud150b4782021-04-21 19:40:59 -040041export default function AccountPreferences(props) {
ervinanohf1758a42022-09-14 14:52:51 -040042 const account = props.account;
43 let devices = [];
44 for (var i in account.devices) devices.push([i, account.devices[i]]);
Adrien Béraud4e287b92021-04-24 16:15:56 -040045
simond47ef9e2022-09-28 22:24:28 -040046 console.log(devices);
ervinanohf1758a42022-09-14 14:52:51 -040047
48 const isJamiAccount = account.getType() === Account.TYPE_JAMI;
simond47ef9e2022-09-28 22:24:28 -040049 const alias = isJamiAccount ? 'Jami account' : 'SIP account';
ervinanohf1758a42022-09-14 14:52:51 -040050 const moderators = account.getDefaultModerators();
simond47ef9e2022-09-28 22:24:28 -040051 const [defaultModeratorUri, setDefaultModeratorUri] = useState('');
ervinanohf1758a42022-09-14 14:52:51 -040052
53 const [details, setDetails] = useState(account.getDetails());
Adrien Béraud86986032021-04-25 12:04:53 -040054
Adrien Béraud4e287b92021-04-24 16:15:56 -040055 const addModerator = () => {
56 if (defaultModeratorUri) {
simond47ef9e2022-09-28 22:24:28 -040057 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${defaultModeratorUri}`, { method: 'PUT' });
58 setDefaultModeratorUri('');
Adrien Béraud4e287b92021-04-24 16:15:56 -040059 }
ervinanohf1758a42022-09-14 14:52:51 -040060 };
Adrien Béraud4e287b92021-04-24 16:15:56 -040061
62 const removeModerator = (uri) =>
simond47ef9e2022-09-28 22:24:28 -040063 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${uri}`, { method: 'DELETE' });
Adrien Béraud4e287b92021-04-24 16:15:56 -040064
Adrien Béraud86986032021-04-25 12:04:53 -040065 const handleToggle = (key, value) => {
ervinanohf1758a42022-09-14 14:52:51 -040066 console.log(`handleToggle ${key} ${value}`);
67 const newDetails = {};
simond47ef9e2022-09-28 22:24:28 -040068 newDetails[key] = value ? 'true' : 'false';
ervinanohf1758a42022-09-14 14:52:51 -040069 console.log(newDetails);
Adrien Béraud86986032021-04-25 12:04:53 -040070 authManager.fetch(`/api/accounts/${account.getId()}`, {
simond47ef9e2022-09-28 22:24:28 -040071 method: 'POST',
Adrien Béraud86986032021-04-25 12:04:53 -040072 headers: {
simond47ef9e2022-09-28 22:24:28 -040073 Accept: 'application/json',
74 'Content-Type': 'application/json',
Adrien Béraud86986032021-04-25 12:04:53 -040075 },
ervinanohf1758a42022-09-14 14:52:51 -040076 body: JSON.stringify(newDetails),
77 });
78 setDetails({ ...account.updateDetails(newDetails) });
79 };
Adrien Béraud86986032021-04-25 12:04:53 -040080
Adrien Béraud150b4782021-04-21 19:40:59 -040081 return (
Adrien Béraud6c934962021-06-07 10:13:26 -040082 <motion.div
ervinanohf1758a42022-09-14 14:52:51 -040083 initial="initial"
84 animate="enter"
85 exit="exit"
86 variants={{
87 enter: { transition: { staggerChildren: 0.05 } },
88 exit: { transition: { staggerChildren: 0.02 } },
89 }}
90 >
91 <motion.div variants={thumbnailVariants}>
92 <Typography variant="h2" component="h2" gutterBottom>
93 {alias}
94 </Typography>
95 </motion.div>
Adrien Béraud21c53cf2021-04-22 00:04:32 -040096 <Grid container spacing={3} style={{ marginBottom: 16 }}>
ervinanohf1758a42022-09-14 14:52:51 -040097 {isJamiAccount && (
98 <Grid item xs={12}>
99 <motion.div variants={thumbnailVariants}>
100 <JamiIdCard account={account} />
101 </motion.div>
102 </Grid>
103 )}
Adrien Béraud150b4782021-04-21 19:40:59 -0400104
105 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400106 <motion.div variants={thumbnailVariants}>
107 <ConversationsOverviewCard accountId={account.getId()} />
Adrien Béraud6c934962021-06-07 10:13:26 -0400108 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400109 </Grid>
110
111 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400112 <motion.div variants={thumbnailVariants}>
113 <Card>
114 <CardContent>
115 <Typography color="textSecondary" gutterBottom>
116 Current calls
117 </Typography>
118 <Typography gutterBottom variant="h5" component="h2">
119 0
120 </Typography>
121 </CardContent>
122 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -0400123 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400124 </Grid>
Adrien Béraud6c934962021-06-07 10:13:26 -0400125
ervinanohf1758a42022-09-14 14:52:51 -0400126 <Grid item xs={12} sm={6}>
127 <motion.div variants={thumbnailVariants}>
128 <Card>
129 <CardContent>
130 <Typography color="textSecondary" gutterBottom>
131 Appareils associés
132 </Typography>
133 <Typography gutterBottom variant="h5" component="h2">
134 {devices.map((device) => (
135 <ListItem>
136 <GroupRounded />
simond47ef9e2022-09-28 22:24:28 -0400137 <ListItemText id="switch-list-label-rendezvous" primary={device[1]} secondary={device[0]} />
ervinanohf1758a42022-09-14 14:52:51 -0400138 </ListItem>
139 ))}
140 {/* <ListItemTextsion> */}
141 </Typography>
142 </CardContent>
143 </Card>
144 </motion.div>
145 </Grid>
Adrien Béraud150b4782021-04-21 19:40:59 -0400146 </Grid>
147
ervinanohf1758a42022-09-14 14:52:51 -0400148 <List
149 subheader={
150 <motion.div variants={thumbnailVariants}>
151 <ListSubheader>Settings</ListSubheader>
152 </motion.div>
153 }
154 >
155 <motion.div variants={thumbnailVariants}>
156 <ListItem>
157 <ListItemIcon>
158 <GroupRounded />
159 </ListItemIcon>
simond47ef9e2022-09-28 22:24:28 -0400160 <ListItemText id="switch-list-label-rendezvous" primary="Rendez-Vous point" />
ervinanohf1758a42022-09-14 14:52:51 -0400161 <ListItemSecondaryAction>
162 <Switch
163 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400164 onChange={(e) => handleToggle('Account.rendezVous', e.target.checked)}
165 checked={details['Account.rendezVous'] === 'true'}
ervinanohf1758a42022-09-14 14:52:51 -0400166 inputProps={{
simond47ef9e2022-09-28 22:24:28 -0400167 'aria-labelledby': 'switch-list-label-rendezvous',
ervinanohf1758a42022-09-14 14:52:51 -0400168 }}
169 />
170 </ListItemSecondaryAction>
171 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400172 </motion.div>
173 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400174 <ListItem>
175 <ListItemIcon>
176 <PhoneCallbackRounded />
177 </ListItemIcon>
simond47ef9e2022-09-28 22:24:28 -0400178 <ListItemText id="switch-list-label-publicin" primary="Allow connection from unkown peers" />
ervinanohf1758a42022-09-14 14:52:51 -0400179 <ListItemSecondaryAction>
180 <Switch
181 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400182 onChange={(e) => handleToggle('DHT.PublicInCalls', e.target.checked)}
183 checked={details['DHT.PublicInCalls'] === 'true'}
184 inputProps={{ 'aria-labelledby': 'switch-list-label-publicin' }}
ervinanohf1758a42022-09-14 14:52:51 -0400185 />
186 </ListItemSecondaryAction>
187 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400188 </motion.div>
189 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400190 <Paper>
191 <Toolbar>
192 <Typography variant="h6">Default moderators</Typography>
193 </Toolbar>
194 <List>
195 <ListItem key="add">
196 <TextField
197 variant="outlined"
198 value={defaultModeratorUri}
199 onChange={(e) => setDefaultModeratorUri(e.target.value)}
200 label="Add new default moderator"
201 placeholder="Enter new moderator name or URI"
202 fullWidth
203 />
204 <ListItemSecondaryAction>
205 <IconButton onClick={addModerator} size="large">
206 <AddCircle />
207 </IconButton>
208 </ListItemSecondaryAction>
209 </ListItem>
210 {!moderators || moderators.length === 0 ? (
211 <ListItem key="placeholder">
212 <ListItemText primary="No default moderator" />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400213 </ListItem>
ervinanohf1758a42022-09-14 14:52:51 -0400214 ) : (
215 moderators.map((moderator) => (
216 <ListItem key={moderator.uri}>
217 <ListItemAvatar>
218 <ConversationAvatar name={moderator.getDisplayName()} />
219 </ListItemAvatar>
220 <ListItemText primary={moderator.getDisplayName()} />
221 <ListItemSecondaryAction>
simond47ef9e2022-09-28 22:24:28 -0400222 <IconButton onClick={(e) => removeModerator(moderator.uri)} size="large">
ervinanohf1758a42022-09-14 14:52:51 -0400223 <DeleteRounded />
224 </IconButton>
225 </ListItemSecondaryAction>
226 </ListItem>
227 ))
228 )}
229 </List>
230 </Paper>
Adrien Béraud6c934962021-06-07 10:13:26 -0400231 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400232 </List>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400233 </motion.div>
234 );
Adrien Béraud150b4782021-04-21 19:40:59 -0400235}