import { CreateLinkEvent, GetGuestRoomResultEvent, GetRoomEngine, NavigatorSearchComposer, RateFlatMessageComposer } from '@nitrots/nitro-renderer'; import { AnimatePresence, motion } from 'framer-motion'; import { classNames } from '../../../../layout'; import { FC, useEffect, useState } from 'react'; import { GetConfigurationValue, LocalizeText, SendMessageComposer, SetLocalStorage, TryVisitRoom } from '../../../../api'; import { Text } from '../../../../common'; import { useMessageEvent, useNavigator, useRoom } from '../../../../hooks'; export const RoomToolsWidgetView: FC<{}> = props => { const [areBubblesMuted, setAreBubblesMuted] = useState(false); const [isZoomedIn, setIsZoomedIn] = useState(false); const [roomName, setRoomName] = useState(null); const [roomOwner, setRoomOwner] = useState(null); const [roomTags, setRoomTags] = useState(null); const [isOpen, setIsOpen] = useState(false); const [isOpenHistory, setIsOpenHistory] = useState(false); const [roomHistory, setRoomHistory] = useState<{ roomId: number, roomName: string }[]>([]); const { navigatorData = null } = useNavigator(); const { roomSession = null } = useRoom(); const handleToolClick = (action: string, value?: string) => { switch (action) { case 'settings': CreateLinkEvent('navigator/toggle-room-info'); return; case 'zoom': setIsZoomedIn(prevValue => { if (GetConfigurationValue('room.zoom.enabled', true)) { const scale = GetRoomEngine().getRoomInstanceRenderingCanvasScale(roomSession.roomId, 1); GetRoomEngine().setRoomInstanceRenderingCanvasScale(roomSession.roomId, 1, scale === 1 ? 0.5 : 1); } else { const geometry = GetRoomEngine().getRoomInstanceGeometry(roomSession.roomId, 1); if (geometry) geometry.performZoom(); } return !prevValue; }); return; case 'chat_history': CreateLinkEvent('chat-history/toggle'); return; case 'hiddenbubbles': CreateLinkEvent('nitrobubblehidden/toggle'); setAreBubblesMuted(prev => !prev); return; case 'like_room': SendMessageComposer(new RateFlatMessageComposer(1)); return; case 'toggle_room_link': CreateLinkEvent('navigator/toggle-room-link'); return; case 'navigator_search_tag': CreateLinkEvent(`navigator/search/${value}`); SendMessageComposer(new NavigatorSearchComposer('hotel_view', `tag:${value}`)); return; case 'room_history': if (roomHistory.length > 0) setIsOpenHistory(prev => !prev); return; case 'room_history_back': const prevIndex = roomHistory.findIndex(room => room.roomId === navigatorData.currentRoomId) - 1; if (prevIndex >= 0) TryVisitRoom(roomHistory[prevIndex].roomId); return; case 'room_history_next': const nextIndex = roomHistory.findIndex(room => room.roomId === navigatorData.currentRoomId) + 1; if (nextIndex < roomHistory.length) TryVisitRoom(roomHistory[nextIndex].roomId); return; } }; const onChangeRoomHistory = (roomId: number, roomName: string) => { let newStorage = JSON.parse(window.localStorage.getItem('nitro.room.history') || '[]'); if (newStorage.some((room: { roomId: number }) => room.roomId === roomId)) return; if (newStorage.length >= 10) newStorage.shift(); newStorage = [...newStorage, { roomId, roomName }]; setRoomHistory(newStorage); SetLocalStorage('nitro.room.history', newStorage); }; useMessageEvent(GetGuestRoomResultEvent, event => { const parser = event.getParser(); if (!parser.roomEnter || (parser.data.roomId !== roomSession.roomId)) return; if (roomName !== parser.data.roomName) setRoomName(parser.data.roomName); if (roomOwner !== parser.data.ownerName) setRoomOwner(parser.data.ownerName); if (roomTags !== parser.data.tags) setRoomTags(parser.data.tags); onChangeRoomHistory(parser.data.roomId, parser.data.roomName); }); useEffect(() => { setIsOpen(true); const timeout = setTimeout(() => setIsOpen(false), 5000); return () => clearTimeout(timeout); }, [roomName, roomOwner, roomTags]); useEffect(() => { setRoomHistory(JSON.parse(window.localStorage.getItem('nitro.room.history') || '[]')); }, []); useEffect(() => { const handleTabClose = () => { window.localStorage.removeItem('nitro.room.history'); }; window.addEventListener('beforeunload', handleTabClose); return () => window.removeEventListener('beforeunload', handleTabClose); }, []); return (
handleToolClick('hiddenbubbles')} />
handleToolClick('settings')} />
handleToolClick('zoom')} />
handleToolClick('chat_history')} />
handleToolClick('hiddenbubbles')} /> {navigatorData.canRate && (
handleToolClick('like_room')} /> )}
handleToolClick('toggle_room_link')} />
handleToolClick('room_history')} />
{isOpen && (
{roomName} {roomOwner}
{roomTags && roomTags.length > 0 && (
{roomTags.map((tag, index) => ( handleToolClick('navigator_search_tag', tag)} > #{tag} ))}
)}
)} {isOpenHistory && (
{roomHistory.map(history => ( TryVisitRoom(history.roomId)} > {history.roomName} ))}
)}
); };