import * as React from 'react' import { AppField } from '@/components/app/AppField' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Switch } from '@/components/ui/switch' import { Textarea } from '@/components/ui/textarea' import type { TicketStatus } from './types' const STATUS_ACTION_LABELS: Partial> = { in_progress: '开始处理', pending_confirm: '提交确认', resolved: '标记解决', closed: '关闭工单' } type TicketTransitionDialogProps = { open: boolean status: TicketStatus | null actionLabel?: string defaultResolution?: string defaultRemark?: string onOpenChange: (open: boolean) => void onSubmit: ( status: TicketStatus, values: { remark: string resolution: string is_resolved?: boolean replied_to_customer: boolean } ) => Promise } export function TicketTransitionDialog({ open, status, actionLabel: customActionLabel, defaultResolution = '', defaultRemark = '', onOpenChange, onSubmit }: TicketTransitionDialogProps) { const [remark, setRemark] = React.useState('') const [resolution, setResolution] = React.useState('') const [repliedToCustomer, setRepliedToCustomer] = React.useState(true) const [submitting, setSubmitting] = React.useState(false) const actionLabel = customActionLabel ?? (status ? STATUS_ACTION_LABELS[status] ?? '调整状态' : '调整状态') const isResolveAction = status === 'resolved' const isOutcomeAction = status === 'resolved' || status === 'closed' const canSubmit = isResolveAction ? Boolean((resolution || remark).trim()) : Boolean(remark.trim()) React.useEffect(() => { if (open) { setRemark(defaultRemark) setResolution(defaultResolution) setRepliedToCustomer(true) setSubmitting(false) return } setRemark('') setResolution('') setRepliedToCustomer(true) setSubmitting(false) }, [defaultRemark, defaultResolution, open]) async function handleSubmit(event: React.FormEvent) { event.preventDefault() if (!status || !canSubmit) return setSubmitting(true) try { await onSubmit(status, { remark: remark.trim(), resolution: resolution.trim(), is_resolved: status === 'resolved' ? true : undefined, replied_to_customer: repliedToCustomer }) onOpenChange(false) } finally { setSubmitting(false) } } return (
{actionLabel} {isOutcomeAction ? '填写本次处理结论,系统会同步记录到工单详情和流转时间线。' : '请说明本次流转的原因、处理动作或待确认事项。'} {isOutcomeAction ? (