import { GetSessionDataManager, RoomDataParser } from '@nitrots/nitro-renderer'; import React, { FC, MouseEvent, useEffect } from 'react'; import { FaUser } from 'react-icons/fa'; import { CreateRoomSession, DoorStateType, TryVisitRoom } from '../../../../api'; import { Column, Flex, LayoutBadgeImageView, LayoutGridItemProps, LayoutRoomThumbnailView, Text } from '../../../../common'; import { useDoorState } from '../../../../hooks'; import { NavigatorSearchResultItemInfoView } from './NavigatorSearchResultItemInfoView'; export interface NavigatorSearchResultItemViewProps extends LayoutGridItemProps { roomData: RoomDataParser; thumbnail?: boolean; selectedRoomId?: number | null; setSelectedRoomId?: React.Dispatch>; isPopoverActive?: boolean; setIsPopoverActive?: React.Dispatch>; } export const NavigatorSearchResultItemView: FC = props => { const { roomData = null, children = null, thumbnail = false, selectedRoomId, setSelectedRoomId, isPopoverActive, setIsPopoverActive, ...rest } = props; const { setSnapshot: setDoorData } = useDoorState(); const handleMouseEnter = () => { if(isPopoverActive && setSelectedRoomId) setSelectedRoomId(roomData.roomId); }; const handleMouseLeave = () => { if(setSelectedRoomId && setIsPopoverActive) { setSelectedRoomId(null); setIsPopoverActive(false); } }; const handleInfoClick = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); if(setIsPopoverActive && setSelectedRoomId) { if(!isPopoverActive) { setSelectedRoomId(roomData.roomId); setIsPopoverActive(true); } else if(selectedRoomId === roomData.roomId) { setSelectedRoomId(null); setIsPopoverActive(false); } else { setSelectedRoomId(roomData.roomId); } } }; useEffect(() => { const handleClickOutside = (event: Event) => { const target = event.target as HTMLElement; const navigatorItem = target.closest('.navigator-item'); if(!navigatorItem && setIsPopoverActive && setSelectedRoomId) { setIsPopoverActive(false); setSelectedRoomId(null); } }; document.addEventListener('click', handleClickOutside); return () => document.removeEventListener('click', handleClickOutside); }, [ setIsPopoverActive, setSelectedRoomId ]); const getUserCounterColor = () => { const num: number = (100 * (roomData.userCount / roomData.maxUserCount)); if(num >= 92) return 'bg-danger'; if(num >= 50) return 'bg-warning'; if(num > 0) return 'bg-success'; return 'bg-primary'; }; const visitRoom = (event: MouseEvent) => { if(roomData.ownerId !== GetSessionDataManager().userId) { if(roomData.habboGroupId !== 0) { TryVisitRoom(roomData.roomId); return; } switch(roomData.doorMode) { case RoomDataParser.DOORBELL_STATE: setDoorData(prevValue => { const newValue = { ...prevValue }; newValue.roomInfo = roomData; newValue.state = DoorStateType.START_DOORBELL; return newValue; }); return; case RoomDataParser.PASSWORD_STATE: setDoorData(prevValue => { const newValue = { ...prevValue }; newValue.roomInfo = roomData; newValue.state = DoorStateType.START_PASSWORD; return newValue; }); return; } } CreateRoomSession(roomData.roomId); }; if(thumbnail) return ( { roomData.habboGroupId > 0 && } { roomData.userCount } { (roomData.doorMode !== RoomDataParser.OPEN_STATE) && } { roomData.roomName } { children } ); return ( { roomData.userCount } { roomData.roomName } { roomData.habboGroupId > 0 && } { (roomData.doorMode !== RoomDataParser.OPEN_STATE) && } { children } ); };