phanpy/src/pages/lists.jsx

131 lines
3.8 KiB
React
Raw Normal View History

2023-04-05 17:30:26 +02:00
import './lists.css';
import { useEffect, useReducer, useRef, useState } from 'preact/hooks';
2023-02-10 17:05:18 +01:00
import Icon from '../components/icon';
import Link from '../components/link';
2023-04-05 17:30:26 +02:00
import ListAddEdit from '../components/list-add-edit';
2023-02-10 17:05:18 +01:00
import Loader from '../components/loader';
2023-04-05 17:30:26 +02:00
import Modal from '../components/modal';
2023-04-26 07:09:44 +02:00
import NavMenu from '../components/nav-menu';
import { fetchLists } from '../utils/lists';
2023-02-11 10:57:26 +01:00
import useTitle from '../utils/useTitle';
function Lists() {
2023-02-11 10:57:26 +01:00
useTitle(`Lists`, `/l`);
2023-08-14 05:22:42 +02:00
const [uiState, setUIState] = useState('default');
2023-04-05 17:30:26 +02:00
const [reloadCount, reload] = useReducer((c) => c + 1, 0);
2023-02-10 17:05:18 +01:00
const [lists, setLists] = useState([]);
useEffect(() => {
2023-08-14 05:22:42 +02:00
setUIState('loading');
(async () => {
try {
const lists = await fetchLists();
2023-02-10 17:05:18 +01:00
console.log(lists);
setLists(lists);
2023-08-14 05:22:42 +02:00
setUIState('default');
} catch (e) {
console.error(e);
2023-08-14 05:22:42 +02:00
setUIState('error');
}
})();
2023-04-05 17:30:26 +02:00
}, [reloadCount]);
const [showListAddEditModal, setShowListAddEditModal] = useState(false);
return (
2023-03-01 08:47:19 +01:00
<div id="lists-page" class="deck-container" tabIndex="-1">
2023-02-10 17:05:18 +01:00
<div class="timeline-deck deck">
<header>
<div class="header-grid">
<div class="header-side">
2023-04-26 07:09:44 +02:00
<NavMenu />
2023-02-10 17:05:18 +01:00
<Link to="/" class="button plain">
<Icon icon="home" size="l" />
</Link>
</div>
<h1>Lists</h1>
2023-04-05 17:30:26 +02:00
<div class="header-side">
<button
type="button"
class="plain"
onClick={() => setShowListAddEditModal(true)}
>
<Icon icon="plus" size="l" alt="New list" />
</button>
</div>
2023-02-10 17:05:18 +01:00
</div>
</header>
<main>
{lists.length > 0 ? (
2024-01-31 02:03:33 +01:00
<>
<ul class="link-list">
{lists.map((list) => (
<li>
<Link to={`/l/${list.id}`}>
<span>
<Icon icon="list" /> <span>{list.title}</span>
</span>
{/* <button
2023-04-05 17:30:26 +02:00
type="button"
class="plain"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
setShowListAddEditModal({
list,
});
}}
>
<Icon icon="pencil" />
</button> */}
2024-01-31 02:03:33 +01:00
</Link>
</li>
))}
</ul>
{lists.length > 1 && (
<footer class="ui-state">
<small class="insignificant">
{lists.length} list
{lists.length === 1 ? '' : 's'}
</small>
</footer>
)}
</>
2023-02-10 17:05:18 +01:00
) : uiState === 'loading' ? (
<p class="ui-state">
<Loader />
</p>
) : uiState === 'error' ? (
<p class="ui-state">Unable to load lists.</p>
) : (
<p class="ui-state">No lists yet.</p>
)}
</main>
</div>
2023-04-05 17:30:26 +02:00
{showListAddEditModal && (
<Modal
onClick={(e) => {
if (e.target === e.currentTarget) {
setShowListAddEditModal(false);
}
}}
>
<ListAddEdit
list={showListAddEditModal?.list}
onClose={(result) => {
if (result.state === 'success') {
reload();
}
setShowListAddEditModal(false);
}}
/>
</Modal>
)}
2023-02-10 17:05:18 +01:00
</div>
);
}
export default Lists;