feat: useFeedActions

This commit is contained in:
DIYgod 2024-07-25 23:45:41 +08:00
parent 9df728664e
commit 72e90f7f6a
No known key found for this signature in database
2 changed files with 98 additions and 71 deletions

View File

@ -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 }) => (
<FeedForm asWidget id={feedId} onSuccess={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 }
}

View File

@ -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 }) => (
<FeedForm asWidget id={feedId} onSuccess={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)
}}
>
<div