5180 fichiers 38.5 Mo 0 téléchargements 352 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / components / groups / views / tabs / GroupTabColorsView.tsx
GroupTabColorsView.tsx 5.7 Ko Télécharger le fichier
import { GroupSaveColorsComposer } from '@octane/renderer';
import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react';
import { IGroupData, LocalizeText, SendMessageComposer } from '../../../../api';
import { useGroup } from '../../../../hooks';
import { GroupColorChip } from '../GroupBadgeCreatorView';
import { useGroupAlert } from '../GroupNativeAlertView';
import { GroupBox, GroupButton, GroupSwatch, GroupText } from '../GroupNativeLayout';

interface GroupTabColorsViewProps {
    groupData: IGroupData;
    setGroupData: Dispatch<SetStateAction<IGroupData>>;
    setCloseAction: Dispatch<SetStateAction<{ action: () => boolean }>>;
}

// step_cont_3 sits at client y=110.
const STEP_Y = 110;

export const GroupTabColorsView: FC<GroupTabColorsViewProps> = (props) => {
    const { groupData = null, setGroupData = null, setCloseAction = null } = props;
    const [colors, setColors] = useState<number[]>(null);
    const { groupCustomize = null } = useGroup();
    const showAlert = useGroupAlert();

    const getGroupColor = (colorIndex: number) => {
        if (!groupCustomize || !colors) return '000000';

        const list = colorIndex === 0 ? groupCustomize.groupColorsA : groupCustomize.groupColorsB;
        const found = list?.find((color) => color.id === colors[colorIndex]);

        return found ? found.color : '000000';
    };

    const selectColor = (colorIndex: number, colorId: number) => {
        setColors((prevValue) => {
            const newColors = [...prevValue];

            newColors[colorIndex] = colorId;

            return newColors;
        });
    };

    const saveColors = useCallback(() => {
        if (!groupData) return false;
        if (!colors || !groupCustomize?.groupColorsA?.some(color => color.id === colors[0]) || !groupCustomize?.groupColorsB?.some(color => color.id === colors[1]))
        {
            showAlert({ title: LocalizeText('group.edit.error.title'), message: LocalizeText('group.edit.error.no.color.selected') });
            return false;
        }

        if (groupData.groupColors[0] === colors[0] && groupData.groupColors[1] === colors[1]) return true;

        if (groupData.groupId <= 0) {
            setGroupData((prevValue) => {
                const newValue = { ...prevValue };

                newValue.groupColors = [...colors];

                return newValue;
            });

            return true;
        }

        SendMessageComposer(new GroupSaveColorsComposer(groupData.groupId, colors[0], colors[1]));
        setGroupData(prevValue => ({ ...prevValue, groupColors: [...colors] }));

        return true;
    }, [groupData, colors, setGroupData, groupCustomize, showAlert]);

    useEffect(() => {
        if (!groupCustomize?.groupColorsA?.length || !groupCustomize?.groupColorsB?.length || (groupData.groupColors && groupData.groupColors.length)) return;

        // The v75 layout opens with a different default each session (gold/gold, white/gold, white/white were all observed): first swatch of each list.
        const groupColors = [groupCustomize.groupColorsA[0].id, groupCustomize.groupColorsB[0].id];

        setGroupData((prevValue) => {
            return { ...prevValue, groupColors };
        });
    }, [groupCustomize, groupData.groupColors, setGroupData]);

    useEffect(() => {
        if (groupData.groupId <= 0) {
            setColors(groupData.groupColors ? [...groupData.groupColors] : null);

            return;
        }

        setColors(groupData.groupColors);
    }, [groupData.groupId, groupData.groupColors]);

    useEffect(() => {
        setCloseAction({ action: saveColors });

        return () => setCloseAction(null);
    }, [setCloseAction, saveColors]);

    if (!colors) return null;

    return (
        <div className="octane-group-native__step-body" style={{ top: STEP_Y }}>
            <GroupText align="center" text={LocalizeText('group.edit.color.guild.color')} textStyle="u_bold" width={92} x={13} y={8} />
            <GroupBox height={46} kind="outline" width={92} x={13} y={29}>
                <GroupBox height={38} kind="tan" width={84} x={4} y={4}>
                    <GroupSwatch color={getGroupColor(0)} x={4} y={4} />
                    <GroupSwatch color={getGroupColor(1)} x={44} y={4} />
                </GroupBox>
            </GroupBox>
            {groupData.groupId > 0 && <GroupButton height={29} label={LocalizeText('group.edit.reset.color')} width={90} x={15} y={85} onClick={() => setColors([...groupData.groupColors])} />}
            <GroupText align="center" text={LocalizeText('group.edit.color.primary.color')} textStyle="u_bold" width={142} x={128} y={8} />
            <GroupText align="center" text={LocalizeText('group.edit.color.secondary.color')} textStyle="u_bold" width={100} x={280} y={8} />
            <GroupBox height={277} kind="dark" width={142} x={128} y={29}>
                <div className="octane-group-native__color-grid" style={{ left: 3, top: 3, width: 138, gridTemplateColumns: 'repeat(9, 15px)' }}>
                    {groupCustomize?.groupColorsA.map((item) => (
                        <GroupColorChip key={item.id} color={item.color} selected={colors[0] === item.id} onSelect={() => selectColor(0, item.id)} />
                    ))}
                </div>
            </GroupBox>
            <GroupBox height={277} kind="dark" width={96} x={280} y={29}>
                <div className="octane-group-native__color-grid" style={{ left: 3, top: 3, width: 94, gridTemplateColumns: 'repeat(6, 15px)' }}>
                    {groupCustomize?.groupColorsB.map((item) => (
                        <GroupColorChip key={item.id} color={item.color} selected={colors[1] === item.id} onSelect={() => selectColor(1, item.id)} />
                    ))}
                </div>
            </GroupBox>
        </div>
    );
};
15Sujets
1Dépôts
20Membres
3En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser