chore: fix fetch memos

pull/2658/head^2
Steven 1 year ago
parent 919f75af1a
commit 29b540ade3

@ -8,6 +8,7 @@ import MemoContent from "@/components/MemoContent";
import MobileHeader from "@/components/MobileHeader"; import MobileHeader from "@/components/MobileHeader";
import { memoServiceClient } from "@/grpcweb"; import { memoServiceClient } from "@/grpcweb";
import { getDateTimeString } from "@/helpers/datetime"; import { getDateTimeString } from "@/helpers/datetime";
import useCurrentUser from "@/hooks/useCurrentUser";
import useLoading from "@/hooks/useLoading"; import useLoading from "@/hooks/useLoading";
import { useMemoV1Store } from "@/store/v1"; import { useMemoV1Store } from "@/store/v1";
import { RowStatus } from "@/types/proto/api/v2/common"; import { RowStatus } from "@/types/proto/api/v2/common";
@ -17,13 +18,14 @@ import { useTranslate } from "@/utils/i18n";
const Archived = () => { const Archived = () => {
const t = useTranslate(); const t = useTranslate();
const loadingState = useLoading(); const loadingState = useLoading();
const user = useCurrentUser();
const memoStore = useMemoV1Store(); const memoStore = useMemoV1Store();
const [archivedMemos, setArchivedMemos] = useState<Memo[]>([]); const [archivedMemos, setArchivedMemos] = useState<Memo[]>([]);
useEffect(() => { useEffect(() => {
memoServiceClient memoServiceClient
.listMemos({ .listMemos({
filter: "row_status == 'ARCHIVED'", filter: [`creator == "${user.name}"`, "row_status == 'ARCHIVED'"].join(" && "),
}) })
.then(({ memos }) => { .then(({ memos }) => {
setArchivedMemos(memos); setArchivedMemos(memos);

@ -16,8 +16,8 @@ const Explore = () => {
const filterStore = useFilterStore(); const filterStore = useFilterStore();
const memoStore = useMemoV1Store(); const memoStore = useMemoV1Store();
const memoList = useMemoList(); const memoList = useMemoList();
const [isRequesting, setIsRequesting] = useState(true);
const [isComplete, setIsComplete] = useState(false); const [isComplete, setIsComplete] = useState(false);
const [isRequesting, setIsRequesting] = useState(false);
const { tag: tagQuery, text: textQuery } = filterStore.state; const { tag: tagQuery, text: textQuery } = filterStore.state;
const sortedMemos = memoList.value.sort((a, b) => getTimeStampByDate(b.displayTime) - getTimeStampByDate(a.displayTime)); const sortedMemos = memoList.value.sort((a, b) => getTimeStampByDate(b.displayTime) - getTimeStampByDate(a.displayTime));

@ -20,9 +20,9 @@ const Home = () => {
const user = useCurrentUser(); const user = useCurrentUser();
const filterStore = useFilterStore(); const filterStore = useFilterStore();
const memoStore = useMemoV1Store(); const memoStore = useMemoV1Store();
const [isComplete, setIsComplete] = useState(false);
const [isRequesting, setIsRequesting] = useState(false);
const memoList = useMemoList(); const memoList = useMemoList();
const [isRequesting, setIsRequesting] = useState(true);
const [isComplete, setIsComplete] = useState(false);
const { tag: tagQuery, text: textQuery } = filterStore.state; const { tag: tagQuery, text: textQuery } = filterStore.state;
const sortedMemos = memoList.value const sortedMemos = memoList.value
.sort((a, b) => getTimeStampByDate(b.displayTime) - getTimeStampByDate(a.displayTime)) .sort((a, b) => getTimeStampByDate(b.displayTime) - getTimeStampByDate(a.displayTime))

@ -15,25 +15,34 @@ import { useTranslate } from "@/utils/i18n";
const Timeline = () => { const Timeline = () => {
const t = useTranslate(); const t = useTranslate();
const currentUser = useCurrentUser(); const user = useCurrentUser();
const memoStore = useMemoV1Store(); const memoStore = useMemoV1Store();
const memoList = useMemoList(); const memoList = useMemoList();
const currentDateStamp = getDateStampByDate(getNormalizedDateString()) as number; const currentDateStamp = getDateStampByDate(getNormalizedDateString()) as number;
const [selectedDateStamp, setSelectedDateStamp] = useState<number>(currentDateStamp as number); const [selectedDateStamp, setSelectedDateStamp] = useState<number>(currentDateStamp as number);
const [isRequesting, setIsRequesting] = useState(true);
const [showDatePicker, toggleShowDatePicker] = useToggle(false); const [showDatePicker, toggleShowDatePicker] = useToggle(false);
const sortedMemos = memoList.value.sort((a, b) => getTimeStampByDate(a.createTime) - getTimeStampByDate(b.createTime)); const sortedMemos = memoList.value.sort((a, b) => getTimeStampByDate(a.createTime) - getTimeStampByDate(b.createTime));
useEffect(() => { useEffect(() => {
memoList.reset(); memoList.reset();
fetchMemos();
}, [selectedDateStamp]);
const fetchMemos = async () => {
const filters = [ const filters = [
`creator == "${currentUser.name}"`, `creator == "${user.name}"`,
`row_status == "NORMAL"`,
`created_ts_after == ${selectedDateStamp / 1000}`, `created_ts_after == ${selectedDateStamp / 1000}`,
`created_ts_before == ${(selectedDateStamp + DAILY_TIMESTAMP) / 1000}`, `created_ts_before == ${(selectedDateStamp + DAILY_TIMESTAMP) / 1000}`,
]; ];
memoStore.fetchMemos({ setIsRequesting(true);
await memoStore.fetchMemos({
offset: memoList.size(),
filter: filters.join(" && "), filter: filters.join(" && "),
}); });
}, [selectedDateStamp]); setIsRequesting(false);
};
const handleDataPickerChange = (datestamp: number): void => { const handleDataPickerChange = (datestamp: number): void => {
setSelectedDateStamp(datestamp); setSelectedDateStamp(datestamp);
@ -73,12 +82,6 @@ const Timeline = () => {
/> />
</div> </div>
<div className="w-full h-auto flex flex-col justify-start items-start px-2 pb-4 bg-white dark:bg-zinc-700"> <div className="w-full h-auto flex flex-col justify-start items-start px-2 pb-4 bg-white dark:bg-zinc-700">
{sortedMemos.length === 0 && (
<div className="w-full mt-4 mb-8 flex flex-col justify-center items-center italic">
<Empty />
<p className="mt-4 text-gray-600 dark:text-gray-400">{t("message.no-data")}</p>
</div>
)}
<div className="flex flex-col justify-start items-start w-full mt-2"> <div className="flex flex-col justify-start items-start w-full mt-2">
{sortedMemos.map((memo, index) => ( {sortedMemos.map((memo, index) => (
<div <div
@ -102,6 +105,12 @@ const Timeline = () => {
</div> </div>
)} )}
</div> </div>
{!isRequesting && sortedMemos.length === 0 && (
<div className="w-full mt-4 mb-8 flex flex-col justify-center items-center italic">
<Empty />
<p className="mt-4 text-gray-600 dark:text-gray-400">{t("message.no-data")}</p>
</div>
)}
</div> </div>
</div> </div>
</div> </div>

@ -6,10 +6,10 @@ import MemoView from "@/components/MemoView";
import MobileHeader from "@/components/MobileHeader"; import MobileHeader from "@/components/MobileHeader";
import UserAvatar from "@/components/UserAvatar"; import UserAvatar from "@/components/UserAvatar";
import { DEFAULT_MEMO_LIMIT } from "@/helpers/consts"; import { DEFAULT_MEMO_LIMIT } from "@/helpers/consts";
import { getTimeStampByDate } from "@/helpers/datetime";
import useLoading from "@/hooks/useLoading"; import useLoading from "@/hooks/useLoading";
import { useFilterStore } from "@/store/module"; import { useFilterStore } from "@/store/module";
import { useMemoV1Store, useUserV1Store } from "@/store/v1"; import { useMemoList, useMemoV1Store, useUserV1Store } from "@/store/v1";
import { Memo } from "@/types/proto/api/v2/memo_service";
import { User } from "@/types/proto/api/v2/user_service"; import { User } from "@/types/proto/api/v2/user_service";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
@ -21,10 +21,13 @@ const UserProfile = () => {
const [user, setUser] = useState<User>(); const [user, setUser] = useState<User>();
const filterStore = useFilterStore(); const filterStore = useFilterStore();
const memoStore = useMemoV1Store(); const memoStore = useMemoV1Store();
const [memos, setMemos] = useState<Memo[]>([]); const memoList = useMemoList();
const [isRequesting, setIsRequesting] = useState(true);
const [isComplete, setIsComplete] = useState(false); const [isComplete, setIsComplete] = useState(false);
const [isRequesting, setIsRequesting] = useState(false);
const { tag: tagQuery, text: textQuery } = filterStore.state; const { tag: tagQuery, text: textQuery } = filterStore.state;
const sortedMemos = memoList.value
.sort((a, b) => getTimeStampByDate(b.displayTime) - getTimeStampByDate(a.displayTime))
.sort((a, b) => Number(b.pinned) - Number(a.pinned));
useEffect(() => { useEffect(() => {
const username = params.username; const username = params.username;
@ -45,6 +48,7 @@ const UserProfile = () => {
}, [params.username]); }, [params.username]);
useEffect(() => { useEffect(() => {
memoList.reset();
fetchMemos(); fetchMemos();
}, [tagQuery, textQuery]); }, [tagQuery, textQuery]);
@ -54,16 +58,23 @@ const UserProfile = () => {
} }
const filters = [`creator == "${user.name}"`, `row_status == "NORMAL"`]; const filters = [`creator == "${user.name}"`, `row_status == "NORMAL"`];
if (tagQuery) filters.push(`tags == "${tagQuery}"`); const contentSearch: string[] = [];
if (textQuery) filters.push(`content_search == "${textQuery}"`); if (tagQuery) {
contentSearch.push(`"#${tagQuery}"`);
}
if (textQuery) {
contentSearch.push(`"${textQuery}"`);
}
if (contentSearch.length > 0) {
filters.push(`content_search == [${contentSearch.join(", ")}]`);
}
setIsRequesting(true); setIsRequesting(true);
const data = await memoStore.fetchMemos({ const data = await memoStore.fetchMemos({
limit: DEFAULT_MEMO_LIMIT, limit: DEFAULT_MEMO_LIMIT,
offset: memos.length, offset: memoList.size(),
filter: filters.join(" && "), filter: filters.join(" && "),
}); });
setIsRequesting(false); setIsRequesting(false);
setMemos([...memos, ...data]);
setIsComplete(data.length < DEFAULT_MEMO_LIMIT); setIsComplete(data.length < DEFAULT_MEMO_LIMIT);
}; };
@ -78,16 +89,15 @@ const UserProfile = () => {
<UserAvatar className="!w-20 !h-20 mb-2 drop-shadow" avatarUrl={user?.avatarUrl} /> <UserAvatar className="!w-20 !h-20 mb-2 drop-shadow" avatarUrl={user?.avatarUrl} />
<p className="text-3xl text-black opacity-80 dark:text-gray-200">{user?.nickname}</p> <p className="text-3xl text-black opacity-80 dark:text-gray-200">{user?.nickname}</p>
</div> </div>
{memos.map((memo) => ( {sortedMemos.map((memo) => (
<MemoView key={memo.id} memo={memo} lazyRendering showVisibility showPinnedStyle showParent /> <MemoView key={memo.id} memo={memo} lazyRendering showVisibility showPinnedStyle showParent />
))} ))}
{isRequesting && ( {isRequesting ? (
<div className="flex flex-col justify-start items-center w-full my-8"> <div className="flex flex-col justify-start items-center w-full my-8">
<p className="text-sm text-gray-400 italic">{t("memo.fetching-data")}</p> <p className="text-sm text-gray-400 italic">{t("memo.fetching-data")}</p>
</div> </div>
)} ) : isComplete ? (
{isComplete ? ( sortedMemos.length === 0 && (
memos.length === 0 && (
<div className="w-full mt-12 mb-8 flex flex-col justify-center items-center italic"> <div className="w-full mt-12 mb-8 flex flex-col justify-center items-center italic">
<Empty /> <Empty />
<p className="mt-2 text-gray-600 dark:text-gray-400">{t("message.no-data")}</p> <p className="mt-2 text-gray-600 dark:text-gray-400">{t("message.no-data")}</p>

Loading…
Cancel
Save