Skip to main content

概述

所有编辑工具使用统一的 Selector 模式,确保一致的用户体验。

接口定义

interface SelectorProps {
  image: Image;           // 当前编辑的图片
  threadId: string;       // 对话线程 ID
  source: ToolSource;     // 触发来源
  onComplete: () => void; // 完成回调
  onCancel: () => void;   // 取消回调
}

type ToolSource = 'ai' | 'toolbar';

组件结构

每个 Selector 组件遵循相同的结构:
export function FilterSelector({ image, threadId, source, onComplete, onCancel }: SelectorProps) {
  // 1. 本地状态
  const [selectedFilter, setSelectedFilter] = useState<Filter | null>(null);
  const [isProcessing, setIsProcessing] = useState(false);

  // 2. 埋点
  const { trackUserInputConfirmed } = useAnalytics();

  // 3. 确认处理
  const handleConfirm = async () => {
    setIsProcessing(true);

    // 调用 API
    await applyFilter({ imageId: image.id, filterId: selectedFilter.id });

    // 埋点
    trackUserInputConfirmed('applyFilter', threadId, source, {
      image_id: image.id,
      filter_id: selectedFilter.id,
    });

    onComplete();
  };

  // 4. 渲染 UI
  return (
    <div>
      {/* 选择界面 */}
      <ActionButtons onConfirm={handleConfirm} onCancel={onCancel} />
    </div>
  );
}

Selector 列表

Selector文件功能
FilterSelectorcommon/generator/filter/滤镜选择和应用
AdjustSelectorcommon/generator/adjust/参数调整
CropSelectorcommon/generator/crop/图片裁剪
UpscaleSelectorcommon/generator/upscale/图片放大
EraserSelectorcommon/generator/eraser/AI 擦除
InpaintSelectorcommon/generator/inpaint/局部重绘
ExpandSelectorcommon/generator/expand/图片扩展
ReplaceBgSelectorcommon/generator/replace-bg/背景替换
ExportSelectorcommon/generator/export/导出下载

最佳实践

  1. Selector 必须支持两种触发来源 (ai / toolbar)
  2. 所有用户确认操作必须埋点
  3. 处理中状态要有 loading 反馈