diff --git a/nkebao/src/components/ui/button.tsx b/nkebao/src/components/ui/button.tsx index 4eb276f1..358d479e 100644 --- a/nkebao/src/components/ui/button.tsx +++ b/nkebao/src/components/ui/button.tsx @@ -8,6 +8,7 @@ interface ButtonProps { onClick?: (e?: React.MouseEvent) => void; disabled?: boolean; type?: 'button' | 'submit' | 'reset'; + loading?: boolean; } export function Button({ @@ -17,7 +18,8 @@ export function Button({ className = '', onClick, disabled = false, - type = 'button' + type = 'button', + loading = false }: ButtonProps) { const baseClasses = 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none'; @@ -43,9 +45,15 @@ export function Button({ ); diff --git a/nkebao/src/components/ui/input.tsx b/nkebao/src/components/ui/input.tsx index 9bc18656..adfa67d6 100644 --- a/nkebao/src/components/ui/input.tsx +++ b/nkebao/src/components/ui/input.tsx @@ -8,6 +8,12 @@ interface InputProps { className?: string; readOnly?: boolean; id?: string; + name?: string; + type?: string; + required?: boolean; + min?: number; + max?: number; + step?: number; } export function Input({ @@ -17,17 +23,28 @@ export function Input({ placeholder, className = '', readOnly = false, - id + id, + name, + type = 'text', + required = false, + min, + max, + step, }: InputProps) { return ( ); diff --git a/nkebao/src/pages/workspace/moments-sync/new.tsx b/nkebao/src/pages/workspace/moments-sync/new.tsx new file mode 100644 index 00000000..77413c48 --- /dev/null +++ b/nkebao/src/pages/workspace/moments-sync/new.tsx @@ -0,0 +1,135 @@ +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { useToast } from '@/components/ui/toast'; +import { createMomentsSyncTask } from '@/api/momentsSync'; + +export default function NewMomentsSyncTask() { + const navigate = useNavigate(); + const { toast } = useToast(); + const [loading, setLoading] = useState(false); + const [form, setForm] = useState({ + name: '', + deviceIds: '', // 逗号分隔 + contentLib: '', + syncMode: 'auto', + syncInterval: '30', + maxSyncPerDay: '100', + timeStart: '08:00', + timeEnd: '22:00', + targetTags: '', // 逗号分隔 + contentTypes: '', // 逗号分隔 + filterKeywords: '', // 逗号分隔 + }); + + const handleChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + setForm(prev => ({ + ...prev, + [name]: value, + })); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!form.name.trim()) { + toast({ title: '请输入任务名称', variant: 'destructive' }); + return; + } + if (!form.deviceIds.trim()) { + toast({ title: '请输入推送设备', variant: 'destructive' }); + return; + } + if (!form.contentLib.trim()) { + toast({ title: '请输入内容库', variant: 'destructive' }); + return; + } + setLoading(true); + try { + await createMomentsSyncTask({ + name: form.name, + devices: form.deviceIds.split(',').map(s => s.trim()).filter(Boolean), + contentLib: form.contentLib, + syncMode: form.syncMode as 'auto' | 'manual', + interval: Number(form.syncInterval), + maxSync: Number(form.maxSyncPerDay), + startTime: form.timeStart, + endTime: form.timeEnd, + targetTags: form.targetTags.split(',').map(s => s.trim()).filter(Boolean), + contentTypes: form.contentTypes.split(',').map(s => s.trim()).filter(Boolean) as ('text' | 'image' | 'video' | 'link')[], + filterKeywords: form.filterKeywords.split(',').map(s => s.trim()).filter(Boolean), + }); + toast({ title: '创建成功' }); + navigate('/workspace/moments-sync'); + } catch (error) { + toast({ title: '创建失败', variant: 'destructive' }); + } finally { + setLoading(false); + } + }; + + return ( +
+
+

新建朋友圈同步任务

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+ ); +} \ No newline at end of file