this repo has no description
1import './lists.css';
2
3import { useEffect, useReducer, useRef, useState } from 'preact/hooks';
4
5import Icon from '../components/icon';
6import Link from '../components/link';
7import ListAddEdit from '../components/list-add-edit';
8import Loader from '../components/loader';
9import Modal from '../components/modal';
10import NavMenu from '../components/nav-menu';
11import { api } from '../utils/api';
12import useTitle from '../utils/useTitle';
13
14function Lists() {
15 const { masto } = api();
16 useTitle(`Lists`, `/l`);
17 const [uiState, setUIState] = useState('default');
18
19 const [reloadCount, reload] = useReducer((c) => c + 1, 0);
20 const [lists, setLists] = useState([]);
21 useEffect(() => {
22 setUIState('loading');
23 (async () => {
24 try {
25 const lists = await masto.v1.lists.list();
26 lists.sort((a, b) => a.title.localeCompare(b.title));
27 console.log(lists);
28 setLists(lists);
29 setUIState('default');
30 } catch (e) {
31 console.error(e);
32 setUIState('error');
33 }
34 })();
35 }, [reloadCount]);
36
37 const [showListAddEditModal, setShowListAddEditModal] = useState(false);
38
39 return (
40 <div id="lists-page" class="deck-container" tabIndex="-1">
41 <div class="timeline-deck deck">
42 <header>
43 <div class="header-grid">
44 <div class="header-side">
45 <NavMenu />
46 <Link to="/" class="button plain">
47 <Icon icon="home" size="l" />
48 </Link>
49 </div>
50 <h1>Lists</h1>
51 <div class="header-side">
52 <button
53 type="button"
54 class="plain"
55 onClick={() => setShowListAddEditModal(true)}
56 >
57 <Icon icon="plus" size="l" alt="New list" />
58 </button>
59 </div>
60 </div>
61 </header>
62 <main>
63 {lists.length > 0 ? (
64 <ul class="link-list">
65 {lists.map((list) => (
66 <li>
67 <Link to={`/l/${list.id}`}>
68 <span>
69 <Icon icon="list" /> <span>{list.title}</span>
70 </span>
71 {/* <button
72 type="button"
73 class="plain"
74 onClick={(e) => {
75 e.preventDefault();
76 e.stopPropagation();
77 setShowListAddEditModal({
78 list,
79 });
80 }}
81 >
82 <Icon icon="pencil" />
83 </button> */}
84 </Link>
85 </li>
86 ))}
87 </ul>
88 ) : uiState === 'loading' ? (
89 <p class="ui-state">
90 <Loader />
91 </p>
92 ) : uiState === 'error' ? (
93 <p class="ui-state">Unable to load lists.</p>
94 ) : (
95 <p class="ui-state">No lists yet.</p>
96 )}
97 </main>
98 </div>
99 {showListAddEditModal && (
100 <Modal
101 class="light"
102 onClick={(e) => {
103 if (e.target === e.currentTarget) {
104 setShowListAddEditModal(false);
105 }
106 }}
107 >
108 <ListAddEdit
109 list={showListAddEditModal?.list}
110 onClose={(result) => {
111 if (result.state === 'success') {
112 reload();
113 }
114 setShowListAddEditModal(false);
115 }}
116 />
117 </Modal>
118 )}
119 </div>
120 );
121}
122
123export default Lists;