import { useState, useCallback } from 'react'; import { Card } from '@/components/ui/Card'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { Textarea } from '@/components/ui/Textarea'; import { Select } from '@/components/ui/Select'; import { Tabs } from '@/components/ui/Tabs'; import { JsonViewer } from '@/components/ui/JsonViewer'; import { useToast } from '@/context/ToastContext'; import { publishImage, publishVideo } from '@/api/endpoints'; export function PublishPage() { const { toast } = useToast(); const [tab, setTab] = useState('image'); // Image form const [imgTitle, setImgTitle] = useState(''); const [imgContent, setImgContent] = useState(''); const [imgPaths, setImgPaths] = useState(''); const [imgTags, setImgTags] = useState(''); const [imgVisibility, setImgVisibility] = useState('public'); const [imgOriginal, setImgOriginal] = useState(false); const [imgLoading, setImgLoading] = useState(false); const [imgResult, setImgResult] = useState(null); // Video form const [vidTitle, setVidTitle] = useState(''); const [vidContent, setVidContent] = useState(''); const [vidPath, setVidPath] = useState(''); const [vidTags, setVidTags] = useState(''); const [vidVisibility, setVidVisibility] = useState('public'); const [vidLoading, setVidLoading] = useState(false); const [vidResult, setVidResult] = useState(null); const handlePublishImage = useCallback(async () => { if (!imgTitle.trim() || !imgPaths.trim()) { toast('warning', '标题和图片为必填项'); return; } setImgLoading(true); setImgResult(null); try { const images = imgPaths.split('\n').map((s) => s.trim()).filter(Boolean); const tags = imgTags.split(',').map((s) => s.trim()).filter(Boolean); const res = await publishImage({ title: imgTitle, content: imgContent, images, tags: tags.length > 0 ? tags : undefined, is_original: imgOriginal, visibility: imgVisibility as 'public' | 'private' | 'friends', }); setImgResult(res); if (res.success) { toast('success', '图文笔记发布成功!'); } else { toast('error', res.error?.message || '发布失败'); } } catch (err) { const msg = err instanceof Error ? err.message : '发布失败'; toast('error', msg); setImgResult({ error: msg }); } finally { setImgLoading(false); } }, [imgTitle, imgContent, imgPaths, imgTags, imgVisibility, imgOriginal, toast]); const handlePublishVideo = useCallback(async () => { if (!vidTitle.trim() || !vidPath.trim()) { toast('warning', '标题和视频路径为必填项'); return; } setVidLoading(true); setVidResult(null); try { const tags = vidTags.split(',').map((s) => s.trim()).filter(Boolean); const res = await publishVideo({ title: vidTitle, content: vidContent, video: vidPath, tags: tags.length > 0 ? tags : undefined, visibility: vidVisibility as 'public' | 'private' | 'friends', }); setVidResult(res); if (res.success) { toast('success', '视频笔记发布成功!'); } else { toast('error', res.error?.message || '发布失败'); } } catch (err) { const msg = err instanceof Error ? err.message : '发布失败'; toast('error', msg); setVidResult({ error: msg }); } finally { setVidLoading(false); } }, [vidTitle, vidContent, vidPath, vidTags, vidVisibility, toast]); return (

发布笔记

{tab === 'image' && (
setImgTitle(e.target.value)} placeholder="笔记标题" />