import { CallForHelpTopicData, DefaultSanctionMessageComposer, ModAlertMessageComposer, ModBanMessageComposer, ModKickMessageComposer, ModMessageMessageComposer, ModMuteMessageComposer, ModTradingLockMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useMemo, useRef, useState } from 'react'; import { FaBan, FaBolt, FaEnvelope, FaExclamationTriangle, FaGavel, FaUserSlash, FaVolumeMute } from 'react-icons/fa'; import { ISelectedUser, LocalizeText, ModActionDefinition, NotificationAlertType, SendMessageComposer } from '../../../../api'; import { Button, DraggableWindowPosition, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; import { useModTools, useNotification } from '../../../../hooks'; interface ModToolsUserModActionViewProps { user: ISelectedUser; onCloseClick: () => void; } const MOD_ACTION_DEFINITIONS = [ new ModActionDefinition(1, 'Alert', ModActionDefinition.ALERT, 1, 0), new ModActionDefinition(2, 'Mute 1h', ModActionDefinition.MUTE, 2, 0), new ModActionDefinition(3, 'Ban 18h', ModActionDefinition.BAN, 3, 0), new ModActionDefinition(4, 'Ban 7 days', ModActionDefinition.BAN, 4, 0), new ModActionDefinition(5, 'Ban 30 days (step 1)', ModActionDefinition.BAN, 5, 0), new ModActionDefinition(7, 'Ban 30 days (step 2)', ModActionDefinition.BAN, 7, 0), new ModActionDefinition(6, 'Ban 100 years', ModActionDefinition.BAN, 6, 0), new ModActionDefinition(106, 'Ban avatar-only 100 years', ModActionDefinition.BAN, 6, 0), new ModActionDefinition(101, 'Kick', ModActionDefinition.KICK, 0, 0), new ModActionDefinition(102, 'Lock trade 1 week', ModActionDefinition.TRADE_LOCK, 0, 168), new ModActionDefinition(104, 'Lock trade permanent', ModActionDefinition.TRADE_LOCK, 0, 876000), new ModActionDefinition(105, 'Message', ModActionDefinition.MESSAGE, 0, 0), ]; const ACTION_ICONS: Record = { [ModActionDefinition.ALERT]: , [ModActionDefinition.MUTE]: , [ModActionDefinition.BAN]: , [ModActionDefinition.KICK]: , [ModActionDefinition.TRADE_LOCK]: , [ModActionDefinition.MESSAGE]: , }; const ACTION_TONE: Record = { [ModActionDefinition.ALERT]: 'bg-amber-100 text-amber-800 border-amber-200', [ModActionDefinition.MUTE]: 'bg-sky-100 text-sky-800 border-sky-200', [ModActionDefinition.BAN]: 'bg-rose-100 text-rose-800 border-rose-200', [ModActionDefinition.KICK]: 'bg-orange-100 text-orange-800 border-orange-200', [ModActionDefinition.TRADE_LOCK]: 'bg-fuchsia-100 text-fuchsia-800 border-fuchsia-200', [ModActionDefinition.MESSAGE]: 'bg-zinc-100 text-zinc-800 border-zinc-200', }; export const ModToolsUserModActionView: FC = props => { const { user = null, onCloseClick = null } = props; const [ selectedTopic, setSelectedTopic ] = useState(-1); const [ selectedAction, setSelectedAction ] = useState(-1); const [ message, setMessage ] = useState(''); const { cfhCategories = null, settings = null } = useModTools(); const { simpleAlert = null } = useNotification(); const isSendingRef = useRef(false); const topics = useMemo(() => { const values: CallForHelpTopicData[] = []; if(cfhCategories && cfhCategories.length) { for(const category of cfhCategories) { for(const topic of category.topics) values.push(topic); } } return values; }, [ cfhCategories ]); const sendAlert = (m: string) => simpleAlert(m, NotificationAlertType.DEFAULT, null, null, 'Error'); const sendDefaultSanction = () => { if(isSendingRef.current) return; const category = topics[selectedTopic]; if(selectedTopic === -1) return sendAlert(LocalizeText('modtools.user.modaction.error.no.topic')); const messageOrDefault = (message.trim().length === 0) ? LocalizeText(`help.cfh.topic.${ category.id }`) : message; isSendingRef.current = true; SendMessageComposer(new DefaultSanctionMessageComposer(user.userId, selectedTopic, messageOrDefault)); onCloseClick(); }; const sendSanction = () => { if(isSendingRef.current) return; let errorMessage: string = null; const category = topics[selectedTopic]; const sanction = MOD_ACTION_DEFINITIONS[selectedAction]; if((selectedTopic === -1) || (selectedAction === -1)) errorMessage = LocalizeText('modtools.user.modaction.error.no.action'); else if(!settings || !settings.cfhPermission) errorMessage = LocalizeText('modtools.user.modaction.error.no.permission'); else if(!category) errorMessage = LocalizeText('modtools.user.modaction.error.no.topic'); else if(!sanction) errorMessage = LocalizeText('modtools.user.modaction.error.no.action'); if(errorMessage) return sendAlert(errorMessage); const messageOrDefault = (message.trim().length === 0) ? LocalizeText(`help.cfh.topic.${ category.id }`) : message; switch(sanction.actionType) { case ModActionDefinition.ALERT: { if(!settings.alertPermission) return sendAlert(LocalizeText('modtools.user.modaction.error.no.permission.alert')); SendMessageComposer(new ModAlertMessageComposer(user.userId, messageOrDefault, category.id)); break; } case ModActionDefinition.MUTE: SendMessageComposer(new ModMuteMessageComposer(user.userId, messageOrDefault, category.id)); break; case ModActionDefinition.BAN: { if(!settings.banPermission) return sendAlert(LocalizeText('modtools.user.modaction.error.no.permission.alert')); SendMessageComposer(new ModBanMessageComposer(user.userId, messageOrDefault, category.id, selectedAction, (sanction.actionId === 106))); break; } case ModActionDefinition.KICK: { if(!settings.kickPermission) return sendAlert(LocalizeText('modtools.user.modaction.error.no.permission.alert')); SendMessageComposer(new ModKickMessageComposer(user.userId, messageOrDefault, category.id)); break; } case ModActionDefinition.TRADE_LOCK: { const numSeconds = (sanction.actionLengthHours * 60); SendMessageComposer(new ModTradingLockMessageComposer(user.userId, messageOrDefault, numSeconds, category.id)); break; } case ModActionDefinition.MESSAGE: { if(message.trim().length === 0) return sendAlert(LocalizeText('modtools.user.modaction.error.no.message')); SendMessageComposer(new ModMessageMessageComposer(user.userId, message, category.id)); break; } } isSendingRef.current = true; onCloseClick(); }; if(!user) return null; const selectedSanction = selectedAction >= 0 ? MOD_ACTION_DEFINITIONS[selectedAction] : null; const selectedTopicName = selectedTopic >= 0 && topics[selectedTopic] ? LocalizeText('help.cfh.topic.' + topics[selectedTopic].id) : null; const sanctionTone = selectedSanction ? ACTION_TONE[selectedSanction.actionType] : ''; const sanctionIcon = selectedSanction ? ACTION_ICONS[selectedSanction.actionType] : null; const canSubmit = (selectedTopic !== -1); return ( onCloseClick() } /> {/* Target header */}
{ LocalizeText('modtools.user.modaction.sanctioning') }
{ user.username }
{/* CFH topic */}
{/* Sanction type */}
{/* Message */}