diff --git a/src/hooks/useMainStore.ts b/src/hooks/useMainStore.ts
index 8122967..3e340e4 100644
--- a/src/hooks/useMainStore.ts
+++ b/src/hooks/useMainStore.ts
@@ -1,4 +1,4 @@
-import { MainStore, User } from '@/types'
+import { MainStore, ModelUser as User } from '@/types'
import { create } from 'zustand'
import { persist, createJSONStorage } from 'zustand/middleware'
diff --git a/src/main.tsx b/src/main.tsx
index e4f287b..9aaaaca 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -12,6 +12,7 @@ import ErrorPage from "./error-page";
import ProtectedRoute from './routes/protect';
import LoginPage from './routes/login';
import ServerPage from './routes/server';
+import ServicePage from './routes/service';
import { AuthProvider } from './hooks/useAuth';
const router = createBrowserRouter([
@@ -28,6 +29,10 @@ const router = createBrowserRouter([
path: "/dashboard",
element: ,
},
+ {
+ path: "/dashboard/service",
+ element: ,
+ },
]
},
]);
diff --git a/src/routes/server.tsx b/src/routes/server.tsx
index 9b98e4b..f08c3a5 100644
--- a/src/routes/server.tsx
+++ b/src/routes/server.tsx
@@ -1,7 +1,7 @@
import { swrFetcher } from "@/api/api"
import { Checkbox } from "@/components/ui/checkbox"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
-import { Server } from "@/types"
+import { ModelServer as Server } from "@/types"
import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table"
import useSWR from "swr"
@@ -42,7 +42,7 @@ export default function ServerPage() {
{
header: "Host",
accessorKey: "host.ip",
- accessorFn: (row) => row.host.ip,
+ accessorFn: (row) => row.host?.ip,
},
{
id: "actions",
diff --git a/src/routes/service.tsx b/src/routes/service.tsx
new file mode 100644
index 0000000..c78c8fc
--- /dev/null
+++ b/src/routes/service.tsx
@@ -0,0 +1,121 @@
+import { swrFetcher } from "@/api/api"
+import { Checkbox } from "@/components/ui/checkbox"
+import { Button } from "@/components/ui/button"
+import { Plus } from "lucide-react"
+import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
+import { ModelService as Service } from "@/types"
+import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table"
+import useSWR from "swr"
+
+export default function ServicePage() {
+ const columns: ColumnDef[] = [
+ {
+ id: "select",
+ header: ({ table }) => (
+ table.toggleAllPageRowsSelected(!!value)}
+ aria-label="Select all"
+ />
+ ),
+ cell: ({ row }) => (
+ row.toggleSelected(!!value)}
+ aria-label="Select row"
+ />
+ ),
+ enableSorting: false,
+ enableHiding: false,
+ },
+ {
+ header: "ID",
+ accessorKey: "id",
+ accessorFn: (row) => row.id,
+ },
+ {
+ header: "Name",
+ accessorKey: "name",
+ accessorFn: (row) => row.name,
+ },
+ {
+ header: "Type",
+ accessorKey: "service.type",
+ accessorFn: (row) => row.type,
+ },
+ {
+ id: "actions",
+ header: "Actions",
+ cell: ({ row }) => {
+ const s = row.original
+ return (
+ <>{s.id}>
+ )
+ },
+ },
+ ]
+
+ const { data, error, isLoading } = useSWR('/api/v1/service', swrFetcher)
+
+ const table = useReactTable({
+ data: data ?? [],
+ columns,
+ getCoreRowModel: getCoreRowModel(),
+ })
+
+ return
+
+
+ Service
+
+
+
+
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => {
+ return (
+
+ {header.isPlaceholder
+ ? null
+ : flexRender(
+ header.column.columnDef.header,
+ header.getContext()
+ )}
+
+ )
+ })}
+
+ ))}
+
+
+ {table.getRowModel().rows?.length ? (
+ table.getRowModel().rows.map((row) => (
+
+ {row.getVisibleCells().map((cell) => (
+
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
+
+ ))}
+
+ ))
+ ) : (
+
+
+ No results.
+
+
+ )}
+
+
+
+}
\ No newline at end of file