import { NitroCard } from '@layout/NitroCard'; import { AddLinkEventTracker, ConvertGlobalRoomIdMessageComposer, FindNewFriendsMessageComposer, HabboWebTools, ILinkEventTracker, LegacyExternalInterface, NavigatorInitComposer, RemoveLinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; import { FC, useEffect, useRef } from 'react'; import { FaPlus } from 'react-icons/fa'; import savesSearchIcon from '../../assets/images/navigator/saves-search/search_save.png'; import createRoomImg from '../../assets/images/navigator/create_room.png'; import randomRoomImg from '../../assets/images/navigator/random_room.png'; import promoteRoomImg from '../../assets/images/navigator/promote_room.png'; import { CreateLinkEvent, LocalizeText, SendMessageComposer, TryVisitRoom } from '../../api'; import { Flex, Text, WidgetErrorBoundary } from '../../common'; import { useNavigatorData, useNavigatorSearch, useNavigatorUiState, useNavigatorUiStore, useNitroEvent } from '../../hooks'; import { NavigatorDoorStateView } from './views/NavigatorDoorStateView'; import { NavigatorRoomCreatorView } from './views/NavigatorRoomCreatorView'; import { NavigatorRoomInfoView } from './views/NavigatorRoomInfoView'; import { NavigatorRoomLinkView } from './views/NavigatorRoomLinkView'; import { NavigatorRoomSettingsView } from './views/room-settings/NavigatorRoomSettingsView'; import { NavigatorEmptyStateView } from './views/search/NavigatorEmptyStateView'; import { NavigatorSearchResultView } from './views/search/NavigatorSearchResultView'; import { NavigatorSearchSavesResultView } from './views/search/NavigatorSearchSavesResultView'; import { NavigatorSearchSkeletonView } from './views/search/NavigatorSearchSkeletonView'; import { NavigatorSearchView } from './views/search/NavigatorSearchView'; export const NavigatorView: FC<{}> = props => { const { topLevelContext, topLevelContexts, navigatorData, navigatorSearches } = useNavigatorData(); const { searchResult, isFetching } = useNavigatorSearch(); const { isVisible, isCreatorOpen, isRoomInfoOpen, isRoomLinkOpen, isOpenSavesSearches, needsInit, currentTabCode } = useNavigatorUiState(); const elementRef = useRef(null); useNitroEvent(RoomSessionEvent.CREATED, event => { useNavigatorUiStore.getState().hide(); useNavigatorUiStore.getState().closeCreator(); }); useEffect(() => { const linkTracker: ILinkEventTracker = { linkReceived: (url: string) => { const parts = url.split('/'); if(parts.length < 2) return; const store = useNavigatorUiStore.getState(); switch(parts[1]) { case 'show': store.show(); return; case 'hide': store.hide(); return; case 'toggle': store.toggle(); return; case 'toggle-room-info': store.toggleRoomInfo(); return; case 'toggle-room-link': store.toggleRoomLink(); return; case 'goto': if(parts.length <= 2) return; if(parts[2] === 'home') { if(navigatorData.homeRoomId <= 0) return; TryVisitRoom(navigatorData.homeRoomId); return; } TryVisitRoom(parseInt(parts[2])); return; case 'create': store.openCreator(); return; case 'search': if(parts.length <= 2) return; const code = parts[2]; const value = parts.length > 3 ? parts[3] : ''; store.setTab(code); if(value) store.setFilter(value); store.show(); return; } }, eventUrlPrefix: 'navigator/' }; AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, [ navigatorData ]); useEffect(() => { if(!searchResult) return; if(elementRef.current) elementRef.current.scrollTop = 0; }, [ searchResult ]); useEffect(() => { if(!isVisible || !needsInit) return; SendMessageComposer(new NavigatorInitComposer()); useNavigatorUiStore.getState().markInitDone(); }, [ isVisible, needsInit ]); useEffect(() => { LegacyExternalInterface.addCallback(HabboWebTools.OPENROOM, (k: string) => SendMessageComposer(new ConvertGlobalRoomIdMessageComposer(k))); }, []); return ( <> { isVisible && useNavigatorUiStore.getState().hide() } /> useNavigatorUiStore.getState().toggleSavesSearches() }> { topLevelContexts && topLevelContexts.length > 0 && topLevelContexts.map((context, index) => useNavigatorUiStore.getState().setTab(context.code) }> { LocalizeText('navigator.toplevelview.' + context.code) } ) } useNavigatorUiStore.getState().openCreator() }> { !isCreatorOpen &&
{ isOpenSavesSearches &&
}
{ (isFetching && !searchResult) && } { searchResult && searchResult.results.map((result, index) => ) } { searchResult && (!searchResult.results || searchResult.results.length === 0) && useNavigatorUiStore.getState().openCreator() } /> }
useNavigatorUiStore.getState().openCreator() }> { LocalizeText('navigator.createroom.create') } { searchResult?.code !== 'myworld_view' && searchResult?.code !== 'roomads_view' && SendMessageComposer(new FindNewFriendsMessageComposer()) }> { LocalizeText('navigator.random.room') } } { (searchResult?.code === 'myworld_view' || searchResult?.code === 'roomads_view') && CreateLinkEvent('catalog/open/room_event') }> { LocalizeText('navigator.promote.room') } }
} { isCreatorOpen && }
} { isRoomInfoOpen && useNavigatorUiStore.getState().setRoomInfoOpen(false) } /> } { isRoomLinkOpen && useNavigatorUiStore.getState().setRoomLinkOpen(false) } /> } ); };