More navi fixes

This commit is contained in:
Bill 2022-03-19 22:40:26 -04:00
parent c2ddd60ff0
commit dfa9dd6b83
26 changed files with 640 additions and 200 deletions

View File

@ -14,6 +14,7 @@
"@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/fontawesome-svg-core": "^6.1.0",
"@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0",
"@fortawesome/react-fontawesome": "^0.1.17", "@fortawesome/react-fontawesome": "^0.1.17",
"@nitrots/nitro-renderer": "^1.1.14",
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"classnames": "^2.3.1", "classnames": "^2.3.1",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",

View File

@ -179,6 +179,7 @@ $nitro-card-tabs-height: 33px;
.nitro-card-tabs { .nitro-card-tabs {
height: 100%; height: 100%;
min-height: $nitro-card-tabs-height;
max-height: $nitro-card-tabs-height; max-height: $nitro-card-tabs-height;
border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color; border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
} }

View File

@ -93,14 +93,12 @@ export const GroupsView: FC<{}> = props =>
return ( return (
<GroupsContextProvider value={ { groupCustomize, setGroupCustomize } }> <GroupsContextProvider value={ { groupCustomize, setGroupCustomize } }>
<div className="nitro-groups">
{ isCreatorVisible && { isCreatorVisible &&
<GroupCreatorView onClose={ () => setCreatorVisible(false) } /> } <GroupCreatorView onClose={ () => setCreatorVisible(false) } /> }
{ !isCreatorVisible && { !isCreatorVisible &&
<GroupManagerView /> } <GroupManagerView /> }
<GroupMembersView /> <GroupMembersView />
<GroupInformationStandaloneView /> <GroupInformationStandaloneView />
</div>
</GroupsContextProvider> </GroupsContextProvider>
); );
}; };

View File

@ -1,5 +1,5 @@
import { NavigatorCategoryDataParser, NavigatorSearchResultSet, NavigatorTopLevelContext } from '@nitrots/nitro-renderer'; import { NavigatorCategoryDataParser, NavigatorSearchResultSet, NavigatorTopLevelContext } from '@nitrots/nitro-renderer';
import { createContext, Dispatch, FC, MutableRefObject, ProviderProps, SetStateAction, useContext } from 'react'; import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react';
import { NavigatorData } from './common/NavigatorData'; import { NavigatorData } from './common/NavigatorData';
interface INavigatorContext interface INavigatorContext
@ -14,7 +14,6 @@ interface INavigatorContext
setNavigatorData: Dispatch<SetStateAction<NavigatorData>>; setNavigatorData: Dispatch<SetStateAction<NavigatorData>>;
searchResult: NavigatorSearchResultSet; searchResult: NavigatorSearchResultSet;
setSearchResult: Dispatch<SetStateAction<NavigatorSearchResultSet>>; setSearchResult: Dispatch<SetStateAction<NavigatorSearchResultSet>>;
lastSearchValue: MutableRefObject<string>;
} }
const NavigatorContext = createContext<INavigatorContext>({ const NavigatorContext = createContext<INavigatorContext>({
@ -27,8 +26,7 @@ const NavigatorContext = createContext<INavigatorContext>({
navigatorData: null, navigatorData: null,
setNavigatorData: null, setNavigatorData: null,
searchResult: null, searchResult: null,
setSearchResult: null, setSearchResult: null
lastSearchValue: null
}); });
export const NavigatorContextProvider: FC<ProviderProps<INavigatorContext>> = props => export const NavigatorContextProvider: FC<ProviderProps<INavigatorContext>> = props =>

View File

@ -1,4 +1,4 @@
import { CantConnectMessageParser, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomResultEvent, HabboWebTools, LegacyExternalInterface, NavigatorCategoriesComposer, NavigatorCategoriesEvent, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSearchEvent, NavigatorSettingsComposer, RoomCreatedEvent, RoomDataParser, RoomDoorbellAcceptedEvent, RoomDoorbellEvent, RoomDoorbellRejectedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomInfoComposer, RoomScoreEvent, RoomSettingsUpdatedEvent, SecurityLevel, UserInfoEvent, UserPermissionsEvent } from '@nitrots/nitro-renderer'; import { CanCreateRoomEventEvent, CantConnectMessageParser, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomResultEvent, HabboWebTools, LegacyExternalInterface, NavigatorCategoriesComposer, NavigatorCategoriesEvent, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSearchEvent, NavigatorSettingsComposer, RoomCreatedEvent, RoomDataParser, RoomDoorbellAcceptedEvent, RoomDoorbellEvent, RoomDoorbellRejectedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomInfoComposer, RoomScoreEvent, RoomSettingsUpdatedEvent, SecurityLevel, UserInfoEvent, UserPermissionsEvent } from '@nitrots/nitro-renderer';
import { FC, useCallback } from 'react'; import { FC, useCallback } from 'react';
import { CreateLinkEvent, CreateRoomSession, GetConfiguration, GetSessionDataManager, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, TryVisitRoom, VisitDesktop } from '../../api'; import { CreateLinkEvent, CreateRoomSession, GetConfiguration, GetSessionDataManager, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, TryVisitRoom, VisitDesktop } from '../../api';
import { UpdateDoorStateEvent } from '../../events'; import { UpdateDoorStateEvent } from '../../events';
@ -18,21 +18,21 @@ export const NavigatorMessageHandler: FC<{}> = props =>
UseMessageEventHook(RoomSettingsUpdatedEvent, onRoomSettingsUpdatedEvent); UseMessageEventHook(RoomSettingsUpdatedEvent, onRoomSettingsUpdatedEvent);
// const onCanCreateRoomEventEvent = useCallback((event: CanCreateRoomEventEvent) => const onCanCreateRoomEventEvent = useCallback((event: CanCreateRoomEventEvent) =>
// { {
// const parser = event.getParser(); const parser = event.getParser();
// if(parser.canCreate) if(parser.canCreate)
// { {
// // show room event cvreate // show room event cvreate
// return; return;
// } }
// NotificationUtilities.simpleAlert(LocalizeText(`navigator.cannotcreateevent.error.${ parser.errorCode }`), null, null, null, LocalizeText('navigator.cannotcreateevent.title')); NotificationUtilities.simpleAlert(LocalizeText(`navigator.cannotcreateevent.error.${ parser.errorCode }`), null, null, null, LocalizeText('navigator.cannotcreateevent.title'));
// }, []); }, []);
// UseMessageEventHook(CanCreateRoomEventEvent, onCanCreateRoomEventEvent); UseMessageEventHook(CanCreateRoomEventEvent, onCanCreateRoomEventEvent);
const onUserInfoEvent = useCallback((event: UserInfoEvent) => const onUserInfoEvent = useCallback((event: UserInfoEvent) =>
{ {
@ -97,7 +97,7 @@ export const NavigatorMessageHandler: FC<{}> = props =>
const newValue = { ...prevValue }; const newValue = { ...prevValue };
newValue.enteredGuestRoom = parser.data; newValue.enteredGuestRoom = parser.data;
//newValue.currentRoomIsStaffPick = parser.staffPick; newValue.currentRoomIsStaffPick = parser.staffPick;
const isCreated = (newValue.createdFlatId === parser.data.roomId); const isCreated = (newValue.createdFlatId === parser.data.roomId);
@ -131,7 +131,7 @@ export const NavigatorMessageHandler: FC<{}> = props =>
} }
} }
// if((parser.data.doorMode === RoomDataParser.NOOB_STATE) && !GetSessionDataManager().isAmbassador && !GetSessionDataManager().isRealNoob && !GetSessionDataManager().isModerator) return; if((parser.data.doorMode === RoomDataParser.NOOB_STATE) && !GetSessionDataManager().isAmbassador && !GetSessionDataManager().isRealNoob && !GetSessionDataManager().isModerator) return;
CreateRoomSession(parser.data.roomId); CreateRoomSession(parser.data.roomId);
} }
@ -142,7 +142,7 @@ export const NavigatorMessageHandler: FC<{}> = props =>
const newValue = { ...prevValue }; const newValue = { ...prevValue };
newValue.enteredGuestRoom = parser.data; newValue.enteredGuestRoom = parser.data;
//newValue.currentRoomIsStaffPick = parser.staffPick; newValue.currentRoomIsStaffPick = parser.staffPick;
return newValue; return newValue;
}); });
@ -152,7 +152,17 @@ export const NavigatorMessageHandler: FC<{}> = props =>
const onRoomScoreEvent = useCallback((event: RoomScoreEvent) => const onRoomScoreEvent = useCallback((event: RoomScoreEvent) =>
{ {
const parser = event.getParser(); const parser = event.getParser();
}, [ ]);
setNavigatorData(prevValue =>
{
const newValue = { ...prevValue };
newValue.currentRoomRating = parser.totalLikes;
newValue.canRate = parser.canLike;
return newValue;
});
}, [ setNavigatorData ]);
const onRoomDoorbellEvent = useCallback((event: RoomDoorbellEvent) => const onRoomDoorbellEvent = useCallback((event: RoomDoorbellEvent) =>
{ {

View File

@ -2,32 +2,35 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { ConvertGlobalRoomIdMessageComposer, HabboWebTools, ILinkEventTracker, LegacyExternalInterface, NavigatorCategoryDataParser, NavigatorInitComposer, NavigatorSearchComposer, NavigatorSearchResultSet, NavigatorTopLevelContext, RoomDataParser, RoomSessionEvent } from '@nitrots/nitro-renderer'; import { ConvertGlobalRoomIdMessageComposer, HabboWebTools, ILinkEventTracker, LegacyExternalInterface, NavigatorCategoryDataParser, NavigatorInitComposer, NavigatorSearchComposer, NavigatorSearchResultSet, NavigatorTopLevelContext, RoomDataParser, RoomSessionEvent } from '@nitrots/nitro-renderer';
import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { AddEventLinkTracker, GoToDesktop, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, TryVisitRoom } from '../../api'; import { AddEventLinkTracker, GoToDesktop, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, TryVisitRoom } from '../../api';
import { Column, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; import { Base, Column, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common';
import { UpdateDoorStateEvent } from '../../events'; import { UpdateDoorStateEvent } from '../../events';
import { BatchUpdates, UseRoomSessionManagerEvent, UseUiEvent } from '../../hooks'; import { BatchUpdates, UseRoomSessionManagerEvent, useSharedState, UseUiEvent } from '../../hooks';
import { NavigatorData } from './common/NavigatorData'; import { NavigatorData } from './common/NavigatorData';
import { NavigatorContextProvider } from './NavigatorContext'; import { NavigatorContextProvider } from './NavigatorContext';
import { NavigatorMessageHandler } from './NavigatorMessageHandler'; import { NavigatorMessageHandler } from './NavigatorMessageHandler';
import { NavigatorRoomCreatorView } from './views/creator/NavigatorRoomCreatorView'; import { NavigatorRoomCreatorView } from './views/NavigatorRoomCreatorView';
import { NavigatorRoomDoorbellView } from './views/room-doorbell/NavigatorRoomDoorbellView'; import { NavigatorRoomDoorbellView } from './views/NavigatorRoomDoorbellView';
import { NavigatorRoomInfoView } from './views/room-info/NavigatorRoomInfoView'; import { NavigatorRoomInfoView } from './views/NavigatorRoomInfoView';
import { NavigatorRoomLinkView } from './views/room-link/NavigatorRoomLinkView'; import { NavigatorRoomLinkView } from './views/NavigatorRoomLinkView';
import { NavigatorRoomPasswordView } from './views/room-password/NavigatorRoomPasswordView'; import { NavigatorRoomPasswordView } from './views/NavigatorRoomPasswordView';
import { NavigatorRoomSettingsView } from './views/room-settings/NavigatorRoomSettingsView'; import { NavigatorRoomSettingsView } from './views/room-settings/NavigatorRoomSettingsView';
import { NavigatorSearchResultView } from './views/search-result/NavigatorSearchResultView'; import { NavigatorSearchResultView } from './views/search/NavigatorSearchResultView';
import { NavigatorSearchView } from './views/search/NavigatorSearchView'; import { NavigatorSearchView } from './views/search/NavigatorSearchView';
export const NavigatorView: FC<{}> = props => export const NavigatorView: FC<{}> = props =>
{ {
const [ isVisible, setIsVisible ] = useState(false); const [ isVisible, setIsVisible ] = useState(false);
const [ isReady, setIsReady ] = useState(false);
const [ isCreatorOpen, setCreatorOpen ] = useState(false); const [ isCreatorOpen, setCreatorOpen ] = useState(false);
const [ isRoomInfoOpen, setRoomInfoOpen ] = useState(false); const [ isRoomInfoOpen, setRoomInfoOpen ] = useState(false);
const [ isRoomLinkOpen, setRoomLinkOpen ] = useState(false); const [ isRoomLinkOpen, setRoomLinkOpen ] = useState(false);
const [ needsUpdate, setNeedsUpdate ] = useState(true); const [ isLoading, setIsLoading ] = useState(false);
const [ needsInit, setNeedsInit ] = useState(true);
const [ needsSearch, setNeedsSearch ] = useState(false);
const [ categories, setCategories ] = useState<NavigatorCategoryDataParser[]>(null); const [ categories, setCategories ] = useState<NavigatorCategoryDataParser[]>(null);
const [ topLevelContext, setTopLevelContext ] = useState<NavigatorTopLevelContext>(null); const [ topLevelContext, setTopLevelContext ] = useState<NavigatorTopLevelContext>(null);
const [ topLevelContexts, setTopLevelContexts ] = useState<NavigatorTopLevelContext[]>(null); const [ topLevelContexts, setTopLevelContexts ] = useState<NavigatorTopLevelContext[]>(null);
const [ navigatorData, setNavigatorData ] = useState<NavigatorData>({ const [ navigatorData, setNavigatorData ] = useSharedState<NavigatorData>('@navigatorData', {
settingsReceived: false, settingsReceived: false,
homeRoomId: 0, homeRoomId: 0,
enteredGuestRoom: null, enteredGuestRoom: null,
@ -37,11 +40,13 @@ export const NavigatorView: FC<{}> = props =>
createdFlatId: 0, createdFlatId: 0,
avatarId: 0, avatarId: 0,
roomPicker: false, roomPicker: false,
eventMod: false eventMod: false,
currentRoomRating: 0,
canRate: true
}); });
const [ searchResult, setSearchResult ] = useState<NavigatorSearchResultSet>(null); const [ searchResult, setSearchResult ] = useState<NavigatorSearchResultSet>(null);
const [ pendingDoorState, setPendingDoorState ] = useState<{ roomData: RoomDataParser, state: string }>(null); const [ pendingDoorState, setPendingDoorState ] = useState<{ roomData: RoomDataParser, state: string }>(null);
const lastSearchValue = useRef<string>(); const pendingSearch = useRef<{ value: string, code: string }>(null);
const onUpdateDoorStateEvent = useCallback((event: UpdateDoorStateEvent) => const onUpdateDoorStateEvent = useCallback((event: UpdateDoorStateEvent) =>
{ {
@ -102,25 +107,57 @@ export const NavigatorView: FC<{}> = props =>
UseRoomSessionManagerEvent(RoomSessionEvent.CREATED, onRoomSessionEvent); UseRoomSessionManagerEvent(RoomSessionEvent.CREATED, onRoomSessionEvent);
const sendSearch = useCallback((searchValue: string, contextCode: string) =>
{
setCreatorOpen(false);
SendMessageComposer(new NavigatorSearchComposer(contextCode, searchValue));
}, []);
const closePendingDoorState = useCallback((state: string) => const closePendingDoorState = useCallback((state: string) =>
{ {
if(state !== null) if(state !== null)
{ {
setPendingDoorState(prevValue => setPendingDoorState(prevValue =>
{ {
return { roomData: prevValue.roomData, state }; return { ...prevValue, state };
}); });
} }
else setPendingDoorState(null); else setPendingDoorState(null);
}, []); }, []);
const sendSearch = useCallback((searchValue: string, contextCode: string) =>
{
setCreatorOpen(false);
SendMessageComposer(new NavigatorSearchComposer(contextCode, searchValue));
setIsLoading(true);
}, []);
const reloadCurrentSearch = useCallback(() =>
{
if(!isReady)
{
setNeedsSearch(true);
return;
}
if(pendingSearch.current)
{
sendSearch(pendingSearch.current.value, pendingSearch.current.code);
pendingSearch.current = null;
return;
}
if(searchResult)
{
sendSearch(searchResult.data, searchResult.code);
return;
}
if(!topLevelContext) return;
sendSearch('', topLevelContext.code);
}, [ isReady, searchResult, topLevelContext, sendSearch ]);
const linkReceived = useCallback((url: string) => const linkReceived = useCallback((url: string) =>
{ {
const parts = url.split('/'); const parts = url.split('/');
@ -129,15 +166,32 @@ export const NavigatorView: FC<{}> = props =>
switch(parts[1]) switch(parts[1])
{ {
case 'show': case 'show': {
BatchUpdates(() =>
{
setIsVisible(true); setIsVisible(true);
setNeedsSearch(true);
});
return; return;
}
case 'hide': case 'hide':
setIsVisible(false); setIsVisible(false);
return; return;
case 'toggle': case 'toggle': {
setIsVisible(prevValue => !prevValue); if(isVisible)
{
setIsVisible(false);
return; return;
}
BatchUpdates(() =>
{
setIsVisible(true);
setNeedsSearch(true);
});
return;
}
case 'toggle-room-info': case 'toggle-room-info':
setRoomInfoOpen(value => !value); setRoomInfoOpen(value => !value);
return; return;
@ -177,12 +231,17 @@ export const NavigatorView: FC<{}> = props =>
if(parts.length > 3) searchValue = parts[3]; if(parts.length > 3) searchValue = parts[3];
pendingSearch.current = { value: searchValue, code: topLevelContextCode };
BatchUpdates(() =>
{
setIsVisible(true); setIsVisible(true);
sendSearch(searchValue, topLevelContextCode); setNeedsSearch(true);
});
} }
return; return;
} }
}, [ navigatorData.homeRoomId, sendSearch ]); }, [ isVisible, navigatorData.homeRoomId ]);
useEffect(() => useEffect(() =>
{ {
@ -196,48 +255,43 @@ export const NavigatorView: FC<{}> = props =>
return () => RemoveLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker);
}, [ linkReceived ]); }, [ linkReceived ]);
// useEffect(() => useEffect(() =>
// { {
// if(!isVisible) return; if(!searchResult) return;
// sendSearch(lastSearch) setIsLoading(false);
// }, [ isVisible ]); }, [ searchResult ]);
useEffect(() => useEffect(() =>
{ {
if(!needsUpdate) return; if(!isVisible || !isReady || !needsSearch) return;
reloadCurrentSearch();
setNeedsSearch(false);
}, [ isVisible, isReady, needsSearch, reloadCurrentSearch ]);
useEffect(() =>
{
if(isReady || !topLevelContext) return;
setIsReady(true);
}, [ isReady, topLevelContext ]);
useEffect(() =>
{
if(!isVisible || !needsInit) return;
SendMessageComposer(new NavigatorInitComposer()); SendMessageComposer(new NavigatorInitComposer());
setNeedsUpdate(false); setNeedsInit(false);
}, [ needsUpdate ]); }, [ isVisible, needsInit ]);
useEffect(() => useEffect(() =>
{ {
LegacyExternalInterface.addCallback(HabboWebTools.OPENROOM, (k: string, _arg_2: boolean = false, _arg_3: string = null) => SendMessageComposer(new ConvertGlobalRoomIdMessageComposer(k))); LegacyExternalInterface.addCallback(HabboWebTools.OPENROOM, (k: string, _arg_2: boolean = false, _arg_3: string = null) => SendMessageComposer(new ConvertGlobalRoomIdMessageComposer(k)));
}, []); }, []);
// useEffect(() =>
// {
// if(!isVisible || !topLevelContext) return;
// sendSearch('', topLevelContext.code);
// }, [ isVisible, sendSearch, topLevelContext ])
// useEffect(() =>
// {
// if(!topLevelContexts || !topLevelContexts.length) return;
// sendSearch('', topLevelContexts[0].code);
// }, [ topLevelContexts, sendSearch ]);
// useEffect(() =>
// {
// if(!isVisible || !LAST_SEARCH || !LAST_SEARCH.length) return;
// CreateLinkEvent(`navigator/search/${ LAST_SEARCH }`);
// }, [ isVisible ]);
const getRoomDoorState = useMemo(() => const getRoomDoorState = useMemo(() =>
{ {
if(!pendingDoorState) return null; if(!pendingDoorState) return null;
@ -257,7 +311,7 @@ export const NavigatorView: FC<{}> = props =>
}, [ pendingDoorState, closePendingDoorState ]); }, [ pendingDoorState, closePendingDoorState ]);
return ( return (
<NavigatorContextProvider value={ { categories, setCategories, topLevelContext, setTopLevelContext, topLevelContexts, setTopLevelContexts, navigatorData, setNavigatorData, searchResult, setSearchResult, lastSearchValue } }> <NavigatorContextProvider value={ { categories, setCategories, topLevelContext, setTopLevelContext, topLevelContexts, setTopLevelContexts, navigatorData, setNavigatorData, searchResult, setSearchResult } }>
<NavigatorMessageHandler /> <NavigatorMessageHandler />
{ getRoomDoorState } { getRoomDoorState }
{ isVisible && { isVisible &&
@ -276,7 +330,9 @@ export const NavigatorView: FC<{}> = props =>
<FontAwesomeIcon icon="plus" /> <FontAwesomeIcon icon="plus" />
</NitroCardTabsItemView> </NitroCardTabsItemView>
</NitroCardTabsView> </NitroCardTabsView>
<NitroCardContentView> <NitroCardContentView position='relative'>
{ isLoading &&
<Base fit position="absolute" className="top-0 start-0 z-index-1 bg-muted opacity-0-5" /> }
{ !isCreatorOpen && { !isCreatorOpen &&
<> <>
<NavigatorSearchView sendSearch={ sendSearch } /> <NavigatorSearchView sendSearch={ sendSearch } />

View File

@ -12,4 +12,6 @@ export interface NavigatorData
avatarId: number; avatarId: number;
roomPicker: boolean; roomPicker: boolean;
eventMod: boolean; eventMod: boolean;
currentRoomRating: number;
canRate: boolean;
} }

View File

@ -1,11 +1,11 @@
/* eslint-disable no-template-curly-in-string */ /* eslint-disable no-template-curly-in-string */
import { HabboClubLevelEnum, RoomCreateComposer } from '@nitrots/nitro-renderer'; import { HabboClubLevelEnum, RoomCreateComposer } from '@nitrots/nitro-renderer';
import { FC, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { GetClubMemberLevel, GetConfiguration, LocalizeText, SendMessageComposer } from '../../../../api'; import { GetClubMemberLevel, GetConfiguration, LocalizeText, SendMessageComposer } from '../../../api';
import { Button, Column, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, Text } from '../../../../common'; import { Button, Column, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, Text } from '../../../common';
import { BatchUpdates } from '../../../../hooks'; import { BatchUpdates } from '../../../hooks';
import { IRoomModel, RoomModels } from '../../common/RoomModels'; import { IRoomModel, RoomModels } from '../common/RoomModels';
import { useNavigatorContext } from '../../NavigatorContext'; import { useNavigatorContext } from '../NavigatorContext';
export const NavigatorRoomCreatorView: FC<{}> = props => export const NavigatorRoomCreatorView: FC<{}> = props =>
{ {

View File

@ -1,11 +1,11 @@
import { RoomDataParser } from '@nitrots/nitro-renderer'; import { RoomDataParser } from '@nitrots/nitro-renderer';
import { FC } from 'react'; import { FC } from 'react';
import { CreateRoomSession, GoToDesktop, LocalizeText } from '../../../../api'; import { CreateRoomSession, GoToDesktop, LocalizeText } from '../../../api';
import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../common';
import { Button } from '../../../../common/Button'; import { Button } from '../../../common/Button';
import { Column } from '../../../../common/Column'; import { Column } from '../../../common/Column';
import { Text } from '../../../../common/Text'; import { Text } from '../../../common/Text';
import { UpdateDoorStateEvent } from '../../../../events'; import { UpdateDoorStateEvent } from '../../../events';
export interface NavigatorRoomDoorbellViewProps export interface NavigatorRoomDoorbellViewProps
{ {

View File

@ -2,11 +2,11 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { RoomMuteComposer, RoomSettingsComposer, RoomStaffPickComposer, SecurityLevel, UserHomeRoomComposer } from '@nitrots/nitro-renderer'; import { RoomMuteComposer, RoomSettingsComposer, RoomStaffPickComposer, SecurityLevel, UserHomeRoomComposer } from '@nitrots/nitro-renderer';
import classNames from 'classnames'; import classNames from 'classnames';
import { FC, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { CreateLinkEvent, GetGroupInformation, GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../../api'; import { CreateLinkEvent, GetGroupInformation, GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../api';
import { Button, Column, Flex, LayoutBadgeImageView, LayoutRoomThumbnailView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text, UserProfileIconView } from '../../../../common'; import { Button, Column, Flex, LayoutBadgeImageView, LayoutRoomThumbnailView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text, UserProfileIconView } from '../../../common';
import { FloorplanEditorEvent, RoomWidgetThumbnailEvent } from '../../../../events'; import { FloorplanEditorEvent, RoomWidgetThumbnailEvent } from '../../../events';
import { BatchUpdates, DispatchUiEvent } from '../../../../hooks'; import { BatchUpdates, DispatchUiEvent } from '../../../hooks';
import { useNavigatorContext } from '../../NavigatorContext'; import { useNavigatorContext } from '../NavigatorContext';
export class NavigatorRoomInfoViewProps export class NavigatorRoomInfoViewProps
{ {

View File

@ -1,7 +1,7 @@
import { FC } from 'react'; import { FC } from 'react';
import { GetConfiguration, LocalizeText } from '../../../../api'; import { GetConfiguration, LocalizeText } from '../../../api';
import { Column, Flex, LayoutRoomThumbnailView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { Column, Flex, LayoutRoomThumbnailView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common';
import { useNavigatorContext } from '../../NavigatorContext'; import { useNavigatorContext } from '../NavigatorContext';
export class NavigatorRoomLinkViewProps export class NavigatorRoomLinkViewProps
{ {

View File

@ -1,11 +1,11 @@
import { RoomDataParser } from '@nitrots/nitro-renderer'; import { RoomDataParser } from '@nitrots/nitro-renderer';
import { FC, useCallback, useState } from 'react'; import { FC, useCallback, useState } from 'react';
import { CreateRoomSession, LocalizeText } from '../../../../api'; import { CreateRoomSession, LocalizeText } from '../../../api';
import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../common';
import { Button } from '../../../../common/Button'; import { Button } from '../../../common/Button';
import { Column } from '../../../../common/Column'; import { Column } from '../../../common/Column';
import { Text } from '../../../../common/Text'; import { Text } from '../../../common/Text';
import { UpdateDoorStateEvent } from '../../../../events'; import { UpdateDoorStateEvent } from '../../../events';
export interface NavigatorRoomPasswordViewProps export interface NavigatorRoomPasswordViewProps
{ {

View File

@ -1,8 +1,8 @@
import { RoomDataParser } from '@nitrots/nitro-renderer'; import { RoomDataParser } from '@nitrots/nitro-renderer';
import { FC, useCallback } from 'react'; import { FC, useCallback } from 'react';
import { LocalizeText } from '../../../../../api'; import { LocalizeText } from '../../../../api';
import { Column, Flex, Text } from '../../../../../common'; import { Column, Flex, Text } from '../../../../common';
import RoomSettingsData from '../../../common/RoomSettingsData'; import RoomSettingsData from '../../common/RoomSettingsData';
interface NavigatorRoomSettingsTabViewProps interface NavigatorRoomSettingsTabViewProps
{ {

View File

@ -1,11 +1,11 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { RoomDeleteComposer } from '@nitrots/nitro-renderer'; import { RoomDeleteComposer } from '@nitrots/nitro-renderer';
import { FC } from 'react'; import { FC } from 'react';
import { CreateLinkEvent, LocalizeText, NotificationUtilities, SendMessageComposer } from '../../../../../api'; import { CreateLinkEvent, LocalizeText, NotificationUtilities, SendMessageComposer } from '../../../../api';
import { Base, Flex, Text } from '../../../../../common'; import { Base, Flex, Text } from '../../../../common';
import RoomSettingsData from '../../../common/RoomSettingsData'; import RoomSettingsData from '../../common/RoomSettingsData';
import { GetMaxVisitorsList } from '../../../common/RoomSettingsUtils'; import { GetMaxVisitorsList } from '../../common/RoomSettingsUtils';
import { useNavigatorContext } from '../../../NavigatorContext'; import { useNavigatorContext } from '../../NavigatorContext';
const DESC_MAX_LENGTH = 255; const DESC_MAX_LENGTH = 255;

View File

@ -1,8 +1,8 @@
import { RoomUnbanUserComposer } from '@nitrots/nitro-renderer'; import { RoomUnbanUserComposer } from '@nitrots/nitro-renderer';
import { FC, useCallback, useState } from 'react'; import { FC, useCallback, useState } from 'react';
import { LocalizeText, SendMessageComposer } from '../../../../../api'; import { LocalizeText, SendMessageComposer } from '../../../../api';
import { Base, Button, Column, Grid, Text } from '../../../../../common'; import { Base, Button, Column, Grid, Text } from '../../../../common';
import RoomSettingsData from '../../../common/RoomSettingsData'; import RoomSettingsData from '../../common/RoomSettingsData';
interface NavigatorRoomSettingsTabViewProps interface NavigatorRoomSettingsTabViewProps
{ {

View File

@ -1,8 +1,8 @@
import { RemoveAllRightsMessageComposer, RoomTakeRightsComposer } from '@nitrots/nitro-renderer'; import { RemoveAllRightsMessageComposer, RoomTakeRightsComposer } from '@nitrots/nitro-renderer';
import { FC, useCallback } from 'react'; import { FC, useCallback } from 'react';
import { LocalizeText, SendMessageComposer } from '../../../../../api'; import { LocalizeText, SendMessageComposer } from '../../../../api';
import { Button, Column, Flex, Grid, Text, UserProfileIconView } from '../../../../../common'; import { Button, Column, Flex, Grid, Text, UserProfileIconView } from '../../../../common';
import RoomSettingsData from '../../../common/RoomSettingsData'; import RoomSettingsData from '../../common/RoomSettingsData';
interface NavigatorRoomSettingsTabViewProps interface NavigatorRoomSettingsTabViewProps
{ {

View File

@ -1,14 +1,15 @@
import { RoomBannedUsersComposer, RoomSettingsEvent, RoomUsersWithRightsComposer, SaveRoomSettingsComposer } from '@nitrots/nitro-renderer'; import { RoomBannedUsersComposer, RoomSettingsEvent, RoomUsersWithRightsComposer, SaveRoomSettingsComposer } from '@nitrots/nitro-renderer';
import { BannedUsersFromRoomEvent, FlatControllerAddedEvent, FlatControllerRemovedEvent, FlatControllersEvent } from '@nitrots/nitro-renderer/src/nitro/communication/messages/incoming/roomsettings';
import { FC, useCallback, useState } from 'react'; import { FC, useCallback, useState } from 'react';
import { LocalizeText, SendMessageComposer } from '../../../../api'; import { LocalizeText, SendMessageComposer } from '../../../../api';
import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../common'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../common';
import { UseMessageEventHook } from '../../../../hooks'; import { UseMessageEventHook } from '../../../../hooks';
import RoomSettingsData from '../../common/RoomSettingsData'; import RoomSettingsData from '../../common/RoomSettingsData';
import { NavigatorRoomSettingsAccessTabView } from './views/NavigatorRoomSettingsAccessTabView'; import { NavigatorRoomSettingsAccessTabView } from './NavigatorRoomSettingsAccessTabView';
import { NavigatorRoomSettingsBasicTabView } from './views/NavigatorRoomSettingsBasicTabView'; import { NavigatorRoomSettingsBasicTabView } from './NavigatorRoomSettingsBasicTabView';
import { NavigatorRoomSettingsModTabView } from './views/NavigatorRoomSettingsModTabView'; import { NavigatorRoomSettingsModTabView } from './NavigatorRoomSettingsModTabView';
import { NavigatorRoomSettingsRightsTabView } from './views/NavigatorRoomSettingsRightsTabView'; import { NavigatorRoomSettingsRightsTabView } from './NavigatorRoomSettingsRightsTabView';
import { NavigatorRoomSettingsVipChatTabView } from './views/NavigatorRoomSettingsVipChatTabView'; import { NavigatorRoomSettingsVipChatTabView } from './NavigatorRoomSettingsVipChatTabView';
const TABS: string[] = [ const TABS: string[] = [
'navigator.roomsettings.tab.1', 'navigator.roomsettings.tab.1',
@ -23,58 +24,56 @@ export const NavigatorRoomSettingsView: FC<{}> = props =>
const [ roomSettingsData, setRoomSettingsData ] = useState<RoomSettingsData>(null); const [ roomSettingsData, setRoomSettingsData ] = useState<RoomSettingsData>(null);
const [ currentTab, setCurrentTab ] = useState(TABS[0]); const [ currentTab, setCurrentTab ] = useState(TABS[0]);
// const onFlatControllersEvent = useCallback((event: FlatControllersEvent) => const onFlatControllersEvent = useCallback((event: FlatControllersEvent) =>
// { {
// const parser = event.getParser(); const parser = event.getParser();
// if(!parser || !roomSettingsData) return; if(!parser || !roomSettingsData) return;
// if(roomSettingsData.roomId !== parser.roomId) return; if(roomSettingsData.roomId !== parser.roomId) return;
// const data = Object.assign({}, roomSettingsData); const data = Object.assign({}, roomSettingsData);
// data.usersWithRights = new Map(parser.users); data.usersWithRights = new Map(parser.users);
// setRoomSettingsData(data); setRoomSettingsData(data);
// }, [ roomSettingsData] ); }, [ roomSettingsData] );
// UseMessageEventHook(FlatControllersEvent, onFlatControllersEvent); UseMessageEventHook(FlatControllersEvent, onFlatControllersEvent);
// const onFlatControllerAddedEvent = useCallback((event: FlatControllerAddedEvent) => const onFlatControllerAddedEvent = useCallback((event: FlatControllerAddedEvent) =>
// { {
// const parser = event.getParser(); const parser = event.getParser();
// if(!parser || !roomSettingsData) return; if(!parser || !roomSettingsData) return;
// if(roomSettingsData.roomId !== parser.roomId) return; if(roomSettingsData.roomId !== parser.roomId) return;
// const data = Object.assign({}, roomSettingsData); const data = Object.assign({}, roomSettingsData);
// // add new controller // add new controller
// setRoomSettingsData(data); setRoomSettingsData(data);
// }, [ roomSettingsData] ); }, [ roomSettingsData] );
// UseMessageEventHook(FlatControllerAddedEvent, onFlatControllerAddedEvent); UseMessageEventHook(FlatControllerAddedEvent, onFlatControllerAddedEvent);
// const onFlatControllerRemovedEvent = useCallback((event: FlatControllerRemovedEvent) => const onFlatControllerRemovedEvent = useCallback((event: FlatControllerRemovedEvent) =>
// { {
// const parser = event.getParser(); const parser = event.getParser();
// if(!parser || !roomSettingsData) return; if(!parser || !roomSettingsData) return;
// if(roomSettingsData.roomId !== parser.roomId) return; if(roomSettingsData.roomId !== parser.roomId) return;
// const data = Object.assign({}, roomSettingsData); const data = Object.assign({}, roomSettingsData);
// // remove controller // remove controller
// setRoomSettingsData(data);
// }, [ roomSettingsData] );
// UseMessageEventHook(FlatControllerRemovedEvent, onFlatControllerRemovedEvent);
setRoomSettingsData(data);
}, [ roomSettingsData] );
UseMessageEventHook(FlatControllerRemovedEvent, onFlatControllerRemovedEvent);
const updateSettings = useCallback((roomSettings: RoomSettingsData) => const updateSettings = useCallback((roomSettings: RoomSettingsData) =>
{ {
@ -94,22 +93,22 @@ export const NavigatorRoomSettingsView: FC<{}> = props =>
UseMessageEventHook(RoomSettingsEvent, onRoomSettingsEvent); UseMessageEventHook(RoomSettingsEvent, onRoomSettingsEvent);
// const onBannedUsersFromRoomEvent = useCallback((event: BannedUsersFromRoomEvent) => const onBannedUsersFromRoomEvent = useCallback((event: BannedUsersFromRoomEvent) =>
// { {
// const parser = event.getParser(); const parser = event.getParser();
// if(!parser || !roomSettingsData) return; if(!parser || !roomSettingsData) return;
// if(roomSettingsData.roomId !== parser.roomId) return; if(roomSettingsData.roomId !== parser.roomId) return;
// const data = Object.assign({}, roomSettingsData); const data = Object.assign({}, roomSettingsData);
// data.bannedUsers = parser.bannedUsers; data.bannedUsers = parser.bannedUsers;
// setRoomSettingsData(data); setRoomSettingsData(data);
// }, [roomSettingsData]); }, [roomSettingsData]);
// UseMessageEventHook(BannedUsersFromRoomEvent, onBannedUsersFromRoomEvent); UseMessageEventHook(BannedUsersFromRoomEvent, onBannedUsersFromRoomEvent);
const saveSettings = useCallback((data: RoomSettingsData) => const saveSettings = useCallback((data: RoomSettingsData) =>
{ {

View File

@ -1,7 +1,7 @@
import { FC } from 'react'; import { FC } from 'react';
import { LocalizeText } from '../../../../../api'; import { LocalizeText } from '../../../../api';
import { Column, Flex, Grid, Text } from '../../../../../common'; import { Column, Flex, Grid, Text } from '../../../../common';
import RoomSettingsData from '../../../common/RoomSettingsData'; import RoomSettingsData from '../../common/RoomSettingsData';
interface NavigatorRoomSettingsTabViewProps interface NavigatorRoomSettingsTabViewProps
{ {

View File

@ -2,7 +2,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { RoomDataParser } from '@nitrots/nitro-renderer'; import { RoomDataParser } from '@nitrots/nitro-renderer';
import { FC, MouseEvent } from 'react'; import { FC, MouseEvent } from 'react';
import { CreateRoomSession, GetSessionDataManager, TryVisitRoom } from '../../../../api'; import { CreateRoomSession, GetSessionDataManager, TryVisitRoom } from '../../../../api';
import { Flex, LayoutBadgeImageView, LayoutGridItemProps, LayoutRoomThumbnailView, Text } from '../../../../common'; import { Column, Flex, LayoutBadgeImageView, LayoutGridItemProps, LayoutRoomThumbnailView, Text } from '../../../../common';
import { UpdateDoorStateEvent } from '../../../../events'; import { UpdateDoorStateEvent } from '../../../../events';
import { DispatchUiEvent } from '../../../../hooks'; import { DispatchUiEvent } from '../../../../hooks';
import { NavigatorSearchResultItemInfoView } from './NavigatorSearchResultItemInfoView'; import { NavigatorSearchResultItemInfoView } from './NavigatorSearchResultItemInfoView';
@ -39,13 +39,7 @@ export const NavigatorSearchResultItemView: FC<NavigatorSearchResultItemViewProp
return bg; return bg;
} }
function openInfo(event: MouseEvent): void const visitRoom = (event: MouseEvent) =>
{
event.stopPropagation();
console.log('info');
}
function visitRoom(): void
{ {
if(roomData.ownerId !== GetSessionDataManager().userId) if(roomData.ownerId !== GetSessionDataManager().userId)
{ {
@ -71,7 +65,7 @@ export const NavigatorSearchResultItemView: FC<NavigatorSearchResultItemViewProp
} }
if(thumbnail) return ( if(thumbnail) return (
<Flex pointer overflow="hidden" column={ true } alignItems="center" onClick={visitRoom} gap={0} className="navigator-item p-1 bg-light rounded-3 small mb-1 flex-column border border-muted" {...rest}> <Column pointer overflow="hidden" alignItems="center" onClick={ visitRoom } gap={ 0 } className="navigator-item p-1 bg-light rounded-3 small mb-1 flex-column border border-muted" {...rest}>
<LayoutRoomThumbnailView roomId={roomData.roomId} customUrl={roomData.officialRoomPicRef} className="d-flex flex-column align-items-center justify-content-end mb-1"> <LayoutRoomThumbnailView roomId={roomData.roomId} customUrl={roomData.officialRoomPicRef} className="d-flex flex-column align-items-center justify-content-end mb-1">
<LayoutBadgeImageView badgeCode={roomData.groupBadgeCode} isGroup={true} className={ 'position-absolute top-0 start-0 m-1' } /> <LayoutBadgeImageView badgeCode={roomData.groupBadgeCode} isGroup={true} className={ 'position-absolute top-0 start-0 m-1' } />
<Flex center className={ 'badge p-1 position-absolute m-1 ' + getUserCounterColor() } gap={ 1 }> <Flex center className={ 'badge p-1 position-absolute m-1 ' + getUserCounterColor() } gap={ 1 }>
@ -89,7 +83,7 @@ export const NavigatorSearchResultItemView: FC<NavigatorSearchResultItemViewProp
{ children } { children }
</Flex> </Flex>
</Flex> </Column>
); );
return ( return (
@ -98,7 +92,7 @@ export const NavigatorSearchResultItemView: FC<NavigatorSearchResultItemViewProp
<FontAwesomeIcon icon="user" /> <FontAwesomeIcon icon="user" />
{ roomData.userCount } { roomData.userCount }
</Flex> </Flex>
<Text truncate className="flex-grow-1">{ roomData.roomName }</Text> <Text truncate grow>{ roomData.roomName }</Text>
<Flex reverse alignItems="center" gap={ 1 }> <Flex reverse alignItems="center" gap={ 1 }>
<NavigatorSearchResultItemInfoView roomData={ roomData } /> <NavigatorSearchResultItemInfoView roomData={ roomData } />
{ roomData.habboGroupId > 0 && <i className="icon icon-navigator-room-group" /> } { roomData.habboGroupId > 0 && <i className="icon icon-navigator-room-group" /> }

View File

@ -1,8 +1,10 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import React, { FC, KeyboardEvent, useState } from 'react'; import React, { FC, KeyboardEvent, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../api'; import { LocalizeText } from '../../../../api';
import { Button } from '../../../../common/Button'; import { Button } from '../../../../common/Button';
import { Flex } from '../../../../common/Flex'; import { Flex } from '../../../../common/Flex';
import { BatchUpdates } from '../../../../hooks';
import { INavigatorSearchFilter } from '../../common/INavigatorSearchFilter';
import { SearchFilterOptions } from '../../common/SearchFilterOptions'; import { SearchFilterOptions } from '../../common/SearchFilterOptions';
import { useNavigatorContext } from '../../NavigatorContext'; import { useNavigatorContext } from '../../NavigatorContext';
@ -16,8 +18,7 @@ export const NavigatorSearchView: FC<NavigatorSearchViewProps> = props =>
const { sendSearch = null } = props; const { sendSearch = null } = props;
const [ searchFilterIndex, setSearchFilterIndex ] = useState(0); const [ searchFilterIndex, setSearchFilterIndex ] = useState(0);
const [ searchValue, setSearchValue ] = useState(''); const [ searchValue, setSearchValue ] = useState('');
const [ lastSearchQuery, setLastSearchQuery ] = useState(''); const { topLevelContext = null, searchResult = null } = useNavigatorContext();
const { topLevelContext = null, lastSearchValue = null } = useNavigatorContext();
const processSearch = () => const processSearch = () =>
{ {
@ -29,12 +30,7 @@ export const NavigatorSearchView: FC<NavigatorSearchViewProps> = props =>
const searchQuery = ((searchFilter.query ? (searchFilter.query + ':') : '') + searchValue); const searchQuery = ((searchFilter.query ? (searchFilter.query + ':') : '') + searchValue);
if(lastSearchQuery === searchQuery) return;
setLastSearchQuery(searchQuery);
sendSearch((searchQuery || ''), topLevelContext.code); sendSearch((searchQuery || ''), topLevelContext.code);
lastSearchValue.current = (searchQuery || '');
} }
const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) =>
@ -44,6 +40,36 @@ export const NavigatorSearchView: FC<NavigatorSearchViewProps> = props =>
processSearch(); processSearch();
}; };
useEffect(() =>
{
if(!searchResult) return null;
const split = searchResult.data.split(':');
let filter: INavigatorSearchFilter = null;
let value: string = '';
if(split.length >= 2)
{
const [ query, ...rest ] = split;
filter = SearchFilterOptions.find(option => (option.query === query));
value = rest.join(':');
}
else
{
value = searchResult.data;
}
if(!filter) filter = SearchFilterOptions[0];
BatchUpdates(() =>
{
setSearchFilterIndex(SearchFilterOptions.findIndex(option => (option === filter)));
setSearchValue(value);
});
}, [ searchResult ]);
return ( return (
<Flex fullWidth gap={ 1 }> <Flex fullWidth gap={ 1 }>
<Flex shrink> <Flex shrink>

View File

@ -3,18 +3,19 @@ import classNames from 'classnames';
import { FC, useCallback, useEffect, useState } from 'react'; import { FC, useCallback, useEffect, useState } from 'react';
import { CreateLinkEvent, LocalizeText, RoomWidgetZoomToggleMessage, SendMessageComposer } from '../../../../api'; import { CreateLinkEvent, LocalizeText, RoomWidgetZoomToggleMessage, SendMessageComposer } from '../../../../api';
import { Base, Column, Flex, Text, TransitionAnimation, TransitionAnimationTypes } from '../../../../common'; import { Base, Column, Flex, Text, TransitionAnimation, TransitionAnimationTypes } from '../../../../common';
import { BatchUpdates, UseMessageEventHook } from '../../../../hooks'; import { BatchUpdates, UseMessageEventHook, useSharedState } from '../../../../hooks';
import { NavigatorData } from '../../../navigator/common/NavigatorData';
import { useRoomContext } from '../../RoomContext'; import { useRoomContext } from '../../RoomContext';
export const RoomToolsWidgetView: FC<{}> = props => export const RoomToolsWidgetView: FC<{}> = props =>
{ {
const [ isZoomedIn, setIsZoomedIn ] = useState(false); const [ isZoomedIn, setIsZoomedIn ] = useState(false);
const [ isLiked, setIsLiked ] = useState(false);
const [ roomName, setRoomName ] = useState(null); const [ roomName, setRoomName ] = useState(null);
const [ roomOwner, setRoomOwner ] = useState(null); const [ roomOwner, setRoomOwner ] = useState(null);
const [ roomTags, setRoomTags ] = useState(null); const [ roomTags, setRoomTags ] = useState(null);
const [ roomInfoDisplay, setRoomInfoDisplay ] = useState(false); const [ roomInfoDisplay, setRoomInfoDisplay ] = useState(false);
const [ isOpen, setIsOpen ] = useState(false); const [ isOpen, setIsOpen ] = useState(false);
const [ navigatorData, setNavigatorData ] = useSharedState<NavigatorData>('@navigatorData');
const { widgetHandler = null } = useRoomContext(); const { widgetHandler = null } = useRoomContext();
const handleToolClick = (action: string) => const handleToolClick = (action: string) =>
@ -32,10 +33,7 @@ export const RoomToolsWidgetView: FC<{}> = props =>
CreateLinkEvent('chat-history/toggle'); CreateLinkEvent('chat-history/toggle');
return; return;
case 'like_room': case 'like_room':
if(isLiked) return;
SendMessageComposer(new RoomLikeRoomComposer(1)); SendMessageComposer(new RoomLikeRoomComposer(1));
setIsLiked(true);
return; return;
case 'toggle_room_link': case 'toggle_room_link':
CreateLinkEvent('navigator/toggle-room-link'); CreateLinkEvent('navigator/toggle-room-link');
@ -68,13 +66,19 @@ export const RoomToolsWidgetView: FC<{}> = props =>
return () => clearTimeout(timeout); return () => clearTimeout(timeout);
}, [ roomName, roomOwner, roomTags ]); }, [ roomName, roomOwner, roomTags ]);
useEffect(() =>
{
console.log(navigatorData);
}, [ navigatorData ]);
return ( return (
<Flex className="nitro-room-tools-container" gap={ 2 }> <Flex className="nitro-room-tools-container" gap={ 2 }>
<Column center className="nitro-room-tools p-2"> <Column center className="nitro-room-tools p-2">
<Base pointer title={ LocalizeText('room.settings.button.text') } className="icon icon-cog" onClick={ () => handleToolClick('settings') } /> <Base pointer title={ LocalizeText('room.settings.button.text') } className="icon icon-cog" onClick={ () => handleToolClick('settings') } />
<Base pointer title={ LocalizeText('room.zoom.button.text') } onClick={ () => handleToolClick('zoom') } className={ 'icon ' + classNames({ 'icon-zoom-less': !isZoomedIn, 'icon-zoom-more': isZoomedIn }) } /> <Base pointer title={ LocalizeText('room.zoom.button.text') } onClick={ () => handleToolClick('zoom') } className={ 'icon ' + classNames({ 'icon-zoom-less': !isZoomedIn, 'icon-zoom-more': isZoomedIn }) } />
<Base pointer title={ LocalizeText('room.chathistory.button.text') } onClick={ () => handleToolClick('chat_history') } className="icon icon-chat-history" /> <Base pointer title={ LocalizeText('room.chathistory.button.text') } onClick={ () => handleToolClick('chat_history') } className="icon icon-chat-history" />
{ !isLiked && <Base pointer title={ LocalizeText('room.like.button.text') } onClick={ () => handleToolClick('like_room') } className="icon icon-like-room" /> } { navigatorData.canRate &&
<Base pointer title={ LocalizeText('room.like.button.text') } onClick={ () => handleToolClick('like_room') } className="icon icon-like-room" /> }
</Column> </Column>
<Column justifyContent="center"> <Column justifyContent="center">
<TransitionAnimation type={ TransitionAnimationTypes.SLIDE_LEFT } inProp={ isOpen } timeout={ 300 }> <TransitionAnimation type={ TransitionAnimationTypes.SLIDE_LEFT } inProp={ isOpen } timeout={ 300 }>

View File

@ -0,0 +1,67 @@
import { Dispatch, SetStateAction, useEffect, useState } from 'react';
const sharedStates: Map<string, any> = new Map();
const sharedSetters: Map<string, Dispatch<SetStateAction<any>>[]> = new Map();
export const useSharedState = <T>(key: string, initialValue?: T | (() => T)): [T, Dispatch<SetStateAction<T>>] =>
{
const [ state, setState ] = useState<T>(() =>
{
try
{
const item = sharedStates.get(key);
return item || initialValue;
}
catch (error)
{
console.error(error);
return initialValue;
}
});
const updateState: Dispatch<SetStateAction<T>> = data =>
{
try
{
const valueToStore = data instanceof Function ? data(state as T) : data;
const setters = sharedSetters.get(key);
if(setters) for(const setter of setters) setter(valueToStore);
sharedStates.set(key, valueToStore);
}
catch (error)
{
console.error(error);
}
};
useEffect(() =>
{
if(!key || !key.length) return;
let existing = sharedSetters.get(key);
if(!existing)
{
existing = [];
sharedSetters.set(key, existing);
}
existing.push(setState);
return () =>
{
const index = existing.findIndex(dispatch => (dispatch === setState));
if(index >= 0) existing.splice(index, 1);
}
}, [ key ]);
return [ state as T, updateState ];
}

View File

@ -5,3 +5,4 @@ export * from './events/nitro';
export * from './events/ui'; export * from './events/ui';
export * from './messages'; export * from './messages';
export * from './UseMountEffect'; export * from './UseMountEffect';
export * from './UseSharedState';

283
yarn.lock
View File

@ -1426,6 +1426,18 @@
"@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/sourcemap-codec" "^1.4.10"
"@nitrots/nitro-renderer@^1.1.14":
version "1.1.14"
resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.14.tgz#30c792572f4df26e85efab0342894bfeb10c3cfa"
integrity sha512-P4ruZ7eJ169q/pzsTN/AYf5pqr4ZoTCefvsAGHON4VSFqUO1vIivqqNmTgWJlBHMukj2VqrbLZukYrbt0+cUCQ==
dependencies:
"@pixi/canvas-renderer" "^6.2.2"
"@pixi/extract" "^6.2.2"
"@pixi/filter-adjustment" "^4.1.3"
"@pixi/tilemap" "^3.2.2"
pako "^2.0.4"
pixi.js "^6.2.2"
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
version "2.1.5" version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@ -1463,6 +1475,206 @@
mkdirp "^1.0.4" mkdirp "^1.0.4"
rimraf "^3.0.2" rimraf "^3.0.2"
"@pixi/accessibility@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/accessibility/-/accessibility-6.2.2.tgz#0c46b59d11c3e4b841bff5153116e2d17d028a24"
integrity sha512-/mXRXCw67bmPY/OZ1Y1p747h3SSg7eqacIChAUJohjbcJK0R2EJRD2uVTspVIUpHPJA0ECNGBpKqk0C1Yzkj2w==
"@pixi/app@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/app/-/app-6.2.2.tgz#45c3dba327a6500d6b9322048950499a5588ec22"
integrity sha512-YBzVaSZGA842w2gsgqzxYwQMXeu2JZmSyiybi4raFsA35iOeMurXy7sEs5NP9JO+cjobJyx6echuHzZpKUjWsQ==
"@pixi/canvas-renderer@^6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/canvas-renderer/-/canvas-renderer-6.2.2.tgz#01b7be3f91c66d527713feb3dd52f128d61dd908"
integrity sha512-GIGUhA9bzodom8oslIYEq9KWB+ko6IJCY+WmzBxvaH2TBKQQ85k6vipTCp+w/ZgNnezhcA/eFRQoqFFM4ob7+A==
"@pixi/compressed-textures@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/compressed-textures/-/compressed-textures-6.2.2.tgz#8860283058ab931c26dde27daa328e0a7de11a65"
integrity sha512-ZjiqYCE6nGtsKTRa6w4W6Krh3vo4M3WT6lrP+VW6BfgUx3quEURt5GVFsFZrJpWF4yI1fShFmjBUOerrTLJGRQ==
"@pixi/constants@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/constants/-/constants-6.2.2.tgz#53a2d0e7f3d16d0400985d81005a076c25b0b32a"
integrity sha512-BKSoj/5SI+pQEatuCG5kXXWtCZmZZNMhfhXeqvYO/WNZ+LDxm6F4pllf0t7KjGs1ZBpNxVf6fyngF9Q5r3MgJQ==
"@pixi/core@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/core/-/core-6.2.2.tgz#badf9c03e3a07835b92d1a3868363d8e5083cf13"
integrity sha512-XAqgdJ1w9k1ZUBXECm19rcnN2ngm+tOP74HkGw4qQay0biM3JS+wtX4fWQmZNGr8krf6lJrNbsghbtUy70uUaw==
"@pixi/display@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/display/-/display-6.2.2.tgz#6e8ef26f2ed686c03d71d8bb5b92e6222cb23563"
integrity sha512-8a0R+9rjlUUjb13nBA6ZNj9gygJqt38B63uIZ2inkhxpIQf0CLo2hNxkqCqXiMeRuGmOw1n6neEDMnHO1Ks+xA==
"@pixi/extract@6.2.2", "@pixi/extract@^6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/extract/-/extract-6.2.2.tgz#f8d682dbf4c29ad2bbbed0bf710c63fcfdcadc7c"
integrity sha512-w3gW1/VoHNqFEUNGRQBKm8dCdg816etbpbLExWctmPpNdyxos5N7DF44UMRFg40GPVBBNzYissrH/ojca4PFIA==
"@pixi/filter-adjustment@^4.1.3":
version "4.1.3"
resolved "https://registry.yarnpkg.com/@pixi/filter-adjustment/-/filter-adjustment-4.1.3.tgz#61e34b4dd9766ccf40463f0538201bf68f78df66"
integrity sha512-W+NhPiZRYKoRToa5+tkU95eOw8gnS5dfIp3ZP+pLv2mdER9RI+4xHxp1uLHMqUYZViTaMdZIIoVOuCgHFPYCbQ==
"@pixi/filter-alpha@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/filter-alpha/-/filter-alpha-6.2.2.tgz#4c39d67deaf99d979019252ea6dab69d853bae84"
integrity sha512-CijLcgFdmivmSyZuM5Yyeo6R+PwalZp9OSoard1Oh5DBVvcRDn4m3cBM+nimR4YJbr0kiMbK4Ja8r+e2vwFVjA==
"@pixi/filter-blur@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/filter-blur/-/filter-blur-6.2.2.tgz#bc0f0d0fe2d7095d3fd8924dd013f154a7436e68"
integrity sha512-ApFqn2fMIipr3mRp/8dZ74qraGGzzPO/EzvltDqJLru9vGlbX6dKLXZ6w5H8D/uN6aQW1e4N1Nrtzk5mvJVQ3g==
"@pixi/filter-color-matrix@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/filter-color-matrix/-/filter-color-matrix-6.2.2.tgz#9eb4c55ae37b2d6e221ef7bb1781c58fb33890ad"
integrity sha512-fQWbtKFWV29jKkq4d6TknEfQ5sF5OxcbJeZo0HJmgoV3FLZ0t21XE991CFI/TqDBo8U3wzUPZVbXxiFoDKmJ8w==
"@pixi/filter-displacement@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/filter-displacement/-/filter-displacement-6.2.2.tgz#6eaa737b1c055c5daff77e384f6d2f728f2a93f3"
integrity sha512-cd9um4kNNIeqKA/wVZw+iha+XVbBOYBC8En5hk3ZXAIXxCHxOCz3KS+aOVejXH5EB/gMDPvNNwygn0SCpSGdKA==
"@pixi/filter-fxaa@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/filter-fxaa/-/filter-fxaa-6.2.2.tgz#fea85d68414f9ee7f417d7e54791ccbaccd861c4"
integrity sha512-e4qekMlsiEcjV0JRoqH3b34sk8yzT4jsROYPHzk0IiafE+nNNcF3vQmcmnfC0aGIyODzmNdzFLjlFkRRSviydA==
"@pixi/filter-noise@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/filter-noise/-/filter-noise-6.2.2.tgz#a4617a279e968628d7e088b36bf28c8c7cf85fb9"
integrity sha512-Jp4L6winS6ZGKpp76x3JyfEWnUMY44fQ90Ts3R3vKkZZFNDd3T4uisZ7YwvDKOhmSo5hY3lQkXaCg/YO5feXbw==
"@pixi/graphics@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/graphics/-/graphics-6.2.2.tgz#bffa1b6ab75a2c5ca54a83444e5cafe6e68dd7c7"
integrity sha512-mQyd6ef6/EF5nt7M1OObBEb9FCXxIP6AT30H01Z2wnnCgu4qj8MHrJxTkQxSHynQ+eVVPswzpVizUQZHlIYZNw==
"@pixi/interaction@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/interaction/-/interaction-6.2.2.tgz#31abd2ed0b810570ff487dd7595b755b76f5a3ba"
integrity sha512-gpNLCPc+j+RZSZqbKbzVRf4fSlOlYm0xqUVn6JtNH1kc+d9AV7Nmw9but4osP/eodDWsWPQ+7sPKClHY36bKRA==
"@pixi/loaders@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/loaders/-/loaders-6.2.2.tgz#b4fdf00f193733c14d499d4ae74fedc9063a6270"
integrity sha512-jwFM59GeMQpzuniw5PlC7kCoXZEaKrw31/ecR1sXKWDtHRyMtvXTuf+R+tSol/1ISQ55c0JBTuUbLPwp7hPvFQ==
"@pixi/math@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/math/-/math-6.2.2.tgz#dfbeeb03de765fa6e1fcfbd2058ed0037d945a86"
integrity sha512-TtsaooRRMc/WAZ4LKUDhP/d14BZElLjRNa2gopwTKUtrDa1KvzAMr8WJ8P+gaXl4DJ8B/MlgESdPhRUqVSUw0A==
"@pixi/mesh-extras@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/mesh-extras/-/mesh-extras-6.2.2.tgz#127280bcb686896b62a9b26f69681a60ecc9f3c2"
integrity sha512-HFYWhWcV6gY7VYnMhz9OSEN14PPfVqLzWnglbegGEMqCbY/ZGsD8X99x/HLGQGd6L4FFto382q0Fj1xu+y/brg==
"@pixi/mesh@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/mesh/-/mesh-6.2.2.tgz#f301bbf888ca36994b8edb30a590fbe4a035dd6f"
integrity sha512-CsKFgTu2MP756sHeoCr9s4tHy2VmnDZPnvZ0ThV8QMnb5w3Z2qRDKlXSSIdNaQOxoAPKkqxIu0JbLK8kyX0oqw==
"@pixi/mixin-cache-as-bitmap@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-6.2.2.tgz#4c0cdddeba91578f6e58a48df7c27743bcfc8f84"
integrity sha512-t3jZKGa/qoRMetMWmGkXz8Kp1Uzmb+2y4/adqu+RdIeG3D1oItuGux+R36ZQO6dVRv3R8s2/Dex0aACek171zw==
"@pixi/mixin-get-child-by-name@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-6.2.2.tgz#154d8f0d8324d0cbd84a695babd960a0c35b6c10"
integrity sha512-BBrniLAkzDex4HyvVdE/DjphzQu4pZ8Nc5aDRIbiS1s283/IXr2oTcoaW23kCjhX0xgu++XcJQQMMyv3mlblZQ==
"@pixi/mixin-get-global-position@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/mixin-get-global-position/-/mixin-get-global-position-6.2.2.tgz#361c4d9889a0b9a724e0cc92fb01d7705b1edb3e"
integrity sha512-Rz7DHn6koYFEeVG36rKiMwoTD+elJKqwQ24HHw0BAKz1VwGagBi0ZTcJ+nWplBOrw6ZPKfdOBwGQLXD7ODg8lQ==
"@pixi/particle-container@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/particle-container/-/particle-container-6.2.2.tgz#ff6b4c5da58b052b177a8504ab2a3a53851c460c"
integrity sha512-DYbSCcUiVLeM4sKZkzAp3F6dz3idyP1jecxbFqNmRjWRyMv7uXIO42rxGJMrd6BzA5j7DkywI3X0SqhhSZP7Ag==
"@pixi/polyfill@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/polyfill/-/polyfill-6.2.2.tgz#18c0a2e7273fcd505f78aa08ee4c10010dca3314"
integrity sha512-Fd5KnjrqG9Vwgl9sDfPvNeqW3/d+hG9Du7H3y5PmItBnu9wXldTtA+I5D0BLsL/wjjjCQLbPVFKwCJj511XfBw==
dependencies:
object-assign "^4.1.1"
promise-polyfill "^8.2.0"
"@pixi/prepare@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/prepare/-/prepare-6.2.2.tgz#7dd53bc2415d371113806700c103e074615f14a8"
integrity sha512-kJojn/6zEcao+XQyU+zWkBmQr0Tgeju3F9JYBpPQ8MKIUJYvDQDtRxYo9A6Xzxk8FJ373s2Ext/OelX2FcR3HQ==
"@pixi/runner@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/runner/-/runner-6.2.2.tgz#ac253ee250198437b7a7182078a90e1e752f8ada"
integrity sha512-q7bc6Eu2XplGzCQBOhbv32P0z48ixW/Su6epT9IOfDi2iTiPjB5Sxp9e+DZDFIzvkfLzgr67Ddy51YMvOp5sQg==
"@pixi/settings@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/settings/-/settings-6.2.2.tgz#1984a9a233b5e78c3cf564fed5a2cde3012b754c"
integrity sha512-eQv0ykSwnJUd/LF4MuaFoL+eBNG+EUPAVfsnlsez/Y09aqwIzJyAjRx+uGp9adQ3XHXwYt2l2wINn+foF1y/8A==
dependencies:
ismobilejs "^1.1.0"
"@pixi/sprite-animated@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/sprite-animated/-/sprite-animated-6.2.2.tgz#8006a943834fbb5059800e0b57b08c890524a264"
integrity sha512-MNkVIuC06aXn8bgfWyqQE8vmclCVLgmHB//hssr/1IFCVmnEEYZLyeWErkIA87grY3iV7tGOILEYSa3pod4XEg==
"@pixi/sprite-tiling@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/sprite-tiling/-/sprite-tiling-6.2.2.tgz#2447fd92af3e9ddf2bdaa143018eb4f721fc0714"
integrity sha512-HQ9RVObmwyPq+PM2wm2UEIMdsvWg96ymSz0NOh9bOfMSme18vSWv0Rbidv/FziQT8x6MpoLpYke0DYMGtbu0tA==
"@pixi/sprite@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/sprite/-/sprite-6.2.2.tgz#a699e95f3da0f290e798a076ff30c4ec0cc6f263"
integrity sha512-Imr+sJWFh5GtarW3FBBUzedSexfijg7OL0A6qwMDHA011gjyVeRZ15uXP8fgIwUoHoMLsU6xk85jcucM9RfWuw==
"@pixi/spritesheet@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/spritesheet/-/spritesheet-6.2.2.tgz#84013fff2f7a6b50f1403484d7cb445a4510198c"
integrity sha512-TZodC/pf+CW/8kZN+RPzObXWSPgYv1pp+foUnOHb7w8AyFnMljeqBPiUfLQaMzw91TI9AHLihoeeofqZ4wMpww==
"@pixi/text-bitmap@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/text-bitmap/-/text-bitmap-6.2.2.tgz#26f2838a06edc2e17659d6e02d4244b714e4b61d"
integrity sha512-pJZM0o68n6cUFUdolvpuuloMccdQqvTc3CLzhLu9xW9HLx7NeFjZEQWTGQea8GXsGa1RhvlMd9x3AiVSNMI2FA==
"@pixi/text@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/text/-/text-6.2.2.tgz#bf4bd0e9fdf9041e3516bbaae2094f6ab8b4ee26"
integrity sha512-Hi6MO/QhllZ4IWkr7MBzImzHB88XXKlF5E9xt1vUBhdZb3KsQD+cPx+bNCFWn6ZMWDmOloJekzRkkSl3KrfBSw==
"@pixi/ticker@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/ticker/-/ticker-6.2.2.tgz#3170ce5f44c56ac1bdb1a66a1f393d023c9cbb4e"
integrity sha512-tF3cRtcYnj3U3HFQ0IJKvAxFU1YUM96T0p8Qh478xZhvGxYGnjrQDPmjXePb4NocAdG5adb6//2uvQOd7o4rHg==
"@pixi/tilemap@^3.2.2":
version "3.2.2"
resolved "https://registry.yarnpkg.com/@pixi/tilemap/-/tilemap-3.2.2.tgz#8327e5d7007a90be640a0b1eb9943a1e405b57e4"
integrity sha512-svdmMyJP63vdae3t66tCmE8IWeO/6lD1xXU+5gzfxqxJS5seTp2bm8mQok2c8PF0O6l/NYlLz6BRklOuEuHboQ==
"@pixi/utils@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@pixi/utils/-/utils-6.2.2.tgz#cf292ceb494992e7974982043b214617615ce335"
integrity sha512-rpS6QolFuRmm/QcKm5PYHOCkX6okl9a00u2osaMbmPP+l7XLATTxSsFhw64UbSNR+zmzsrhreRFBVFn3tf8K6w==
dependencies:
"@types/earcut" "^2.1.0"
earcut "^2.2.2"
eventemitter3 "^3.1.0"
url "^0.11.0"
"@pmmmwh/react-refresh-webpack-plugin@0.4.3": "@pmmmwh/react-refresh-webpack-plugin@0.4.3":
version "0.4.3" version "0.4.3"
resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766"
@ -1721,6 +1933,11 @@
dependencies: dependencies:
"@babel/types" "^7.3.0" "@babel/types" "^7.3.0"
"@types/earcut@^2.1.0":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@types/earcut/-/earcut-2.1.1.tgz#573a0af609f17005c751f6f4ffec49cfe358ea51"
integrity sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ==
"@types/eslint@^7.28.2": "@types/eslint@^7.28.2":
version "7.29.0" version "7.29.0"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78"
@ -4431,6 +4648,11 @@ duplexify@^3.4.2, duplexify@^3.6.0:
readable-stream "^2.0.0" readable-stream "^2.0.0"
stream-shift "^1.0.0" stream-shift "^1.0.0"
earcut@^2.2.2:
version "2.2.3"
resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.3.tgz#d44ced2ff5a18859568e327dd9c7d46b16f55cf4"
integrity sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==
ecc-jsbn@~0.1.1: ecc-jsbn@~0.1.1:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@ -4922,6 +5144,11 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
eventemitter3@^3.1.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
eventemitter3@^4.0.0: eventemitter3@^4.0.0:
version "4.0.7" version "4.0.7"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
@ -6505,6 +6732,11 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
ismobilejs@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ismobilejs/-/ismobilejs-1.1.1.tgz#c56ca0ae8e52b24ca0f22ba5ef3215a2ddbbaa0e"
integrity sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==
isobject@^2.0.0: isobject@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
@ -8330,6 +8562,11 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
pako@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d"
integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==
pako@~1.0.5: pako@~1.0.5:
version "1.0.11" version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
@ -8524,6 +8761,47 @@ pirates@^4.0.1:
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
pixi.js@^6.2.2:
version "6.2.2"
resolved "https://registry.yarnpkg.com/pixi.js/-/pixi.js-6.2.2.tgz#bc8319f007e48c0d5190b32b3e4f1d5bee0677e4"
integrity sha512-/xCnJUsWTZuacR6JYTnRbUb+5grzlqpp2O1Ub7bCZCE3FApTCs7nMNYeLfdeP+np/MlGaM+SsPh2cXcafR3OZw==
dependencies:
"@pixi/accessibility" "6.2.2"
"@pixi/app" "6.2.2"
"@pixi/compressed-textures" "6.2.2"
"@pixi/constants" "6.2.2"
"@pixi/core" "6.2.2"
"@pixi/display" "6.2.2"
"@pixi/extract" "6.2.2"
"@pixi/filter-alpha" "6.2.2"
"@pixi/filter-blur" "6.2.2"
"@pixi/filter-color-matrix" "6.2.2"
"@pixi/filter-displacement" "6.2.2"
"@pixi/filter-fxaa" "6.2.2"
"@pixi/filter-noise" "6.2.2"
"@pixi/graphics" "6.2.2"
"@pixi/interaction" "6.2.2"
"@pixi/loaders" "6.2.2"
"@pixi/math" "6.2.2"
"@pixi/mesh" "6.2.2"
"@pixi/mesh-extras" "6.2.2"
"@pixi/mixin-cache-as-bitmap" "6.2.2"
"@pixi/mixin-get-child-by-name" "6.2.2"
"@pixi/mixin-get-global-position" "6.2.2"
"@pixi/particle-container" "6.2.2"
"@pixi/polyfill" "6.2.2"
"@pixi/prepare" "6.2.2"
"@pixi/runner" "6.2.2"
"@pixi/settings" "6.2.2"
"@pixi/sprite" "6.2.2"
"@pixi/sprite-animated" "6.2.2"
"@pixi/sprite-tiling" "6.2.2"
"@pixi/spritesheet" "6.2.2"
"@pixi/text" "6.2.2"
"@pixi/text-bitmap" "6.2.2"
"@pixi/ticker" "6.2.2"
"@pixi/utils" "6.2.2"
pkg-dir@^3.0.0: pkg-dir@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
@ -9290,6 +9568,11 @@ promise-inflight@^1.0.1:
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
promise-polyfill@^8.2.0:
version "8.2.3"
resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.2.3.tgz#2edc7e4b81aff781c88a0d577e5fe9da822107c6"
integrity sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==
promise@^8.1.0: promise@^8.1.0:
version "8.1.0" version "8.1.0"
resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e"