/** * BulkActionToolbar Component * Toolbar for performing bulk actions on selected users */ 'use client'; import { useState } from 'react'; import { CheckCircle, XCircle, Trash, X } from 'lucide-react'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog'; import { Button } from '@/components/ui/button'; import { toast } from 'sonner'; import { useBulkUserAction } from '@/lib/api/hooks/useAdmin'; interface BulkActionToolbarProps { selectedCount: number; onClearSelection: () => void; selectedUserIds: string[]; } type BulkAction = 'activate' | 'deactivate' | 'delete' | null; export function BulkActionToolbar({ selectedCount, onClearSelection, selectedUserIds, }: BulkActionToolbarProps) { const [pendingAction, setPendingAction] = useState(null); const bulkAction = useBulkUserAction(); if (selectedCount === 0) { return null; } const handleAction = (action: BulkAction) => { setPendingAction(action); }; const confirmAction = async () => { if (!pendingAction) return; try { await bulkAction.mutateAsync({ action: pendingAction, userIds: selectedUserIds, }); toast.success( `Successfully ${pendingAction}d ${selectedCount} user${selectedCount > 1 ? 's' : ''}` ); onClearSelection(); setPendingAction(null); } catch (error) { toast.error( error instanceof Error ? error.message : `Failed to ${pendingAction} users` ); setPendingAction(null); } }; const cancelAction = () => { setPendingAction(null); }; const getActionDescription = () => { switch (pendingAction) { case 'activate': return `Are you sure you want to activate ${selectedCount} user${selectedCount > 1 ? 's' : ''}? They will be able to log in.`; case 'deactivate': return `Are you sure you want to deactivate ${selectedCount} user${selectedCount > 1 ? 's' : ''}? They will not be able to log in until reactivated.`; case 'delete': return `Are you sure you want to delete ${selectedCount} user${selectedCount > 1 ? 's' : ''}? This action cannot be undone.`; default: return ''; } }; const getActionTitle = () => { switch (pendingAction) { case 'activate': return 'Activate Users'; case 'deactivate': return 'Deactivate Users'; case 'delete': return 'Delete Users'; default: return ''; } }; return ( <>
{selectedCount} user{selectedCount > 1 ? 's' : ''} selected
{/* Confirmation Dialog */} cancelAction()}> {getActionTitle()} {getActionDescription()} Cancel {pendingAction === 'activate' && 'Activate'} {pendingAction === 'deactivate' && 'Deactivate'} {pendingAction === 'delete' && 'Delete'} ); }