blob: 77c033ae1c808bf368bbf4a4d4dfae21cfa2dcf4 [file] [log] [blame]
simond47ef9e2022-09-28 22:24:28 -04001import { Fragment, useEffect, useState } from 'react';
Adrien Béraudab519ff2022-05-03 15:34:48 -04002import { Avatar, Card, CardHeader, Container, List } from '@mui/material';
simond47ef9e2022-09-28 22:24:28 -04003import Header from '../components/Header';
4import 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';
Adrien Béraudab519ff2022-05-03 15:34:48 -04009import { AddRounded } from '@mui/icons-material';
10import { useNavigate } 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 },
simond47ef9e2022-09-28 22:24:28 -040015 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) => {
simond47ef9e2022-09-28 22:24:28 -040019 const navigate = useNavigate();
20 const [loaded, setLoaded] = useState(false);
21 const [error, setError] = useState(false);
22 const [accounts, setAccounts] = useState([]);
Adrien Béraud6ecaa402021-04-06 17:37:25 -040023
Adrien Béraud150b4782021-04-21 19:40:59 -040024 useEffect(() => {
simond47ef9e2022-09-28 22:24:28 -040025 const controller = new AbortController();
26 authManager
27 .fetch(`/api/accounts`, { signal: controller.signal })
28 .then((res) => res.json())
29 .then(
30 (result) => {
31 console.log(result);
32 if (result.length === 0) {
33 navigate('/newAccount');
34 } else {
35 setLoaded(true);
36 setAccounts(result.map((account) => Account.from(account)));
37 }
38 },
39 (error) => {
40 console.log(`get error ${error}`);
41 setLoaded(true);
42 setError(true);
Adrien Béraude5cad982021-06-07 10:05:50 -040043 }
simond47ef9e2022-09-28 22:24:28 -040044 )
45 .catch((e) => console.log(e));
46 // return () => controller.abort() // crash on React18
47 }, []);
Adrien Béraud6ecaa402021-04-06 17:37:25 -040048
simond47ef9e2022-09-28 22:24:28 -040049 if (!loaded) return <LoadingPage />;
Adrien Béraud150b4782021-04-21 19:40:59 -040050 return (
Adrien Béraud023f7cf2022-09-18 14:57:53 -040051 <Fragment>
Adrien Béraud150b4782021-04-21 19:40:59 -040052 <Header />
simond47ef9e2022-09-28 22:24:28 -040053 <Container maxWidth="sm" style={{ paddingBottom: 32 }}>
Adrien Béraud6c934962021-06-07 10:13:26 -040054 <motion.div drag="x" initial="exit" animate="enter" exit="exit" variants={variants}>
simond47ef9e2022-09-28 22:24:28 -040055 <Card style={{ marginTop: 32, marginBottom: 32 }}>
56 <CardHeader title="Choose an account" />
57 <List>
58 {accounts.map((account) => (
59 <ListItemLink
60 key={account.getId()}
61 icon={<ConversationAvatar displayName={account.getDisplayNameNoFallback()} />}
62 to={`/account/${account.getId()}/settings`}
63 primary={account.getDisplayName()}
64 secondary={account.getDisplayUri()}
65 />
66 ))}
67 <ListItemLink
68 icon={
69 <Avatar>
70 <AddRounded />
71 </Avatar>
72 }
73 to="/newAccount"
74 primary="Create new account"
75 />
76 </List>
77 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -040078 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -040079 </Container>
Adrien Béraud023f7cf2022-09-18 14:57:53 -040080 </Fragment>
81 );
simond47ef9e2022-09-28 22:24:28 -040082};
Adrien Béraud6ecaa402021-04-06 17:37:25 -040083
simond47ef9e2022-09-28 22:24:28 -040084export default AccountSelection;