blob: 363df68790b33f2abccad9680f059ab13df787d0 [file] [log] [blame]
Adrien Béraud4e287b92021-04-24 16:15:56 -04001import React, { useState } from 'react'
Adrien Béraud21c53cf2021-04-22 00:04:32 -04002import { makeStyles } from '@material-ui/core/styles'
3import { List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, ListSubheader, Switch, Typography, Grid, Paper, CardContent, Card, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Toolbar, IconButton, ListItemAvatar, Input, TextField } from '@material-ui/core'
Adrien Béraud4e287b92021-04-24 16:15:56 -04004import { PhoneCallbackRounded, GroupRounded, DeleteRounded, AddCircle } from '@material-ui/icons'
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éraud21c53cf2021-04-22 00:04:32 -040014const useStyles = makeStyles(theme => ({
Adrien Béraud150b4782021-04-21 19:40:59 -040015 root: {
16 minWidth: 275,
17 },
Adrien Béraud150b4782021-04-21 19:40:59 -040018 title: {
19 fontSize: 14,
Adrien Béraud21c53cf2021-04-22 00:04:32 -040020 flexGrow: 1
Adrien Béraud150b4782021-04-21 19:40:59 -040021 },
22 pos: {
23 marginBottom: 12,
24 },
Adrien Béraud21c53cf2021-04-22 00:04:32 -040025 paper: {
26 marginTop: 24,
27 marginBottom: 24
Adrien Béraud150b4782021-04-21 19:40:59 -040028 },
Adrien Béraud21c53cf2021-04-22 00:04:32 -040029 textField: {
30 //marginLeft: theme.spacing(1),
31 marginRight: theme.spacing(2),
32 }
33}))
Adrien Béraud150b4782021-04-21 19:40:59 -040034
Adrien Béraud6c934962021-06-07 10:13:26 -040035const transition = { duration: 0.3, ease: [0.43, 0.13, 0.23, 0.96] }
36
37const thumbnailVariants = {
38 initial: { scale: 0.9, opacity: 0 },
39 enter: { scale: 1, opacity: 1, transition },
40 exit: {
41 scale: 0.5,
42 opacity: 0,
43 transition: { duration: 1.5, ...transition }
44 }
45}
46
Adrien Béraud150b4782021-04-21 19:40:59 -040047export default function AccountPreferences(props) {
48 const classes = useStyles()
49 const account = props.account
50 const isJamiAccount = account.getType() === Account.TYPE_JAMI
51 const alias = isJamiAccount ? "Jami account" : "SIP account"
Adrien Béraud21c53cf2021-04-22 00:04:32 -040052 const moderators = account.getDefaultModerators()
Adrien Béraud4e287b92021-04-24 16:15:56 -040053 const [defaultModeratorUri, setDefaultModeratorUri] = useState('')
54
Adrien Béraud86986032021-04-25 12:04:53 -040055 const [details, setDetails] = useState(account.getDetails())
56
Adrien Béraud4e287b92021-04-24 16:15:56 -040057 const addModerator = () => {
58 if (defaultModeratorUri) {
59 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${defaultModeratorUri}`, {method: "PUT"})
60 setDefaultModeratorUri('')
61 }
62 }
63
64 const removeModerator = (uri) =>
65 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${uri}`, {method: "DELETE"})
66
Adrien Béraud86986032021-04-25 12:04:53 -040067 const handleToggle = (key, value) => {
68 console.log(`handleToggle ${key} ${value}`)
69 const newDetails = {}
70 newDetails[key] = value ? "true" : "false"
71 console.log(newDetails)
72 authManager.fetch(`/api/accounts/${account.getId()}`, {
73 method: "POST",
74 headers: {
75 'Accept': 'application/json',
76 'Content-Type': 'application/json'
77 },
78 body: JSON.stringify(newDetails)
79 })
80 setDetails({...account.updateDetails(newDetails)})
81 }
82
Adrien Béraud150b4782021-04-21 19:40:59 -040083 return (
Adrien Béraud6c934962021-06-07 10:13:26 -040084 <motion.div
85 initial="initial"
86 animate="enter"
87 exit="exit"
88 variants={{
89 enter: { transition: { staggerChildren: 0.05 } },
90 exit: { transition: { staggerChildren: 0.02 } }
91 }}
92 >
93 <motion.div variants={thumbnailVariants}><Typography variant="h2" component="h2" gutterBottom>{alias}</Typography></motion.div>
Adrien Béraud21c53cf2021-04-22 00:04:32 -040094 <Grid container spacing={3} style={{ marginBottom: 16 }}>
Adrien Béraud150b4782021-04-21 19:40:59 -040095 {isJamiAccount &&
Adrien Béraud6c934962021-06-07 10:13:26 -040096 <Grid item xs={12}><motion.div variants={thumbnailVariants}><JamiIdCard account={account} /></motion.div></Grid>}
Adrien Béraud150b4782021-04-21 19:40:59 -040097
98 <Grid item xs={12} sm={6}>
Adrien Béraud6c934962021-06-07 10:13:26 -040099 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400100 <ConversationsOverviewCard accountId={account.getId()} />
Adrien Béraud6c934962021-06-07 10:13:26 -0400101 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400102 </Grid>
103
104 <Grid item xs={12} sm={6}>
Adrien Béraud6c934962021-06-07 10:13:26 -0400105 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400106 <Card>
107 <CardContent>
108 <Typography className={classes.title} color="textSecondary" gutterBottom>
109 Current calls
110 </Typography>
111 <Typography gutterBottom variant="h5" component="h2">
112 0
113 </Typography>
114 </CardContent>
115 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -0400116 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400117 </Grid>
Adrien Béraud6c934962021-06-07 10:13:26 -0400118
Adrien Béraud150b4782021-04-21 19:40:59 -0400119 </Grid>
120
Adrien Béraud6c934962021-06-07 10:13:26 -0400121 <List subheader={<motion.div variants={thumbnailVariants}><ListSubheader>Settings</ListSubheader></motion.div>}>
122 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400123 <ListItem>
124 <ListItemIcon>
125 <GroupRounded />
126 </ListItemIcon>
127 <ListItemText id="switch-list-label-rendezvous" primary="Rendez-Vous point" />
128 <ListItemSecondaryAction>
129 <Switch
130 edge="end"
Adrien Béraud86986032021-04-25 12:04:53 -0400131 onChange={e => handleToggle('Account.rendezVous', e.target.checked)}
132 checked={details['Account.rendezVous'] === 'true'}
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400133 inputProps={{ 'aria-labelledby': 'switch-list-label-rendezvous' }}
Adrien Béraud150b4782021-04-21 19:40:59 -0400134 />
135 </ListItemSecondaryAction>
136 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400137 </motion.div>
138 <motion.div variants={thumbnailVariants}>
Adrien Béraud150b4782021-04-21 19:40:59 -0400139 <ListItem>
140 <ListItemIcon>
141 <PhoneCallbackRounded />
142 </ListItemIcon>
143 <ListItemText id="switch-list-label-publicin" primary="Allow connection from unkown peers" />
144 <ListItemSecondaryAction>
145 <Switch
146 edge="end"
Adrien Béraud86986032021-04-25 12:04:53 -0400147 onChange={e => handleToggle('DHT.PublicInCalls', e.target.checked)}
148 checked={details['DHT.PublicInCalls'] === 'true'}
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400149 inputProps={{ 'aria-labelledby': 'switch-list-label-publicin' }}
Adrien Béraud150b4782021-04-21 19:40:59 -0400150 />
151 </ListItemSecondaryAction>
152 </ListItem>
Adrien Béraud6c934962021-06-07 10:13:26 -0400153 </motion.div>
154 <motion.div variants={thumbnailVariants}>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400155 <Paper className={classes.paper}>
156 <Toolbar>
157 <Typography className={classes.title} variant="h6">
158 Default moderators
159 </Typography>
160 </Toolbar>
161 <List>
162 <ListItem key="add">
Adrien Béraud4e287b92021-04-24 16:15:56 -0400163 <TextField variant="outlined"
164 className={classes.textField}
165 value={defaultModeratorUri}
166 onChange={e => setDefaultModeratorUri(e.target.value)}
167 label="Add new default moderator"
168 placeholder="Enter new moderator name or URI"
169 fullWidth />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400170 <ListItemSecondaryAction>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400171 <IconButton onClick={addModerator}><AddCircle /></IconButton>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400172 </ListItemSecondaryAction>
173 </ListItem>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400174 {!moderators || moderators.length === 0 ?
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400175 <ListItem key="placeholder">
176 <ListItemText primary="No default moderator" /></ListItem> :
177 moderators.map((moderator) => (
Adrien Béraud4e287b92021-04-24 16:15:56 -0400178 <ListItem key={moderator.uri}>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400179 <ListItemAvatar>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400180 <ConversationAvatar name={moderator.getDisplayName()} />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400181 </ListItemAvatar>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400182 <ListItemText primary={moderator.getDisplayName()} />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400183 <ListItemSecondaryAction>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400184 <IconButton onClick={e => removeModerator(moderator.uri)}><DeleteRounded /></IconButton>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400185 </ListItemSecondaryAction>
186 </ListItem>
187 ))}
188 </List>
189 </Paper>
Adrien Béraud6c934962021-06-07 10:13:26 -0400190 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -0400191 </List>
192
Adrien Béraud6c934962021-06-07 10:13:26 -0400193 </motion.div>)
Adrien Béraud150b4782021-04-21 19:40:59 -0400194}