AvatarEditorModelView.tsx 6.2 Ko
Télécharger le fichier
import { AvatarEditorFigureCategory, AvatarFigurePartType, FigureDataContainer } from '@octane/renderer';
import { FC, useCallback, useEffect, useMemo, useState } from 'react';
import { CreateLinkEvent, GetClubMemberLevel, IAvatarEditorCategory, LocalizeText } from '../../api';
import { LayoutCurrencyIcon } from '../../common';
import { useAvatarEditor } from '../../hooks';
import { AvatarEditorIcon } from './AvatarEditorIcon';
import { AvatarEditorFigureSetView } from './figure-set';
import { AvatarEditorAdvancedColorView, AvatarEditorPaletteSetView } from './palette-set';
import { BaseButton } from '../../common/BaseButton';
import { ToggleButton } from '../../common/ToggleButton';
import { NativeTextTree } from '../../common/native-text/NativeTextTree';
export const AvatarEditorModelView: FC<{
name: string;
categories: IAvatarEditorCategory[];
}> = (props) => {
const { name = '', categories = [] } = props;
const [activeSetType, setActiveSetType] = useState<string>(() => categories[0]?.setType ?? '');
const [advancedColorMode, setAdvancedColorMode] = useState<boolean>(false);
const hasHC = GetClubMemberLevel() > 0;
const {
maxPaletteCount = 1,
gender = null,
setGender = null,
selectedColorParts = null,
getFirstSelectableColor = null,
selectEditorColor = null
} = useAvatarEditor();
const resolvedSetType = useMemo(() => {
if (categories.some((category) => category.setType === activeSetType)) return activeSetType;
return categories[0]?.setType ?? '';
}, [categories, activeSetType]);
const activeCategory = useMemo(() => {
return categories.find((category) => category.setType === resolvedSetType) ?? null;
}, [categories, resolvedSetType]);
const selectSet = useCallback(
(setType: string) => {
const selectedPalettes = selectedColorParts?.[setType];
if (!selectedPalettes || !selectedPalettes.length) selectEditorColor?.(setType, 0, getFirstSelectableColor?.(setType));
setActiveSetType(setType);
},
[getFirstSelectableColor, selectEditorColor, selectedColorParts]
);
useEffect(() => {
if (!resolvedSetType) return;
const selectedPalettes = selectedColorParts?.[resolvedSetType];
if (resolvedSetType === activeSetType && selectedPalettes?.length) return;
selectSet(resolvedSetType);
}, [activeSetType, resolvedSetType, selectSet, selectedColorParts]);
if (!activeCategory) return null;
return (
<NativeTextTree>
<div className="octane-avatar-editor-model">
<div className={`octane-avatar-editor-subcategories${name === AvatarEditorFigureCategory.GENERIC ? ' is-gender' : ''}`}>
{name === AvatarEditorFigureCategory.GENERIC && (
<>
<BaseButton type="button" className="category-item gender-category-item" onClick={() => setGender(AvatarFigurePartType.MALE)}>
<AvatarEditorIcon icon="male" selected={gender === FigureDataContainer.MALE} />
<span>{LocalizeText('avatareditor.generic.boy')}</span>
</BaseButton>
<BaseButton type="button" className="category-item gender-category-item" onClick={() => setGender(AvatarFigurePartType.FEMALE)}>
<AvatarEditorIcon icon="female" selected={gender === FigureDataContainer.FEMALE} />
<span>{LocalizeText('avatareditor.generic.girl')}</span>
</BaseButton>
</>
)}
{name !== AvatarEditorFigureCategory.GENERIC &&
categories.map((category) => (
<ToggleButton
type="button"
key={category.setType}
className="category-item" pressed={resolvedSetType === category.setType}
onClick={() => selectSet(category.setType)}
>
<AvatarEditorIcon icon={category.setType} selected={resolvedSetType === category.setType} />
</ToggleButton>
))}
</div>
<div className="octane-avatar-editor-parts-grid">
<AvatarEditorFigureSetView category={activeCategory} columnCount={6} />
</div>
<BaseButton
type="button"
className={`octane-avatar-editor-advanced-color${advancedColorMode ? ' is-active' : ''}`}
onClick={() => (hasHC ? setAdvancedColorMode((prev) => !prev) : CreateLinkEvent('habboUI/open/hccenter'))}
>
Advanced Color
<LayoutCurrencyIcon type="hc" />
</BaseButton>
<div className={`octane-avatar-editor-palettes${maxPaletteCount === 2 ? ' dual-palette' : ''}`}>
{maxPaletteCount >= 1 && (
<div className="avatar-editor-palette-set-view">
{advancedColorMode ? (
<AvatarEditorAdvancedColorView category={activeCategory} paletteIndex={0} />
) : (
<AvatarEditorPaletteSetView category={activeCategory} columnCount={maxPaletteCount === 2 ? 9 : 20} paletteIndex={0} />
)}
</div>
)}
{maxPaletteCount === 2 && (
<div className="avatar-editor-palette-set-view">
{advancedColorMode ? (
<AvatarEditorAdvancedColorView category={activeCategory} paletteIndex={1} />
) : (
<AvatarEditorPaletteSetView category={activeCategory} columnCount={9} paletteIndex={1} />
)}
</div>
)}
</div>
</div>
</NativeTextTree>
);
};
