Start link events

This commit is contained in:
Bill 2021-07-23 01:04:12 -04:00
parent f00d55a5c3
commit 89ba080c54
3 changed files with 87 additions and 16 deletions

View File

@ -1,7 +1,6 @@
import { CatalogModeComposer, CatalogRequestGiftConfigurationComposer, ICatalogPageData, RoomPreviewer } from 'nitro-renderer'; import { CatalogModeComposer, CatalogPageComposer, CatalogRequestGiftConfigurationComposer, ICatalogPageData, ILinkEventTracker, RoomPreviewer } from 'nitro-renderer';
import { FC, useCallback, useEffect, useReducer, useState } from 'react'; import { FC, useCallback, useEffect, useReducer, useState } from 'react';
import { GetRoomEngine } from '../../api'; import { AddEventLinkTracker, GetRoomEngine, RemoveLinkEventTracker } from '../../api';
import { GetCatalogPageComposer } from '../../api/catalog/GetCatalogPageComposer';
import { CatalogEvent } from '../../events'; import { CatalogEvent } from '../../events';
import { useUiEvent } from '../../hooks/events/ui/ui-event'; import { useUiEvent } from '../../hooks/events/ui/ui-event';
import { SendMessageHook } from '../../hooks/messages/message-event'; import { SendMessageHook } from '../../hooks/messages/message-event';
@ -9,6 +8,7 @@ import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, Nitro
import { LocalizeText } from '../../utils/LocalizeText'; import { LocalizeText } from '../../utils/LocalizeText';
import { CatalogMessageHandler } from './CatalogMessageHandler'; import { CatalogMessageHandler } from './CatalogMessageHandler';
import { CatalogMode, CatalogViewProps } from './CatalogView.types'; import { CatalogMode, CatalogViewProps } from './CatalogView.types';
import { GetCatalogPageTree } from './common/CatalogUtilities';
import { CatalogContextProvider } from './context/CatalogContext'; import { CatalogContextProvider } from './context/CatalogContext';
import { CatalogActions, CatalogReducer, initialCatalog } from './reducers/CatalogReducer'; import { CatalogActions, CatalogReducer, initialCatalog } from './reducers/CatalogReducer';
import { CatalogNavigationView } from './views/navigation/CatalogNavigationView'; import { CatalogNavigationView } from './views/navigation/CatalogNavigationView';
@ -42,6 +42,67 @@ export const CatalogView: FC<CatalogViewProps> = props =>
useUiEvent(CatalogEvent.TOGGLE_CATALOG, onCatalogEvent); useUiEvent(CatalogEvent.TOGGLE_CATALOG, onCatalogEvent);
useUiEvent(CatalogEvent.CATALOG_RESET, onCatalogEvent); useUiEvent(CatalogEvent.CATALOG_RESET, onCatalogEvent);
const setCurrentTab = useCallback((page: ICatalogPageData) =>
{
dispatchCatalogState({
type: CatalogActions.SET_CATALOG_CURRENT_TAB,
payload: {
currentTab: page
}
});
}, [ dispatchCatalogState ]);
const navigateThroughTree = useCallback((tree: ICatalogPageData[]) =>
{
setCurrentTab(tree.shift());
}, [ setCurrentTab ]);
const navigateToPage = useCallback((pageId: number) =>
{
const pageTree: ICatalogPageData[] = [];
GetCatalogPageTree(root, pageId, pageTree);
if(!pageTree.length) return;
pageTree.reverse();
navigateThroughTree(pageTree);
}, [ root, navigateThroughTree ]);
const linkReceived = useCallback((url: string) =>
{
const parts = url.split('/');
if(parts.length < 2) return;
switch(parts[1])
{
case 'open':
if(parts.length > 2)
{
navigateToPage(parseInt(parts[2]));
}
else
{
setIsVisible(true);
}
return;
}
}, [ navigateToPage ]);
useEffect(() =>
{
const linkTracker: ILinkEventTracker = {
linkReceived,
eventUrlPrefix: 'catalog/'
};
AddEventLinkTracker(linkTracker);
return () => RemoveLinkEventTracker(linkTracker);
}, [ linkReceived]);
useEffect(() => useEffect(() =>
{ {
if(!isVisible) return; if(!isVisible) return;
@ -51,13 +112,15 @@ export const CatalogView: FC<CatalogViewProps> = props =>
SendMessageHook(new CatalogModeComposer(CatalogMode.MODE_NORMAL)); SendMessageHook(new CatalogModeComposer(CatalogMode.MODE_NORMAL));
SendMessageHook(new CatalogRequestGiftConfigurationComposer()); SendMessageHook(new CatalogRequestGiftConfigurationComposer());
} }
console.log(catalogState.root)
}, [ isVisible, catalogState.root ]); }, [ isVisible, catalogState.root ]);
useEffect(() => useEffect(() =>
{ {
if(!currentTab) return; if(!currentTab) return;
SendMessageHook(GetCatalogPageComposer(currentTab.pageId, -1, CatalogMode.MODE_NORMAL)); SendMessageHook(new CatalogPageComposer(currentTab.pageId, -1, CatalogMode.MODE_NORMAL));
}, [ currentTab ]); }, [ currentTab ]);
useEffect(() => useEffect(() =>
@ -75,16 +138,6 @@ export const CatalogView: FC<CatalogViewProps> = props =>
} }
}, []); }, []);
const setCurrentTab = useCallback((page: ICatalogPageData) =>
{
dispatchCatalogState({
type: CatalogActions.SET_CATALOG_CURRENT_TAB,
payload: {
currentTab: page
}
});
}, [ dispatchCatalogState ]);
const currentNavigationPage = ((searchResult && searchResult.page) || currentTab); const currentNavigationPage = ((searchResult && searchResult.page) || currentTab);
return ( return (

View File

@ -149,3 +149,20 @@ export function GetPetAvailableColors(petIndex: number, palettes: SellablePetPal
} }
} }
} }
export function GetCatalogPageTree(page: ICatalogPageData, targetPageId: number, tree: ICatalogPageData[])
{
if(page.pageId === targetPageId) return page;
for(const pageData of page.children)
{
const foundPageData = GetCatalogPageTree(pageData, targetPageId, tree);
if(foundPageData)
{
tree.push(pageData);
return pageData;
}
}
}

View File

@ -1,6 +1,7 @@
import { ILinkEventTracker, NavigatorInitComposer, NavigatorSearchComposer, RoomSessionEvent } from 'nitro-renderer'; import { ILinkEventTracker, NavigatorInitComposer, NavigatorSearchComposer, RoomSessionEvent } from 'nitro-renderer';
import { FC, useCallback, useEffect, useReducer, useState } from 'react'; import { FC, useCallback, useEffect, useReducer, useState } from 'react';
import { AddEventLinkTracker, RemoveLinkEventTracker } from '../../api'; import { AddEventLinkTracker, RemoveLinkEventTracker } from '../../api';
import { TryVisitRoom } from '../../api/navigator/TryVisitRoom';
import { NavigatorEvent } from '../../events'; import { NavigatorEvent } from '../../events';
import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event'; import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event';
import { useUiEvent } from '../../hooks/events/ui/ui-event'; import { useUiEvent } from '../../hooks/events/ui/ui-event';
@ -93,7 +94,7 @@ export const NavigatorView: FC<NavigatorViewProps> = props =>
default: { default: {
const roomId = parseInt(parts[2]); const roomId = parseInt(parts[2]);
//if(roomId > 0) this.goToPrivateRoom(roomId); TryVisitRoom(roomId);
} }
} }
} }
@ -105,7 +106,7 @@ export const NavigatorView: FC<NavigatorViewProps> = props =>
{ {
const linkTracker: ILinkEventTracker = { const linkTracker: ILinkEventTracker = {
linkReceived, linkReceived,
eventUrlPrefix: 'navigator' eventUrlPrefix: 'navigator/'
}; };
AddEventLinkTracker(linkTracker); AddEventLinkTracker(linkTracker);