From 7b954ee9c7c7034b0a71f45164df54543c844a4e Mon Sep 17 00:00:00 2001 From: Innei Date: Tue, 23 Jul 2024 13:31:28 +0800 Subject: [PATCH] fix: entry check new api (#147) * fix: entry check new api Signed-off-by: Innei * fix: type Signed-off-by: Innei --------- Signed-off-by: Innei --- .../modules/app/NetworkStatusIndicator.tsx | 2 +- .../src/modules/entry-column/hooks.ts | 46 +++++++++---------- src/renderer/src/queries/entries.ts | 32 +++++++++++++ 3 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/renderer/src/modules/app/NetworkStatusIndicator.tsx b/src/renderer/src/modules/app/NetworkStatusIndicator.tsx index d092a4738..9fdca59ef 100644 --- a/src/renderer/src/modules/app/NetworkStatusIndicator.tsx +++ b/src/renderer/src/modules/app/NetworkStatusIndicator.tsx @@ -33,7 +33,7 @@ export const NetworkStatusIndicator = () => { {networkStatus === NetworkStatus.OFFLINE ? canUseLocalData ? - "Local Mode" : + "Local Mode (alpha)" : "Offline" : apiStatus === NetworkStatus.OFFLINE ? "API Error" : diff --git a/src/renderer/src/modules/entry-column/hooks.ts b/src/renderer/src/modules/entry-column/hooks.ts index 9eb767eae..78b7071d5 100644 --- a/src/renderer/src/modules/entry-column/hooks.ts +++ b/src/renderer/src/modules/entry-column/hooks.ts @@ -58,11 +58,7 @@ export const useEntryMarkReadHandler = (entriesIds: string[]) => { scrollMarkUnread, ]) } -export const useEntriesByView = ({ - onReset, -}: { - onReset?: () => void -}) => { +export const useEntriesByView = ({ onReset }: { onReset?: () => void }) => { const routeParams = useRouteParms() const unreadOnly = useGeneralSettingKey("unreadOnly") @@ -77,28 +73,28 @@ export const useEntriesByView = ({ } const query = useEntries(entriesOptions) - const [firstPublishedAt, setFirstPublishedAt] = useState() - const [hasUpdate, setHasUpdate] = useState(false) - const firstEntry = useAuthQuery(entries.entries({ - ...entriesOptions, - limit: 1, - }), { - refetchInterval: 1000 * 6, - enabled: !hasUpdate && !!firstPublishedAt, - }) + const lastPublishedAt = + query.data?.pages?.[0]?.data?.[0]?.entries.publishedAt + + const [pauseQuery, setPauseQuery] = useState(false) + const hasNewQuery = useAuthQuery( + entries.checkNew({ + ...entriesOptions, + lastPublishedAt: lastPublishedAt!, + }), + { + refetchInterval: 1000 * 6, + enabled: !!lastPublishedAt && !pauseQuery, + }, + ) + const hasUpdate = useMemo( + () => !!(lastPublishedAt && hasNewQuery?.data?.data.has_new), + [hasNewQuery?.data?.data.has_new, lastPublishedAt], + ) useEffect(() => { - if (query.data?.pages?.[0]?.data?.[0]) { - setFirstPublishedAt(query.data.pages[0].data[0].entries.publishedAt) - setHasUpdate(false) - } - }, [query.data?.pages?.[0]?.data?.[0]]) - - useEffect(() => { - if (!hasUpdate && firstPublishedAt && firstEntry.data?.data?.[0] && new Date(firstPublishedAt) < new Date(firstEntry.data.data[0].entries.publishedAt)) { - setHasUpdate(true) - } - }, [firstEntry.data?.data?.[0]]) + setPauseQuery(hasUpdate) + }, [hasUpdate]) const remoteEntryIds = useMemo( () => diff --git a/src/renderer/src/queries/entries.ts b/src/renderer/src/queries/entries.ts index 30b51f9fd..453caf07b 100644 --- a/src/renderer/src/queries/entries.ts +++ b/src/renderer/src/queries/entries.ts @@ -1,6 +1,7 @@ import { useAuthInfiniteQuery, useAuthQuery } from "@renderer/hooks/common" import { apiClient } from "@renderer/lib/api-fetch" import { defineQuery } from "@renderer/lib/defineQuery" +import { getEntriesParams } from "@renderer/lib/utils" import { entryActions } from "@renderer/store/entry" export const entries = { @@ -49,6 +50,37 @@ export const entries = { rootKey: ["entries-preview"], }, ), + + checkNew: ({ + id, + view, + read, + lastPublishedAt, + }: { + id?: number | string + view?: number + read?: boolean + lastPublishedAt: string + }) => + defineQuery( + ["entry-checkNew", id, view, read, lastPublishedAt], + async () => + // @ts-expect-error + apiClient.entries["check-new"].$get({ + query: { + ...getEntriesParams({ + id, + view, + }), + read, + publishedAfter: lastPublishedAt, + }, + }) as Promise<{ data: { has_new: boolean, lastest_at?: string } }>, + + { + rootKey: ["entry-checkNew", id], + }, + ), } export const useEntries = ({