import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { getDirectusClient, readItems, createItem, updateItem, deleteItem } from '@/lib/directus/client'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Card, CardHeader, CardTitle, CardContent, CardFooter } from '@/components/ui/card'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogTrigger } from '@/components/ui/dialog'; import { Globe, Plus, Settings, Trash2, ExternalLink } from 'lucide-react'; import { toast } from 'sonner'; const client = getDirectusClient(); interface Site { id: string; name: string; domain: string; status: 'active' | 'inactive'; settings?: any; } export default function SitesManager() { const queryClient = useQueryClient(); const [editorOpen, setEditorOpen] = useState(false); const [editingSite, setEditingSite] = useState>({}); // Fetch const { data: sites = [], isLoading } = useQuery({ queryKey: ['sites'], queryFn: async () => { // @ts-ignore const res = await client.request(readItems('sites', { limit: -1 })); return res as unknown as Site[]; } }); // Mutations const mutation = useMutation({ mutationFn: async (site: Partial) => { if (site.id) { // @ts-ignore await client.request(updateItem('sites', site.id, site)); } else { // @ts-ignore await client.request(createItem('sites', site)); } }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['sites'] }); toast.success(editingSite.id ? 'Site updated' : 'Site created'); setEditorOpen(false); } }); const deleteMutation = useMutation({ mutationFn: async (id: string) => { // @ts-ignore await client.request(deleteItem('sites', id)); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['sites'] }); toast.success('Site deleted'); } }); return (

Your Sites

Manage your deployed web properties.

{sites.map((site) => ( {site.name} {site.status || 'inactive'}
{site.domain}

deployed via Launchpad

))} {sites.length === 0 && (

No sites configured yet.

)}
{editingSite.id ? 'Edit Site' : 'New Site'}
setEditingSite({ ...editingSite, name: e.target.value })} placeholder="My Awesome Blog" className="bg-zinc-950 border-zinc-800" />
https:// setEditingSite({ ...editingSite, domain: e.target.value })} placeholder="example.com" className="rounded-l-none bg-zinc-950 border-zinc-800" />
); }