64387c00bb
CI/CD Pipeline / Check if frontend-only change (push) Blocked by required conditions
CI/CD Pipeline / Validate - Code Quality (push) Blocked by required conditions
CI/CD Pipeline / Validate - Type Check (mypy) (push) Blocked by required conditions
CI/CD Pipeline / Validate - Migration (alembic) (push) Blocked by required conditions
CI/CD Pipeline / Unit Tests (push) Blocked by required conditions
CI/CD Pipeline / Integration Tests (push) Blocked by required conditions
CI/CD Pipeline / Frontend Lint (push) Blocked by required conditions
CI/CD Pipeline / Frontend Unit Tests (push) Blocked by required conditions
CI/CD Pipeline / PR Build API Image (push) Blocked by required conditions
CI/CD Pipeline / PR Build Web Image (push) Blocked by required conditions
CI/CD Pipeline / PR Build Worker Image (push) Blocked by required conditions
CI/CD Pipeline / Build Staging API Image (push) Blocked by required conditions
CI/CD Pipeline / Build Staging Web Image (push) Blocked by required conditions
CI/CD Pipeline / Build Staging Worker Image (push) Blocked by required conditions
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Blocked by required conditions
CI/CD Pipeline / Staging E2E Tests (push) Blocked by required conditions
CI/CD Pipeline / Staging API Integration Tests (push) Blocked by required conditions
CI/CD Pipeline / Build Production API Image (push) Blocked by required conditions
CI/CD Pipeline / Build Production Web Image (push) Blocked by required conditions
CI/CD Pipeline / Build Production Worker Image (push) Blocked by required conditions
CI/CD Pipeline / Deploy Production (push) Blocked by required conditions
CI/CD Pipeline / Production Browser E2E (push) Blocked by required conditions
CI/CD Pipeline / ACR Image Cleanup (push) Blocked by required conditions
CI/CD Pipeline / Canary Release to Production (push) Blocked by required conditions
90 lines
2.2 KiB
TypeScript
90 lines
2.2 KiB
TypeScript
/**
|
|
* 贴纸配置面板
|
|
* 贴纸素材库(emoji / 图片)+ 文字花字 + 位置大小调整
|
|
*/
|
|
import React from "react"
|
|
import { Drawer, Switch } from "antd"
|
|
import type { StickerConfig } from "@/pages/editing-planner/types"
|
|
import StickerLibrary from "./sticker/StickerLibrary"
|
|
import StickerList from "./sticker/StickerList"
|
|
import StickerPropsEditor from "./sticker/StickerPropsEditor"
|
|
import { useStickerItems } from "@/pages/editing-planner/hooks/useStickerItems"
|
|
|
|
interface StickerPanelProps {
|
|
open: boolean
|
|
onClose: () => void
|
|
config: StickerConfig
|
|
onChange: (config: StickerConfig) => void
|
|
totalDuration: number
|
|
}
|
|
|
|
const StickerPanel: React.FC<StickerPanelProps> = ({
|
|
open,
|
|
onClose,
|
|
config,
|
|
onChange,
|
|
totalDuration,
|
|
}) => {
|
|
const {
|
|
selectedId,
|
|
setSelectedId,
|
|
activeTab,
|
|
setActiveTab,
|
|
selectedSticker,
|
|
updateItem,
|
|
addSticker,
|
|
removeSticker,
|
|
handleReset,
|
|
} = useStickerItems({ config, onChange, totalDuration })
|
|
|
|
return (
|
|
<Drawer
|
|
title="贴纸"
|
|
placement="right"
|
|
width={460}
|
|
open={open}
|
|
onClose={onClose}
|
|
className="sticker-panel-drawer"
|
|
>
|
|
{/* 顶部开关 */}
|
|
<div className="sticker-header">
|
|
<span className="sticker-header-label">启用贴纸</span>
|
|
<Switch
|
|
size="small"
|
|
checked={config.enabled}
|
|
onChange={(checked) => onChange({ ...config, enabled: checked })}
|
|
/>
|
|
</div>
|
|
|
|
{/* 素材库 + 类型Tab */}
|
|
<StickerLibrary activeTab={activeTab} onTabChange={setActiveTab} onAddSticker={addSticker} />
|
|
|
|
{/* 已添加贴纸列表 */}
|
|
<StickerList
|
|
items={config.items}
|
|
selectedId={selectedId}
|
|
onSelect={setSelectedId}
|
|
onDelete={removeSticker}
|
|
/>
|
|
|
|
{/* 选中贴纸的属性编辑 */}
|
|
{selectedSticker && (
|
|
<StickerPropsEditor
|
|
sticker={selectedSticker}
|
|
totalDuration={totalDuration}
|
|
onUpdate={updateItem}
|
|
/>
|
|
)}
|
|
|
|
{/* 底部重置 */}
|
|
<div className="sticker-footer">
|
|
<button className="sticker-reset-btn" onClick={handleReset}>
|
|
清空所有贴纸
|
|
</button>
|
|
</div>
|
|
</Drawer>
|
|
)
|
|
}
|
|
|
|
export default StickerPanel
|