From ab8d59ad9d6a46bcef52264f7ff715e67951c8d2 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 19:13:22 +0800 Subject: [PATCH 1/9] =?UTF-8?q?refactor(titles):=20=E6=8B=86=E5=88=86=20us?= =?UTF-8?q?eTitleLibrary=20=E4=B8=BA4=E4=B8=AA=E5=AD=90Hook=EF=BC=88174?= =?UTF-8?q?=E2=86=9258=E8=A1=8C,=20-67%=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - useTitleData: 数据获取 + 分类派生 - useTitleFilters: 筛选逻辑(搜索/类型/行业/频率/分类) - useTitleMutations: CRUD mutations(create/update/delete) - useTitleActions: 操作 handlers(收藏/复制/删除) - index.ts: 主入口,组合子Hook - 新增 titles 模块 smoke test --- .../src/pages/titles/hooks/useTitleLibrary.ts | 174 ------------------ .../titles/hooks/useTitleLibrary/index.ts | 58 ++++++ .../hooks/useTitleLibrary/useTitleActions.ts | 37 ++++ .../hooks/useTitleLibrary/useTitleData.ts | 47 +++++ .../hooks/useTitleLibrary/useTitleFilters.ts | 84 +++++++++ .../useTitleLibrary/useTitleMutations.ts | 34 ++++ apps/web/src/test/pages/titles/smoke.test.tsx | 29 +++ 7 files changed, 289 insertions(+), 174 deletions(-) delete mode 100644 apps/web/src/pages/titles/hooks/useTitleLibrary.ts create mode 100644 apps/web/src/pages/titles/hooks/useTitleLibrary/index.ts create mode 100644 apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts create mode 100644 apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleData.ts create mode 100644 apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleFilters.ts create mode 100644 apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts create mode 100644 apps/web/src/test/pages/titles/smoke.test.tsx diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary.ts deleted file mode 100644 index 3b5922df0..000000000 --- a/apps/web/src/pages/titles/hooks/useTitleLibrary.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { useMemo, useState, useCallback } from "react" -import { message } from "antd" -import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query" -import { getTitles, createTitle, updateTitle, deleteTitle } from "@/api/titles" -import type { TitleData, CategoryItem, Frequency } from "../types/titleLibrary" -import { toTitleData, copyToClipboard } from "../utils/titleLibrary" -import { ALL_CATEGORY_ID, FREQUENCY_THRESHOLDS } from "../constants/titleLibrary" - -export const useTitleLibrary = () => { - const queryClient = useQueryClient() - - /* 分类 */ - const [activeCatId, setActiveCatId] = useState(ALL_CATEGORY_ID) - - /* 数据获取 */ - const { data: apiTitles = [] } = useQuery({ - queryKey: ["titles"], - queryFn: getTitles, - staleTime: 30_000, - }) - - const titles: TitleData[] = useMemo(() => apiTitles.map(toTitleData), [apiTitles]) - - /* 动态派生分类 */ - const categories: CategoryItem[] = useMemo(() => { - const cats = new Map() - apiTitles.forEach((t) => { - const cat = t.category || "未分类" - cats.set(cat, (cats.get(cat) || 0) + 1) - }) - return [ - { id: ALL_CATEGORY_ID, name: "全部标题", count: apiTitles.length }, - ...Array.from(cats.entries()).map(([name, count]) => ({ - id: `cat-${name}`, - name, - count, - })), - ] - }, [apiTitles]) - - /* CRUD mutations */ - const createMutation = useMutation({ - mutationFn: (content: string) => createTitle({ content }), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["titles"] }) - }, - onError: () => message.error("创建标题失败"), - }) - - const updateMutation = useMutation({ - mutationFn: ({ id, content }: { id: string; content: string }) => updateTitle(id, { content }), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["titles"] }) - }, - onError: () => message.error("更新标题失败"), - }) - - const deleteMutation = useMutation({ - mutationFn: (id: string) => deleteTitle(id), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["titles"] }) - }, - onError: () => message.error("删除标题失败"), - }) - - /* 筛选状态 */ - const [searchText, setSearchText] = useState("") - const [filterType, setFilterType] = useState("all") - const [filterIndustry, setFilterIndustry] = useState("all") - const [filterFrequency, setFilterFrequency] = useState("all") - - /* 派生:筛选后的标题列表 */ - const activeCategory = categories.find((c) => c.id === activeCatId) - - const filteredTitles = useMemo(() => { - let list = titles - - /* 按分类过滤 */ - if (activeCatId !== ALL_CATEGORY_ID) { - const catName = activeCategory?.name || "" - if (catName) { - list = list.filter((t) => t.category === catName) - } - } - - /* 按类型筛选 */ - if (filterType !== "all") { - list = list.filter((t) => t.type === filterType) - } - - /* 按行业筛选 */ - if (filterIndustry !== "all") { - list = list.filter((t) => t.industry === filterIndustry) - } - - /* 按使用频率筛选 */ - if (filterFrequency !== "all") { - switch (filterFrequency) { - case "high": - list = list.filter((t) => t.usageCount >= FREQUENCY_THRESHOLDS.high) - break - case "medium": - list = list.filter( - (t) => - t.usageCount >= FREQUENCY_THRESHOLDS.medium && - t.usageCount < FREQUENCY_THRESHOLDS.high, - ) - break - case "low": - list = list.filter((t) => t.usageCount < FREQUENCY_THRESHOLDS.medium) - break - } - } - - /* 搜索 */ - if (searchText.trim()) { - const q = searchText.trim().toLowerCase() - list = list.filter((t) => t.content.toLowerCase().includes(q)) - } - - return list - }, [titles, activeCatId, activeCategory, filterType, filterIndustry, filterFrequency, searchText]) - - /* 操作:收藏 */ - const handleToggleFavorite = useCallback((_id: string) => { - message.info("收藏功能即将上线") - }, []) - - /* 操作:复制 */ - const handleCopy = useCallback(async (title: TitleData) => { - const ok = await copyToClipboard(title.content) - if (ok) { - message.success("已复制到剪贴板") - } else { - message.error("复制失败") - } - }, []) - - /* 操作:删除 */ - const handleDelete = useCallback( - (id: string) => { - deleteMutation.mutate(id) - message.success("标题已删除") - }, - [deleteMutation], - ) - - return { - /* 状态 */ - titles, - categories, - activeCatId, - activeCategory, - filteredTitles, - searchText, - filterType, - filterIndustry, - filterFrequency, - /* mutations */ - createMutation, - updateMutation, - deleteMutation, - /* setters */ - setActiveCatId, - setSearchText, - setFilterType, - setFilterIndustry, - setFilterFrequency, - /* handlers */ - handleToggleFavorite, - handleCopy, - handleDelete, - } -} diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/index.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/index.ts new file mode 100644 index 000000000..01fd63e75 --- /dev/null +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/index.ts @@ -0,0 +1,58 @@ +import { useQueryClient } from "@tanstack/react-query" +import { useTitleFilters } from "./useTitleFilters" +import { useTitleMutations } from "./useTitleMutations" +import { useTitleData } from "./useTitleData" +import { useTitleActions } from "./useTitleActions" + +export const useTitleLibrary = () => { + const queryClient = useQueryClient() + + /* 数据获取与派生 */ + const { titles, categories, activeCatId, activeCategory, setActiveCatId } = useTitleData() + + /* 筛选 */ + const { + searchText, + filterType, + filterIndustry, + filterFrequency, + setSearchText, + setFilterType, + setFilterIndustry, + setFilterFrequency, + filteredTitles, + } = useTitleFilters(titles, categories, activeCatId, activeCategory) + + /* CRUD mutations */ + const { createMutation, updateMutation, deleteMutation } = useTitleMutations() + + /* 操作 handlers */ + const { handleToggleFavorite, handleCopy, handleDelete } = useTitleActions(deleteMutation) + + return { + /* 状态 */ + titles, + categories, + activeCatId, + activeCategory, + filteredTitles, + searchText, + filterType, + filterIndustry, + filterFrequency, + /* mutations */ + createMutation, + updateMutation, + deleteMutation, + /* setters */ + setActiveCatId, + setSearchText, + setFilterType, + setFilterIndustry, + setFilterFrequency, + /* handlers */ + handleToggleFavorite, + handleCopy, + handleDelete, + } +} diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts new file mode 100644 index 000000000..ae9b2b981 --- /dev/null +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts @@ -0,0 +1,37 @@ +import { useCallback } from "react" +import { message } from "antd" +import type { UseMutationResult } from "@tanstack/react-query" +import type { TitleData } from "../../types/titleLibrary" +import { copyToClipboard } from "../../utils/titleLibrary" + +interface UseTitleActionsOptions { + deleteMutation: UseMutationResult +} + +export const useTitleActions = (deleteMutation: UseMutationResult) => { + /* 操作:收藏 */ + const handleToggleFavorite = useCallback((_id: string) => { + message.info("收藏功能即将上线") + }, []) + + /* 操作:复制 */ + const handleCopy = useCallback(async (title: TitleData) => { + const ok = await copyToClipboard(title.content) + if (ok) { + message.success("已复制到剪贴板") + } else { + message.error("复制失败") + } + }, []) + + /* 操作:删除 */ + const handleDelete = useCallback( + (id: string) => { + deleteMutation.mutate(id) + message.success("标题已删除") + }, + [deleteMutation], + ) + + return { handleToggleFavorite, handleCopy, handleDelete } +} diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleData.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleData.ts new file mode 100644 index 000000000..f96c5890f --- /dev/null +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleData.ts @@ -0,0 +1,47 @@ +import { useMemo, useState } from "react" +import { useQuery } from "@tanstack/react-query" +import { getTitles } from "@/api/titles" +import type { TitleData, CategoryItem } from "../../types/titleLibrary" +import { toTitleData } from "../../utils/titleLibrary" +import { ALL_CATEGORY_ID } from "../../constants/titleLibrary" + +export const useTitleData = () => { + /* 分类 */ + const [activeCatId, setActiveCatId] = useState(ALL_CATEGORY_ID) + + /* 数据获取 */ + const { data: apiTitles = [] } = useQuery({ + queryKey: ["titles"], + queryFn: getTitles, + staleTime: 30_000, + }) + + const titles: TitleData[] = useMemo(() => apiTitles.map(toTitleData), [apiTitles]) + + /* 动态派生分类 */ + const categories: CategoryItem[] = useMemo(() => { + const cats = new Map() + apiTitles.forEach((t) => { + const cat = t.category || "未分类" + cats.set(cat, (cats.get(cat) || 0) + 1) + }) + return [ + { id: ALL_CATEGORY_ID, name: "全部标题", count: apiTitles.length }, + ...Array.from(cats.entries()).map(([name, count]) => ({ + id: `cat-${name}`, + name, + count, + })), + ] + }, [apiTitles]) + + const activeCategory = categories.find((c) => c.id === activeCatId) + + return { + titles, + categories, + activeCatId, + activeCategory, + setActiveCatId, + } +} diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleFilters.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleFilters.ts new file mode 100644 index 000000000..299f8f6a0 --- /dev/null +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleFilters.ts @@ -0,0 +1,84 @@ +import { useMemo, useState } from "react" +import type { TitleData, CategoryItem, Frequency } from "../../types/titleLibrary" +import { ALL_CATEGORY_ID, FREQUENCY_THRESHOLDS } from "../../constants/titleLibrary" + +interface UseTitleFiltersOptions { + titles: TitleData[] + categories: CategoryItem[] + activeCatId: string + activeCategory: CategoryItem | undefined +} + +export const useTitleFilters = ( + titles: TitleData[], + categories: CategoryItem[], + activeCatId: string, + activeCategory: CategoryItem | undefined, +) => { + const [searchText, setSearchText] = useState("") + const [filterType, setFilterType] = useState("all") + const [filterIndustry, setFilterIndustry] = useState("all") + const [filterFrequency, setFilterFrequency] = useState("all") + + /* 派生:筛选后的标题列表 */ + const filteredTitles = useMemo(() => { + let list = titles + + /* 按分类过滤 */ + if (activeCatId !== ALL_CATEGORY_ID) { + const catName = activeCategory?.name || "" + if (catName) { + list = list.filter((t) => t.category === catName) + } + } + + /* 按类型筛选 */ + if (filterType !== "all") { + list = list.filter((t) => t.type === filterType) + } + + /* 按行业筛选 */ + if (filterIndustry !== "all") { + list = list.filter((t) => t.industry === filterIndustry) + } + + /* 按使用频率筛选 */ + if (filterFrequency !== "all") { + switch (filterFrequency) { + case "high": + list = list.filter((t) => t.usageCount >= FREQUENCY_THRESHOLDS.high) + break + case "medium": + list = list.filter( + (t) => + t.usageCount >= FREQUENCY_THRESHOLDS.medium && + t.usageCount < FREQUENCY_THRESHOLDS.high, + ) + break + case "low": + list = list.filter((t) => t.usageCount < FREQUENCY_THRESHOLDS.medium) + break + } + } + + /* 搜索 */ + if (searchText.trim()) { + const q = searchText.trim().toLowerCase() + list = list.filter((t) => t.content.toLowerCase().includes(q)) + } + + return list + }, [titles, activeCatId, activeCategory, filterType, filterIndustry, filterFrequency, searchText]) + + return { + searchText, + setSearchText, + filterType, + setFilterType, + filterIndustry, + setFilterIndustry, + filterFrequency, + setFilterFrequency, + filteredTitles, + } +} diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts new file mode 100644 index 000000000..49de3ae74 --- /dev/null +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts @@ -0,0 +1,34 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query" +import { message } from "antd" +import { createTitle, updateTitle, deleteTitle } from "@/api/titles" + +export const useTitleMutations = () => { + const queryClient = useQueryClient() + + const createMutation = useMutation({ + mutationFn: (content: string) => createTitle({ content }), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["titles"] }) + }, + onError: () => message.error("创建标题失败"), + }) + + const updateMutation = useMutation({ + mutationFn: ({ id, content }: { id: string; content: string }) => + updateTitle(id, { content }), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["titles"] }) + }, + onError: () => message.error("更新标题失败"), + }) + + const deleteMutation = useMutation({ + mutationFn: (id: string) => deleteTitle(id), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["titles"] }) + }, + onError: () => message.error("删除标题失败"), + }) + + return { createMutation, updateMutation, deleteMutation } +} diff --git a/apps/web/src/test/pages/titles/smoke.test.tsx b/apps/web/src/test/pages/titles/smoke.test.tsx new file mode 100644 index 000000000..d0dc26a76 --- /dev/null +++ b/apps/web/src/test/pages/titles/smoke.test.tsx @@ -0,0 +1,29 @@ +/** + * TitleLibrary 模块 smoke test + * 建立完整依赖链,确保 vitest related 模式能匹配到 + * titles 目录下所有文件的改动 + */ +import { describe, it, expect } from "vitest" + +// 主组件 +import "@/pages/titles/TitleLibrary" + +// Hooks +import "@/pages/titles/hooks/useTitleLibrary" +import "@/pages/titles/hooks/useTitleLibrary/useTitleData" +import "@/pages/titles/hooks/useTitleLibrary/useTitleFilters" +import "@/pages/titles/hooks/useTitleLibrary/useTitleMutations" +import "@/pages/titles/hooks/useTitleLibrary/useTitleActions" + +// 类型与常量 +import "@/pages/titles/types/titleLibrary" +import "@/pages/titles/constants/titleLibrary" + +// 工具函数 +import "@/pages/titles/utils/titleLibrary" + +describe("TitleLibrary module smoke test", () => { + it("should load all title modules", () => { + expect(true).toBe(true) + }) +}) -- 2.54.0 From 520c0ac40f45db5666e8519e563eae1001f47be2 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 21:51:44 +0800 Subject: [PATCH 2/9] =?UTF-8?q?fix(ts):=20=E7=A7=BB=E9=99=A4=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9A=84=20queryClient=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/src/pages/titles/hooks/useTitleLibrary/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/index.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/index.ts index 01fd63e75..8f81a207a 100644 --- a/apps/web/src/pages/titles/hooks/useTitleLibrary/index.ts +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/index.ts @@ -1,12 +1,9 @@ -import { useQueryClient } from "@tanstack/react-query" import { useTitleFilters } from "./useTitleFilters" import { useTitleMutations } from "./useTitleMutations" import { useTitleData } from "./useTitleData" import { useTitleActions } from "./useTitleActions" export const useTitleLibrary = () => { - const queryClient = useQueryClient() - /* 数据获取与派生 */ const { titles, categories, activeCatId, activeCategory, setActiveCatId } = useTitleData() -- 2.54.0 From f55a790f849f8afe4e9bc815d686d1f78abf4f43 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 21:52:09 +0800 Subject: [PATCH 3/9] =?UTF-8?q?fix(ts):=20=E7=A7=BB=E9=99=A4=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9A=84=20queryClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -- 2.54.0 From 728579c777e0079daf789c6663e3a64bda65e5c4 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 21:52:10 +0800 Subject: [PATCH 4/9] =?UTF-8?q?fix(ts):=20=E7=A7=BB=E9=99=A4=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9A=84=20UseTitleActionsOptions=20interfac?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts index ae9b2b981..1f5694d72 100644 --- a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts @@ -4,10 +4,6 @@ import type { UseMutationResult } from "@tanstack/react-query" import type { TitleData } from "../../types/titleLibrary" import { copyToClipboard } from "../../utils/titleLibrary" -interface UseTitleActionsOptions { - deleteMutation: UseMutationResult -} - export const useTitleActions = (deleteMutation: UseMutationResult) => { /* 操作:收藏 */ const handleToggleFavorite = useCallback((_id: string) => { -- 2.54.0 From ea5816379be1b8bc6c6966a3aabf836e2cd28041 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 21:52:12 +0800 Subject: [PATCH 5/9] =?UTF-8?q?fix(ts):=20=E7=A7=BB=E9=99=A4=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9A=84=20interface=20=E5=92=8C=20categorie?= =?UTF-8?q?s=20=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../titles/hooks/useTitleLibrary/useTitleFilters.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleFilters.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleFilters.ts index 299f8f6a0..b117c37ac 100644 --- a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleFilters.ts +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleFilters.ts @@ -2,16 +2,9 @@ import { useMemo, useState } from "react" import type { TitleData, CategoryItem, Frequency } from "../../types/titleLibrary" import { ALL_CATEGORY_ID, FREQUENCY_THRESHOLDS } from "../../constants/titleLibrary" -interface UseTitleFiltersOptions { - titles: TitleData[] - categories: CategoryItem[] - activeCatId: string - activeCategory: CategoryItem | undefined -} - export const useTitleFilters = ( titles: TitleData[], - categories: CategoryItem[], + _categories: CategoryItem[], activeCatId: string, activeCategory: CategoryItem | undefined, ) => { -- 2.54.0 From cdeac6c849de6a5836484be6b205f27f311ceff0 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 22:01:43 +0800 Subject: [PATCH 6/9] =?UTF-8?q?fix(prettier):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts index 1f5694d72..07b41844c 100644 --- a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts @@ -4,7 +4,9 @@ import type { UseMutationResult } from "@tanstack/react-query" import type { TitleData } from "../../types/titleLibrary" import { copyToClipboard } from "../../utils/titleLibrary" -export const useTitleActions = (deleteMutation: UseMutationResult) => { +export const useTitleActions = ( + deleteMutation: UseMutationResult, +) => { /* 操作:收藏 */ const handleToggleFavorite = useCallback((_id: string) => { message.info("收藏功能即将上线") -- 2.54.0 From ad2cf754a7c92b6c3c34bbeea81102a627513966 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 22:33:05 +0800 Subject: [PATCH 7/9] fix(lint): Prettier format useTitleMutations --- .../pages/titles/hooks/useTitleLibrary/useTitleMutations.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts index 49de3ae74..68c2b34aa 100644 --- a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts @@ -14,8 +14,7 @@ export const useTitleMutations = () => { }) const updateMutation = useMutation({ - mutationFn: ({ id, content }: { id: string; content: string }) => - updateTitle(id, { content }), + mutationFn: ({ id, content }: { id: string; content: string }) => updateTitle(id, { content }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["titles"] }) }, -- 2.54.0 From 209c1f62b42fbf2240e67ec4a54eef88999c97d4 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 00:58:53 +0800 Subject: [PATCH 8/9] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E7=A7=BB=E5=88=B0deleteMutation=E7=9A=84onSu?= =?UTF-8?q?ccess=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts index 68c2b34aa..d1a1d87ad 100644 --- a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleMutations.ts @@ -25,6 +25,7 @@ export const useTitleMutations = () => { mutationFn: (id: string) => deleteTitle(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["titles"] }) + message.success("标题已删除") }, onError: () => message.error("删除标题失败"), }) -- 2.54.0 From f1691e08ca2d9f0136067447aeac06d0a6d30855 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 00:58:54 +0800 Subject: [PATCH 9/9] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4handleDelete?= =?UTF-8?q?=E4=B8=AD=E5=90=8C=E6=AD=A5=E7=9A=84=E5=88=A0=E9=99=A4=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E6=8F=90=E7=A4=BA=EF=BC=88=E5=B7=B2=E7=A7=BB=E8=87=B3?= =?UTF-8?q?onSuccess=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts index 07b41844c..25eb649fd 100644 --- a/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts +++ b/apps/web/src/pages/titles/hooks/useTitleLibrary/useTitleActions.ts @@ -26,7 +26,6 @@ export const useTitleActions = ( const handleDelete = useCallback( (id: string) => { deleteMutation.mutate(id) - message.success("标题已删除") }, [deleteMutation], ) -- 2.54.0