'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) => (
))}
{/* 场景描述 */}
{/* 按钮区 */}
)
}