import { FlatControllerAddedEvent, FlatControllerRemovedEvent, FlatControllersEvent, RemoveAllRightsMessageComposer, RoomGiveRightsComposer, RoomTakeRightsComposer, RoomUsersWithRightsComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useRef, useState } from 'react'; import { IRoomData, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, Flex, Grid, Text, UserProfileIconView } from '../../../../common'; import { useFriends, useMessageEvent } from '../../../../hooks'; import { NavigatorRoomSettingsSectionView } from './NavigatorRoomSettingsSectionView'; interface NavigatorRoomSettingsTabViewProps { roomData: IRoomData; handleChange: (field: string, value: string | number | boolean) => void; } const STAFF_CHAT_ID = -1; const STAFF_CHAT_NAME = 'Staff Chat'; export const NavigatorRoomSettingsRightsTabView: FC = props => { const { roomData = null } = props; const [ usersWithRights, setUsersWithRights ] = useState>(new Map()); const { onlineFriends = [], offlineFriends = [] } = useFriends(); const pendingActionsRef = useRef>(new Set()); const guardedSend = (key: string, composer: any) => { if(pendingActionsRef.current.has(key)) return; pendingActionsRef.current.add(key); SendMessageComposer(composer); setTimeout(() => pendingActionsRef.current.delete(key), 2000); }; const allFriendsRaw = [ ...onlineFriends, ...offlineFriends ]; const allFriends = allFriendsRaw.filter(friend => { if(friend.id === STAFF_CHAT_ID) return false; if(friend.name === STAFF_CHAT_NAME) return false; if(friend.id <= 0) return false; return true; }); const filteredUsersWithRights = new Map( Array.from(usersWithRights.entries()).filter(([ id, name ]) => { if(id === STAFF_CHAT_ID) return false; if(name === STAFF_CHAT_NAME) return false; if(id <= 0) return false; return true; }) ); const friendsWithoutRights = allFriends.filter(friend => !filteredUsersWithRights.has(friend.id)); useMessageEvent(FlatControllersEvent, event => { const parser = event.getParser(); if(!roomData || (roomData.roomId !== parser.roomId)) return; setUsersWithRights(parser.users); }); useMessageEvent(FlatControllerAddedEvent, event => { const parser = event.getParser(); if(!roomData || (roomData.roomId !== parser.roomId)) return; setUsersWithRights(prevValue => { const newValue = new Map(prevValue); newValue.set(parser.data.userId, parser.data.userName); return newValue; }); }); useMessageEvent(FlatControllerRemovedEvent, event => { const parser = event.getParser(); if(!roomData || (roomData.roomId !== parser.roomId)) return; setUsersWithRights(prevValue => { const newValue = new Map(prevValue); newValue.delete(parser.userId); return newValue; }); }); useEffect(() => { if(!roomData) return; SendMessageComposer(new RoomUsersWithRightsComposer(roomData.roomId)); }, [ roomData ]); return ( { Array.from(filteredUsersWithRights.entries()).map(([ id, name ], index) => { return ( guardedSend(`take_${id}`, new RoomTakeRightsComposer(id)) }> { name } ); }) } { friendsWithoutRights.map((friend, index) => { return ( guardedSend(`give_${friend.id}`, new RoomGiveRightsComposer(friend.id)) }> { friend.name } ); }) } ); };