nitro-react/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx

82 lines
3.7 KiB
TypeScript
Raw Normal View History

2021-12-13 06:42:42 +01:00
import { IAvatarFigureContainer, SaveWardrobeOutfitMessageComposer } from '@nitrots/nitro-renderer';
import { Dispatch, FC, SetStateAction, useCallback, useMemo } from 'react';
2021-07-22 05:53:47 +02:00
import { Button } from 'react-bootstrap';
2021-09-01 04:39:15 +02:00
import { GetAvatarRenderManager, GetSessionDataManager } from '../../../../api';
2021-12-13 06:42:42 +01:00
import { Grid } from '../../../../common/Grid';
2021-12-29 17:42:29 +01:00
import { LayoutGridItem } from '../../../../common/layout/LayoutGridItem';
2021-07-22 05:53:47 +02:00
import { SendMessageHook } from '../../../../hooks';
2021-12-29 17:42:29 +01:00
import { AvatarImageView } from '../../../../views/shared/avatar-image/AvatarImageView';
import { CurrencyIcon } from '../../../../views/shared/currency-icon/CurrencyIcon';
2021-12-13 06:42:42 +01:00
import { FigureData } from '../../common/FigureData';
export interface AvatarEditorWardrobeViewProps
{
figureData: FigureData;
savedFigures: [ IAvatarFigureContainer, string ][];
setSavedFigures: Dispatch<SetStateAction<[ IAvatarFigureContainer, string][]>>;
loadAvatarInEditor: (figure: string, gender: string, reset?: boolean) => void;
}
2021-07-21 23:53:36 +02:00
export const AvatarEditorWardrobeView: FC<AvatarEditorWardrobeViewProps> = props =>
{
2021-07-22 05:53:47 +02:00
const { figureData = null, savedFigures = [], setSavedFigures = null, loadAvatarInEditor = null } = props;
2021-07-21 23:53:36 +02:00
2021-07-22 05:53:47 +02:00
const wearFigureAtIndex = useCallback((index: number) =>
2021-07-21 23:53:36 +02:00
{
2021-07-22 05:53:47 +02:00
if((index >= savedFigures.length) || (index < 0)) return;
2021-07-21 23:53:36 +02:00
2021-07-22 05:53:47 +02:00
const [ figure, gender ] = savedFigures[index];
2021-07-21 23:53:36 +02:00
2021-09-01 02:02:59 +02:00
loadAvatarInEditor(figure.getFigureString(), gender);
2021-07-22 05:53:47 +02:00
}, [ savedFigures, loadAvatarInEditor ]);
const saveFigureAtWardrobeIndex = useCallback((index: number) =>
{
if(!figureData || (index >= savedFigures.length) || (index < 0)) return;
const newFigures = [ ...savedFigures ];
const figure = figureData.getFigureString();
const gender = figureData.gender;
2021-09-01 02:02:59 +02:00
newFigures[index] = [ GetAvatarRenderManager().createFigureContainer(figure), gender ];
2021-07-21 23:53:36 +02:00
2021-07-22 05:53:47 +02:00
setSavedFigures(newFigures);
2021-08-25 23:20:32 +02:00
SendMessageHook(new SaveWardrobeOutfitMessageComposer((index + 1), figure, gender));
2021-07-22 05:53:47 +02:00
}, [ figureData, savedFigures, setSavedFigures ]);
2021-07-21 23:53:36 +02:00
2021-07-22 05:53:47 +02:00
const figures = useMemo(() =>
{
2021-09-01 04:39:15 +02:00
if(!savedFigures || !savedFigures.length) return [];
2021-07-22 05:53:47 +02:00
const items: JSX.Element[] = [];
2021-07-21 23:53:36 +02:00
2021-09-01 02:02:59 +02:00
savedFigures.forEach(([ figureContainer, gender ], index) =>
2021-07-21 23:53:36 +02:00
{
2021-09-01 04:39:15 +02:00
let clubLevel = 0;
if(figureContainer) clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender);
2021-07-22 05:53:47 +02:00
items.push(
2021-12-29 17:42:29 +01:00
<LayoutGridItem key={ index } position="relative" justifyContent="end" alignItems="center">
{ figureContainer &&
<AvatarImageView figure={ figureContainer.getFigureString() } gender={ gender } direction={ 2 } position="absolute" className="bottom-3" /> }
2021-09-01 04:39:15 +02:00
{ (clubLevel > 0) && <CurrencyIcon className="position-absolute top-1 start-1" type="hc" /> }
2021-07-22 05:53:47 +02:00
<div className="d-flex w-100 figure-button-container p-1">
<Button variant="link" size="sm" className="w-100" onClick={ event => saveFigureAtWardrobeIndex(index) }>Save</Button>
2021-09-01 04:39:15 +02:00
{ figureContainer && <Button variant="link" size="sm" className="w-100" onClick={ event => wearFigureAtIndex(index) } disabled={ (clubLevel > GetSessionDataManager().clubLevel) }>Use</Button> }
2021-07-22 05:53:47 +02:00
</div>
2021-12-29 17:42:29 +01:00
</LayoutGridItem>
2021-07-22 05:53:47 +02:00
);
});
2021-07-21 23:53:36 +02:00
2021-07-22 05:53:47 +02:00
return items;
}, [ savedFigures, saveFigureAtWardrobeIndex, wearFigureAtIndex ]);
2021-07-21 23:53:36 +02:00
return (
2021-12-29 17:42:29 +01:00
<Grid grow columnCount={ 5 } overflow="auto" columnMinWidth={ 80 } columnMinHeight={ 140 }>
2021-09-30 04:30:25 +02:00
{ figures }
2021-12-13 06:42:42 +01:00
</Grid>
2021-07-21 23:53:36 +02:00
);
}