blob: 0c62204c2904612aca41cc868c81dc0a36fc61fb [file] [log] [blame]
Adrien Béraud4e287b92021-04-24 16:15:56 -04001import React, { useState } from 'react'
Adrien Béraudab519ff2022-05-03 15:34:48 -04002
Adrien Béraudab519ff2022-05-03 15:34:48 -04003import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, ListSubheader, Switch, Typography, Grid, Paper, CardContent, Card, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Toolbar, IconButton, ListItemAvatar, Input, TextField } from '@mui/material'
4import { PhoneCallbackRounded, GroupRounded, DeleteRounded, AddCircle } from '@mui/icons-material'
Adrien Béraud6ecaa402021-04-06 17:37:25 -04005
Adrien Béraud21c53cf2021-04-22 00:04:32 -04006import Account from '../../../model/Account'
7import JamiIdCard from './JamiIdCard'
8import ConversationAvatar from './ConversationAvatar'
9import ConversationsOverviewCard from './ConversationsOverviewCard'
Adrien Béraud6ecaa402021-04-06 17:37:25 -040010
Adrien Béraud4e287b92021-04-24 16:15:56 -040011import authManager from '../AuthManager'
Adrien Béraud6c934962021-06-07 10:13:26 -040012import { motion } from 'framer-motion'
Adrien Béraud4e287b92021-04-24 16:15:56 -040013
Adrien Béraud6c934962021-06-07 10:13:26 -040014const transition = { duration: 0.3, ease: [0.43, 0.13, 0.23, 0.96] }
15
16const thumbnailVariants = {
17 initial: { scale: 0.9, opacity: 0 },
18 enter: { scale: 1, opacity: 1, transition },
19 exit: {
20 scale: 0.5,
21 opacity: 0,
22 transition: { duration: 1.5, ...transition }
23 }
24}
25
Adrien Béraud150b4782021-04-21 19:40:59 -040026export default function AccountPreferences(props) {
ervinanohf1758a42022-09-14 14:52:51 -040027 const account = props.account;
28 let devices = [];
29 for (var i in account.devices) devices.push([i, account.devices[i]]);
Adrien Béraud4e287b92021-04-24 16:15:56 -040030
ervinanohf1758a42022-09-14 14:52:51 -040031 console.log(devices)
32
33 const isJamiAccount = account.getType() === Account.TYPE_JAMI;
34 const alias = isJamiAccount ? "Jami account" : "SIP account";
35 const moderators = account.getDefaultModerators();
36 const [defaultModeratorUri, setDefaultModeratorUri] = useState("");
37
38 const [details, setDetails] = useState(account.getDetails());
Adrien Béraud86986032021-04-25 12:04:53 -040039
Adrien Béraud4e287b92021-04-24 16:15:56 -040040 const addModerator = () => {
41 if (defaultModeratorUri) {
ervinanohf1758a42022-09-14 14:52:51 -040042 authManager.fetch(
43 `/api/accounts/${account.getId()}/defaultModerators/${defaultModeratorUri}`,
44 { method: "PUT" }
45 );
46 setDefaultModeratorUri("");
Adrien Béraud4e287b92021-04-24 16:15:56 -040047 }
ervinanohf1758a42022-09-14 14:52:51 -040048 };
Adrien Béraud4e287b92021-04-24 16:15:56 -040049
50 const removeModerator = (uri) =>
ervinanohf1758a42022-09-14 14:52:51 -040051 authManager.fetch(
52 `/api/accounts/${account.getId()}/defaultModerators/${uri}`,
53 { method: "DELETE" }
54 );
Adrien Béraud4e287b92021-04-24 16:15:56 -040055
Adrien Béraud86986032021-04-25 12:04:53 -040056 const handleToggle = (key, value) => {
ervinanohf1758a42022-09-14 14:52:51 -040057 console.log(`handleToggle ${key} ${value}`);
58 const newDetails = {};
59 newDetails[key] = value ? "true" : "false";
60 console.log(newDetails);
Adrien Béraud86986032021-04-25 12:04:53 -040061 authManager.fetch(`/api/accounts/${account.getId()}`, {
62 method: "POST",
63 headers: {
ervinanohf1758a42022-09-14 14:52:51 -040064 Accept: "application/json",
65 "Content-Type": "application/json",
Adrien Béraud86986032021-04-25 12:04:53 -040066 },
ervinanohf1758a42022-09-14 14:52:51 -040067 body: JSON.stringify(newDetails),
68 });
69 setDetails({ ...account.updateDetails(newDetails) });
70 };
Adrien Béraud86986032021-04-25 12:04:53 -040071
Adrien Béraud150b4782021-04-21 19:40:59 -040072 return (
Adrien Béraud6c934962021-06-07 10:13:26 -040073 <motion.div
ervinanohf1758a42022-09-14 14:52:51 -040074 initial="initial"
75 animate="enter"
76 exit="exit"
77 variants={{
78 enter: { transition: { staggerChildren: 0.05 } },
79 exit: { transition: { staggerChildren: 0.02 } },
80 }}
81 >
82 <motion.div variants={thumbnailVariants}>
83 <Typography variant="h2" component="h2" gutterBottom>
84 {alias}
85 </Typography>
86 </motion.div>
Adrien Béraud21c53cf2021-04-22 00:04:32 -040087 <Grid container spacing={3} style={{ marginBottom: 16 }}>
ervinanohf1758a42022-09-14 14:52:51 -040088 {isJamiAccount && (
89 <Grid item xs={12}>
90 <motion.div variants={thumbnailVariants}>
91 <JamiIdCard account={account} />
92 </motion.div>
93 </Grid>
94 )}
Adrien Béraud150b4782021-04-21 19:40:59 -040095
96 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -040097 <motion.div variants={thumbnailVariants}>
98 <ConversationsOverviewCard accountId={account.getId()} />
Adrien Béraud6c934962021-06-07 10:13:26 -040099 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400100 </Grid>
101
102 <Grid item xs={12} sm={6}>
ervinanohf1758a42022-09-14 14:52:51 -0400103 <motion.div variants={thumbnailVariants}>
104 <Card>
105 <CardContent>
106 <Typography color="textSecondary" gutterBottom>
107 Current calls
108 </Typography>
109 <Typography gutterBottom variant="h5" component="h2">
110 0
111 </Typography>
112 </CardContent>
113 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -0400114 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400115 </Grid>
Adrien Béraud6c934962021-06-07 10:13:26 -0400116
ervinanohf1758a42022-09-14 14:52:51 -0400117 <Grid item xs={12} sm={6}>
118 <motion.div variants={thumbnailVariants}>
119 <Card>
120 <CardContent>
121 <Typography color="textSecondary" gutterBottom>
122 Appareils associés
123 </Typography>
124 <Typography gutterBottom variant="h5" component="h2">
125 {devices.map((device) => (
126 <ListItem>
127 <GroupRounded />
128 <ListItemText
129 id="switch-list-label-rendezvous"
130 primary={device[1]}
131 secondary={device[0]}
132 />
133 </ListItem>
134 ))}
135 {/* <ListItemTextsion> */}
136 </Typography>
137 </CardContent>
138 </Card>
139 </motion.div>
140 </Grid>
Adrien Béraud150b4782021-04-21 19:40:59 -0400141 </Grid>
142
ervinanohf1758a42022-09-14 14:52:51 -0400143 <List
144 subheader={
145 <motion.div variants={thumbnailVariants}>
146 <ListSubheader>Settings</ListSubheader>
147 </motion.div>
148 }
149 >
150 <motion.div variants={thumbnailVariants}>
151 <ListItem>
152 <ListItemIcon>
153 <GroupRounded />
154 </ListItemIcon>
155 <ListItemText
156 id="switch-list-label-rendezvous"
157 primary="Rendez-Vous point"
Adrien Béraud150b4782021-04-21 19:40:59 -0400158 />
ervinanohf1758a42022-09-14 14:52:51 -0400159 <ListItemSecondaryAction>
160 <Switch
161 edge="end"
162 onChange={(e) =>
163 handleToggle("Account.rendezVous", e.target.checked)
164 }
165 checked={details["Account.rendezVous"] === "true"}
166 inputProps={{
167 "aria-labelledby": "switch-list-label-rendezvous",
168 }}
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>
178 <ListItemText
179 id="switch-list-label-publicin"
180 primary="Allow connection from unkown peers"
Adrien Béraud150b4782021-04-21 19:40:59 -0400181 />
ervinanohf1758a42022-09-14 14:52:51 -0400182 <ListItemSecondaryAction>
183 <Switch
184 edge="end"
185 onChange={(e) =>
186 handleToggle("DHT.PublicInCalls", e.target.checked)
187 }
188 checked={details["DHT.PublicInCalls"] === "true"}
189 inputProps={{ "aria-labelledby": "switch-list-label-publicin" }}
190 />
191 </ListItemSecondaryAction>
192 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400193 </motion.div>
194 <motion.div variants={thumbnailVariants}>
ervinanohf1758a42022-09-14 14:52:51 -0400195 <Paper>
196 <Toolbar>
197 <Typography variant="h6">Default moderators</Typography>
198 </Toolbar>
199 <List>
200 <ListItem key="add">
201 <TextField
202 variant="outlined"
203 value={defaultModeratorUri}
204 onChange={(e) => setDefaultModeratorUri(e.target.value)}
205 label="Add new default moderator"
206 placeholder="Enter new moderator name or URI"
207 fullWidth
208 />
209 <ListItemSecondaryAction>
210 <IconButton onClick={addModerator} size="large">
211 <AddCircle />
212 </IconButton>
213 </ListItemSecondaryAction>
214 </ListItem>
215 {!moderators || moderators.length === 0 ? (
216 <ListItem key="placeholder">
217 <ListItemText primary="No default moderator" />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400218 </ListItem>
ervinanohf1758a42022-09-14 14:52:51 -0400219 ) : (
220 moderators.map((moderator) => (
221 <ListItem key={moderator.uri}>
222 <ListItemAvatar>
223 <ConversationAvatar name={moderator.getDisplayName()} />
224 </ListItemAvatar>
225 <ListItemText primary={moderator.getDisplayName()} />
226 <ListItemSecondaryAction>
227 <IconButton
228 onClick={(e) => removeModerator(moderator.uri)}
229 size="large"
230 >
231 <DeleteRounded />
232 </IconButton>
233 </ListItemSecondaryAction>
234 </ListItem>
235 ))
236 )}
237 </List>
238 </Paper>
Adrien Béraud6c934962021-06-07 10:13:26 -0400239 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400240 </List>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400241 </motion.div>
242 );
Adrien Béraud150b4782021-04-21 19:40:59 -0400243}