import { RoomDataParser, RoomSettingsComposer, UpdateHomeRoomMessageComposer } from '@nitrots/nitro-renderer'; import * as Popover from '@radix-ui/react-popover'; import React, { FC, useRef, useState } from 'react'; import { FaUser } from 'react-icons/fa'; import { GetGroupInformation, GetSessionDataManager, GetUserProfile, LocalizeText, ReportType, SendMessageComposer, ToggleFavoriteRoom } from '../../../../api'; import { Column, Flex, LayoutBadgeImageView, LayoutRoomThumbnailView, NitroCardContentView, Text, UserProfileIconView } from '../../../../common'; import { useHelp, useNavigator } from '../../../../hooks'; import { classNames } from '../../../../layout'; interface NavigatorSearchResultItemInfoViewProps { roomData: RoomDataParser; isVisible?: boolean; onToggle?: (e: React.MouseEvent) => void; setIsPopoverActive?: React.Dispatch>; } export const NavigatorSearchResultItemInfoView: FC = props => { const { roomData = null, isVisible = undefined, onToggle, setIsPopoverActive } = props; const elementRef = useRef(null); const [ internalVisible, setInternalVisible ] = useState(false); const { navigatorData = null, favouriteRoomIds = [] } = useNavigator(); const { report = null } = useHelp(); const isControlled = isVisible !== undefined; const popoverOpen = isControlled ? isVisible : internalVisible; const handleOpenChange = (open: boolean) => { if(!isControlled) setInternalVisible(open); if(!open && setIsPopoverActive) setIsPopoverActive(false); }; 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 processAction = (action: string) => { if(!navigatorData || !roomData) return; switch(action) { case 'set_home_room': { let newRoomId = -1; if(navigatorData.homeRoomId !== roomData.roomId) newRoomId = roomData.roomId; if(newRoomId > 0) SendMessageComposer(new UpdateHomeRoomMessageComposer(newRoomId)); return; } case 'open_room_settings': SendMessageComposer(new RoomSettingsComposer(roomData.roomId)); return; case 'report_room': report(ReportType.ROOM, { roomId: roomData.roomId, roomName: roomData.roomName }); return; case 'room_favourite': ToggleFavoriteRoom(roomData.roomId, favouriteRoomIds.includes(roomData.roomId)); return; } }; const handleOwnerClick = (e: React.MouseEvent) => { e.stopPropagation(); GetUserProfile(roomData.ownerId); }; const handleGroupClick = (e: React.MouseEvent) => { e.stopPropagation(); GetGroupInformation(roomData.habboGroupId); }; const getTradeModeText = (): string => { if(roomData.tradeMode === 1) return LocalizeText('trading.mode.free'); return LocalizeText('trading.mode.not.allowed'); }; const handleIconClick = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); if(onToggle) onToggle(e); }; return (
{ if(!isControlled) setInternalVisible(true); } } onMouseLeave={ () => { if(!isControlled) setInternalVisible(false); } } /> e.stopPropagation() }> { roomData.habboGroupId > 0 && ( ) } { roomData.doorMode !== RoomDataParser.OPEN_STATE && ( ) } { roomData.roomName.length > 35 ? roomData.roomName.substring(0, 35) + '…' : roomData.roomName } { roomData.description } { roomData.ownerName && roomData.ownerName.length > 0 && { roomData.ownerName } } { roomData.habboGroupId > 0 && { roomData.groupName } } { LocalizeText('navigator.roompopup.property.trading') } { getTradeModeText() } { LocalizeText('navigator.roompopup.property.max_users') } { roomData.maxUserCount } { roomData.userCount } processAction('room_favourite') }> { LocalizeText('navigator.room.popup.room.info.favorite') } processAction('set_home_room') }> { LocalizeText('navigator.room.popup.room.info.home') } { GetSessionDataManager().userId === roomData.ownerId && processAction('open_room_settings') }> { LocalizeText('navigator.room.popup.info.room.settings') } } { GetSessionDataManager().userId !== roomData.ownerId && processAction('report_room') }> { LocalizeText('navigator.room.popup.report.room') } } { roomData.tags && roomData.tags.length > 0 && { roomData.tags.map((tag, i) => ( #{ tag } )) } } ); };