import { useState } from 'react'; import { Link } from 'react-router'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Plus, Building2 } from 'lucide-react'; import { api } from '@/lib/api'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; interface Organization { id: string; name: string; slug: string; maxServers: number; maxNodes: number; createdAt: string; } interface PaginatedResponse { data: T[]; meta: { total: number; page: number; perPage: number; totalPages: number }; } export function OrganizationsPage() { const queryClient = useQueryClient(); const [open, setOpen] = useState(false); const [name, setName] = useState(''); const [slug, setSlug] = useState(''); const { data } = useQuery({ queryKey: ['organizations'], queryFn: () => api.get>('/organizations'), }); const createMutation = useMutation({ mutationFn: (body: { name: string; slug: string }) => api.post('/organizations', body), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['organizations'] }); setOpen(false); setName(''); setSlug(''); }, }); return (

Organizations

Manage your organizations

Create Organization
{ e.preventDefault(); createMutation.mutate({ name, slug }); }} className="space-y-4" >
setName(e.target.value)} required />
setSlug(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, ''))} pattern="^[a-z0-9-]+$" required />
{data?.data.map((org) => (
{org.name} {org.slug}
Max {org.maxServers} servers Max {org.maxNodes} nodes
))}
); }