blob: fc01074788957d3b2dde1c7d3afb97da28d3851b [file] [log] [blame]
simon26e79f72022-10-05 22:16:08 -04001/*
2 * Copyright (C) 2022 Savoir-faire Linux Inc.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License as
6 * published by the Free Software Foundation; either version 3 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Affero General Public License for more details.
13 *
14 * You should have received a copy of the GNU Affero General Public
15 * License along with this program. If not, see
16 * <https://www.gnu.org/licenses/>.
17 */
Ziwei Wanga41e1662023-01-27 14:56:32 -050018import AddCircle from '@mui/icons-material/AddCircle';
19import DeleteRounded from '@mui/icons-material/AddCircle';
20import GroupRounded from '@mui/icons-material/AddCircle';
21import PhoneCallbackRounded from '@mui/icons-material/AddCircle';
simond47ef9e2022-09-28 22:24:28 -040022import {
simon07b4eb02022-09-29 17:50:26 -040023 Card,
24 CardContent,
25 Grid,
26 IconButton,
simond47ef9e2022-09-28 22:24:28 -040027 List,
28 ListItem,
simon07b4eb02022-09-29 17:50:26 -040029 ListItemAvatar,
simond47ef9e2022-09-28 22:24:28 -040030 ListItemIcon,
31 ListItemSecondaryAction,
32 ListItemText,
33 ListSubheader,
simond47ef9e2022-09-28 22:24:28 -040034 Paper,
simon07b4eb02022-09-29 17:50:26 -040035 Switch,
simond47ef9e2022-09-28 22:24:28 -040036 TextField,
simon07b4eb02022-09-29 17:50:26 -040037 Toolbar,
38 Typography,
simond47ef9e2022-09-28 22:24:28 -040039} from '@mui/material';
simon07b4eb02022-09-29 17:50:26 -040040import { motion } from 'framer-motion';
Misha Krieger-Raynauld6bbdacf2022-11-29 21:45:40 -050041import { AccountDetails } from 'jami-web-common';
simon07b4eb02022-09-29 17:50:26 -040042import { useState } from 'react';
Adrien Béraud6ecaa402021-04-06 17:37:25 -040043
simon416d0792022-11-03 02:46:18 -040044import { useAuthContext } from '../contexts/AuthProvider';
idillonb0ec86a2022-12-06 17:54:55 -050045import ConversationAvatar, { AvatarEditor } from './ConversationAvatar';
simond47ef9e2022-09-28 22:24:28 -040046import ConversationsOverviewCard from './ConversationsOverviewCard';
simon07b4eb02022-09-29 17:50:26 -040047import JamiIdCard from './JamiIdCard';
Adrien Béraud4e287b92021-04-24 16:15:56 -040048
simond47ef9e2022-09-28 22:24:28 -040049const transition = { duration: 0.3, ease: [0.43, 0.13, 0.23, 0.96] };
Adrien Béraud6c934962021-06-07 10:13:26 -040050
51const thumbnailVariants = {
52 initial: { scale: 0.9, opacity: 0 },
53 enter: { scale: 1, opacity: 1, transition },
54 exit: {
55 scale: 0.5,
56 opacity: 0,
simonfe1de722022-10-02 00:21:43 -040057 transition: { ...transition, duration: 1.5 },
simond47ef9e2022-09-28 22:24:28 -040058 },
59};
Adrien Béraud6c934962021-06-07 10:13:26 -040060
simon94fe53e2022-11-10 12:51:58 -050061export default function AccountPreferences() {
62 const { account, axiosInstance } = useAuthContext();
simon416d0792022-11-03 02:46:18 -040063
simonfe1de722022-10-02 00:21:43 -040064 const devices: string[][] = [];
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050065 const accountDevices = account.devices;
simonfe1de722022-10-02 00:21:43 -040066 for (const i in accountDevices) devices.push([i, accountDevices[i]]);
Adrien Béraud4e287b92021-04-24 16:15:56 -040067
simond47ef9e2022-09-28 22:24:28 -040068 console.log(devices);
ervinanohf1758a42022-09-14 14:52:51 -040069
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050070 const isJamiAccount = account.getType() === 'RING';
simond47ef9e2022-09-28 22:24:28 -040071 const alias = isJamiAccount ? 'Jami account' : 'SIP account';
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050072 const moderators = account.defaultModerators;
simond47ef9e2022-09-28 22:24:28 -040073 const [defaultModeratorUri, setDefaultModeratorUri] = useState('');
ervinanohf1758a42022-09-14 14:52:51 -040074
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050075 const [details, setDetails] = useState(account.details);
Adrien Béraud86986032021-04-25 12:04:53 -040076
simon94fe53e2022-11-10 12:51:58 -050077 const addModerator = async () => {
Adrien Béraud4e287b92021-04-24 16:15:56 -040078 if (defaultModeratorUri) {
simon94fe53e2022-11-10 12:51:58 -050079 await axiosInstance.put(`/default-moderators/${defaultModeratorUri}`);
simond47ef9e2022-09-28 22:24:28 -040080 setDefaultModeratorUri('');
Adrien Béraud4e287b92021-04-24 16:15:56 -040081 }
ervinanohf1758a42022-09-14 14:52:51 -040082 };
Adrien Béraud4e287b92021-04-24 16:15:56 -040083
simon94fe53e2022-11-10 12:51:58 -050084 const removeModerator = async (uri: string) => await axiosInstance.delete(`/default-moderators/${uri}`);
Adrien Béraud4e287b92021-04-24 16:15:56 -040085
simon94fe53e2022-11-10 12:51:58 -050086 const handleToggle = async (key: keyof AccountDetails, value: boolean) => {
ervinanohf1758a42022-09-14 14:52:51 -040087 console.log(`handleToggle ${key} ${value}`);
simonfe1de722022-10-02 00:21:43 -040088 const newDetails: Partial<AccountDetails> = {};
simond47ef9e2022-09-28 22:24:28 -040089 newDetails[key] = value ? 'true' : 'false';
ervinanohf1758a42022-09-14 14:52:51 -040090 console.log(newDetails);
simon94fe53e2022-11-10 12:51:58 -050091 await axiosInstance.patch('/account', newDetails);
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050092 account.updateDetails(newDetails);
93 setDetails(account.details);
ervinanohf1758a42022-09-14 14:52:51 -040094 };
Adrien Béraud86986032021-04-25 12:04:53 -040095
Adrien Béraud150b4782021-04-21 19:40:59 -040096 return (
Adrien Béraud6c934962021-06-07 10:13:26 -040097 <motion.div
ervinanohf1758a42022-09-14 14:52:51 -040098 initial="initial"
99 animate="enter"
100 exit="exit"
101 variants={{
102 enter: { transition: { staggerChildren: 0.05 } },
103 exit: { transition: { staggerChildren: 0.02 } },
104 }}
105 >
idillonb0ec86a2022-12-06 17:54:55 -0500106 <AvatarEditor />
ervinanohf1758a42022-09-14 14:52:51 -0400107 <motion.div variants={thumbnailVariants}>
108 <Typography variant="h2" component="h2" gutterBottom>
109 {alias}
110 </Typography>
111 </motion.div>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400112 <Grid container spacing={3} style={{ marginBottom: 16 }}>
ervinanohf1758a42022-09-14 14:52:51 -0400113 {isJamiAccount && (
114 <Grid item xs={12}>
115 <motion.div variants={thumbnailVariants}>
116 <JamiIdCard account={account} />
117 </motion.div>
118 </Grid>
119 )}
Adrien Béraud150b4782021-04-21 19:40:59 -0400120
121 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400122 <motion.div variants={thumbnailVariants}>
simon5da8ca62022-11-09 15:21:25 -0500123 <ConversationsOverviewCard />
Adrien Béraud6c934962021-06-07 10:13:26 -0400124 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400125 </Grid>
126
127 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400128 <motion.div variants={thumbnailVariants}>
129 <Card>
130 <CardContent>
131 <Typography color="textSecondary" gutterBottom>
132 Current calls
133 </Typography>
134 <Typography gutterBottom variant="h5" component="h2">
135 0
136 </Typography>
137 </CardContent>
138 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -0400139 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400140 </Grid>
Adrien Béraud6c934962021-06-07 10:13:26 -0400141
ervinanohf1758a42022-09-14 14:52:51 -0400142 <Grid item xs={12} sm={6}>
143 <motion.div variants={thumbnailVariants}>
144 <Card>
145 <CardContent>
146 <Typography color="textSecondary" gutterBottom>
147 Appareils associés
148 </Typography>
149 <Typography gutterBottom variant="h5" component="h2">
simon80b7b3b2022-09-28 17:50:10 -0400150 {devices.map((device, i) => (
151 <ListItem key={i}>
ervinanohf1758a42022-09-14 14:52:51 -0400152 <GroupRounded />
simond47ef9e2022-09-28 22:24:28 -0400153 <ListItemText id="switch-list-label-rendezvous" primary={device[1]} secondary={device[0]} />
ervinanohf1758a42022-09-14 14:52:51 -0400154 </ListItem>
155 ))}
156 {/* <ListItemTextsion> */}
157 </Typography>
158 </CardContent>
159 </Card>
160 </motion.div>
161 </Grid>
Adrien Béraud150b4782021-04-21 19:40:59 -0400162 </Grid>
163
ervinanohf1758a42022-09-14 14:52:51 -0400164 <List
165 subheader={
166 <motion.div variants={thumbnailVariants}>
167 <ListSubheader>Settings</ListSubheader>
168 </motion.div>
169 }
170 >
171 <motion.div variants={thumbnailVariants}>
172 <ListItem>
173 <ListItemIcon>
174 <GroupRounded />
175 </ListItemIcon>
simond47ef9e2022-09-28 22:24:28 -0400176 <ListItemText id="switch-list-label-rendezvous" primary="Rendez-Vous point" />
ervinanohf1758a42022-09-14 14:52:51 -0400177 <ListItemSecondaryAction>
178 <Switch
179 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400180 onChange={(e) => handleToggle('Account.rendezVous', e.target.checked)}
181 checked={details['Account.rendezVous'] === 'true'}
ervinanohf1758a42022-09-14 14:52:51 -0400182 inputProps={{
simond47ef9e2022-09-28 22:24:28 -0400183 'aria-labelledby': 'switch-list-label-rendezvous',
ervinanohf1758a42022-09-14 14:52:51 -0400184 }}
185 />
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 <ListItem>
191 <ListItemIcon>
192 <PhoneCallbackRounded />
193 </ListItemIcon>
Misha Krieger-Raynauldbaf49d82022-11-30 18:51:37 -0500194 <ListItemText id="switch-list-label-publicin" primary="Allow connection from unknown peers" />
ervinanohf1758a42022-09-14 14:52:51 -0400195 <ListItemSecondaryAction>
196 <Switch
197 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400198 onChange={(e) => handleToggle('DHT.PublicInCalls', e.target.checked)}
199 checked={details['DHT.PublicInCalls'] === 'true'}
200 inputProps={{ 'aria-labelledby': 'switch-list-label-publicin' }}
ervinanohf1758a42022-09-14 14:52:51 -0400201 />
202 </ListItemSecondaryAction>
203 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400204 </motion.div>
205 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400206 <Paper>
207 <Toolbar>
208 <Typography variant="h6">Default moderators</Typography>
209 </Toolbar>
210 <List>
211 <ListItem key="add">
212 <TextField
213 variant="outlined"
214 value={defaultModeratorUri}
215 onChange={(e) => setDefaultModeratorUri(e.target.value)}
216 label="Add new default moderator"
217 placeholder="Enter new moderator name or URI"
218 fullWidth
219 />
220 <ListItemSecondaryAction>
221 <IconButton onClick={addModerator} size="large">
222 <AddCircle />
223 </IconButton>
224 </ListItemSecondaryAction>
225 </ListItem>
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -0500226 {moderators.length === 0 ? (
ervinanohf1758a42022-09-14 14:52:51 -0400227 <ListItem key="placeholder">
228 <ListItemText primary="No default moderator" />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400229 </ListItem>
ervinanohf1758a42022-09-14 14:52:51 -0400230 ) : (
231 moderators.map((moderator) => (
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -0500232 <ListItem key={moderator.uri}>
ervinanohf1758a42022-09-14 14:52:51 -0400233 <ListItemAvatar>
simonfe1de722022-10-02 00:21:43 -0400234 <ConversationAvatar displayName={moderator.getDisplayName()} />
ervinanohf1758a42022-09-14 14:52:51 -0400235 </ListItemAvatar>
236 <ListItemText primary={moderator.getDisplayName()} />
237 <ListItemSecondaryAction>
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -0500238 <IconButton onClick={() => removeModerator(moderator.uri)} size="large">
ervinanohf1758a42022-09-14 14:52:51 -0400239 <DeleteRounded />
240 </IconButton>
241 </ListItemSecondaryAction>
242 </ListItem>
243 ))
244 )}
245 </List>
246 </Paper>
Adrien Béraud6c934962021-06-07 10:13:26 -0400247 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400248 </List>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400249 </motion.div>
250 );
Adrien Béraud150b4782021-04-21 19:40:59 -0400251}