Files
checkcle/application/src/components/settings/user-management/UserManagement.tsx
T
2025-05-09 21:28:07 +07:00

118 lines
3.8 KiB
TypeScript

import React from "react";
import UserTable from "./UserTable";
import AddUserDialog from "./AddUserDialog";
import EditUserDialog from "./EditUserDialog";
import DeleteUserDialog from "./DeleteUserDialog";
import { useUserManagement } from "./hooks";
import {
Accordion,
AccordionContent,
AccordionItem,
AccordionTrigger
} from "@/components/ui/accordion";
import { UserCog, Loader2, AlertCircle } from "lucide-react";
import { Button } from "@/components/ui/button";
const UserManagement = () => {
const {
users,
loading,
error,
newUserForm,
isAddUserDialogOpen,
setIsAddUserDialogOpen,
isDialogOpen,
setIsDialogOpen,
isDeleting,
setIsDeleting,
isSubmitting,
updateError,
form,
currentUser,
userToDelete,
handleEditUser,
handleDeletePrompt,
handleDeleteUser,
onSubmit,
onAddUser,
fetchUsers
} = useUserManagement();
return (
<div className="space-y-4">
<Accordion type="single" collapsible className="w-full" defaultValue="user-management">
<AccordionItem value="user-management">
<AccordionTrigger className="py-4 px-5 bg-card hover:bg-card/90 hover:no-underline rounded-lg text-lg font-medium flex items-center w-full">
<div className="flex items-center">
<UserCog className="h-5 w-5 mr-2 text-green-500" />
<span>User Management</span>
</div>
</AccordionTrigger>
<AccordionContent className="p-4 pt-6 bg-background rounded-b-lg">
<div className="flex justify-between items-center mb-6">
<h2 className="text-2xl font-bold">User Management</h2>
<button
onClick={() => setIsAddUserDialogOpen(true)}
className="bg-green-500 hover:bg-green-600 text-white py-2 px-4 rounded-md flex items-center"
>
<span className="mr-1">+</span> Add User
</button>
</div>
{loading ? (
<div className="p-8 flex flex-col items-center justify-center text-center">
<Loader2 className="h-8 w-8 animate-spin mb-2 text-primary" />
<p className="text-muted-foreground">Loading users...</p>
</div>
) : error ? (
<div className="p-8 flex flex-col items-center justify-center text-center">
<AlertCircle className="h-8 w-8 text-destructive mb-2" />
<p className="text-destructive font-medium mb-2">Failed to load users</p>
<p className="text-muted-foreground mb-4">{error}</p>
<Button onClick={fetchUsers} variant="outline">
Retry
</Button>
</div>
) : (
<UserTable
users={users}
onUserUpdate={handleEditUser}
onUserDelete={handleDeletePrompt}
/>
)}
<AddUserDialog
isOpen={isAddUserDialogOpen}
setIsOpen={setIsAddUserDialogOpen}
form={newUserForm}
onSubmit={onAddUser}
isSubmitting={isSubmitting}
/>
<EditUserDialog
isOpen={isDialogOpen}
setIsOpen={setIsDialogOpen}
form={form}
user={currentUser}
onSubmit={onSubmit}
isSubmitting={isSubmitting}
error={updateError}
/>
<DeleteUserDialog
isOpen={isDeleting}
setIsOpen={setIsDeleting}
user={userToDelete}
onDelete={handleDeleteUser}
isDeleting={isSubmitting}
/>
</AccordionContent>
</AccordionItem>
</Accordion>
</div>
);
};
export default UserManagement;