crush-level-web/src/app/(main)/user/[userId]/components/UserActionDropdown.tsx

101 lines
3.4 KiB
TypeScript
Raw Normal View History

2025-11-28 06:31:36 +00:00
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
} from '@/components/ui/alert-dialog'
import { IconButton } from '@/components/ui/button'
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
import { useDeleteCharacter } from '@/hooks/aiUser'
import { useState } from 'react'
import { useAIUser } from '../context/aiUser'
import { useParams, useRouter } from 'next/navigation'
import { useNimChat, useNimConversation, useNimMsgContext } from '@/context/NimChat/useNimChat'
2025-11-13 08:38:25 +00:00
const UserActionDropdown = () => {
2025-11-28 06:31:36 +00:00
const router = useRouter()
const [isDeleteCharacterDialogOpen, setIsDeleteCharacterDialogOpen] = useState(false)
const { userId, isOwner } = useAIUser()
const { removeConversationById } = useNimConversation()
const { clearHistoryMessage } = useNimMsgContext()
const { nim } = useNimChat()
2025-11-13 08:38:25 +00:00
2025-11-28 06:31:36 +00:00
const { mutate: deleteCharacter, isPending: isDeleteCharacterLoading } = useDeleteCharacter({
aiId: Number(userId),
})
2025-11-13 08:38:25 +00:00
const handleDeleteCharacter = () => {
2025-11-28 06:31:36 +00:00
setIsDeleteCharacterDialogOpen(true)
2025-11-13 08:38:25 +00:00
}
const handleDeleteCharacterConfirm = async () => {
2025-11-28 06:31:36 +00:00
const conversationId = await nim.V2NIMConversationIdUtil.p2pConversationId(
`${userId}@r@t` as string
)
await removeConversationById(conversationId)
await clearHistoryMessage(conversationId)
await deleteCharacter({ aiId: Number(userId) })
router.replace('/profile')
2025-11-13 08:38:25 +00:00
}
2025-11-28 06:31:36 +00:00
if (!isOwner) return null
2025-11-13 08:38:25 +00:00
return (
<>
<div className="absolute top-0 right-0 left-0">
2025-11-28 06:31:36 +00:00
<div className="mx-auto max-w-[1120px] px-6">
<div className="relative w-full">
2025-11-13 08:38:25 +00:00
<div className="absolute top-0 right-0">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<IconButton iconfont="icon-More" size="large" variant="tertiaryDark" />
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem onClick={handleDeleteCharacter}>
<i className="iconfont icon-trashcan !text-[16px] leading-none" />
<span>Delete Character</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
</div>
</div>
</div>
<AlertDialog open={isDeleteCharacterDialogOpen} onOpenChange={setIsDeleteCharacterDialogOpen}>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>Delete Character</AlertDialogTitle>
</AlertDialogHeader>
<AlertDialogDescription>
2025-11-28 06:31:36 +00:00
Once deleted, the character cannot be restored. To ensure a good user experience, users
who have previously chatted with or made purchases for this character will still be able
to interact with them.
2025-11-13 08:38:25 +00:00
</AlertDialogDescription>
<AlertDialogFooter>
<AlertDialogCancel>Cancel</AlertDialogCancel>
2025-11-28 06:31:36 +00:00
<AlertDialogAction
variant="destructive"
loading={isDeleteCharacterLoading}
onClick={handleDeleteCharacterConfirm}
>
Delete
</AlertDialogAction>
2025-11-13 08:38:25 +00:00
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</>
2025-11-28 06:31:36 +00:00
)
2025-11-13 08:38:25 +00:00
}
2025-11-28 06:31:36 +00:00
export default UserActionDropdown