MIF_E31221222/sigap-website/app/protected/(admin-pages)/_components/users/edit-user.tsx

192 lines
5.6 KiB
TypeScript

"use client";
import { Button } from "@/app/_components/ui/button";
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/app/_components/ui/form";
import { Input } from "@/app/_components/ui/input";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/app/_components/ui/select";
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
} from "@/app/_components/ui/sheet";
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
import * as z from "zod";
import type { User } from "./users-table";
import { useCallback } from "react";
const formSchema = z.object({
firstName: z.string().min(2, {
message: "First name must be at least 2 characters.",
}),
lastName: z.string().min(2, {
message: "Last name must be at least 2 characters.",
}),
email: z.string().email({
message: "Please enter a valid email address.",
}),
role: z.enum(["admin", "staff", "user"]),
status: z.enum(["active", "inactive"]),
});
interface EditUserSheetProps {
isOpen: boolean;
onOpenChange: (open: boolean) => void;
selectedUser: User | null;
onUserUpdate: (updatedUser: User) => void;
}
export function EditUserSheet({
isOpen,
onOpenChange,
selectedUser,
onUserUpdate,
}: EditUserSheetProps) {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
firstName: selectedUser?.firstName || "",
lastName: selectedUser?.lastName || "",
email: selectedUser?.email || "",
role: selectedUser?.role || "user",
status: selectedUser?.status || "inactive",
},
});
const onSubmit = useCallback(
(values: z.infer<typeof formSchema>) => {
if (!selectedUser) return;
const updatedUser: User = {
...selectedUser,
firstName: values.firstName,
lastName: values.lastName,
email: values.email,
role: values.role,
status: values.status,
};
onUserUpdate(updatedUser);
onOpenChange(false);
},
[selectedUser, onUserUpdate, onOpenChange]
);
return (
<Sheet open={isOpen} onOpenChange={onOpenChange}>
<SheetContent side="right">
<SheetHeader>
<SheetTitle>Edit User</SheetTitle>
<SheetDescription>
Make changes to the user profile here. Click save when you're done.
</SheetDescription>
</SheetHeader>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
<FormField
control={form.control}
name="firstName"
render={({ field }) => (
<FormItem>
<FormLabel>First name</FormLabel>
<FormControl>
<Input placeholder="First name" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="lastName"
render={({ field }) => (
<FormItem>
<FormLabel>Last name</FormLabel>
<FormControl>
<Input placeholder="Last name" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<Input placeholder="Email" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="role"
render={({ field }) => (
<FormItem>
<FormLabel>Role</FormLabel>
<Select
onValueChange={field.onChange}
defaultValue={field.value}
>
<SelectTrigger className="w-[180px]">
<SelectValue placeholder="Select a role" />
</SelectTrigger>
<SelectContent>
<SelectItem value="admin">Admin</SelectItem>
<SelectItem value="staff">Staff</SelectItem>
<SelectItem value="user">User</SelectItem>
</SelectContent>
</Select>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="status"
render={({ field }) => (
<FormItem>
<FormLabel>Status</FormLabel>
<Select
onValueChange={field.onChange}
defaultValue={field.value}
>
<SelectTrigger className="w-[180px]">
<SelectValue placeholder="Select a status" />
</SelectTrigger>
<SelectContent>
<SelectItem value="active">Active</SelectItem>
<SelectItem value="inactive">Inactive</SelectItem>
</SelectContent>
</Select>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">Save changes</Button>
</form>
</Form>
</SheetContent>
</Sheet>
);
}