'use client' import { logError as _ulogError } from '@/lib/logging/core' import { useState } from 'react' import { useTranslations } from 'next-intl' import { ART_STYLES } from '@/lib/constants' import { useAiDesignLocation, useCreateAssetHubLocation } from '@/lib/query/hooks' import { useImageGenerationCount } from '@/lib/image-generation/use-image-generation-count' import TaskStatusInline from '@/components/task/TaskStatusInline' import { resolveTaskPresentationState } from '@/lib/task/presentation' import { AppIcon } from '@/components/ui/icons' interface AddLocationModalProps { folderId: string | null onClose: () => void onSuccess: () => void } // 内联 SVG 图标 const XMarkIcon = ({ className }: { className?: string }) => ( ) const SparklesIcon = ({ className }: { className?: string }) => ( ) export function AddLocationModal({ folderId, onClose, onSuccess }: AddLocationModalProps) { const t = useTranslations('assetHub') // 表单字段 const [name, setName] = useState('') const [summary, setSummary] = useState('') const [aiInstruction, setAiInstruction] = useState('') const [artStyle, setArtStyle] = useState('american-comic') const aiDesignMutation = useAiDesignLocation() const createLocationMutation = useCreateAssetHubLocation() const { count: locationGenerationCount } = useImageGenerationCount('location') const isSubmitting = createLocationMutation.isPending const isAiDesigning = aiDesignMutation.isPending const aiDesigningState = isAiDesigning ? resolveTaskPresentationState({ phase: 'processing', intent: 'generate', resource: 'image', hasOutput: false, }) : null const submittingState = isSubmitting ? resolveTaskPresentationState({ phase: 'processing', intent: 'generate', resource: 'image', hasOutput: false, }) : null // AI 设计描述 const handleAiDesign = async () => { if (!aiInstruction.trim()) return try { const data = await aiDesignMutation.mutateAsync(aiInstruction.trim()) setSummary(data.prompt || '') setAiInstruction('') } catch (error) { _ulogError('AI设计失败:', error) } } // 提交 const handleSubmit = async () => { if (!name.trim() || !summary.trim()) return try { await createLocationMutation.mutateAsync({ name: name.trim(), summary: summary.trim(), folderId, artStyle, count: locationGenerationCount, }) onSuccess() } catch (error) { _ulogError('创建场景失败:', error) } } return (
{/* 标题 */}

{t('modal.newLocation')}

{/* AI 设计区域 */}
{t('modal.aiDesign')}
setAiInstruction(e.target.value)} placeholder={t('modal.aiDesignLocationPlaceholder')} className="glass-input-base flex-1 px-3 py-2 text-sm" disabled={isAiDesigning} onKeyDown={(e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault() handleAiDesign() } }} />

{t('modal.aiDesignLocationTip')}

{/* 场景名称 */}
setName(e.target.value)} placeholder={t('modal.locationNamePlaceholder')} className="glass-input-base w-full px-3 py-2 text-sm" />
{/* 风格选择 */}
{ART_STYLES.map((style) => ( ))}
{/* 场景描述 */}