'use client'; import { useState } from 'react'; import { BellIcon, CheckCircleIcon, CircleDollarSignIcon, CreditCardIcon, DatabaseIcon, ListIcon, ShieldIcon, TagIcon, } from 'lucide-react'; import { Badge } from '@kit/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@kit/ui/dialog'; import { Separator } from '@kit/ui/separator'; interface DatabaseEnum { name: string; values: string[]; sourceFile: string; category: string; description: string; } interface EnumBrowserProps { searchTerm: string; enums: DatabaseEnum[]; } const categoryColors: Record = { 'Security & Permissions': 'bg-red-100 text-red-800', 'Billing & Payments': 'bg-green-100 text-green-800', Notifications: 'bg-blue-100 text-blue-800', }; const categoryIcons: Record> = { 'Security & Permissions': ShieldIcon, 'Billing & Payments': CreditCardIcon, Notifications: BellIcon, }; const valueColors: Record = { // Permission colors 'roles.manage': 'bg-purple-100 text-purple-800', 'billing.manage': 'bg-green-100 text-green-800', 'settings.manage': 'bg-blue-100 text-blue-800', 'members.manage': 'bg-orange-100 text-orange-800', 'invites.manage': 'bg-teal-100 text-teal-800', // Payment provider colors stripe: 'bg-purple-100 text-purple-800', 'lemon-squeezy': 'bg-yellow-100 text-yellow-800', paddle: 'bg-blue-100 text-blue-800', // Notification channel colors in_app: 'bg-blue-100 text-blue-800', email: 'bg-green-100 text-green-800', // Notification type colors info: 'bg-blue-100 text-blue-800', warning: 'bg-yellow-100 text-yellow-800', error: 'bg-red-100 text-red-800', // Payment status colors pending: 'bg-yellow-100 text-yellow-800', succeeded: 'bg-green-100 text-green-800', failed: 'bg-red-100 text-red-800', // Subscription item type colors flat: 'bg-gray-100 text-gray-800', per_seat: 'bg-orange-100 text-orange-800', metered: 'bg-purple-100 text-purple-800', // Subscription status colors active: 'bg-green-100 text-green-800', trialing: 'bg-blue-100 text-blue-800', past_due: 'bg-yellow-100 text-yellow-800', canceled: 'bg-red-100 text-red-800', unpaid: 'bg-red-100 text-red-800', incomplete: 'bg-gray-100 text-gray-800', incomplete_expired: 'bg-gray-100 text-gray-800', paused: 'bg-gray-100 text-gray-800', }; export function EnumBrowser({ searchTerm, enums }: EnumBrowserProps) { const [selectedEnum, setSelectedEnum] = useState(null); const [isDialogOpen, setIsDialogOpen] = useState(false); // Filter enums based on search term const filteredEnums = enums.filter( (enumItem) => enumItem.name.toLowerCase().includes(searchTerm.toLowerCase()) || enumItem.description.toLowerCase().includes(searchTerm.toLowerCase()) || enumItem.category.toLowerCase().includes(searchTerm.toLowerCase()) || enumItem.values.some((value) => value.toLowerCase().includes(searchTerm.toLowerCase()), ), ); // Group enums by category const enumsByCategory = filteredEnums.reduce( (acc, enumItem) => { if (!acc[enumItem.category]) { acc[enumItem.category] = []; } acc[enumItem.category].push(enumItem); return acc; }, {} as Record, ); const handleEnumClick = (enumName: string) => { setSelectedEnum(enumName); setIsDialogOpen(true); }; const closeDialog = () => { setIsDialogOpen(false); setSelectedEnum(null); }; const getValueBadgeColor = (value: string): string => { return valueColors[value] || 'bg-gray-100 text-gray-800'; }; return (
{/* Summary */}

Total Enums

{filteredEnums.length}

Categories

{Object.keys(enumsByCategory).length}

Total Values

{filteredEnums.reduce( (acc, enumItem) => acc + enumItem.values.length, 0, )}

{/* Enums by Category */} {Object.entries(enumsByCategory).map(([category, categoryEnums]) => { const IconComponent = categoryIcons[category] || ListIcon; return (
{category} {categoryEnums.length} enum {categoryEnums.length !== 1 ? 's' : ''}
{categoryEnums.map((enumItem) => ( handleEnumClick(enumItem.name)} > {enumItem.name} {enumItem.values.length} value {enumItem.values.length !== 1 ? 's' : ''}

{enumItem.description}

{enumItem.values.slice(0, 4).map((value) => ( {value} ))} {enumItem.values.length > 4 && ( +{enumItem.values.length - 4} more )}
{enumItem.sourceFile} Click for details
))}
); })} {/* Enum Details Dialog */} Enum Details: {selectedEnum}
{(() => { const enumItem = enums.find((e) => e.name === selectedEnum); if (!enumItem) return null; return ( <>

Description

{enumItem.description}

Values ({enumItem.values.length})

{enumItem.values.map((value, index) => (
{index + 1}. {value}
))}

Category

{enumItem.category}

Source File

{enumItem.sourceFile}

Usage Examples

CREATE TABLE example_table (
id uuid PRIMARY KEY,
status {enumItem.name} NOT NULL
);
SELECT * FROM table_name WHERE status = ' {enumItem.values[0]}';
); })()}
{filteredEnums.length === 0 && (

{searchTerm ? 'No enums match your search' : 'No enums found'}

)}
); }