febb1bcfce
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 1m2s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (push) Has been cancelled
CI/CD Pipeline / Validate - Type Check (mypy) (push) Has been cancelled
CI/CD Pipeline / Validate - Migration (alembic) (push) Has been cancelled
CI/CD Pipeline / Unit Tests (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Frontend Lint (push) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (push) Has been cancelled
CI/CD Pipeline / PR Build API Image (push) Has been cancelled
CI/CD Pipeline / PR Build Web Image (push) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (push) Has been cancelled
CI/CD Pipeline / Build Staging API Image (push) Has been cancelled
CI/CD Pipeline / Build Staging Web Image (push) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (push) Has been cancelled
CI/CD Pipeline / Build Production API Image (push) Has been cancelled
CI/CD Pipeline / Build Production Web Image (push) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (push) Has been cancelled
CI/CD Pipeline / Deploy Production (push) Has been cancelled
CI/CD Pipeline / Production Browser E2E (push) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (push) Has been cancelled
CI/CD Pipeline / Canary Release to Production (push) Has been cancelled
CI/CD Pipeline / CI Gate (push) Has been cancelled
CI/CD Pipeline / Check if frontend-only change (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build API Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Web Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
前端: - 删除 GenerationProgressModal/GenerationHistoryModal 组件及目录 - 删除 generateEditPlan/getGenerationStatus/getEditPlanGenerations 三个死API函数 - 删除对应类型 GenerateResponse/EditPlanGeneration/GenerationStatusResponse - 清理测试文件中的 mock 和引用 - 用户可见文案 '剪辑编辑器' 统一改为 '剪辑模板' - 不改变量名/组件名/路由路径/API路径 后端: - 删除 templates_editor/generation.py 死接口文件 - 清理 _fallback.py、dependencies.py、schemas.py 中的死代码 - 删除对应无用测试文件
148 lines
3.8 KiB
TypeScript
148 lines
3.8 KiB
TypeScript
import { useState, useMemo, useCallback } from "react"
|
|
import { useNavigate } from "react-router-dom"
|
|
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"
|
|
import { message } from "antd"
|
|
import {
|
|
getTemplates,
|
|
toggleFavoriteTemplate,
|
|
copyTemplate,
|
|
type TemplateItem,
|
|
type TemplateListParams,
|
|
} from "@/api/templates"
|
|
import type { EditTemplateType, DurationRange } from "../types/templateLibrary"
|
|
import { DEFAULT_PAGE_SIZE } from "../constants/templateLibrary"
|
|
|
|
export const useTemplateLibrary = () => {
|
|
const navigate = useNavigate()
|
|
const queryClient = useQueryClient()
|
|
|
|
/* 筛选状态 */
|
|
const [searchText, setSearchText] = useState("")
|
|
const [activeType, setActiveType] = useState<EditTemplateType | "全部">("全部")
|
|
const [durationRange, setDurationRange] = useState<DurationRange>("")
|
|
const [page, setPage] = useState(1)
|
|
const [pageSize] = useState(DEFAULT_PAGE_SIZE)
|
|
|
|
/* 构建查询参数 */
|
|
const queryParams: TemplateListParams = useMemo(() => {
|
|
const params: TemplateListParams = {
|
|
page,
|
|
page_size: pageSize,
|
|
}
|
|
if (activeType !== "全部") params.category = activeType
|
|
if (searchText.trim()) params.keyword = searchText.trim()
|
|
if (durationRange) params.duration_range = durationRange
|
|
return params
|
|
}, [page, pageSize, activeType, searchText, durationRange])
|
|
|
|
/* 获取模板列表 */
|
|
const {
|
|
data: templateData,
|
|
isLoading,
|
|
isError,
|
|
error,
|
|
} = useQuery({
|
|
queryKey: ["templates", queryParams],
|
|
queryFn: () => getTemplates(queryParams),
|
|
staleTime: 30_000,
|
|
})
|
|
|
|
const templates = templateData?.items ?? []
|
|
const totalTemplates = templateData?.total ?? 0
|
|
|
|
/* 收藏 mutation */
|
|
const favMutation = useMutation({
|
|
mutationFn: toggleFavoriteTemplate,
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["templates"] })
|
|
},
|
|
})
|
|
|
|
/* 复制模板 mutation */
|
|
const copyMutation = useMutation({
|
|
mutationFn: copyTemplate,
|
|
onSuccess: (data) => {
|
|
message.success(`模板「${data.name}」已复制到「我的模板」`)
|
|
queryClient.invalidateQueries({ queryKey: ["templates"] })
|
|
},
|
|
onError: () => {
|
|
message.error("复制模板失败,请稍后重试")
|
|
},
|
|
})
|
|
|
|
/* 操作:切换收藏 */
|
|
const toggleFavorite = useCallback(
|
|
(id: string, e?: React.MouseEvent) => {
|
|
e?.stopPropagation()
|
|
favMutation.mutate(id)
|
|
},
|
|
[favMutation],
|
|
)
|
|
|
|
/* 操作:复制模板 */
|
|
const handleCopy = useCallback(
|
|
(template: TemplateItem) => {
|
|
copyMutation.mutate(template.id)
|
|
},
|
|
[copyMutation],
|
|
)
|
|
|
|
/* 操作:使用模板 → 跳转剪辑模板 */
|
|
const handleUse = useCallback(
|
|
(template: TemplateItem) => {
|
|
navigate(`/app/editing-planner?templateId=${template.id}`)
|
|
},
|
|
[navigate],
|
|
)
|
|
|
|
/* 操作:创建模板 */
|
|
const handleCreate = useCallback(() => {
|
|
navigate("/app/editing-planner")
|
|
}, [navigate])
|
|
|
|
/* 搜索 */
|
|
const handleSearchChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
|
|
setSearchText(e.target.value)
|
|
setPage(1)
|
|
}, [])
|
|
|
|
/* 切换分类 */
|
|
const handleCategoryChange = useCallback((type: EditTemplateType | "全部") => {
|
|
setActiveType(type)
|
|
setPage(1)
|
|
}, [])
|
|
|
|
/* 切换时长筛选 */
|
|
const handleDurationChange = useCallback((value: DurationRange) => {
|
|
setDurationRange(value)
|
|
setPage(1)
|
|
}, [])
|
|
|
|
return {
|
|
/* 状态 */
|
|
templates,
|
|
totalTemplates,
|
|
isLoading,
|
|
isError,
|
|
error,
|
|
searchText,
|
|
activeType,
|
|
durationRange,
|
|
page,
|
|
pageSize,
|
|
/* mutations */
|
|
favMutation,
|
|
copyMutation,
|
|
/* setters */
|
|
setPage,
|
|
/* handlers */
|
|
toggleFavorite,
|
|
handleCopy,
|
|
handleUse,
|
|
handleCreate,
|
|
handleSearchChange,
|
|
handleCategoryChange,
|
|
handleDurationChange,
|
|
}
|
|
}
|