import { useEffect, useState } from "react"; import { ActionButton } from "@/components/ui/action-button"; import { Button } from "@/components/ui/button"; import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { toast } from "@/components/ui/use-toast"; import { api } from "@/lib/trpc"; import { zodResolver } from "@hookform/resolvers/zod"; import { TRPCClientError } from "@trpc/client"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { changeRoleSchema } from "@hoarder/shared/types/admin"; type ChangeRoleSchema = z.infer; interface ChangeRoleDialogProps { userId: string; currentRole: "user" | "admin"; children?: React.ReactNode; } export default function ChangeRoleDialog({ userId, currentRole, children, }: ChangeRoleDialogProps) { const apiUtils = api.useUtils(); const [isOpen, onOpenChange] = useState(false); const form = useForm({ resolver: zodResolver(changeRoleSchema), defaultValues: { userId, role: currentRole, }, }); const { mutate, isPending } = api.admin.changeRole.useMutation({ onSuccess: () => { toast({ description: "Role changed successfully", }); apiUtils.users.list.invalidate(); onOpenChange(false); }, onError: (error) => { if (error instanceof TRPCClientError) { toast({ variant: "destructive", description: error.message, }); } else { toast({ variant: "destructive", description: "Failed to change role", }); } }, }); useEffect(() => { if (isOpen) { form.reset(); } }, [isOpen, form]); return ( {children} Change Role
mutate(val))}>
( Role )} /> ( )} /> Change
); }