import { Link, useNavigate } from 'react-router' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Pencil, Plus, Trash2 } from 'lucide-react' import { useState } from 'react' import { api } from '../lib/api' import type { NoteItem } from '../lib/api' import { invalidatePublic } from '../lib/invalidate' import { useAuth } from '../lib/auth' import { formatDateTime } from '../lib/utils' function useAdminNotes() { return useQuery({ queryKey: ['admin', 'notes'], queryFn: () => api<{ items: NoteItem[]; total: number }>('/api/admin/notes'), }) } export default function AdminList() { const { data, isLoading } = useAdminNotes() const { logout } = useAuth() const navigate = useNavigate() const qc = useQueryClient() const [confirmId, setConfirmId] = useState(null) const trashMutation = useMutation({ mutationFn: (id: number) => api(`/api/admin/notes/${id}`, { method: 'DELETE' }), onSuccess: () => { setConfirmId(null) void qc.invalidateQueries({ queryKey: ['admin'] }) invalidatePublic(qc) }, }) const toggleStatus = useMutation({ mutationFn: async (note: NoteItem) => { // 状态切换:读全文 → 翻转 status → PUT const full = await api(`/api/admin/notes/${note.id}`) return api(`/api/admin/notes/${note.id}`, { method: 'PUT', body: JSON.stringify({ title: full.title, slug: full.slug, summary: full.summary, content: full.content, status: full.status === 'public' ? 'private' : 'public', tags: full.tags, pinned: full.pinned, }), }) }, onSuccess: () => { void qc.invalidateQueries({ queryKey: ['admin'] }) invalidatePublic(qc) }, }) return (

笔记管理({data?.total ?? 0})

新建
{isLoading ? (

加载中…

) : !data || data.items.length === 0 ? (

还没有笔记,点击「新建」开始

) : (
    {data.items.map((n) => (
  • {n.status === 'public' ? '公开' : '私有'} {n.pinned && 置顶}
    {n.title}

    /{n.slug} · {formatDateTime(n.updated_at)} {n.tags.length > 0 && ' · ' + n.tags.map((t) => '#' + t).join(' ')}

    {confirmId === n.id && (

    移入回收站?

    「{n.title}」将被软删除,30 天内可在回收站恢复。

    {trashMutation.isError && (

    操作失败,请重试

    )}
    )}
  • ))}
)}
) }