"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { ArrowLeft, Save, Trash2, User } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import * as z from "zod"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { apiClient } from "@/lib/api-client"; import { parseMetadata } from "@/lib/utils"; import { toast } from "sonner"; const userSchema = z.object({ firstName: z.string().optional(), lastName: z.string().optional(), email: z.string().email("Please enter a valid email address"), // permissions: z.array(z.string()), role: z.enum([ "user", "support-agent", "sales-agent", "developer", "read-only", "readonly", "admin", ]), metadata: z.string().optional(), password: z.string().optional(), }); type UserFormData = z.infer; export default function UserDetailPage() { // const [newPermission, setNewPermission] = useState(""); const params = useParams(); const router = useRouter(); const queryClient = useQueryClient(); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const userId = params.id as string; const isNew = userId === "new"; const form = useForm({ resolver: zodResolver(userSchema), defaultValues: { firstName: "", lastName: "", email: "", // permissions: [], role: "user", metadata: "", password: undefined, }, }); const { data: user, isLoading } = useQuery({ queryKey: ["user", userId], queryFn: () => apiClient.getUser(userId), enabled: !isNew, }); useEffect(() => { if (user && !isNew) { form.reset({ firstName: user.data.attributes.firstName || "", lastName: user.data.attributes.lastName || "", email: user.data.attributes.email, // permissions: user.data.attributes.permissions || [], role: user.data.attributes.role || "user", metadata: user.data.attributes.metadata ? JSON.stringify(user.data.attributes.metadata, null, 2) : "", password: user.data.attributes?.password || undefined, }); } }, [user, form, isNew]); const createMutation = useMutation({ mutationFn: async (userData: UserFormData) => await apiClient.createUser({ ...userData, metadata: parseMetadata(userData.metadata || ""), } as any), onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: ["users"] }); toast.success("User created successfully"); router.push("/dashboard/users"); }, onError: (error) => { toast.error(error.message); }, }); const updateMutation = useMutation({ mutationFn: async (userData: UserFormData) => await apiClient.updateUser(userId, { ...userData, metadata: parseMetadata(userData.metadata || ""), } as any), onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: ["users"] }); await queryClient.invalidateQueries({ queryKey: ["user", userId] }); toast.success("User updated successfully"); }, onError: (error) => { toast.error(error.message); }, }); const deleteMutation = useMutation({ mutationFn: async () => await apiClient.deleteUser(userId), onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: ["users"] }); toast.success("User deleted successfully"); router.push("/dashboard/users"); }, onError: (error) => { toast.error(error.message); }, }); const onSubmit = async (data: UserFormData) => { if (isNew) { await createMutation.mutateAsync({...data, password: data.password?.length ? data.password : undefined}); } else { await updateMutation.mutateAsync({...data, password: data.password?.length ? data.password : undefined}); } }; const handleDelete = async () => { await deleteMutation.mutateAsync(); setIsDeleteDialogOpen(false); }; if (isLoading && !isNew) { return (

Loading user...

); } return (
{/* Header */}

{isNew ? "Create User" : "Edit User"}

{isNew ? "Add a new user to your system" : "Update user information and settings"}

{!isNew && ( )}
{/* Form */} User Information {isNew ? "Enter the details for the new user" : "Update the user information below"}
{/* Email + Name */}
( Email Address )} /> {/* Role */} ( Role )} /> ( First Name )} /> ( Last Name )} />
{/* Password */} ( Password )} /> {/* Metadata */} ( Metadata