blob: 598d07f652cae8028a4040d8007aac1438f232b4 [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';
simonfe1de722022-10-02 00:21:43 -040024import AccountDetails from '../../../model/AccountDetails';
simon07b4eb02022-09-29 17:50:26 -040025import authManager from '../AuthManager';
simond47ef9e2022-09-28 22:24:28 -040026import ConversationAvatar from './ConversationAvatar';
27import ConversationsOverviewCard from './ConversationsOverviewCard';
simon07b4eb02022-09-29 17:50:26 -040028import JamiIdCard from './JamiIdCard';
Adrien Béraud4e287b92021-04-24 16:15:56 -040029
simond47ef9e2022-09-28 22:24:28 -040030const transition = { duration: 0.3, ease: [0.43, 0.13, 0.23, 0.96] };
Adrien Béraud6c934962021-06-07 10:13:26 -040031
32const thumbnailVariants = {
33 initial: { scale: 0.9, opacity: 0 },
34 enter: { scale: 1, opacity: 1, transition },
35 exit: {
36 scale: 0.5,
37 opacity: 0,
simonfe1de722022-10-02 00:21:43 -040038 transition: { ...transition, duration: 1.5 },
simond47ef9e2022-09-28 22:24:28 -040039 },
40};
Adrien Béraud6c934962021-06-07 10:13:26 -040041
simonfe1de722022-10-02 00:21:43 -040042type AccountPreferencesProps = {
43 account: Account;
44 onAccountChanged?: (account: Account) => void;
45};
46
47export default function AccountPreferences({ account }: AccountPreferencesProps) {
48 const devices: string[][] = [];
49 const accountDevices = account.getDevices();
50 for (const i in accountDevices) devices.push([i, accountDevices[i]]);
Adrien Béraud4e287b92021-04-24 16:15:56 -040051
simond47ef9e2022-09-28 22:24:28 -040052 console.log(devices);
ervinanohf1758a42022-09-14 14:52:51 -040053
54 const isJamiAccount = account.getType() === Account.TYPE_JAMI;
simond47ef9e2022-09-28 22:24:28 -040055 const alias = isJamiAccount ? 'Jami account' : 'SIP account';
ervinanohf1758a42022-09-14 14:52:51 -040056 const moderators = account.getDefaultModerators();
simond47ef9e2022-09-28 22:24:28 -040057 const [defaultModeratorUri, setDefaultModeratorUri] = useState('');
ervinanohf1758a42022-09-14 14:52:51 -040058
59 const [details, setDetails] = useState(account.getDetails());
Adrien Béraud86986032021-04-25 12:04:53 -040060
Adrien Béraud4e287b92021-04-24 16:15:56 -040061 const addModerator = () => {
62 if (defaultModeratorUri) {
simond47ef9e2022-09-28 22:24:28 -040063 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${defaultModeratorUri}`, { method: 'PUT' });
64 setDefaultModeratorUri('');
Adrien Béraud4e287b92021-04-24 16:15:56 -040065 }
ervinanohf1758a42022-09-14 14:52:51 -040066 };
Adrien Béraud4e287b92021-04-24 16:15:56 -040067
simonfe1de722022-10-02 00:21:43 -040068 const removeModerator = (uri: string) =>
simond47ef9e2022-09-28 22:24:28 -040069 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${uri}`, { method: 'DELETE' });
Adrien Béraud4e287b92021-04-24 16:15:56 -040070
simonfe1de722022-10-02 00:21:43 -040071 const handleToggle = (key: keyof AccountDetails, value: boolean) => {
ervinanohf1758a42022-09-14 14:52:51 -040072 console.log(`handleToggle ${key} ${value}`);
simonfe1de722022-10-02 00:21:43 -040073 const newDetails: Partial<AccountDetails> = {};
simond47ef9e2022-09-28 22:24:28 -040074 newDetails[key] = value ? 'true' : 'false';
ervinanohf1758a42022-09-14 14:52:51 -040075 console.log(newDetails);
Adrien Béraud86986032021-04-25 12:04:53 -040076 authManager.fetch(`/api/accounts/${account.getId()}`, {
simond47ef9e2022-09-28 22:24:28 -040077 method: 'POST',
Adrien Béraud86986032021-04-25 12:04:53 -040078 headers: {
simond47ef9e2022-09-28 22:24:28 -040079 Accept: 'application/json',
80 'Content-Type': 'application/json',
Adrien Béraud86986032021-04-25 12:04:53 -040081 },
ervinanohf1758a42022-09-14 14:52:51 -040082 body: JSON.stringify(newDetails),
83 });
84 setDetails({ ...account.updateDetails(newDetails) });
85 };
Adrien Béraud86986032021-04-25 12:04:53 -040086
Adrien Béraud150b4782021-04-21 19:40:59 -040087 return (
Adrien Béraud6c934962021-06-07 10:13:26 -040088 <motion.div
ervinanohf1758a42022-09-14 14:52:51 -040089 initial="initial"
90 animate="enter"
91 exit="exit"
92 variants={{
93 enter: { transition: { staggerChildren: 0.05 } },
94 exit: { transition: { staggerChildren: 0.02 } },
95 }}
96 >
97 <motion.div variants={thumbnailVariants}>
98 <Typography variant="h2" component="h2" gutterBottom>
99 {alias}
100 </Typography>
101 </motion.div>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400102 <Grid container spacing={3} style={{ marginBottom: 16 }}>
ervinanohf1758a42022-09-14 14:52:51 -0400103 {isJamiAccount && (
104 <Grid item xs={12}>
105 <motion.div variants={thumbnailVariants}>
106 <JamiIdCard account={account} />
107 </motion.div>
108 </Grid>
109 )}
Adrien Béraud150b4782021-04-21 19:40:59 -0400110
111 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400112 <motion.div variants={thumbnailVariants}>
113 <ConversationsOverviewCard accountId={account.getId()} />
Adrien Béraud6c934962021-06-07 10:13:26 -0400114 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400115 </Grid>
116
117 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400118 <motion.div variants={thumbnailVariants}>
119 <Card>
120 <CardContent>
121 <Typography color="textSecondary" gutterBottom>
122 Current calls
123 </Typography>
124 <Typography gutterBottom variant="h5" component="h2">
125 0
126 </Typography>
127 </CardContent>
128 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -0400129 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400130 </Grid>
Adrien Béraud6c934962021-06-07 10:13:26 -0400131
ervinanohf1758a42022-09-14 14:52:51 -0400132 <Grid item xs={12} sm={6}>
133 <motion.div variants={thumbnailVariants}>
134 <Card>
135 <CardContent>
136 <Typography color="textSecondary" gutterBottom>
137 Appareils associés
138 </Typography>
139 <Typography gutterBottom variant="h5" component="h2">
simon80b7b3b2022-09-28 17:50:10 -0400140 {devices.map((device, i) => (
141 <ListItem key={i}>
ervinanohf1758a42022-09-14 14:52:51 -0400142 <GroupRounded />
simond47ef9e2022-09-28 22:24:28 -0400143 <ListItemText id="switch-list-label-rendezvous" primary={device[1]} secondary={device[0]} />
ervinanohf1758a42022-09-14 14:52:51 -0400144 </ListItem>
145 ))}
146 {/* <ListItemTextsion> */}
147 </Typography>
148 </CardContent>
149 </Card>
150 </motion.div>
151 </Grid>
Adrien Béraud150b4782021-04-21 19:40:59 -0400152 </Grid>
153
ervinanohf1758a42022-09-14 14:52:51 -0400154 <List
155 subheader={
156 <motion.div variants={thumbnailVariants}>
157 <ListSubheader>Settings</ListSubheader>
158 </motion.div>
159 }
160 >
161 <motion.div variants={thumbnailVariants}>
162 <ListItem>
163 <ListItemIcon>
164 <GroupRounded />
165 </ListItemIcon>
simond47ef9e2022-09-28 22:24:28 -0400166 <ListItemText id="switch-list-label-rendezvous" primary="Rendez-Vous point" />
ervinanohf1758a42022-09-14 14:52:51 -0400167 <ListItemSecondaryAction>
168 <Switch
169 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400170 onChange={(e) => handleToggle('Account.rendezVous', e.target.checked)}
171 checked={details['Account.rendezVous'] === 'true'}
ervinanohf1758a42022-09-14 14:52:51 -0400172 inputProps={{
simond47ef9e2022-09-28 22:24:28 -0400173 'aria-labelledby': 'switch-list-label-rendezvous',
ervinanohf1758a42022-09-14 14:52:51 -0400174 }}
175 />
176 </ListItemSecondaryAction>
177 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400178 </motion.div>
179 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400180 <ListItem>
181 <ListItemIcon>
182 <PhoneCallbackRounded />
183 </ListItemIcon>
simond47ef9e2022-09-28 22:24:28 -0400184 <ListItemText id="switch-list-label-publicin" primary="Allow connection from unkown peers" />
ervinanohf1758a42022-09-14 14:52:51 -0400185 <ListItemSecondaryAction>
186 <Switch
187 edge="end"
simond47ef9e2022-09-28 22:24:28 -0400188 onChange={(e) => handleToggle('DHT.PublicInCalls', e.target.checked)}
189 checked={details['DHT.PublicInCalls'] === 'true'}
190 inputProps={{ 'aria-labelledby': 'switch-list-label-publicin' }}
ervinanohf1758a42022-09-14 14:52:51 -0400191 />
192 </ListItemSecondaryAction>
193 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400194 </motion.div>
195 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400196 <Paper>
197 <Toolbar>
198 <Typography variant="h6">Default moderators</Typography>
199 </Toolbar>
200 <List>
201 <ListItem key="add">
202 <TextField
203 variant="outlined"
204 value={defaultModeratorUri}
205 onChange={(e) => setDefaultModeratorUri(e.target.value)}
206 label="Add new default moderator"
207 placeholder="Enter new moderator name or URI"
208 fullWidth
209 />
210 <ListItemSecondaryAction>
211 <IconButton onClick={addModerator} size="large">
212 <AddCircle />
213 </IconButton>
214 </ListItemSecondaryAction>
215 </ListItem>
216 {!moderators || moderators.length === 0 ? (
217 <ListItem key="placeholder">
218 <ListItemText primary="No default moderator" />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400219 </ListItem>
ervinanohf1758a42022-09-14 14:52:51 -0400220 ) : (
221 moderators.map((moderator) => (
simonfe1de722022-10-02 00:21:43 -0400222 <ListItem key={moderator.getUri()}>
ervinanohf1758a42022-09-14 14:52:51 -0400223 <ListItemAvatar>
simonfe1de722022-10-02 00:21:43 -0400224 <ConversationAvatar displayName={moderator.getDisplayName()} />
ervinanohf1758a42022-09-14 14:52:51 -0400225 </ListItemAvatar>
226 <ListItemText primary={moderator.getDisplayName()} />
227 <ListItemSecondaryAction>
simonfe1de722022-10-02 00:21:43 -0400228 <IconButton onClick={(e) => removeModerator(moderator.getUri())} size="large">
ervinanohf1758a42022-09-14 14:52:51 -0400229 <DeleteRounded />
230 </IconButton>
231 </ListItemSecondaryAction>
232 </ListItem>
233 ))
234 )}
235 </List>
236 </Paper>
Adrien Béraud6c934962021-06-07 10:13:26 -0400237 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400238 </List>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400239 </motion.div>
240 );
Adrien Béraud150b4782021-04-21 19:40:59 -0400241}