import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { useTranslate } from "@/utils/i18n"; import { useLocation } from "react-router-dom"; import { useFilterStore, useMemoStore } from "@/store/module"; import { TAG_REG } from "@/labs/marked/parser"; import { DEFAULT_MEMO_LIMIT } from "@/helpers/consts"; import useLoading from "@/hooks/useLoading"; import MemoFilter from "@/components/MemoFilter"; import Memo from "@/components/Memo"; import MobileHeader from "@/components/MobileHeader"; import Empty from "@/components/Empty"; interface State { memos: Memo[]; } const Explore = () => { const t = useTranslate(); const location = useLocation(); const filterStore = useFilterStore(); const memoStore = useMemoStore(); const filter = filterStore.state; const [state, setState] = useState({ memos: [], }); const [isComplete, setIsComplete] = useState(false); const loadingState = useLoading(); useEffect(() => { memoStore.fetchAllMemos(DEFAULT_MEMO_LIMIT, 0).then((memos) => { if (memos.length < DEFAULT_MEMO_LIMIT) { setIsComplete(true); } setState({ memos, }); loadingState.setFinish(); }); }, [location]); const { tag: tagQuery, text: textQuery } = filter; const showMemoFilter = Boolean(tagQuery || textQuery); const shownMemos = showMemoFilter ? state.memos.filter((memo) => { let shouldShow = true; if (tagQuery) { const tagsSet = new Set(); for (const t of Array.from(memo.content.match(new RegExp(TAG_REG, "g")) ?? [])) { const tag = t.replace(TAG_REG, "$1").trim(); const items = tag.split("/"); let temp = ""; for (const i of items) { temp += i; tagsSet.add(temp); temp += "/"; } } if (!tagsSet.has(tagQuery)) { shouldShow = false; } } return shouldShow; }) : state.memos; const sortedMemos = shownMemos.filter((m) => m.rowStatus === "NORMAL"); const handleFetchMoreClick = async () => { try { const fetchedMemos = await memoStore.fetchAllMemos(DEFAULT_MEMO_LIMIT, state.memos.length); if (fetchedMemos.length < DEFAULT_MEMO_LIMIT) { setIsComplete(true); } else { setIsComplete(false); } setState({ memos: state.memos.concat(fetchedMemos), }); } catch (error: any) { console.error(error); toast.error(error.response.data.message); } }; return (
{!loadingState.isLoading && (
{sortedMemos.map((memo) => { return ; })} {isComplete ? ( state.memos.length === 0 && (

{t("message.no-data")}

) ) : (

{t("memo.fetch-more")}

)}
)}
); }; export default Explore;