import React, { useState } from 'react'; import { useNavigate } from 'react-router'; import { Badge, Button, Card, DataTable, EmptyState, FormField, Input, Modal, Spinner, useToast, } from '@cameleer/design-system'; import type { Column } from '@cameleer/design-system'; import { useAuth } from '../auth/useAuth'; import { useEnvironments, useCreateEnvironment } from '../api/hooks'; import { RequirePermission } from '../components/RequirePermission'; import type { EnvironmentResponse } from '../types/api'; interface TableRow { id: string; displayName: string; slug: string; status: string; createdAt: string; _raw: EnvironmentResponse; } const columns: Column[] = [ { key: 'displayName', header: 'Name', render: (_val, row) => ( {row.displayName} ), }, { key: 'slug', header: 'Slug', render: (_val, row) => ( ), }, { key: 'status', header: 'Status', render: (_val, row) => ( ), }, { key: 'createdAt', header: 'Created', render: (_val, row) => new Date(row.createdAt).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric', }), }, ]; export function EnvironmentsPage() { const navigate = useNavigate(); const { toast } = useToast(); const { tenantId } = useAuth(); const { data: environments, isLoading } = useEnvironments(tenantId ?? ''); const createMutation = useCreateEnvironment(tenantId ?? ''); const [modalOpen, setModalOpen] = useState(false); const [slug, setSlug] = useState(''); const [displayName, setDisplayName] = useState(''); const tableData: TableRow[] = (environments ?? []).map((env) => ({ id: env.id, displayName: env.displayName, slug: env.slug, status: env.status, createdAt: env.createdAt, _raw: env, })); function openModal() { setSlug(''); setDisplayName(''); setModalOpen(true); } function closeModal() { setModalOpen(false); } async function handleCreate(e: React.FormEvent) { e.preventDefault(); if (!slug.trim() || !displayName.trim()) return; try { await createMutation.mutateAsync({ slug: slug.trim(), displayName: displayName.trim() }); toast({ title: 'Environment created', variant: 'success' }); closeModal(); } catch { toast({ title: 'Failed to create environment', variant: 'error' }); } } if (isLoading) { return (
); } return (
{/* Page header */}

Environments

{/* Table / empty state */} {tableData.length === 0 ? ( } /> ) : ( columns={columns} data={tableData} onRowClick={(row) => navigate(`/environments/${row.id}`)} flush /> )} {/* Create Environment Modal */}
setSlug(e.target.value)} placeholder="e.g. production" required /> setDisplayName(e.target.value)} placeholder="e.g. Production" required />
); }