"use client" import type React from "react" import { useState } from "react" import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetFooter } from "@/components/ui/sheet" import { Button } from "@/components/ui/button" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Label } from "@/components/ui/label" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Switch } from "@/components/ui/switch" import { Separator } from "@/components/ui/separator" import { Badge } from "@/components/ui/badge" import { useMutation } from "@tanstack/react-query" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog" import { updateUser, deleteUser, sendPasswordRecovery, sendMagicLink, banUser, unbanUser } from "@/app/protected/(admin)/dashboard/user-management/action" import { User } from "@/src/models/users/users.model" import { toast } from "sonner" interface UserSheetProps { user: User open: boolean onOpenChange: (open: boolean) => void onUserUpdate: () => void } export function UserSheet({ user, open, onOpenChange, onUserUpdate }: UserSheetProps) { const [formData, setFormData] = useState({ email: user.email || "", phone: user.phone || "", metadata: JSON.stringify(user.raw_user_meta_data || {}, null, 2), }) const updateUserMutation = useMutation({ mutationFn: async () => { let metadata = {} try { metadata = JSON.parse(formData.metadata) } catch (error) { toast.error("Invalid JSON. Please check your metadata format.") throw new Error("Invalid JSON") } return updateUser(user.id, { email: formData.email, phone: formData.phone, user_metadata: metadata, }) }, onSuccess: () => { toast.success("User updated successfully") onUserUpdate() }, onError: () => { toast.error("Failed to update user") }, }) const deleteUserMutation = useMutation({ mutationFn: () => deleteUser(user.id), onSuccess: () => { toast.success("User deleted successfully") onUserUpdate() }, onError: () => { toast.error("Failed to delete user") }, }) const sendPasswordRecoveryMutation = useMutation({ mutationFn: () => { if (!user.email) { throw new Error("User does not have an email address") } return sendPasswordRecovery(user.email) }, onSuccess: () => { toast.success("Password recovery email sent") }, onError: () => { toast.error("Failed to send password recovery email") }, }) const sendMagicLinkMutation = useMutation({ mutationFn: () => { if (!user.email) { throw new Error("User does not have an email address") } return sendMagicLink(user.email) }, onSuccess: () => { toast.success("Magic link sent successfully") }, onError: () => { toast.error("Failed to send magic link") }, }) const toggleBanMutation = useMutation({ mutationFn: () => { if (user.banned_until) { return unbanUser(user.id) } else { return banUser(user.id) } }, onSuccess: () => { toast.success("User ban status updated") onUserUpdate() }, onError: () => { toast.error("Failed to update user ban status") }, }) const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target setFormData((prev) => ({ ...prev, [name]: value })) } return ( User Details {user.banned_until && Banned} {!user.email_confirmed_at && Unconfirmed} {!user.banned_until && user.email_confirmed_at && Active} ID: {user.id} Details Security Actions