blob: 9355a8bb8892342e30eee1d4f460bf96c1a707b0 [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 */
simon07b4eb02022-09-29 17:50:26 -040018import { AddCircle, DeleteRounded, GroupRounded, PhoneCallbackRounded } from '@mui/icons-material';
simond47ef9e2022-09-28 22:24:28 -040019import {
simon07b4eb02022-09-29 17:50:26 -040020 Card,
21 CardContent,
22 Grid,
23 IconButton,
simond47ef9e2022-09-28 22:24:28 -040024 List,
25 ListItem,
simon07b4eb02022-09-29 17:50:26 -040026 ListItemAvatar,
simond47ef9e2022-09-28 22:24:28 -040027 ListItemIcon,
28 ListItemSecondaryAction,
29 ListItemText,
30 ListSubheader,
simond47ef9e2022-09-28 22:24:28 -040031 Paper,
simon07b4eb02022-09-29 17:50:26 -040032 Switch,
simond47ef9e2022-09-28 22:24:28 -040033 TextField,
simon07b4eb02022-09-29 17:50:26 -040034 Toolbar,
35 Typography,
simond47ef9e2022-09-28 22:24:28 -040036} from '@mui/material';
simon07b4eb02022-09-29 17:50:26 -040037import { motion } from 'framer-motion';
Misha Krieger-Raynauld6bbdacf2022-11-29 21:45:40 -050038import { AccountDetails } from 'jami-web-common';
simon07b4eb02022-09-29 17:50:26 -040039import { useState } from 'react';
Adrien Béraud6ecaa402021-04-06 17:37:25 -040040
simon416d0792022-11-03 02:46:18 -040041import { useAuthContext } from '../contexts/AuthProvider';
idillonb0ec86a2022-12-06 17:54:55 -050042import ConversationAvatar, { AvatarEditor } from './ConversationAvatar';
simond47ef9e2022-09-28 22:24:28 -040043import ConversationsOverviewCard from './ConversationsOverviewCard';
simon07b4eb02022-09-29 17:50:26 -040044import JamiIdCard from './JamiIdCard';
Adrien Béraud4e287b92021-04-24 16:15:56 -040045
simond47ef9e2022-09-28 22:24:28 -040046const transition = { duration: 0.3, ease: [0.43, 0.13, 0.23, 0.96] };
Adrien Béraud6c934962021-06-07 10:13:26 -040047
48const thumbnailVariants = {
49 initial: { scale: 0.9, opacity: 0 },
50 enter: { scale: 1, opacity: 1, transition },
51 exit: {
52 scale: 0.5,
53 opacity: 0,
simonfe1de722022-10-02 00:21:43 -040054 transition: { ...transition, duration: 1.5 },
simond47ef9e2022-09-28 22:24:28 -040055 },
56};
Adrien Béraud6c934962021-06-07 10:13:26 -040057
simon94fe53e2022-11-10 12:51:58 -050058export default function AccountPreferences() {
59 const { account, axiosInstance } = useAuthContext();
simon416d0792022-11-03 02:46:18 -040060
simonfe1de722022-10-02 00:21:43 -040061 const devices: string[][] = [];
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050062 const accountDevices = account.devices;
simonfe1de722022-10-02 00:21:43 -040063 for (const i in accountDevices) devices.push([i, accountDevices[i]]);
Adrien Béraud4e287b92021-04-24 16:15:56 -040064
simond47ef9e2022-09-28 22:24:28 -040065 console.log(devices);
ervinanohf1758a42022-09-14 14:52:51 -040066
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050067 const isJamiAccount = account.getType() === 'RING';
simond47ef9e2022-09-28 22:24:28 -040068 const alias = isJamiAccount ? 'Jami account' : 'SIP account';
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050069 const moderators = account.defaultModerators;
simond47ef9e2022-09-28 22:24:28 -040070 const [defaultModeratorUri, setDefaultModeratorUri] = useState('');
ervinanohf1758a42022-09-14 14:52:51 -040071
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050072 const [details, setDetails] = useState(account.details);
Adrien Béraud86986032021-04-25 12:04:53 -040073
simon94fe53e2022-11-10 12:51:58 -050074 const addModerator = async () => {
Adrien Béraud4e287b92021-04-24 16:15:56 -040075 if (defaultModeratorUri) {
simon94fe53e2022-11-10 12:51:58 -050076 await axiosInstance.put(`/default-moderators/${defaultModeratorUri}`);
simond47ef9e2022-09-28 22:24:28 -040077 setDefaultModeratorUri('');
Adrien Béraud4e287b92021-04-24 16:15:56 -040078 }
ervinanohf1758a42022-09-14 14:52:51 -040079 };
Adrien Béraud4e287b92021-04-24 16:15:56 -040080
simon94fe53e2022-11-10 12:51:58 -050081 const removeModerator = async (uri: string) => await axiosInstance.delete(`/default-moderators/${uri}`);
Adrien Béraud4e287b92021-04-24 16:15:56 -040082
simon94fe53e2022-11-10 12:51:58 -050083 const handleToggle = async (key: keyof AccountDetails, value: boolean) => {
ervinanohf1758a42022-09-14 14:52:51 -040084 console.log(`handleToggle ${key} ${value}`);
simonfe1de722022-10-02 00:21:43 -040085 const newDetails: Partial<AccountDetails> = {};
simond47ef9e2022-09-28 22:24:28 -040086 newDetails[key] = value ? 'true' : 'false';
ervinanohf1758a42022-09-14 14:52:51 -040087 console.log(newDetails);
simon94fe53e2022-11-10 12:51:58 -050088 await axiosInstance.patch('/account', newDetails);
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -050089 account.updateDetails(newDetails);
90 setDetails(account.details);
ervinanohf1758a42022-09-14 14:52:51 -040091 };
Adrien Béraud86986032021-04-25 12:04:53 -040092
Adrien Béraud150b4782021-04-21 19:40:59 -040093 return (
Adrien Béraud6c934962021-06-07 10:13:26 -040094 <motion.div
ervinanohf1758a42022-09-14 14:52:51 -040095 initial="initial"
96 animate="enter"
97 exit="exit"
98 variants={{
99 enter: { transition: { staggerChildren: 0.05 } },
100 exit: { transition: { staggerChildren: 0.02 } },
101 }}
102 >
idillonb0ec86a2022-12-06 17:54:55 -0500103 <AvatarEditor />
ervinanohf1758a42022-09-14 14:52:51 -0400104 <motion.div variants={thumbnailVariants}>
105 <Typography variant="h2" component="h2" gutterBottom>
106 {alias}
107 </Typography>
108 </motion.div>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400109 <Grid container spacing={3} style={{ marginBottom: 16 }}>
ervinanohf1758a42022-09-14 14:52:51 -0400110 {isJamiAccount && (
111 <Grid item xs={12}>
112 <motion.div variants={thumbnailVariants}>
113 <JamiIdCard account={account} />
114 </motion.div>
115 </Grid>
116 )}
Adrien Béraud150b4782021-04-21 19:40:59 -0400117
118 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400119 <motion.div variants={thumbnailVariants}>
simon5da8ca62022-11-09 15:21:25 -0500120 <ConversationsOverviewCard />
Adrien Béraud6c934962021-06-07 10:13:26 -0400121 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400122 </Grid>
123
124 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400125 <motion.div variants={thumbnailVariants}>
126 <Card>
127 <CardContent>
128 <Typography color="textSecondary" gutterBottom>
129 Current calls
130 </Typography>
131 <Typography gutterBottom variant="h5" component="h2">
132 0
133 </Typography>
134 </CardContent>
135 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -0400136 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400137 </Grid>
Adrien Béraud6c934962021-06-07 10:13:26 -0400138
ervinanohf1758a42022-09-14 14:52:51 -0400139 <Grid item xs={12} sm={6}>
140 <motion.div variants={thumbnailVariants}>
141 <Card>
142 <CardContent>
143 <Typography color="textSecondary" gutterBottom>
144 Appareils associés
145 </Typography>
146 <Typography gutterBottom variant="h5" component="h2">
simon80b7b3b2022-09-28 17:50:10 -0400147 {devices.map((device, i) => (
148 <ListItem key={i}>
ervinanohf1758a42022-09-14 14:52:51 -0400149 <GroupRounded />
simond47ef9e2022-09-28 22:24:28 -0400150 <ListItemText id="switch-list-label-rendezvous" primary={device[1]} secondary={device[0]} />
ervinanohf1758a42022-09-14 14:52:51 -0400151 </ListItem>
152 ))}
153 {/* <ListItemTextsion> */}
154 </Typography>
155 </CardContent>
156 </Card>
157 </motion.div>
158 </Grid>
Adrien Béraud150b4782021-04-21 19:40:59 -0400159 </Grid>
160
ervinanohf1758a42022-09-14 14:52:51 -0400161 <List
162 subheader={
163 <motion.div variants={thumbnailVariants}>
164 <ListSubheader>Settings</ListSubheader>
165 </motion.div>
166 }
167 >
168 <motion.div variants={thumbnailVariants}>
169 <ListItem>
170 <ListItemIcon>
171 <GroupRounded />
172 </ListItemIcon>
simond47ef9e2022-09-28 22:24:28 -0400173 <ListItemText id="switch-list-label-rendezvous" primary="Rendez-Vous point" />
ervinanohf1758a42022-09-14 14:52:51 -0400174 <ListItemSecondaryAction>
175 <Switch
176 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400177 onChange={(e) => handleToggle('Account.rendezVous', e.target.checked)}
178 checked={details['Account.rendezVous'] === 'true'}
ervinanohf1758a42022-09-14 14:52:51 -0400179 inputProps={{
simond47ef9e2022-09-28 22:24:28 -0400180 'aria-labelledby': 'switch-list-label-rendezvous',
ervinanohf1758a42022-09-14 14:52:51 -0400181 }}
182 />
183 </ListItemSecondaryAction>
184 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400185 </motion.div>
186 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400187 <ListItem>
188 <ListItemIcon>
189 <PhoneCallbackRounded />
190 </ListItemIcon>
Misha Krieger-Raynauldbaf49d82022-11-30 18:51:37 -0500191 <ListItemText id="switch-list-label-publicin" primary="Allow connection from unknown peers" />
ervinanohf1758a42022-09-14 14:52:51 -0400192 <ListItemSecondaryAction>
193 <Switch
194 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400195 onChange={(e) => handleToggle('DHT.PublicInCalls', e.target.checked)}
196 checked={details['DHT.PublicInCalls'] === 'true'}
197 inputProps={{ 'aria-labelledby': 'switch-list-label-publicin' }}
ervinanohf1758a42022-09-14 14:52:51 -0400198 />
199 </ListItemSecondaryAction>
200 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400201 </motion.div>
202 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400203 <Paper>
204 <Toolbar>
205 <Typography variant="h6">Default moderators</Typography>
206 </Toolbar>
207 <List>
208 <ListItem key="add">
209 <TextField
210 variant="outlined"
211 value={defaultModeratorUri}
212 onChange={(e) => setDefaultModeratorUri(e.target.value)}
213 label="Add new default moderator"
214 placeholder="Enter new moderator name or URI"
215 fullWidth
216 />
217 <ListItemSecondaryAction>
218 <IconButton onClick={addModerator} size="large">
219 <AddCircle />
220 </IconButton>
221 </ListItemSecondaryAction>
222 </ListItem>
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -0500223 {moderators.length === 0 ? (
ervinanohf1758a42022-09-14 14:52:51 -0400224 <ListItem key="placeholder">
225 <ListItemText primary="No default moderator" />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400226 </ListItem>
ervinanohf1758a42022-09-14 14:52:51 -0400227 ) : (
228 moderators.map((moderator) => (
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -0500229 <ListItem key={moderator.uri}>
ervinanohf1758a42022-09-14 14:52:51 -0400230 <ListItemAvatar>
simonfe1de722022-10-02 00:21:43 -0400231 <ConversationAvatar displayName={moderator.getDisplayName()} />
ervinanohf1758a42022-09-14 14:52:51 -0400232 </ListItemAvatar>
233 <ListItemText primary={moderator.getDisplayName()} />
234 <ListItemSecondaryAction>
Misha Krieger-Raynauldcfa44302022-11-30 18:36:36 -0500235 <IconButton onClick={() => removeModerator(moderator.uri)} size="large">
ervinanohf1758a42022-09-14 14:52:51 -0400236 <DeleteRounded />
237 </IconButton>
238 </ListItemSecondaryAction>
239 </ListItem>
240 ))
241 )}
242 </List>
243 </Paper>
Adrien Béraud6c934962021-06-07 10:13:26 -0400244 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400245 </List>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400246 </motion.div>
247 );
Adrien Béraud150b4782021-04-21 19:40:59 -0400248}