blob: 8160459d0eb66fae8185ee40562d44f53982d90d [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
3
4import { makeStyles } from '@mui/styles'
5//import { createTheme, ThemeProvider } from '@mui/material/styles'
6
7import { 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'
8import { PhoneCallbackRounded, GroupRounded, DeleteRounded, AddCircle } from '@mui/icons-material'
Adrien Béraud6ecaa402021-04-06 17:37:25 -04009
Adrien Béraud21c53cf2021-04-22 00:04:32 -040010import Account from '../../../model/Account'
11import JamiIdCard from './JamiIdCard'
12import ConversationAvatar from './ConversationAvatar'
13import ConversationsOverviewCard from './ConversationsOverviewCard'
Adrien Béraud6ecaa402021-04-06 17:37:25 -040014
Adrien Béraud4e287b92021-04-24 16:15:56 -040015import authManager from '../AuthManager'
Adrien Béraud6c934962021-06-07 10:13:26 -040016import { motion } from 'framer-motion'
Adrien Béraud4e287b92021-04-24 16:15:56 -040017
Adrien Béraud21c53cf2021-04-22 00:04:32 -040018const useStyles = makeStyles(theme => ({
Adrien Béraud150b4782021-04-21 19:40:59 -040019 root: {
20 minWidth: 275,
21 },
Adrien Béraud150b4782021-04-21 19:40:59 -040022 title: {
23 fontSize: 14,
Adrien Béraud21c53cf2021-04-22 00:04:32 -040024 flexGrow: 1
Adrien Béraud150b4782021-04-21 19:40:59 -040025 },
26 pos: {
27 marginBottom: 12,
28 },
Adrien Béraud21c53cf2021-04-22 00:04:32 -040029 paper: {
30 marginTop: 24,
31 marginBottom: 24
Adrien Béraud150b4782021-04-21 19:40:59 -040032 },
Adrien Béraud21c53cf2021-04-22 00:04:32 -040033 textField: {
34 //marginLeft: theme.spacing(1),
Adrien Béraudab519ff2022-05-03 15:34:48 -040035 //marginRight: theme.spacing(2),
Adrien Béraud21c53cf2021-04-22 00:04:32 -040036 }
37}))
Adrien Béraud150b4782021-04-21 19:40:59 -040038
Adrien Béraud6c934962021-06-07 10:13:26 -040039const transition = { duration: 0.3, ease: [0.43, 0.13, 0.23, 0.96] }
40
41const thumbnailVariants = {
42 initial: { scale: 0.9, opacity: 0 },
43 enter: { scale: 1, opacity: 1, transition },
44 exit: {
45 scale: 0.5,
46 opacity: 0,
47 transition: { duration: 1.5, ...transition }
48 }
49}
50
Adrien Béraud150b4782021-04-21 19:40:59 -040051export default function AccountPreferences(props) {
52 const classes = useStyles()
53 const account = props.account
54 const isJamiAccount = account.getType() === Account.TYPE_JAMI
55 const alias = isJamiAccount ? "Jami account" : "SIP account"
Adrien Béraud21c53cf2021-04-22 00:04:32 -040056 const moderators = account.getDefaultModerators()
Adrien Béraud4e287b92021-04-24 16:15:56 -040057 const [defaultModeratorUri, setDefaultModeratorUri] = useState('')
58
Adrien Béraud86986032021-04-25 12:04:53 -040059 const [details, setDetails] = useState(account.getDetails())
60
Adrien Béraud4e287b92021-04-24 16:15:56 -040061 const addModerator = () => {
62 if (defaultModeratorUri) {
63 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${defaultModeratorUri}`, {method: "PUT"})
64 setDefaultModeratorUri('')
65 }
66 }
67
68 const removeModerator = (uri) =>
69 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${uri}`, {method: "DELETE"})
70
Adrien Béraud86986032021-04-25 12:04:53 -040071 const handleToggle = (key, value) => {
72 console.log(`handleToggle ${key} ${value}`)
73 const newDetails = {}
74 newDetails[key] = value ? "true" : "false"
75 console.log(newDetails)
76 authManager.fetch(`/api/accounts/${account.getId()}`, {
77 method: "POST",
78 headers: {
79 'Accept': 'application/json',
80 'Content-Type': 'application/json'
81 },
82 body: JSON.stringify(newDetails)
83 })
84 setDetails({...account.updateDetails(newDetails)})
85 }
86
Adrien Béraud150b4782021-04-21 19:40:59 -040087 return (
Adrien Béraud6c934962021-06-07 10:13:26 -040088 <motion.div
89 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}><Typography variant="h2" component="h2" gutterBottom>{alias}</Typography></motion.div>
Adrien Béraud21c53cf2021-04-22 00:04:32 -040098 <Grid container spacing={3} style={{ marginBottom: 16 }}>
Adrien Béraud150b4782021-04-21 19:40:59 -040099 {isJamiAccount &&
Adrien Béraud6c934962021-06-07 10:13:26 -0400100 <Grid item xs={12}><motion.div variants={thumbnailVariants}><JamiIdCard account={account} /></motion.div></Grid>}
Adrien Béraud150b4782021-04-21 19:40:59 -0400101
102 <Grid item xs={12} sm={6}>
Adrien Béraud6c934962021-06-07 10:13:26 -0400103 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400104 <ConversationsOverviewCard accountId={account.getId()} />
Adrien Béraud6c934962021-06-07 10:13:26 -0400105 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400106 </Grid>
107
108 <Grid item xs={12} sm={6}>
Adrien Béraud6c934962021-06-07 10:13:26 -0400109 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400110 <Card>
111 <CardContent>
112 <Typography className={classes.title} color="textSecondary" gutterBottom>
113 Current calls
114 </Typography>
115 <Typography gutterBottom variant="h5" component="h2">
116 0
117 </Typography>
118 </CardContent>
119 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -0400120 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400121 </Grid>
Adrien Béraud6c934962021-06-07 10:13:26 -0400122
Adrien Béraud150b4782021-04-21 19:40:59 -0400123 </Grid>
124
Adrien Béraud6c934962021-06-07 10:13:26 -0400125 <List subheader={<motion.div variants={thumbnailVariants}><ListSubheader>Settings</ListSubheader></motion.div>}>
126 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400127 <ListItem>
128 <ListItemIcon>
129 <GroupRounded />
130 </ListItemIcon>
131 <ListItemText id="switch-list-label-rendezvous" primary="Rendez-Vous point" />
132 <ListItemSecondaryAction>
133 <Switch
134 edge="end"
Adrien Béraud86986032021-04-25 12:04:53 -0400135 onChange={e => handleToggle('Account.rendezVous', e.target.checked)}
136 checked={details['Account.rendezVous'] === 'true'}
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400137 inputProps={{ 'aria-labelledby': 'switch-list-label-rendezvous' }}
Adrien Béraud150b4782021-04-21 19:40:59 -0400138 />
139 </ListItemSecondaryAction>
140 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400141 </motion.div>
142 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400143 <ListItem>
144 <ListItemIcon>
145 <PhoneCallbackRounded />
146 </ListItemIcon>
147 <ListItemText id="switch-list-label-publicin" primary="Allow connection from unkown peers" />
148 <ListItemSecondaryAction>
149 <Switch
150 edge="end"
Adrien Béraud86986032021-04-25 12:04:53 -0400151 onChange={e => handleToggle('DHT.PublicInCalls', e.target.checked)}
152 checked={details['DHT.PublicInCalls'] === 'true'}
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400153 inputProps={{ 'aria-labelledby': 'switch-list-label-publicin' }}
Adrien Béraud150b4782021-04-21 19:40:59 -0400154 />
155 </ListItemSecondaryAction>
156 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400157 </motion.div>
158 <motion.div variants={thumbnailVariants}>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400159 <Paper className={classes.paper}>
160 <Toolbar>
161 <Typography className={classes.title} variant="h6">
162 Default moderators
163 </Typography>
164 </Toolbar>
165 <List>
166 <ListItem key="add">
Adrien Béraud4e287b92021-04-24 16:15:56 -0400167 <TextField variant="outlined"
168 className={classes.textField}
169 value={defaultModeratorUri}
170 onChange={e => setDefaultModeratorUri(e.target.value)}
171 label="Add new default moderator"
172 placeholder="Enter new moderator name or URI"
173 fullWidth />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400174 <ListItemSecondaryAction>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400175 <IconButton onClick={addModerator} size="large"><AddCircle /></IconButton>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400176 </ListItemSecondaryAction>
177 </ListItem>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400178 {!moderators || moderators.length === 0 ?
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400179 <ListItem key="placeholder">
180 <ListItemText primary="No default moderator" /></ListItem> :
181 moderators.map((moderator) => (
Adrien Béraud4e287b92021-04-24 16:15:56 -0400182 <ListItem key={moderator.uri}>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400183 <ListItemAvatar>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400184 <ConversationAvatar name={moderator.getDisplayName()} />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400185 </ListItemAvatar>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400186 <ListItemText primary={moderator.getDisplayName()} />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400187 <ListItemSecondaryAction>
Adrien Béraudab519ff2022-05-03 15:34:48 -0400188 <IconButton onClick={e => removeModerator(moderator.uri)} size="large"><DeleteRounded /></IconButton>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400189 </ListItemSecondaryAction>
190 </ListItem>
191 ))}
192 </List>
193 </Paper>
Adrien Béraud6c934962021-06-07 10:13:26 -0400194 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400195 </List>
196
Adrien Béraudab519ff2022-05-03 15:34:48 -0400197 </motion.div>
198 );
Adrien Béraud150b4782021-04-21 19:40:59 -0400199}