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 */}
{/* Email Dialog */}
);
};
export default AdminCustomersPage;