feat: add main view block

This commit is contained in:
Stephen Zhou 2025-09-03 17:21:27 +08:00
parent d234f64d89
commit 0ca804adb7
No known key found for this signature in database
4 changed files with 36 additions and 3 deletions

View File

@ -1,6 +1,8 @@
import { views } from "@follow/constants"
import { clsx, cn } from "@follow/utils/utils"
import type { FC } from "react"
import { memo } from "react"
import { useTranslation } from "react-i18next"
import { ImageThumbnail } from "~/modules/ai-chat/components/layouts/ImageThumbnail"
import { CircularProgress } from "~/modules/ai-chat/components/ui/UploadProgress"
@ -13,11 +15,18 @@ import {
import { EntryTitle, FeedTitle } from "./TitleComponents"
const blockTypeCanNotBeRemoved = new Set(["mainEntry", "mainView"])
export const ContextBlock: FC<{ block: AIChatContextBlock }> = memo(({ block }) => {
const { t } = useTranslation("common")
const blockActions = useChatBlockActions()
const getBlockIcon = () => {
switch (block.type) {
case "mainView": {
const viewIcon = views.find((v) => v.view === Number(block.value))?.icon.props.className
return viewIcon
}
case "mainEntry": {
return "i-mgc-star-cute-fi"
}
@ -50,6 +59,10 @@ export const ContextBlock: FC<{ block: AIChatContextBlock }> = memo(({ block })
const getDisplayContent = () => {
switch (block.type) {
case "mainView": {
const viewName = views.find((v) => v.view === Number(block.value))?.name
return viewName ? t(viewName) : block.value
}
case "mainEntry":
case "referEntry": {
return <EntryTitle entryId={block.value} fallback={block.value} />
@ -145,6 +158,9 @@ export const ContextBlock: FC<{ block: AIChatContextBlock }> = memo(({ block })
const getBlockLabel = () => {
switch (block.type) {
case "mainView": {
return ""
}
case "mainEntry": {
return "Current"
}
@ -167,7 +183,7 @@ export const ContextBlock: FC<{ block: AIChatContextBlock }> = memo(({ block })
}
}
const canRemove = block.type !== "mainEntry"
const canRemove = !blockTypeCanNotBeRemoved.has(block.type)
return (
<div

View File

@ -1,12 +1,15 @@
import { cn } from "@follow/utils/utils"
import { memo, useCallback, useMemo, useRef } from "react"
import { memo, useCallback, useEffect, useMemo, useRef } from "react"
import { useAISettingValue } from "~/atoms/settings/ai"
import { DropdownMenu, DropdownMenuTrigger } from "~/components/ui/dropdown-menu/dropdown-menu"
import { useRouteParamsSelector } from "~/hooks/biz/useRouteParams"
import { useFileUploadWithDefaults } from "~/modules/ai-chat/hooks/useFileUpload"
import { useAIChatStore } from "~/modules/ai-chat/store/AIChatContext"
import { SUPPORTED_MIME_ACCEPT } from "~/modules/ai-chat/utils/file-validation"
import { useBlockActions } from "../../store/hooks"
import { BlockSliceAction } from "../../store/slices/block.slice"
import { ContextBlock } from "../context-bar/blocks"
import { ContextMenuContent, ShortcutsMenuContent } from "../context-bar/menus"
@ -27,6 +30,19 @@ export const AIChatContextBar: Component<{ onSendShortcut?: (prompt: string) =>
fileInputRef.current?.click()
}, [])
const view = useRouteParamsSelector((i) => i.view)
const { addOrUpdateBlock, removeBlock } = useBlockActions()
useEffect(() => {
addOrUpdateBlock({
id: BlockSliceAction.SPECIAL_TYPES.mainView,
type: "mainView",
value: `${view}`,
})
return () => {
removeBlock(BlockSliceAction.SPECIAL_TYPES.mainView)
}
}, [addOrUpdateBlock, view, removeBlock])
return (
<div className={cn("flex flex-wrap items-center gap-2 px-4 py-3", className)}>
{/* Add Context Button */}

View File

@ -30,6 +30,7 @@ export class BlockSliceAction {
}
static SPECIAL_TYPES = {
mainView: "mainView",
mainEntry: "mainEntry",
selectedText: "selectedText",
}

View File

@ -19,7 +19,7 @@ interface BaseContextBlock {
}
export interface ValueContextBlock extends BaseContextBlock {
type: "mainEntry" | "referEntry" | "referFeed" | "selectedText"
type: "mainView" | "mainEntry" | "referEntry" | "referFeed" | "selectedText"
value: string
}