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)
}}
>