import { useEffect, useRef, useState } from 'preact/hooks'; import Icon from '../components/Icon'; import Link from '../components/link'; import Loader from '../components/Loader'; import Status from '../components/status'; import useTitle from '../utils/useTitle'; const LIMIT = 40; function Bookmarks() { useTitle('Bookmarks'); const [bookmarks, setBookmarks] = useState([]); const [uiState, setUIState] = useState('default'); const [showMore, setShowMore] = useState(false); const bookmarksIterator = useRef(); async function fetchBookmarks(firstLoad) { if (firstLoad || !bookmarksIterator.current) { bookmarksIterator.current = masto.v1.bookmarks.list({ limit: LIMIT }); } const allBookmarks = await bookmarksIterator.current.next(); const bookmarksValue = allBookmarks.value; if (bookmarksValue?.length) { if (firstLoad) { setBookmarks(bookmarksValue); } else { setBookmarks([...bookmarks, ...bookmarksValue]); } } return allBookmarks; } const loadBookmarks = (firstLoad) => { setUIState('loading'); (async () => { try { const { done } = await fetchBookmarks(firstLoad); setShowMore(!done); setUIState('default'); } catch (e) { console.error(e); setUIState('error'); } })(); }; useEffect(() => { loadBookmarks(true); }, []); const scrollableRef = useRef(null); return (
{ if (e.target === e.currentTarget) { scrollableRef.current?.scrollTo({ top: 0, behavior: 'smooth', }); } }} onDblClick={(e) => { loadBookmarks(true); }} >

Bookmarks

{!!bookmarks.length ? ( <> {showMore && ( )} ) : ( uiState !== 'loading' && (

No bookmarks yet. Go bookmark something!

) )} {uiState === 'loading' ? ( ) : uiState === 'error' ? (

Unable to load bookmarks.

) : ( bookmarks.length && !showMore &&

The end.

)}
); } export default Bookmarks;