this repo has no description
at hotfix/infinite-loop-intersection-observer 123 lines 3.6 kB view raw
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;