import { useState, useEffect } from 'react'; import { UserCog } from 'lucide-react'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { supabase } from '@/lib/supabaseClient'; import { handleError, getErrorMessage } from '@/lib/errorHandler'; import { logger } from '@/lib/logger'; interface Moderator { user_id: string; username: string; display_name?: string | null; role: string; } interface ReassignDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onReassign: (moderatorId: string) => Promise; submissionType: string; } export function ReassignDialog({ open, onOpenChange, onReassign, submissionType, }: ReassignDialogProps) { const [selectedModerator, setSelectedModerator] = useState(''); const [moderators, setModerators] = useState([]); const [isSubmitting, setIsSubmitting] = useState(false); const [loading, setLoading] = useState(true); useEffect(() => { if (open) { fetchModerators(); } }, [open]); const fetchModerators = async () => { setLoading(true); try { const { data: roles, error: rolesError } = await supabase .from('user_roles') .select('user_id, role') .in('role', ['moderator', 'admin', 'superuser']); if (rolesError) throw rolesError; if (!roles || roles.length === 0) { setModerators([]); return; } const userIds = roles.map((r) => r.user_id); let profiles: Array<{ user_id: string; username: string; display_name?: string | null }> | null = null; const { data: allProfiles, error: rpcError } = await supabase .rpc('get_users_with_emails'); if (rpcError) { // Fall back to basic profiles const { data: basicProfiles } = await supabase .from('profiles') .select('user_id, username, display_name') .in('user_id', userIds); profiles = basicProfiles as typeof profiles; } else { profiles = allProfiles?.filter(p => userIds.includes(p.user_id)) || null; } const moderatorsList = roles.map((role) => { const profile = profiles?.find((p) => p.user_id === role.user_id); return { user_id: role.user_id, username: profile?.username || 'Unknown', display_name: profile?.display_name, role: role.role, }; }); setModerators(moderatorsList); } catch (error: unknown) { handleError(error, { action: 'Load Moderators List', metadata: { submissionType } }); } finally { setLoading(false); } }; const handleReassign = async () => { if (!selectedModerator) return; setIsSubmitting(true); try { await onReassign(selectedModerator); setSelectedModerator(''); onOpenChange(false); } finally { setIsSubmitting(false); } }; return ( Reassign Submission Assign this {submissionType} to another moderator. They will receive a lock for 15 minutes.
{loading ? (
Loading moderators...
) : moderators.length === 0 ? (
No moderators available
) : ( )}
); }