Clickable front page links

This commit is contained in:
Bill 2021-07-27 22:41:51 -04:00
parent ddea5be9bc
commit c572143268
3 changed files with 53 additions and 38 deletions

View File

@ -18,7 +18,7 @@ export const CatalogView: FC<CatalogViewProps> = props =>
{ {
const [ isVisible, setIsVisible ] = useState(false); const [ isVisible, setIsVisible ] = useState(false);
const [ roomPreviewer, setRoomPreviewer ] = useState<RoomPreviewer>(null); const [ roomPreviewer, setRoomPreviewer ] = useState<RoomPreviewer>(null);
const [ pendingPageId, setPendingPageId ] = useState(-1); const [ pendingPageLookup, setPendingPageLookup ] = useState<string>(null);
const [ pendingTree, setPendingTree ] = useState<ICatalogPageData[]>(null); const [ pendingTree, setPendingTree ] = useState<ICatalogPageData[]>(null);
const [ catalogState, dispatchCatalogState ] = useReducer(CatalogReducer, initialCatalog); const [ catalogState, dispatchCatalogState ] = useReducer(CatalogReducer, initialCatalog);
const [ currentTab, setCurrentTab ] = useState<ICatalogPageData>(null); const [ currentTab, setCurrentTab ] = useState<ICatalogPageData>(null);
@ -56,7 +56,7 @@ export const CatalogView: FC<CatalogViewProps> = props =>
case 'open': case 'open':
if(parts.length > 2) if(parts.length > 2)
{ {
setPendingPageId(parseInt(parts[2])); setPendingPageLookup(parts[2]);
} }
else else
{ {
@ -80,7 +80,7 @@ export const CatalogView: FC<CatalogViewProps> = props =>
useEffect(() => useEffect(() =>
{ {
const loadCatalog = (((pendingPageId > -1) && !catalogState.root) || (isVisible && !catalogState.root)); const loadCatalog = (((pendingPageLookup !== null) && !catalogState.root) || (isVisible && !catalogState.root));
if(loadCatalog) if(loadCatalog)
{ {
@ -92,24 +92,23 @@ export const CatalogView: FC<CatalogViewProps> = props =>
if(catalogState.root) if(catalogState.root)
{ {
if(!isVisible && (pendingPageId > -1)) if(!isVisible && (pendingPageLookup !== null))
{ {
setIsVisible(true); setIsVisible(true);
return; return;
} }
if(pendingPageId > -1) if(pendingPageLookup !== null)
{ {
const tree = BuildCatalogPageTree(catalogState.root, pendingPageId); const tree = BuildCatalogPageTree(catalogState.root, pendingPageLookup);
setCurrentTab(tree.shift()); setCurrentTab(tree.shift());
setPendingPageId(-1); setPendingPageLookup(null);
setPendingTree(tree); setPendingTree(tree);
} }
else else
{ {
setCurrentTab(prevValue => setCurrentTab(prevValue =>
{ {
if(catalogState.root.children.length) if(catalogState.root.children.length)
@ -126,7 +125,7 @@ export const CatalogView: FC<CatalogViewProps> = props =>
}); });
} }
} }
}, [ isVisible, pendingPageId, catalogState.root, setCurrentTab ]); }, [ isVisible, pendingPageLookup, catalogState.root, setCurrentTab ]);
useEffect(() => useEffect(() =>
{ {

View File

@ -150,13 +150,13 @@ export function GetPetAvailableColors(petIndex: number, palettes: SellablePetPal
} }
} }
export function GetCatalogPageTree(page: ICatalogPageData, targetPageId: number, tree: ICatalogPageData[]) export function GetCatalogPageTreeByName(page: ICatalogPageData, lookup: string, tree: ICatalogPageData[])
{ {
if(page.pageId === targetPageId) return page; if(page.pageName === lookup) return page;
for(const pageData of page.children) for(const pageData of page.children)
{ {
const foundPageData = GetCatalogPageTree(pageData, targetPageId, tree); const foundPageData = GetCatalogPageTreeByName(pageData, lookup, tree);
if(foundPageData) if(foundPageData)
{ {
@ -167,11 +167,35 @@ export function GetCatalogPageTree(page: ICatalogPageData, targetPageId: number,
} }
} }
export function BuildCatalogPageTree(page: ICatalogPageData, targetPageId: number) export function GetCatalogPageTreeById(page: ICatalogPageData, lookup: number, tree: ICatalogPageData[])
{
if(page.pageId === lookup) return page;
for(const pageData of page.children)
{
const foundPageData = GetCatalogPageTreeById(pageData, lookup, tree);
if(foundPageData)
{
tree.push(pageData);
return pageData;
}
}
}
export function BuildCatalogPageTree(page: ICatalogPageData, lookup: string)
{ {
const pageTree: ICatalogPageData[] = []; const pageTree: ICatalogPageData[] = [];
GetCatalogPageTree(page, targetPageId, pageTree); if(isNaN((lookup as unknown) as number))
{
GetCatalogPageTreeByName(page, lookup, pageTree);
}
else
{
GetCatalogPageTreeById(page, parseInt(lookup), pageTree);
}
if(pageTree.length) pageTree.reverse(); if(pageTree.length) pageTree.reverse();

View File

@ -1,56 +1,48 @@
import { CatalogFrontPageItem } from 'nitro-renderer';
import { FC, useCallback, useMemo } from 'react'; import { FC, useCallback, useMemo } from 'react';
import { GetConfiguration } from '../../../../../../api'; import { CreateLinkEvent, GetConfiguration } from '../../../../../../api';
import { CatalogLayoutFrontpage4ViewProps } from './CatalogLayoutFrontpage4View.types'; import { CatalogLayoutFrontpage4ViewProps } from './CatalogLayoutFrontpage4View.types';
export const CatalogLayoutFrontpage4View: FC<CatalogLayoutFrontpage4ViewProps> = props => export const CatalogLayoutFrontpage4View: FC<CatalogLayoutFrontpage4ViewProps> = props =>
{ {
const { pageParser = null } = props; const { pageParser = null } = props;
const getFrontPageItem = useCallback((position: number) =>
{
for(const item of pageParser.frontPageItems)
{
if(item.position !== position) continue;
return item;
}
}, [ pageParser ]);
const getFrontPageItemImage = useCallback((position: number) =>
{
const item = getFrontPageItem(position);
if(!item) return null;
return item.itemPromoImage;
}, [ getFrontPageItem ]);
const imageLibraryUrl = useMemo(() => const imageLibraryUrl = useMemo(() =>
{ {
return GetConfiguration<string>('image.library.url'); return GetConfiguration<string>('image.library.url');
}, []); }, []);
const selectItem = useCallback((item: CatalogFrontPageItem) =>
{
switch(item.type)
{
case CatalogFrontPageItem.ITEM_CATALOGUE_PAGE:
CreateLinkEvent(`catalog/open/${ item.catalogPageLocation }`);
return;
}
}, []);
if(!pageParser) return null; if(!pageParser) return null;
return ( return (
<div className="row h-100 nitro-catalog-layout-frontpage4"> <div className="row h-100 nitro-catalog-layout-frontpage4">
<div className="col-4"> <div className="col-4">
{ pageParser.frontPageItems[0] && { pageParser.frontPageItems[0] &&
<div className="front-page-item h-100" style={ { backgroundImage: `url('${ imageLibraryUrl }${ pageParser.frontPageItems[0].itemPromoImage }')`}}> <div className="front-page-item h-100" style={ { backgroundImage: `url('${ imageLibraryUrl }${ pageParser.frontPageItems[0].itemPromoImage }')`}} onClick={ event => selectItem(pageParser.frontPageItems[0]) }>
<div className="front-page-item-caption">{ pageParser.frontPageItems[0].itemName }</div> <div className="front-page-item-caption">{ pageParser.frontPageItems[0].itemName }</div>
</div> } </div> }
</div> </div>
<div className="d-flex col-8 flex-column"> <div className="d-flex col-8 flex-column">
{ pageParser.frontPageItems[1] && { pageParser.frontPageItems[1] &&
<div className="front-page-item h-100 mb-2" style={ { backgroundImage: `url('${ imageLibraryUrl }${ pageParser.frontPageItems[1].itemPromoImage }')`}}> <div className="front-page-item h-100 mb-2" style={ { backgroundImage: `url('${ imageLibraryUrl }${ pageParser.frontPageItems[1].itemPromoImage }')`}} onClick={ event => selectItem(pageParser.frontPageItems[1]) }>
<div className="front-page-item-caption">{ pageParser.frontPageItems[1].itemName }</div> <div className="front-page-item-caption">{ pageParser.frontPageItems[1].itemName }</div>
</div> } </div> }
{ pageParser.frontPageItems[2] && { pageParser.frontPageItems[2] &&
<div className="front-page-item h-100 mb-2" style={ { backgroundImage: `url('${ imageLibraryUrl }${ pageParser.frontPageItems[2].itemPromoImage }')`}}> <div className="front-page-item h-100 mb-2" style={ { backgroundImage: `url('${ imageLibraryUrl }${ pageParser.frontPageItems[2].itemPromoImage }')`}} onClick={ event => selectItem(pageParser.frontPageItems[2]) }>
<div className="front-page-item-caption">{ pageParser.frontPageItems[2].itemName }</div> <div className="front-page-item-caption">{ pageParser.frontPageItems[2].itemName }</div>
</div> } </div> }
{ pageParser.frontPageItems[3] && { pageParser.frontPageItems[3] &&
<div className="front-page-item h-100" style={ { backgroundImage: `url('${ imageLibraryUrl }${ pageParser.frontPageItems[3].itemPromoImage }')`}}> <div className="front-page-item h-100" style={ { backgroundImage: `url('${ imageLibraryUrl }${ pageParser.frontPageItems[3].itemPromoImage }')`}} onClick={ event => selectItem(pageParser.frontPageItems[3]) }>
<div className="front-page-item-caption">{ pageParser.frontPageItems[3].itemName }</div> <div className="front-page-item-caption">{ pageParser.frontPageItems[3].itemName }</div>
</div> } </div> }
</div> </div>