import { useCallback, useEffect, useState } from 'react'; import { Button, Card, Form, Input, InputNumber, Modal, Select, Space, Switch, Tabs, TimePicker, Typography, message, } from 'antd'; import dayjs, { type Dayjs } from 'dayjs'; import { WECOM_REPORT_KIND_LABELS, WECOM_REPORT_KINDS, WECOM_REPORT_WEEKDAY_OPTIONS, type WecomReportKind, type WecomReportPreviewDto, type WecomReportPushDto, } from '@dukang/shared-types'; import { request } from '../lib/api'; import { fmtTime } from '../lib/constants'; type FormValues = { name: string; webhookUrl: string; enabled: boolean; mentionWecomUserId?: string; sendTime: Dayjs; sendWeekday: number; sendMonthDay: number; }; function ReportKindPane({ kind, row, onSaved, }: { kind: WecomReportKind; row: WecomReportPushDto | undefined; onSaved: () => void; }) { const [form] = Form.useForm(); const [saving, setSaving] = useState(false); const [previewing, setPreviewing] = useState(false); const [sending, setSending] = useState(false); const [preview, setPreview] = useState(null); useEffect(() => { if (!row) return; form.setFieldsValue({ name: row.name, webhookUrl: row.webhookUrl, enabled: row.enabled, mentionWecomUserId: row.mentionWecomUserId ?? undefined, sendTime: dayjs().hour(row.sendHour).minute(row.sendMinute).second(0), sendWeekday: row.sendWeekday, sendMonthDay: row.sendMonthDay, }); }, [form, row]); async function save() { const values = await form.validateFields(); setSaving(true); try { await request(`/admin/wecom-reports/${kind}`, { method: 'PUT', body: JSON.stringify({ name: values.name, webhookUrl: values.webhookUrl, enabled: values.enabled, mentionWecomUserId: values.mentionWecomUserId?.trim() || null, sendHour: values.sendTime.hour(), sendMinute: values.sendTime.minute(), sendWeekday: values.sendWeekday, sendMonthDay: values.sendMonthDay, }), }); message.success('已保存'); onSaved(); } catch (e) { message.error(e instanceof Error ? e.message : '保存失败'); } finally { setSaving(false); } } async function openPreview() { setPreviewing(true); try { const data = await request(`/admin/wecom-reports/${kind}/preview`, { method: 'POST', body: '{}', }); setPreview(data); } catch (e) { message.error(e instanceof Error ? e.message : '预览失败'); } finally { setPreviewing(false); } } async function sendNow() { setSending(true); try { const res = await request<{ message: string }>(`/admin/wecom-reports/${kind}/send`, { method: 'POST', body: '{}', }); message.success(res.message || '已发送'); onSaved(); } catch (e) { message.error(e instanceof Error ? e.message : '发送失败'); } finally { setSending(false); } } const label = WECOM_REPORT_KIND_LABELS[kind]; return ( <>
{kind === 'weekly' ? (