From f820d54b23a69eec21c474aefdbb643f56c7a0ed Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 09:06:10 +0800 Subject: [PATCH] =?UTF-8?q?refactor(StickerPanel):=20=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E9=80=BB=E8=BE=91Hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StickerPanel/hooks/useStickerPanel.ts | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 apps/web/src/pages/editing-planner/components/StickerPanel/hooks/useStickerPanel.ts diff --git a/apps/web/src/pages/editing-planner/components/StickerPanel/hooks/useStickerPanel.ts b/apps/web/src/pages/editing-planner/components/StickerPanel/hooks/useStickerPanel.ts new file mode 100644 index 000000000..027a36959 --- /dev/null +++ b/apps/web/src/pages/editing-planner/components/StickerPanel/hooks/useStickerPanel.ts @@ -0,0 +1,85 @@ +import { useState, useCallback, useMemo } from "react" +import type { StickerConfig, StickerItem, StickerType } from "../../types" +import { DEFAULT_STICKER_CONFIG, DEFAULT_STICKER_ITEM } from "../../types" +import { genStickerId } from "../constants" + +interface UseStickerPanelOptions { + config: StickerConfig + onChange: (config: StickerConfig) => void + totalDuration: number +} + +export const useStickerPanel = ({ config, onChange, totalDuration }: UseStickerPanelOptions) => { + const [selectedId, setSelectedId] = useState(null) + const [activeTab, setActiveTab] = useState("emoji") + const [textInput, setTextInput] = useState("") + + const selectedSticker = useMemo( + () => config.items.find((s) => s.id === selectedId) ?? null, + [config.items, selectedId], + ) + + /** 更新单个贴纸 */ + const updateItem = useCallback( + (id: string, partial: Partial) => { + onChange({ + ...config, + items: config.items.map((s) => (s.id === id ? { ...s, ...partial } : s)), + }) + }, + [config, onChange], + ) + + /** 添加贴纸 */ + const addSticker = useCallback( + (type: StickerType, content: string) => { + const newItem: StickerItem = { + ...DEFAULT_STICKER_ITEM, + id: genStickerId(), + type, + content, + duration: totalDuration > 0 ? totalDuration : 5, + z_index: config.items.length + 1, + } + onChange({ + ...config, + enabled: true, + items: [...config.items, newItem], + }) + setSelectedId(newItem.id) + }, + [config, onChange, totalDuration], + ) + + /** 删除贴纸 */ + const removeSticker = useCallback( + (id: string) => { + onChange({ + ...config, + items: config.items.filter((s) => s.id !== id), + }) + if (selectedId === id) setSelectedId(null) + }, + [config, onChange, selectedId], + ) + + /** 重置所有 */ + const handleReset = useCallback(() => { + onChange({ ...DEFAULT_STICKER_CONFIG, enabled: config.enabled }) + setSelectedId(null) + }, [config.enabled, onChange]) + + return { + selectedId, + setSelectedId, + selectedSticker, + activeTab, + setActiveTab, + textInput, + setTextInput, + updateItem, + addSticker, + removeSticker, + handleReset, + } +}