"use client"; import { useState, useEffect, useCallback } from "react"; import Link from "next/link"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { cloudDocsApi, type CloudDocLinkRead, type CloudDocLinkCreate, } from "@/lib/api/client"; import { FileStack, Plus, Pencil, Trash2, Loader2, ExternalLink } from "lucide-react"; import { toast } from "sonner"; export default function SettingsCloudDocsPage() { const [links, setLinks] = useState([]); const [loading, setLoading] = useState(true); const [dialogOpen, setDialogOpen] = useState(false); const [editingId, setEditingId] = useState(null); const [saving, setSaving] = useState(false); const [form, setForm] = useState({ name: "", url: "" }); const loadLinks = useCallback(async () => { try { const list = await cloudDocsApi.list(); setLinks(list); } catch { toast.error("加载云文档列表失败"); } finally { setLoading(false); } }, []); useEffect(() => { loadLinks(); }, [loadLinks]); const openAdd = () => { setEditingId(null); setForm({ name: "", url: "" }); setDialogOpen(true); }; const openEdit = (item: CloudDocLinkRead) => { setEditingId(item.id); setForm({ name: item.name, url: item.url }); setDialogOpen(true); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!form.name.trim() || !form.url.trim()) { toast.error("请填写名称和链接"); return; } setSaving(true); try { if (editingId) { await cloudDocsApi.update(editingId, { name: form.name.trim(), url: form.url.trim(), }); toast.success("已更新"); } else { const payload: CloudDocLinkCreate = { name: form.name.trim(), url: form.url.trim(), }; await cloudDocsApi.create(payload); toast.success("已添加"); } setDialogOpen(false); await loadLinks(); if (typeof window !== "undefined") { window.dispatchEvent(new CustomEvent("cloud-docs-changed")); } } catch (e) { toast.error(e instanceof Error ? e.message : "保存失败"); } finally { setSaving(false); } }; const handleDelete = async (id: string) => { if (!confirm("确定删除该云文档入口?")) return; try { await cloudDocsApi.delete(id); toast.success("已删除"); await loadLinks(); if (typeof window !== "undefined") { window.dispatchEvent(new CustomEvent("cloud-docs-changed")); } } catch (e) { toast.error(e instanceof Error ? e.message : "删除失败"); } }; return (
← 设置
云文档快捷入口

添加腾讯文档、飞书、语雀等云文档登录/入口链接,侧栏可快速打开。

{loading ? (

加载中…

) : links.length === 0 ? (

暂无云文档入口。添加后将显示在左侧边栏「云文档」区域,点击即可在新标签页打开。

) : ( 名称 链接 操作 {links.map((item) => ( {item.name} {item.url}
))}
)}
{editingId ? "编辑云文档入口" : "添加云文档入口"}
setForm((f) => ({ ...f, name: e.target.value }))} placeholder="如:腾讯文档、飞书、语雀" />
setForm((f) => ({ ...f, url: e.target.value }))} placeholder="https://..." />
); }