"use client"; import Link from "next/link"; import { Button, buttonVariants } from "../../ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "../../ui/dropdown-menu"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "../../ui/alert-dialog"; import { Input } from "../../ui/input"; import { banUser, closeReportsByUser, resetBotToken, sendAlert, suspendUser, transferBot, unsuspendUser, updateBotDiscoverability, updateUserBadges, wipeUser, wipeUserProfile, } from "@/lib/actions"; import { useRef, useState } from "react"; import { useToast } from "../../ui/use-toast"; import { Bot, User } from "revolt-api"; import { Card, CardHeader } from "../../ui/card"; import { cn } from "@/lib/utils"; import { decodeTime } from "ulid"; import { Checkbox } from "@/components/ui/checkbox"; import UserSelector from "@/components/ui/user-selector"; import { Textarea } from "@/components/ui/textarea"; const badges = [1, 2, 4, 8, 16, 32, 128, 0, 256, 512, 1024]; export function UserActions({ user, bot }: { user: User; bot?: Bot }) { const alertMessage = useRef(""); const { toast } = useToast(); const [userDraft, setUserDraft] = useState(user); const [botDraft, setBotDraft] = useState(bot); const [wipeDraft, setWipeDraft] = useState({ banner: false, avatar: false, bio: false, displayName: false, status: false, }); const [transferTarget, setTransferTarget] = useState(null); const [transferResetToken, setTransferResetToken] = useState(true); const userInaccessible = userDraft.flags === 4 || userDraft.flags === 2; return ( <> {badges.map((badge) => { const sysBadge = (badge === 0 && user._id === "01EX2NCWQ0CHS3QJF0FEQS1GR4") || (badge === 256 && decodeTime(user._id) < 1629638578431); return ( // eslint-disable-next-line { if (sysBadge) return; try { const badges = (decodeTime(user._id) < 1629638578431 ? 256 : 0) | ((userDraft.badges ?? 0) ^ badge); await updateUserBadges(user._id, badges); setUserDraft((user) => ({ ...user!, badges })); toast({ title: "Updated user badges", }); } catch (err) { toast({ title: "Failed to update user badges", description: String(err), variant: "destructive", }); } }} /> ); })}
{bot ? ( botDraft!.discoverable ? ( ) : ( ) ) : ( Account )} Are you sure you want to{" "} {userDraft.flags === 1 ? "unsuspend" : "suspend"} this user? Cancel userDraft.flags === 1 ? unsuspendUser(user._id) .then(() => { setUserDraft((user) => ({ ...user, flags: 0 })); toast({ title: "Unsuspended user" }); }) .catch((err) => toast({ title: "Failed to unsuspend user!", description: String(err), variant: "destructive", }) ) : suspendUser(user._id) .then(() => { setUserDraft((user) => ({ ...user, flags: 1 })); toast({ title: "Suspended user" }); }) .catch((err) => toast({ title: "Failed to suspend user!", description: String(err), variant: "destructive", }) ) } > {userDraft.flags === 1 ? "Unsuspend" : "Suspend"} Are you sure you want to ban this user? All messages sent by this user will be deleted immediately.
This action is irreversible!
Cancel banUser(user._id) .then(() => { setUserDraft((user) => ({ ...user, flags: 4 })); toast({ title: "Banned user" }); }) .catch((err) => toast({ title: "Failed to ban user!", description: String(err), variant: "destructive", }) ) } > Ban
Are you sure you want to wipe this user's messages? All messages sent by this user will be deleted immediately.
This action is irreversible and{" "} will not publish any events!
Cancel wipeUser(user._id, 0, true) .then(() => { setUserDraft((user) => ({ ...user, flags: 4 })); toast({ title: "Wiped user's messages" }); }) .catch((err) => toast({ title: "Failed to wipe user's messages!", description: String(err), variant: "destructive", }) ) } > Ban
Release the bees Are you sure you want to send the bees? Cancel toast({ title: "🐝" })}> Deploy Send Alert This will send a message from the Platform Moderation account.