import React, { useState } from 'react'; import { Box, Typography, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TablePagination, IconButton, TextField, InputAdornment, Chip, CircularProgress, Alert, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Button, Switch, FormControlLabel, Tooltip } from '@mui/material'; import { Search as SearchIcon, Edit as EditIcon, Clear as ClearIcon, Mail as MailIcon, CheckCircle as ActiveIcon, Cancel as DisabledIcon } from '@mui/icons-material'; import { useAdminUsers, useUpdateUser } from '@hooks/adminHooks'; import { format } from 'date-fns'; import EmailDialog from '@components/EmailDialog'; import { useAuth } from '@hooks/reduxHooks'; const AdminCustomersPage = () => { const { user, userData, isAuthenticated } = useAuth(); const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(10); const [search, setSearch] = useState(''); const [editDialogOpen, setEditDialogOpen] = useState(false); const [emailDialogOpen, setEmailDialogOpen] = useState(false); const [currentUser, setCurrentUser] = useState(null); const [emailRecipient, setEmailRecipient] = useState(null); const [formData, setFormData] = useState({ is_disabled: false, is_admin: false, internal_notes: '' }); // React Query hooks const { data: users, isLoading, error } = useAdminUsers(); const updateUserMutation = useUpdateUser(); // Filter users by search term const filteredUsers = users ? users.filter(user => { const searchTerm = search.toLowerCase(); return ( user.email.toLowerCase().includes(searchTerm) || (user.first_name && user.first_name.toLowerCase().includes(searchTerm)) || (user.last_name && user.last_name.toLowerCase().includes(searchTerm)) ); }) : []; // Paginated users const paginatedUsers = filteredUsers.slice( page * rowsPerPage, page * rowsPerPage + rowsPerPage ); // Handle search change const handleSearchChange = (event) => { setSearch(event.target.value); setPage(0); }; // Clear search const handleClearSearch = () => { setSearch(''); setPage(0); }; // Handle page change const handleChangePage = (event, newPage) => { setPage(newPage); }; // Handle rows per page change const handleChangeRowsPerPage = (event) => { setRowsPerPage(parseInt(event.target.value, 10)); setPage(0); }; // Handle edit dialog open const handleOpenEditDialog = (user) => { setCurrentUser(user); setFormData({ is_disabled: user.is_disabled, is_admin: user.is_admin, internal_notes: user.internal_notes || '' }); setEditDialogOpen(true); }; // Handle edit dialog close const handleCloseEditDialog = () => { setCurrentUser(null); setEditDialogOpen(false); }; // Handle email dialog open const handleOpenEmailDialog = (user) => { setEmailRecipient(user); setEmailDialogOpen(true); }; // Handle email dialog close const handleCloseEmailDialog = () => { setEmailRecipient(null); setEmailDialogOpen(false); }; // Handle form changes const handleFormChange = (e) => { const { name, value, checked } = e.target; setFormData(prev => ({ ...prev, [name]: name === 'is_disabled' || name === 'is_admin' ? checked : value })); }; // Handle save user const handleSaveUser = () => { if (currentUser) { updateUserMutation.mutate({ id: currentUser.id, data: formData }); } }; // Format date const formatDate = (dateString) => { if (!dateString) return 'Never'; try { return format(new Date(dateString), 'MMM d, yyyy h:mm a'); } catch (error) { return dateString; } }; // Loading state if (isLoading) { return ( ); } // Error state if (error) { return ( Error loading customers: {error.message} ); } return ( Customers {/* Search Box */} ), endAdornment: search && ( ) }} /> {/* Users Table */} Name Email Status Last Login Joined Notes Actions {paginatedUsers.length > 0 ? ( paginatedUsers.map((user) => ( {user.first_name} {user.last_name} {user.is_admin && ( )} {user.is_super_admin && ( )} {user.email} {user.is_disabled ? ( } label="Disabled" color="error" size="small" /> ) : ( } label="Active" color="success" size="small" /> )} {formatDate(user.last_login)} {formatDate(user.created_at)} {user.internal_notes ? ( {user.internal_notes} ) : ( No notes )} handleOpenEditDialog(user)} color="primary" > handleOpenEmailDialog(user)} color="primary" > )) ) : ( {search ? 'No customers match your search.' : 'No customers found.'} )}
{/* Edit User Dialog */} {currentUser && `Edit Customer: ${currentUser.first_name} ${currentUser.last_name}`} {currentUser && ( Email: {currentUser.email} } label={`${formData.is_disabled ? "Account is disabled" : "Account is active"}` + `${userData?.id === currentUser.id && formData.is_admin? " (Current user can\'t disabled themselves)" : "" }`} sx={{ my: 2, display: 'block' }} /> } label={`${formData.is_admin ? "Account is Admin" : "Account is not Admin"}` + `${userData?.id === currentUser.id && formData.is_admin? " (Admin can't downgrade themselves)" : "" }`} sx={{ my: 2, display: 'block' }} /> Last login: {formatDate(currentUser.last_login)} )} {/* Email Dialog */}
); }; export default AdminCustomersPage;