diff --git a/icons/mgc/refresh_2_cute_re.svg b/icons/mgc/refresh_2_cute_re.svg new file mode 100644 index 000000000..0d29b3fdc --- /dev/null +++ b/icons/mgc/refresh_2_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/src/lib/utils.ts b/src/renderer/src/lib/utils.ts index d5f66da60..9c567f0d9 100644 --- a/src/renderer/src/lib/utils.ts +++ b/src/renderer/src/lib/utils.ts @@ -67,3 +67,22 @@ export function getOS(): OS { // eslint-disable-next-line no-control-regex export const isASCII = (str) => /^[\u0000-\u007F]*$/.test(str) + +export const isBizId = (id) => { + if (!id) return false + + // id is uuid or snowflake + + // 0. check is uuid + if (id.length === 36 && id[8] === "-" && id[13] === "-" && id[18] === "-" && id[23] === "-") { + return true + } + + // 1. check is snowflake + // snowflake ep 1712546615000 + if (id.length > 16 && id.length < 20 && !Number.isNaN(id)) { + return true + } + + return false +} diff --git a/src/renderer/src/modules/entry-column/index.tsx b/src/renderer/src/modules/entry-column/index.tsx index 48504e855..ffb1b871e 100644 --- a/src/renderer/src/modules/entry-column/index.tsx +++ b/src/renderer/src/modules/entry-column/index.tsx @@ -1,4 +1,5 @@ import { useMainContainerElement } from "@renderer/atoms" +import { useUser } from "@renderer/atoms/user" import { ActionButton, StyledButton } from "@renderer/components/ui/button" import { Popover, @@ -17,11 +18,13 @@ import { apiClient } from "@renderer/lib/api-fetch" import { views } from "@renderer/lib/constants" import { buildStorageNS } from "@renderer/lib/ns" import { shortcuts } from "@renderer/lib/shortcuts" -import { cn, getEntriesParams, getOS } from "@renderer/lib/utils" +import { cn, getEntriesParams, getOS, isBizId } from "@renderer/lib/utils" import { useEntries } from "@renderer/queries/entries" +import { useRefreshFeedMutation } from "@renderer/queries/feed" import { entryActions, subscriptionActions, + useFeedById, useFeedHeaderTitle, } from "@renderer/store" import { @@ -276,9 +279,7 @@ const ListHeader: FC<{ const titleAtBottom = window.electron && os === "macOS" const titleInfo = ( -
+
{headerTitle} @@ -293,6 +294,13 @@ const ListHeader: FC<{
) + const { mutateAsync: refreshFeed, isPending } = useRefreshFeedMutation( + routerParams.feedId, + ) + + const user = useUser() + + const feed = useFeedById(routerParams.feedId) return (
{!titleAtBottom && titleInfo}
+ {feed?.ownerUserId === user?.id && + isBizId(routerParams.feedId) && ( + { + refreshFeed() + }} + > + + + )} defineQuery( - ["entries", level, id, view, read], + ["entries", id, level, view, read], async ({ pageParam }) => entryActions.fetchEntries({ level, @@ -27,7 +27,7 @@ export const entries = { pageParam: pageParam as string, }), { - rootKey: ["entries"], + rootKey: ["entries", id], }, ), byId: (id: string) => diff --git a/src/renderer/src/queries/feed.ts b/src/renderer/src/queries/feed.ts index 92b8b4f37..3f5fffec0 100644 --- a/src/renderer/src/queries/feed.ts +++ b/src/renderer/src/queries/feed.ts @@ -6,6 +6,8 @@ import { feedActions } from "@renderer/store" import { useMutation } from "@tanstack/react-query" import { toast } from "sonner" +import { Queries } from "." + export const feed = { byId: ({ id, url }: { id?: string, url?: string }) => defineQuery( @@ -58,3 +60,18 @@ export const useClaimFeedMutation = (feedId: string) => useMutation({ }) }, }) + +export const useRefreshFeedMutation = (feedId?: string) => useMutation({ + mutationKey: ["refreshFeed", feedId], + mutationFn: () => apiClient.feeds.refresh.$get({ query: { id: feedId! } }), + + onSuccess() { + if (!feedId) return + Queries.entries.entries({ + id: feedId!, + }).invalidateRoot() + }, + async onError(err) { + toast.error(await getFetchErrorMessage(err)) + }, +})