import { useMemo, useState } from 'react' import { toast } from 'sonner' import { Briefcase, Loader2, XCircle } from 'lucide-react' import { EmptyState } from '@/components/common/EmptyState' import { Card, CardContent } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog' import type { Consultation, ExpertService } from '@/types' import { api } from '@/lib/api' import { useWorkbenchData, WorkbenchShell, maskPhone } from './shared' /** 专家工作台 - 服务中用户:已确认服务关系的用户列表,可取消服务 */ export function WorkbenchUsers() { const { expert, services, consultations, loading, error, loadData } = useWorkbenchData() const [cancelService, setCancelService] = useState(null) const [cancelling, setCancelling] = useState(false) const activeServices = services.filter(s => s.status === 'active') /** 按服务用户分组咨询 */ const consultationsByUser = useMemo(() => { const map = new Map() for (const c of consultations) { const phone = c.user_phone || 'unknown' if (!map.has(phone)) { map.set(phone, []) } map.get(phone)!.push(c) } return map }, [consultations]) /** 确认取消服务关系 */ const handleCancel = async () => { if (!cancelService) return setCancelling(true) try { await api.cancelExpertService(cancelService.service_id) toast.success('服务关系已取消') setCancelService(null) loadData() } catch (e) { toast.error(e instanceof Error ? e.message : '取消失败') } finally { setCancelling(false) } } return ( {activeServices.length === 0 ? ( ) : (
{activeServices.map((s) => { const userConsultations = consultationsByUser.get(s.user_phone || '') || [] return (

用户:{maskPhone(s.user_phone || '')}

签约时间:{s.signed_at} {userConsultations.length > 0 && ` · ${userConsultations.length} 条咨询`}

服务中
) })}
)} {/* 取消服务确认弹窗 */} !o && setCancelService(null)}> 取消服务关系 确认取消与用户「{cancelService ? maskPhone(cancelService.user_phone || '') : ''}」的服务关系?取消后不可恢复。
) }