import { CallForHelpCategoryData, CfhSanctionMessageEvent, CfhTopicsInitEvent, IssueDeletedMessageEvent, IssueInfoMessageEvent, IssueMessageData, IssuePickFailedMessageEvent, ModeratorActionResultMessageEvent, ModeratorInitData, ModeratorInitMessageEvent, ModeratorToolPreferencesEvent } from '@nitrots/nitro-renderer'; import { useState } from 'react'; import { useBetween } from 'use-between'; import { NotificationAlertType, PlaySound, SoundNames } from '../../api'; import { useMessageEvent } from '../events'; import { useNotification } from '../notification'; const useModToolsState = () => { const [ settings, setSettings ] = useState(null); const [ openRooms, setOpenRooms ] = useState([]); const [ openRoomChatlogs, setOpenRoomChatlogs ] = useState([]); const [ openUserInfos, setOpenUserInfos ] = useState([]); const [ openUserChatlogs, setOpenUserChatlogs ] = useState([]); const [ tickets, setTickets ] = useState([]); const [ cfhCategories, setCfhCategories ] = useState([]); const { simpleAlert = null } = useNotification(); const openRoomInfo = (roomId: number) => { if(openRooms.indexOf(roomId) >= 0) return; setOpenRooms(prevValue => [ ...prevValue, roomId ]); }; const closeRoomInfo = (roomId: number) => { setOpenRooms(prevValue => { const newValue = [ ...prevValue ]; const existingIndex = newValue.indexOf(roomId); if(existingIndex >= 0) newValue.splice(existingIndex, 1); return newValue; }); }; const toggleRoomInfo = (roomId: number) => { if(openRooms.indexOf(roomId) >= 0) closeRoomInfo(roomId); else openRoomInfo(roomId); }; const openRoomChatlog = (roomId: number) => { if(openRoomChatlogs.indexOf(roomId) >= 0) return; setOpenRoomChatlogs(prevValue => [ ...prevValue, roomId ]); }; const closeRoomChatlog = (roomId: number) => { setOpenRoomChatlogs(prevValue => { const newValue = [ ...prevValue ]; const existingIndex = newValue.indexOf(roomId); if(existingIndex >= 0) newValue.splice(existingIndex, 1); return newValue; }); }; const toggleRoomChatlog = (roomId: number) => { if(openRoomChatlogs.indexOf(roomId) >= 0) closeRoomChatlog(roomId); else openRoomChatlog(roomId); }; const openUserInfo = (userId: number) => { if(openUserInfos.indexOf(userId) >= 0) return; setOpenUserInfos(prevValue => [ ...prevValue, userId ]); }; const closeUserInfo = (userId: number) => { setOpenUserInfos(prevValue => { const newValue = [ ...prevValue ]; const existingIndex = newValue.indexOf(userId); if(existingIndex >= 0) newValue.splice(existingIndex, 1); return newValue; }); }; const toggleUserInfo = (userId: number) => { if(openUserInfos.indexOf(userId) >= 0) closeUserInfo(userId); else openUserInfo(userId); }; const openUserChatlog = (userId: number) => { if(openUserChatlogs.indexOf(userId) >= 0) return; setOpenUserChatlogs(prevValue => [ ...prevValue, userId ]); }; const closeUserChatlog = (userId: number) => { setOpenUserChatlogs(prevValue => { const newValue = [ ...prevValue ]; const existingIndex = newValue.indexOf(userId); if(existingIndex >= 0) newValue.splice(existingIndex, 1); return newValue; }); }; const toggleUserChatlog = (userId: number) => { if(openUserChatlogs.indexOf(userId) >= 0) closeUserChatlog(userId); else openUserChatlog(userId); }; useMessageEvent(ModeratorInitMessageEvent, event => { const parser = event.getParser(); const data = parser.data; setSettings(data); setTickets(data.issues); }); useMessageEvent(IssueInfoMessageEvent, event => { const parser = event.getParser(); setTickets(prevValue => { const newValue = [ ...prevValue ]; const existingIndex = newValue.findIndex(ticket => (ticket.issueId === parser.issueData.issueId)); if(existingIndex >= 0) newValue[existingIndex] = parser.issueData; else { newValue.push(parser.issueData); PlaySound(SoundNames.MODTOOLS_NEW_TICKET); } return newValue; }); }); useMessageEvent(ModeratorToolPreferencesEvent, event => { const parser = event.getParser(); }); useMessageEvent(IssuePickFailedMessageEvent, event => { const parser = event.getParser(); if(!parser) return; simpleAlert('Failed to pick issue', NotificationAlertType.DEFAULT, null, null, 'Error'); }); useMessageEvent(IssueDeletedMessageEvent, event => { const parser = event.getParser(); setTickets(prevValue => { const newValue = [ ...prevValue ]; const existingIndex = newValue.findIndex(ticket => (ticket.issueId === parser.issueId)); if(existingIndex >= 0) newValue.splice(existingIndex, 1); return newValue; }); }); useMessageEvent(ModeratorActionResultMessageEvent, event => { const parser = event.getParser(); if(parser.success) simpleAlert('Moderation action was successfull', NotificationAlertType.MODERATION, null, null, 'Success'); else simpleAlert('There was a problem applying tht moderation action', NotificationAlertType.MODERATION, null, null, 'Error'); }); useMessageEvent(CfhTopicsInitEvent, event => { const parser = event.getParser(); setCfhCategories(parser.callForHelpCategories); }); useMessageEvent(CfhSanctionMessageEvent, event => { const parser = event.getParser(); // todo: update sanction data }); return { settings, openRooms, openRoomChatlogs, openUserChatlogs, openUserInfos, cfhCategories, tickets, openRoomInfo, closeRoomInfo, toggleRoomInfo, openRoomChatlog, closeRoomChatlog, toggleRoomChatlog, openUserInfo, closeUserInfo, toggleUserInfo, openUserChatlog, closeUserChatlog, toggleUserChatlog }; }; export const useModTools = () => useBetween(useModToolsState);