import { useEffect, useState } from "react"; import { useStudioStore } from '../studio/store.ts'; import { Search, RotateCw, Plus, MoreHorizontal, Layout, Edit2, Trash2, MousePointer2, Book } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { ViewEditor } from "@/pages/view/components/ViewEditor.tsx"; import { toast } from "sonner"; import { useShallow } from "zustand/shallow"; import { DocsModal } from './components/DocsModal.tsx' const ViewItem = ({ view, onEdit, onDelete, onDeleteViewItem }: { view: any; onEdit: (view: any) => void; onDelete: (id: string) => void; onDeleteViewItem: (id: string, viewId: string) => void }) => { const [expanded, setExpanded] = useState(false); const studioStore = useStudioStore(useShallow((state) => ({ currentView: state.currentView, searchRoutes: state.searchRoutes }))); useEffect(() => { const currentViewId = studioStore.currentView?.viewId; if (view.views.some((v: any) => v.id === currentViewId)) { setExpanded(true); } }, [studioStore.currentView?.viewId]); const ShowViews = (props: { views: { id: string, title: string, query?: any }[] }) => { const studioStore = useStudioStore(useShallow((state) => ({ currentView: state.currentView, setCurrentView: state.setCurrentView, }))); const currentViewId = studioStore.currentView?.viewId; const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false); const [deleteTargetId, setDeleteTargetId] = useState(null); const isActiveView = (viewId: string) => { return viewId === currentViewId; } return
{props.views.map(v => (
{ studioStore.setCurrentView({ ...view, viewId: v.id }) }} > {v.title || '未命名视图'}
{v.query ? v.query : '无查询字段'}
{ if (!open) { setDeleteConfirmOpen(false); setDeleteTargetId(null); } }}> { e.stopPropagation(); setDeleteTargetId(v.id); setDeleteConfirmOpen(true); }} />

删除视图

确定要删除这个视图吗?此操作无法撤销。

))}
} return
setExpanded(!expanded)}>
{view.title || '未命名视图'}
e.stopPropagation()} > { e.stopPropagation(); studioStore.searchRoutes('') }}> 选中 { e.stopPropagation(); onEdit(view); }}> 编辑 { e.stopPropagation(); onDelete(view.id); }} className="cursor-pointer text-red-600 focus:text-red-600" > 删除
{expanded && }
} export const ViewList = () => { const store = useStudioStore(useShallow((state) => ({ routeViewList: state.routeViewList, updateRouteView: state.updateRouteView, deleteRouteView: state.deleteRouteView, deleteRouteViewItem: state.deleteRouteViewItem, getViewList: state.getViewList, setShowApiDocs: state.setShowApiDocs, }))); const [searchTerm, setSearchTerm] = useState(""); const [editorOpen, setEditorOpen] = useState(false); const [editingView, setEditingView] = useState(null); const filteredViews = store.routeViewList.filter(view => (view.title || '未命名视图').toLowerCase().includes(searchTerm.toLowerCase()) || (view.description || '').toLowerCase().includes(searchTerm.toLowerCase()) ); useEffect(() => { store.getViewList(); }, []) const handleRefresh = async () => { const toastId = toast.loading('正在刷新视图列表...'); await store.getViewList(); // toast.update(toastId, { render: '视图列表已刷新', type: 'success', id: false, autoClose: 1000 }); toast.success('视图列表已刷新', { duration: 1000 }); toast.dismiss(toastId); }; const handleAdd = () => { handleEdit({}); }; const handleEdit = (view: any) => { setEditingView(view); setEditorOpen(true); }; const handleDelete = (id: string) => { if (confirm('确定要删除这个视图吗?')) { store.deleteRouteView(id); } }; const handleSaveView = (viewData: any) => { store.updateRouteView(viewData); }; return (
setSearchTerm(e.target.value)} />
{filteredViews.length === 0 ? (
{searchTerm ? '未找到匹配的视图' : '暂无视图'}
) : ( filteredViews.map((view) => ( )) )}
); }