blob: 6c52af4a64e9ff1874fc9b3dc089c6a3696229df [file] [log] [blame]
Adrien Béraud150b4782021-04-21 19:40:59 -04001import React, { useEffect, useState } from 'react';
Adrien Béraud88a52442021-04-26 12:11:41 -04002import { Avatar, Card, CardHeader, Container, List } from '@material-ui/core';
Adrien Béraud150b4782021-04-21 19:40:59 -04003import Header from '../components/Header'
Adrien Béraud150b4782021-04-21 19:40:59 -04004import authManager from '../AuthManager'
Adrien Béraud6ecaa402021-04-06 17:37:25 -04005import Account from '../../../model/Account';
Adrien Béraud150b4782021-04-21 19:40:59 -04006import LoadingPage from '../components/loading';
Adrien Béraud88a52442021-04-26 12:11:41 -04007import ListItemLink from '../components/ListItemLink';
8import ConversationAvatar from '../components/ConversationAvatar';
9import { AddRounded } from '@material-ui/icons';
Adrien Béraude5cad982021-06-07 10:05:50 -040010import { useHistory } from 'react-router';
Adrien Béraud6c934962021-06-07 10:13:26 -040011import { motion } from 'framer-motion';
12
13const variants = {
14 enter: { opacity: 1, y: 0 },
15 exit: { opacity: 0, y: "-50px" },
16}
Adrien Béraud6ecaa402021-04-06 17:37:25 -040017
Adrien Béraud150b4782021-04-21 19:40:59 -040018const AccountSelection = (props) => {
Adrien Béraude5cad982021-06-07 10:05:50 -040019 const history = useHistory()
Adrien Béraud150b4782021-04-21 19:40:59 -040020 const [state, setState] = useState({
21 loaded: false,
22 error: false,
23 accounts: []
24 })
Adrien Béraud6ecaa402021-04-06 17:37:25 -040025
Adrien Béraud150b4782021-04-21 19:40:59 -040026 useEffect(() => {
27 const controller = new AbortController()
28 authManager.fetch(`/api/accounts`, {signal: controller.signal})
29 .then(res => res.json())
30 .then(result => {
31 console.log(result)
Adrien Béraude5cad982021-06-07 10:05:50 -040032 if (result.length === 0) {
33 history.replace('/newAccount')
34 } else {
35 setState({
36 loaded: true,
37 accounts: result.map(account => Account.from(account)),
38 })
39 }
Adrien Béraud150b4782021-04-21 19:40:59 -040040 }, error => {
41 console.log(`get error ${error}`)
42 setState({
43 loaded: true,
44 error: true
45 })
Adrien Béraud88a52442021-04-26 12:11:41 -040046 }).catch(e => console.log(e))
Adrien Béraud150b4782021-04-21 19:40:59 -040047 return () => controller.abort()
48 }, [])
Adrien Béraud6ecaa402021-04-06 17:37:25 -040049
Adrien Béraud150b4782021-04-21 19:40:59 -040050 if (!state.loaded)
51 return <LoadingPage />
52 return (
53 <React.Fragment>
54 <Header />
55 <Container maxWidth="sm" style={{paddingBottom:32}}>
Adrien Béraud6c934962021-06-07 10:13:26 -040056 <motion.div drag="x" initial="exit" animate="enter" exit="exit" variants={variants}>
Adrien Béraud150b4782021-04-21 19:40:59 -040057 <Card style={{marginTop:32, marginBottom:32}}>
58 <CardHeader title="Choose an account" />
Adrien Béraud88a52442021-04-26 12:11:41 -040059 <List>
60 {state.accounts.map(account => <ListItemLink key={account.getId()}
61 icon={<ConversationAvatar displayName={account.getDisplayNameNoFallback()} />}
62 to={`/account/${account.getId()}/settings`}
63 primary={account.getDisplayName()}
64 secondary={account.getDisplayUri()} />)}
65 <ListItemLink
66 icon={<Avatar><AddRounded /></Avatar>}
67 to='/newAccount'
68 primary="Create new account" />
69 </List>
Adrien Béraud150b4782021-04-21 19:40:59 -040070 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -040071 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -040072 </Container>
73 </React.Fragment>
74 )
Adrien Béraud6ecaa402021-04-06 17:37:25 -040075}
76
Adrien Béraud88a52442021-04-26 12:11:41 -040077export default AccountSelection