import { AddLinkEventTracker, AvatarEditorFigureCategory, GetSessionDataManager, ILinkEventTracker, RemoveLinkEventTracker, UserFigureComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { FaDice, FaRedo, FaTrash } from 'react-icons/fa'; import { AvatarEditorAction, LocalizeText, SendMessageComposer } from '../../api'; import { Button, ButtonGroup, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; import { useAvatarEditor } from '../../hooks'; import { AvatarEditorFigurePreviewView } from './AvatarEditorFigurePreviewView'; import { AvatarEditorModelView } from './AvatarEditorModelView'; import { AvatarEditorWardrobeView } from './AvatarEditorWardrobeView'; export const AvatarEditorView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); const { setIsVisible: setEditorVisibility, avatarModels, activeModelKey, setActiveModelKey, loadAvatarData, getFigureStringWithFace, gender, randomizeCurrentFigure = null, getFigureString = null } = useAvatarEditor(); const isWardrobeOpen = (activeModelKey === AvatarEditorFigureCategory.WARDROBE); const processAction = (action: string) => { switch(action) { case AvatarEditorAction.ACTION_RESET: loadAvatarData(GetSessionDataManager().figure, GetSessionDataManager().gender); return; case AvatarEditorAction.ACTION_CLEAR: loadAvatarData(getFigureStringWithFace(0, false), gender); return; case AvatarEditorAction.ACTION_RANDOMIZE: randomizeCurrentFigure(); return; case AvatarEditorAction.ACTION_SAVE: SendMessageComposer(new UserFigureComposer(gender, getFigureString)); setIsVisible(false); return; } }; useEffect(() => { const linkTracker: ILinkEventTracker = { linkReceived: (url: string) => { const parts = url.split('/'); if(parts.length < 2) return; switch(parts[1]) { case 'show': setIsVisible(true); return; case 'hide': setIsVisible(false); return; case 'toggle': setIsVisible(prevValue => !prevValue); return; } }, eventUrlPrefix: 'avatar-editor/' }; AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); useEffect(() => { setEditorVisibility(isVisible); }, [ isVisible, setEditorVisibility ]); if(!isVisible) return null; return ( setIsVisible(false) } /> { Object.keys(avatarModels).map(modelKey => { const isActive = (activeModelKey === modelKey); const isWardrobe = (modelKey === AvatarEditorFigureCategory.WARDROBE); return ( setActiveModelKey(modelKey) }>
); }) }
{ /* left: model view or wardrobe */ }
{ (activeModelKey.length > 0 && !isWardrobeOpen) && } { isWardrobeOpen && }
{ /* right: preview + actions */ }
); };