Skip to main content

概述

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

接口定义

每个 Selector 有自己独立的 props 接口,没有统一的 SelectorProps。以下是几个实际示例:
// UpscaleSelector props
interface UpscaleSelectorProps {
  threadId: string;
  image: Image;
  onClose: () => void;
}

// EraserSelector props
interface EraserSelectorProps {
  threadId: string;
  image: Image;
  getMaskImage: (imageWidth: number, imageHeight: number) => Promise<string | null>;
  onClose: () => void;
  onPaintSizeChange: (size: number) => void;
  onBackward: () => void;
  canBackward: boolean;
}

组件结构

每个 Selector 组件拥有自己的 props 接口和内部逻辑,但通常遵循类似的模式:
export function FilterSelector({ threadId, image, onClose }: FilterSelectorProps) {
  // 1. 本地状态
  const [selectedFilter, setSelectedFilter] = useState<Filter | null>(null);
  const [isProcessing, setIsProcessing] = useState(false);

  // 2. 确认处理
  const handleConfirm = async () => {
    setIsProcessing(true);
    // 调用 API
    await applyFilter({ imageId: image.id, filterId: selectedFilter.id });
    onClose();
  };

  // 3. 渲染 UI
  return (
    <div>
      {/* 选择界面 */}
    </div>
  );
}

Selector 列表

Selector文件功能
FilterSelectorcommon/generator/filter-selector.tsx滤镜选择和应用
ChooseFilterSelectorcommon/generator/choose-filter-selector.tsx滤镜预选
UpscaleSelectorcommon/generator/upscale-selector.tsx图片放大
EraserSelectorcommon/generator/eraser-selector.tsxAI 擦除
InpaintSelectorcommon/generator/inpaint-selector.tsx局部重绘
InpaintFromUserSelectorcommon/generator/inpaint-from-user-selector.tsx用户指定局部重绘
ExpandSelectorcommon/generator/expand-selector.tsx图片扩展
ReplaceBgSelectorcommon/generator/replacebg-selector.tsx背景替换
VideoSelectorcommon/generator/video-selector.tsx视频生成配置
MusicSelectorcommon/generator/music-selector.tsx歌曲生成配置
InstrumentalSelectorcommon/generator/instrumental-selector.tsx器乐生成配置
AddVocalsSelectorcommon/generator/add-vocals-selector.tsx添加人声配置
AddInstrumentalSelectorcommon/generator/add-instrumental-selector.tsx添加器乐配置
GenerateImageSelectorcommon/generator/generate-image-selector.tsx图片生成配置
导出功能不是 Selector,而是位于 tool/export.tsx

平台特定变体

部分 Selector 有 PC 和移动端的独立实现:
功能PC 版移动端版
调整PCAdjustSelectorMobileAdjustSelector
裁剪PCCropSelectorMobileCropSelector

最佳实践

  1. 所有用户确认操作必须埋点
  2. 处理中状态要有 loading 反馈
  3. 每个 Selector 定义自己的 props 接口,不使用统一接口