diff --git a/src/renderer/src/hooks/biz/useFeedActions.tsx b/src/renderer/src/hooks/biz/useFeedActions.tsx new file mode 100644 index 000000000..d38a48625 --- /dev/null +++ b/src/renderer/src/hooks/biz/useFeedActions.tsx @@ -0,0 +1,94 @@ +import { getMe } from "@renderer/atoms/user" +import { useModalStack } from "@renderer/components/ui/modal" +import { useFeedClaimModal } from "@renderer/modules/claim" +import { FeedForm } from "@renderer/modules/discover/feed-form" +import { getFeedById, useFeedById } from "@renderer/store/feed" +import { useSubscriptionByFeedId } from "@renderer/store/subscription" +import { WEB_URL } from "@shared/constants" +import { useMemo } from "react" + +import { useDeleteSubscription } from "./useSubscriptionActions" + +export const useFeedActions = ({ + feedId, + view, +}: { + feedId: string + view?: number +}) => { + const feed = useFeedById(feedId) + const subscription = useSubscriptionByFeedId(feedId) + + const { present } = useModalStack() + const deleteSubscription = useDeleteSubscription({}) + const claimFeed = useFeedClaimModal({ + feedId, + }) + + const items = useMemo(() => { + if (!feed) return [] + const items = [ + { + type: "text" as const, + label: "Edit", + + click: () => { + present({ + title: "Edit Feed", + content: ({ dismiss }) => ( + + ), + }) + }, + }, + { + type: "text" as const, + label: "Unfollow", + click: () => deleteSubscription.mutate(subscription), + }, + { + type: "separator" as const, + }, + ...(!feed.ownerUserId && !!feed.id ? + [{ + type: "text" as const, + label: "Claim", + click: () => { + claimFeed() + }, + }] : + []), + ...(feed.ownerUserId === getMe()?.id ? + [ + { + type: "text" as const, + label: "This feed is owned by you", + }, + ] : + []), + { + type: "separator" as const, + }, + { + type: "text" as const, + label: "Open Feed in Browser", + click: () => + window.open(`${WEB_URL}/feed/${feedId}?view=${view}`, "_blank"), + }, + { + type: "text" as const, + label: "Open Site in Browser", + click: () => { + const feed = getFeedById(feedId) + if (feed) { + feed.siteUrl && window.open(feed.siteUrl, "_blank") + } + }, + }, + ] + + return items + }, [feedId]) + + return { items } +} diff --git a/src/renderer/src/modules/feed-column/item.tsx b/src/renderer/src/modules/feed-column/item.tsx index b33e5e396..d4bf12696 100644 --- a/src/renderer/src/modules/feed-column/item.tsx +++ b/src/renderer/src/modules/feed-column/item.tsx @@ -1,7 +1,5 @@ import { getMainContainerElement } from "@renderer/atoms/dom" -import { getMe } from "@renderer/atoms/user" import { FeedIcon } from "@renderer/components/feed-icon" -import { useModalStack } from "@renderer/components/ui/modal/stacked/hooks" import { Tooltip, TooltipContent, @@ -9,22 +7,19 @@ import { TooltipProvider, TooltipTrigger, } from "@renderer/components/ui/tooltip" +import { useFeedActions } from "@renderer/hooks/biz/useFeedActions" import { useNavigateEntry } from "@renderer/hooks/biz/useNavigateEntry" import { useRouteParamsSelector } from "@renderer/hooks/biz/useRouteParams" -import { useDeleteSubscription } from "@renderer/hooks/biz/useSubscriptionActions" import { nextFrame } from "@renderer/lib/dom" import { showNativeMenu } from "@renderer/lib/native-menu" import { cn } from "@renderer/lib/utils" -import { getFeedById, useFeedById } from "@renderer/store/feed" +import { useFeedById } from "@renderer/store/feed" import { useSubscriptionByFeedId } from "@renderer/store/subscription" import { useFeedUnreadStore } from "@renderer/store/unread" import { WEB_URL } from "@shared/constants" import dayjs from "dayjs" import { memo, useCallback } from "react" -import { useFeedClaimModal } from "../claim/hooks" -import { FeedForm } from "../discover/feed-form" - interface FeedItemProps { feedId: string view?: number @@ -56,10 +51,7 @@ const FeedItemImpl = ({ [feedId, navigate, view], ) - const deleteSubscription = useDeleteSubscription({}) - const feedUnread = useFeedUnreadStore((state) => state.data[feedId] || 0) - const { present } = useModalStack() const isActive = useRouteParamsSelector( (routerParams) => routerParams.feedId === feedId, @@ -67,9 +59,7 @@ const FeedItemImpl = ({ const feed = useFeedById(feedId) - const claimFeed = useFeedClaimModal({ - feedId, - }) + const { items } = useFeedActions({ feedId, view }) if (!feed) return null return ( @@ -84,64 +74,7 @@ const FeedItemImpl = ({ window.open(`${WEB_URL}/feed/${feedId}?view=${view}`, "_blank") }} onContextMenu={(e) => { - showNativeMenu( - [ - { - type: "text", - label: "Edit", - - click: () => { - present({ - title: "Edit Feed", - content: ({ dismiss }) => ( - - ), - }) - }, - }, - { - type: "text", - label: "Unfollow", - click: () => deleteSubscription.mutate(subscription), - }, - { - type: "separator", - }, - !feed.ownerUserId && - !!feed.id && { - type: "text", - label: "Claim", - click: () => { - claimFeed() - }, - }, - feed.ownerUserId === getMe()?.id && { - type: "text", - label: "This feed is owned by you", - }, - { - type: "separator", - }, - - { - type: "text", - label: "Open Feed in Browser", - click: () => - window.open(`${WEB_URL}/feed/${feedId}?view=${view}`, "_blank"), - }, - { - type: "text", - label: "Open Site in Browser", - click: () => { - const feed = getFeedById(feedId) - if (feed) { - feed.siteUrl && window.open(feed.siteUrl, "_blank") - } - }, - }, - ], - e, - ) + showNativeMenu(items, e) }} >