Advertisement
Larrisa

userDetails.tsx

Jan 21st, 2025
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, { useState } from "react";
  2. import { Avatar, AvatarFallback } from "@/components/ui/avatar";
  3. import { Icons } from "@/components/icons";
  4.  
  5. interface UserDetailsDialogProps {
  6.   open: boolean;
  7.   onOpenChange: (open: boolean) => void;
  8.   user: {
  9.     firstName: string;
  10.     lastName: string;
  11.     email: string;
  12.     isAdmin: boolean;
  13.     active: boolean;
  14.     createdAt: string;
  15.   };
  16.   onSave: (updatedUser: Partial<typeof user>) => void; // Callback for saving changes
  17.   onDeactivate: () => void; // Callback for deactivation
  18. }
  19.  
  20. export function UserDetailsDialog({
  21.   open,
  22.   onOpenChange,
  23.   user,
  24.   onSave,
  25.   onDeactivate,
  26. }: UserDetailsDialogProps) {
  27.   const [isEditing, setIsEditing] = useState({
  28.     firstName: false,
  29.     lastName: false,
  30.     email: false,
  31.     isAdmin: false,
  32.   });
  33.  
  34.   const [editedUser, setEditedUser] = useState({ ...user });
  35.  
  36.   const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {
  37.     const { name, value } = e.target;
  38.     setEditedUser((prev) => ({
  39.       ...prev,
  40.       [name]: value,
  41.     }));
  42.   };
  43.  
  44.   const handleSave = (field: keyof typeof isEditing) => {
  45.     onSave({ [field]: editedUser[field] });
  46.     setIsEditing((prev) => ({ ...prev, [field]: false }));
  47.   };
  48.  
  49.   return (
  50.     <div
  51.       className={`fixed inset-0 z-50 flex items-center justify-center ${
  52.         open ? "block" : "hidden"
  53.       }`}
  54.     >
  55.       <div className="bg-white w-[400px] p-6 rounded-lg shadow-lg relative">
  56.         {/* Close button */}
  57.         <button
  58.           className="absolute top-4 right-4 text-gray-600 hover:text-gray-800"
  59.           onClick={() => onOpenChange(false)}
  60.         >
  61.           Close
  62.         </button>
  63.  
  64.         {/* Avatar */}
  65.         <div className="flex flex-col items-center mb-6">
  66.           <Avatar className="h-16 w-16 bg-red-500">
  67.             <AvatarFallback>
  68.               {user.firstName.charAt(0)}
  69.               {user.lastName.charAt(0)}
  70.             </AvatarFallback>
  71.           </Avatar>
  72.  
  73.           {/* Name */}
  74.           <div className="text-center mt-4">
  75.             {isEditing.firstName || isEditing.lastName ? (
  76.               <div className="flex justify-center space-x-2">
  77.                 <input
  78.                   className="border rounded px-2 py-1"
  79.                   name="firstName"
  80.                   value={editedUser.firstName}
  81.                   onChange={handleInputChange}
  82.                 />
  83.                 <input
  84.                   className="border rounded px-2 py-1"
  85.                   name="lastName"
  86.                   value={editedUser.lastName}
  87.                   onChange={handleInputChange}
  88.                 />
  89.                 <button
  90.                   onClick={() => {
  91.                     handleSave("firstName");
  92.                     handleSave("lastName");
  93.                   }}
  94.                   className="text-green-600 hover:underline"
  95.                 >
  96.                   Save
  97.                 </button>
  98.               </div>
  99.             ) : (
  100.               <h2 className="text-xl font-bold">
  101.                 {user.firstName} {user.lastName}{" "}
  102.                 <button
  103.                   onClick={() => setIsEditing((prev) => ({ ...prev, firstName: true, lastName: true }))}
  104.                 >
  105.                   <Icons.Pencil className="inline-block w-4 h-4 ml-2 text-gray-500" />
  106.                 </button>
  107.               </h2>
  108.             )}
  109.           </div>
  110.         </div>
  111.  
  112.         {/* Role */}
  113.         <div className="text-center mb-4">
  114.           {isEditing.isAdmin ? (
  115.             <div className="flex justify-center space-x-2">
  116.               <select
  117.                 className="border rounded px-2 py-1"
  118.                 name="isAdmin"
  119.                 value={editedUser.isAdmin ? "true" : "false"}
  120.                 onChange={handleInputChange}
  121.               >
  122.                 <option value="false">User</option>
  123.                 <option value="true">Admin</option>
  124.               </select>
  125.               <button
  126.                 onClick={() => handleSave("isAdmin")}
  127.                 className="text-green-600 hover:underline"
  128.               >
  129.                 Save
  130.               </button>
  131.             </div>
  132.           ) : (
  133.             <p className="italic">
  134.               {user.isAdmin ? "Admin" : "User"}{" "}
  135.               <button
  136.                 onClick={() => setIsEditing((prev) => ({ ...prev, isAdmin: true }))}
  137.               >
  138.                 <Icons.Pencil className="inline-block w-4 h-4 ml-2 text-gray-500" />
  139.               </button>
  140.             </p>
  141.           )}
  142.         </div>
  143.  
  144.         {/* Email */}
  145.         <div className="text-center mb-4">
  146.           <p className="text-sm font-semibold">Email address:</p>
  147.           {isEditing.email ? (
  148.             <div className="flex justify-center space-x-2">
  149.               <input
  150.                 className="border rounded px-2 py-1"
  151.                 name="email"
  152.                 value={editedUser.email}
  153.                 onChange={handleInputChange}
  154.               />
  155.               <button
  156.                 onClick={() => handleSave("email")}
  157.                 className="text-green-600 hover:underline"
  158.               >
  159.                 Save
  160.               </button>
  161.             </div>
  162.           ) : (
  163.             <p>
  164.               {user.email}{" "}
  165.               <button
  166.                 onClick={() => setIsEditing((prev) => ({ ...prev, email: true }))}
  167.               >
  168.                 <Icons.Pencil className="inline-block w-4 h-4 ml-2 text-gray-500" />
  169.               </button>
  170.             </p>
  171.           )}
  172.         </div>
  173.  
  174.         {/* Status */}
  175.         <div className="text-center mb-4">
  176.           <p className="text-sm font-semibold">Status:</p>
  177.           <p className="italic">{user.active ? "Active" : "Inactive"}</p>
  178.         </div>
  179.  
  180.         {/* Date Created */}
  181.         <div className="text-center mb-6">
  182.           <p className="text-sm font-semibold">Date created:</p>
  183.           <p className="italic">{user.createdAt}</p>
  184.         </div>
  185.  
  186.         {/* Action buttons */}
  187.         <div className="flex justify-between">
  188.           <a
  189.             href={`mailto:${user.email}`}
  190.             className="flex items-center bg-black text-white py-2 px-4 rounded-md hover:bg-gray-800"
  191.           >
  192.             Contact
  193.           </a>
  194.           <button
  195.             onClick={onDeactivate}
  196.             className="flex items-center bg-red-600 text-white py-2 px-4 rounded-md hover:bg-red-700"
  197.           >
  198.             Deactivate
  199.           </button>
  200.         </div>
  201.       </div>
  202.     </div>
  203.   );
  204. }
  205.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement