import BaseLayout from '@layouts/base'; import WithSidebarLayout from '@layouts/withSidebar'; import FormBase from '@components/form/base'; import { NoteBase } from '@components/note/base'; import { Placeholder } from '@components/note/placeholder'; import { hasNewerNoteAtom } from '@stores/note'; import { dateToUnix } from '@utils/getDate'; import { filterDuplicateParentID } from '@utils/transform'; import { ArrowUp } from 'iconoir-react'; import { useAtom } from 'jotai'; import { JSXElementConstructor, ReactElement, ReactFragment, ReactPortal, useCallback, useEffect, useRef, useState, } from 'react'; import { Virtuoso } from 'react-virtuoso'; export default function Page() { const [data, setData] = useState([]); const [hasNewerNote, setHasNewerNote] = useAtom(hasNewerNoteAtom); const virtuosoRef = useRef(null); const now = useRef(new Date()); const limit = useRef(20); const offset = useRef(0); const itemContent: any = useCallback( (index: string | number) => { return ; }, [data] ); const computeItemKey = useCallback( (index: string | number) => { return data[index].eventId; }, [data] ); const initialData = useCallback(async () => { const { getNotes } = await import('@utils/bindings'); const result: any = await getNotes({ date: dateToUnix(now.current), limit: limit.current, offset: offset.current, }); setData((data) => [...data, ...result]); }, []); const loadMore = useCallback(async () => { const { getNotes } = await import('@utils/bindings'); offset.current += limit.current; // next query const result: any = await getNotes({ date: dateToUnix(now.current), limit: limit.current, offset: offset.current, }); setData((data) => [...data, ...result]); }, []); const loadLatest = useCallback(async () => { const { getLatestNotes } = await import('@utils/bindings'); // next query const result: any = await getLatestNotes({ date: dateToUnix(now.current) }); // update data if (result.length > 0) { setData((data) => [...data, ...result]); } else { setData((data) => [...data, result]); } // hide newer trigger setHasNewerNote(false); // scroll to top virtuosoRef.current.scrollToIndex({ index: 0 }); }, [setHasNewerNote]); useEffect(() => { initialData().catch(console.error); }, [initialData]); return (
{hasNewerNote && (
)}
); } const COMPONENTS = { Header: () => , EmptyPlaceholder: () => , ScrollSeekPlaceholder: () => , }; Page.getLayout = function getLayout( page: | string | number | boolean | ReactElement> | ReactFragment | ReactPortal ) { return ( {page} ); };