import { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Switch } from '@/components/ui/switch'; import { Badge } from '@/components/ui/badge'; import { supabase } from '@/lib/supabase'; import { useToast } from '@/hooks/use-toast'; import { Shield, Save, RefreshCw, Lock, Unlock } from 'lucide-react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; interface Role { id: string; name: string; description: string; permissions: Record; is_system: boolean; } const PERMISSION_CATEGORIES = { governance: { title: 'Governance', permissions: { create_proposal: 'Create Proposals', vote_proposal: 'Vote on Proposals', delegate_vote: 'Delegate Voting Power', manage_treasury: 'Manage Treasury', } }, moderation: { title: 'Moderation', permissions: { moderate_content: 'Moderate Content', ban_users: 'Ban Users', delete_posts: 'Delete Posts', pin_posts: 'Pin Posts', } }, administration: { title: 'Administration', permissions: { manage_users: 'Manage Users', manage_roles: 'Manage Roles', view_analytics: 'View Analytics', system_settings: 'System Settings', } }, security: { title: 'Security', permissions: { view_audit_logs: 'View Audit Logs', manage_sessions: 'Manage Sessions', configure_2fa: 'Configure 2FA', access_api: 'Access API', } } }; export function PermissionEditor() { const [roles, setRoles] = useState([]); const [selectedRole, setSelectedRole] = useState(null); const [saving, setSaving] = useState(false); const { toast } = useToast(); useEffect(() => { loadRoles(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const loadRoles = async () => { try { const { data, error } = await supabase .from('roles') .select('*') .order('name'); if (error) throw error; setRoles(data || []); if (data && data.length > 0) { setSelectedRole(data[0]); } } catch { console.error('Error loading roles:', error); toast({ title: 'Error', description: 'Failed to load roles', variant: 'destructive', }); } finally { setLoading(false); } }; const togglePermission = (category: string, permission: string) => { if (!selectedRole || selectedRole.is_system) return; const fullPermission = `${category}.${permission}`; setSelectedRole({ ...selectedRole, permissions: { ...selectedRole.permissions, [fullPermission]: !selectedRole.permissions[fullPermission] } }); }; const savePermissions = async () => { if (!selectedRole) return; setSaving(true); try { const { error } = await supabase .from('roles') .update({ permissions: selectedRole.permissions }) .eq('id', selectedRole.id); if (error) throw error; toast({ title: 'Success', description: 'Permissions updated successfully', }); } catch { toast({ title: 'Error', description: 'Failed to save permissions', variant: 'destructive', }); } finally { setSaving(false); } }; const resetPermissions = () => { if (!selectedRole) return; const original = roles.find(r => r.id === selectedRole.id); if (original) { setSelectedRole(original); } }; return ( Permission Editor { const role = roles.find(r => r.id === id); if (role) setSelectedRole(role); }}> {roles.map(role => ( {role.name} {role.is_system && ( )} ))} {selectedRole && (

{selectedRole.name}

{selectedRole.description}

{selectedRole.is_system && ( System Role (Read Only) )}
{!selectedRole.is_system && (
)}
{Object.entries(PERMISSION_CATEGORIES).map(([categoryKey, category]) => (

{category.title}

{Object.entries(category.permissions).map(([permKey, permName]) => { const fullPerm = `${categoryKey}.${permKey}`; const isEnabled = selectedRole.permissions[fullPerm] || false; return (
{isEnabled ? ( ) : ( )} {permName}
togglePermission(categoryKey, permKey)} />
); })}
))}
)}
); }