blob: 9f6fcc8e24eae5e56cfd42a022bf11c3897c1b62 [file] [log] [blame]
Adrien Béraudab519ff2022-05-03 15:34:48 -04001import { AddRounded } from '@mui/icons-material';
simon07b4eb02022-09-29 17:50:26 -04002import { Avatar, Card, CardHeader, Container, List } from '@mui/material';
Adrien Béraud6c934962021-06-07 10:13:26 -04003import { motion } from 'framer-motion';
simon07b4eb02022-09-29 17:50:26 -04004import { Fragment, useEffect, useState } from 'react';
5import { useNavigate } from 'react-router';
6
7import Account from '../../../model/Account';
8import authManager from '../AuthManager';
9import ConversationAvatar from '../components/ConversationAvatar';
10import Header from '../components/Header';
11import ListItemLink from '../components/ListItemLink';
12import LoadingPage from '../components/loading';
Adrien Béraud6c934962021-06-07 10:13:26 -040013
14const variants = {
15 enter: { opacity: 1, y: 0 },
simond47ef9e2022-09-28 22:24:28 -040016 exit: { opacity: 0, y: '-50px' },
17};
Adrien Béraud6ecaa402021-04-06 17:37:25 -040018
simonfe1de722022-10-02 00:21:43 -040019const AccountSelection = () => {
simond47ef9e2022-09-28 22:24:28 -040020 const navigate = useNavigate();
21 const [loaded, setLoaded] = useState(false);
22 const [error, setError] = useState(false);
simonfe1de722022-10-02 00:21:43 -040023 const [accounts, setAccounts] = useState<Account[]>([]);
Adrien Béraud6ecaa402021-04-06 17:37:25 -040024
Adrien Béraud150b4782021-04-21 19:40:59 -040025 useEffect(() => {
simond47ef9e2022-09-28 22:24:28 -040026 const controller = new AbortController();
27 authManager
28 .fetch(`/api/accounts`, { signal: controller.signal })
29 .then((res) => res.json())
30 .then(
simonfe1de722022-10-02 00:21:43 -040031 (result: Account[]) => {
simond47ef9e2022-09-28 22:24:28 -040032 console.log(result);
33 if (result.length === 0) {
34 navigate('/newAccount');
35 } else {
36 setLoaded(true);
37 setAccounts(result.map((account) => Account.from(account)));
38 }
39 },
40 (error) => {
41 console.log(`get error ${error}`);
42 setLoaded(true);
43 setError(true);
Adrien Béraude5cad982021-06-07 10:05:50 -040044 }
simond47ef9e2022-09-28 22:24:28 -040045 )
46 .catch((e) => console.log(e));
47 // return () => controller.abort() // crash on React18
simon80b7b3b2022-09-28 17:50:10 -040048 }, [navigate]);
Adrien Béraud6ecaa402021-04-06 17:37:25 -040049
simond47ef9e2022-09-28 22:24:28 -040050 if (!loaded) return <LoadingPage />;
Adrien Béraud150b4782021-04-21 19:40:59 -040051 return (
Adrien Béraud023f7cf2022-09-18 14:57:53 -040052 <Fragment>
Adrien Béraud150b4782021-04-21 19:40:59 -040053 <Header />
simond47ef9e2022-09-28 22:24:28 -040054 <Container maxWidth="sm" style={{ paddingBottom: 32 }}>
Adrien Béraud6c934962021-06-07 10:13:26 -040055 <motion.div drag="x" initial="exit" animate="enter" exit="exit" variants={variants}>
simond47ef9e2022-09-28 22:24:28 -040056 <Card style={{ marginTop: 32, marginBottom: 32 }}>
57 <CardHeader title="Choose an account" />
58 <List>
59 {accounts.map((account) => (
60 <ListItemLink
61 key={account.getId()}
62 icon={<ConversationAvatar displayName={account.getDisplayNameNoFallback()} />}
63 to={`/account/${account.getId()}/settings`}
64 primary={account.getDisplayName()}
65 secondary={account.getDisplayUri()}
66 />
67 ))}
68 <ListItemLink
69 icon={
70 <Avatar>
71 <AddRounded />
72 </Avatar>
73 }
74 to="/newAccount"
75 primary="Create new account"
76 />
77 </List>
78 </Card>
Adrien Béraud6c934962021-06-07 10:13:26 -040079 </motion.div>
Adrien Béraud150b4782021-04-21 19:40:59 -040080 </Container>
Adrien Béraud023f7cf2022-09-18 14:57:53 -040081 </Fragment>
82 );
simond47ef9e2022-09-28 22:24:28 -040083};
Adrien Béraud6ecaa402021-04-06 17:37:25 -040084
simond47ef9e2022-09-28 22:24:28 -040085export default AccountSelection;