blob: 7c7298d5f67ad07c2b515537f27b7aa5b4805c35 [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'
12
Adrien Béraud21c53cf2021-04-22 00:04:32 -040013const useStyles = makeStyles(theme => ({
Adrien Béraud150b4782021-04-21 19:40:59 -040014 root: {
15 minWidth: 275,
16 },
Adrien Béraud150b4782021-04-21 19:40:59 -040017 title: {
18 fontSize: 14,
Adrien Béraud21c53cf2021-04-22 00:04:32 -040019 flexGrow: 1
Adrien Béraud150b4782021-04-21 19:40:59 -040020 },
21 pos: {
22 marginBottom: 12,
23 },
Adrien Béraud21c53cf2021-04-22 00:04:32 -040024 paper: {
25 marginTop: 24,
26 marginBottom: 24
Adrien Béraud150b4782021-04-21 19:40:59 -040027 },
Adrien Béraud21c53cf2021-04-22 00:04:32 -040028 textField: {
29 //marginLeft: theme.spacing(1),
30 marginRight: theme.spacing(2),
31 }
32}))
Adrien Béraud150b4782021-04-21 19:40:59 -040033
34export default function AccountPreferences(props) {
35 const classes = useStyles()
36 const account = props.account
37 const isJamiAccount = account.getType() === Account.TYPE_JAMI
38 const alias = isJamiAccount ? "Jami account" : "SIP account"
Adrien Béraud21c53cf2021-04-22 00:04:32 -040039 const moderators = account.getDefaultModerators()
Adrien Béraud4e287b92021-04-24 16:15:56 -040040 const [defaultModeratorUri, setDefaultModeratorUri] = useState('')
41
Adrien Béraud86986032021-04-25 12:04:53 -040042 const [details, setDetails] = useState(account.getDetails())
43
Adrien Béraud4e287b92021-04-24 16:15:56 -040044 const addModerator = () => {
45 if (defaultModeratorUri) {
46 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${defaultModeratorUri}`, {method: "PUT"})
47 setDefaultModeratorUri('')
48 }
49 }
50
51 const removeModerator = (uri) =>
52 authManager.fetch(`/api/accounts/${account.getId()}/defaultModerators/${uri}`, {method: "DELETE"})
53
Adrien Béraud86986032021-04-25 12:04:53 -040054 const handleToggle = (key, value) => {
55 console.log(`handleToggle ${key} ${value}`)
56 const newDetails = {}
57 newDetails[key] = value ? "true" : "false"
58 console.log(newDetails)
59 authManager.fetch(`/api/accounts/${account.getId()}`, {
60 method: "POST",
61 headers: {
62 'Accept': 'application/json',
63 'Content-Type': 'application/json'
64 },
65 body: JSON.stringify(newDetails)
66 })
67 setDetails({...account.updateDetails(newDetails)})
68 }
69
Adrien Béraud150b4782021-04-21 19:40:59 -040070 return (
71 <React.Fragment>
72 <Typography variant="h2" component="h2" gutterBottom>{alias}</Typography>
Adrien Béraud21c53cf2021-04-22 00:04:32 -040073 <Grid container spacing={3} style={{ marginBottom: 16 }}>
Adrien Béraud150b4782021-04-21 19:40:59 -040074 {isJamiAccount &&
75 <Grid item xs={12}><JamiIdCard account={account} /></Grid>}
76
77 <Grid item xs={12} sm={6}>
78 <ConversationsOverviewCard accountId={account.getId()} />
79 </Grid>
80
81 <Grid item xs={12} sm={6}>
82 <Card>
83 <CardContent>
84 <Typography className={classes.title} color="textSecondary" gutterBottom>
85 Current calls
86 </Typography>
87 <Typography gutterBottom variant="h5" component="h2">
88 0
89 </Typography>
90 </CardContent>
91 </Card>
92 </Grid>
93 </Grid>
94
95 <List subheader={<ListSubheader>Settings</ListSubheader>}>
96 <ListItem>
97 <ListItemIcon>
98 <GroupRounded />
99 </ListItemIcon>
100 <ListItemText id="switch-list-label-rendezvous" primary="Rendez-Vous point" />
101 <ListItemSecondaryAction>
102 <Switch
103 edge="end"
Adrien Béraud86986032021-04-25 12:04:53 -0400104 onChange={e => handleToggle('Account.rendezVous', e.target.checked)}
105 checked={details['Account.rendezVous'] === 'true'}
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400106 inputProps={{ 'aria-labelledby': 'switch-list-label-rendezvous' }}
Adrien Béraud150b4782021-04-21 19:40:59 -0400107 />
108 </ListItemSecondaryAction>
109 </ListItem>
110 <ListItem>
111 <ListItemIcon>
112 <PhoneCallbackRounded />
113 </ListItemIcon>
114 <ListItemText id="switch-list-label-publicin" primary="Allow connection from unkown peers" />
115 <ListItemSecondaryAction>
116 <Switch
117 edge="end"
Adrien Béraud86986032021-04-25 12:04:53 -0400118 onChange={e => handleToggle('DHT.PublicInCalls', e.target.checked)}
119 checked={details['DHT.PublicInCalls'] === 'true'}
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400120 inputProps={{ 'aria-labelledby': 'switch-list-label-publicin' }}
Adrien Béraud150b4782021-04-21 19:40:59 -0400121 />
122 </ListItemSecondaryAction>
123 </ListItem>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400124
125 <Paper className={classes.paper}>
126 <Toolbar>
127 <Typography className={classes.title} variant="h6">
128 Default moderators
129 </Typography>
130 </Toolbar>
131 <List>
132 <ListItem key="add">
Adrien Béraud4e287b92021-04-24 16:15:56 -0400133 <TextField variant="outlined"
134 className={classes.textField}
135 value={defaultModeratorUri}
136 onChange={e => setDefaultModeratorUri(e.target.value)}
137 label="Add new default moderator"
138 placeholder="Enter new moderator name or URI"
139 fullWidth />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400140 <ListItemSecondaryAction>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400141 <IconButton onClick={addModerator}><AddCircle /></IconButton>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400142 </ListItemSecondaryAction>
143 </ListItem>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400144 {!moderators || moderators.length === 0 ?
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400145 <ListItem key="placeholder">
146 <ListItemText primary="No default moderator" /></ListItem> :
147 moderators.map((moderator) => (
Adrien Béraud4e287b92021-04-24 16:15:56 -0400148 <ListItem key={moderator.uri}>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400149 <ListItemAvatar>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400150 <ConversationAvatar name={moderator.getDisplayName()} />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400151 </ListItemAvatar>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400152 <ListItemText primary={moderator.getDisplayName()} />
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400153 <ListItemSecondaryAction>
Adrien Béraud4e287b92021-04-24 16:15:56 -0400154 <IconButton onClick={e => removeModerator(moderator.uri)}><DeleteRounded /></IconButton>
Adrien Béraud21c53cf2021-04-22 00:04:32 -0400155 </ListItemSecondaryAction>
156 </ListItem>
157 ))}
158 </List>
159 </Paper>
Adrien Béraud150b4782021-04-21 19:40:59 -0400160 </List>
161
Adrien Béraud150b4782021-04-21 19:40:59 -0400162 </React.Fragment>)
163}