5180 fichiers 38.5 Mo 0 téléchargements 401 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / components / friends / views / friends-list / FriendsCategoryManagerView.tsx
FriendsCategoryManagerView.tsx 6.1 Ko Télécharger le fichier
import { FriendCategoryData } from '@octane/renderer';
import { FC, MouseEvent, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../api';
import { Button, Column, Flex, OctaneCardContentView, OctaneCardHeaderView, OctaneCardView } from '../../../../common';
import { BaseButton } from '../../../../common/BaseButton';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';
import { Hint } from '../../../../common/Tooltip';
import { useFriendsActions } from '../../../../hooks';

interface FriendsCategoryManagerViewProps {
    categories: FriendCategoryData[];
    onCloseClick: (event: MouseEvent) => void;
}

export const FriendsCategoryManagerView: FC<FriendsCategoryManagerViewProps> = (props) => {
    const { categories = [], onCloseClick = null } = props;
    const { addCategory, renameCategory, removeCategory } = useFriendsActions();
    const [newName, setNewName] = useState<string>('');
    const [editingId, setEditingId] = useState<number>(0);
    const [editingName, setEditingName] = useState<string>('');

    useEffect(() => {
        if (editingId && !categories.some((category) => category.id === editingId)) {
            setEditingId(0);
            setEditingName('');
        }
    }, [categories, editingId]);

    const submitAdd = () => {
        const trimmed = newName.trim();
        if (!trimmed.length) return;
        addCategory(trimmed);
        setNewName('');
    };

    const submitRename = () => {
        const trimmed = editingName.trim();
        if (editingId && trimmed.length) renameCategory(editingId, trimmed);
        setEditingId(0);
        setEditingName('');
    };

    return (
        <NativeTextTree>
            <OctaneCardView
                className="octane-friends-category-manager min-w-0 max-w-[calc(100vw-16px)] max-h-[calc(100vh-16px)]"
                theme="primary-slim"
                uniqueKey="octane-friends-category-manager"
                isResizable={false}
            >
                <OctaneCardHeaderView headerText={LocalizeText('friendlist.friends')} onCloseClick={onCloseClick} />
                <OctaneCardContentView className="text-black" gap={1}>
                    <Flex gap={1} alignItems="center">
                        <input
                            className="form-control form-control-sm w-full"
                            maxLength={25}
                            type="text"
                            value={newName}
                            onChange={(event) => setNewName(event.target.value)}
                            onKeyDown={(event) => event.key === 'Enter' && submitAdd()}
                        />
                        <Button disabled={!newName.trim().length || categories.length >= 20} onClick={submitAdd}>
                            {LocalizeText('catalog.admin.create')}
                        </Button>
                    </Flex>
                    <Column gap={1}>
                        {categories.map((category) => (
                            <Flex key={category.id} alignItems="center" gap={1}>
                                {editingId === category.id ? (
                                    <>
                                        <input
                                            autoFocus
                                            className="form-control form-control-sm w-full"
                                            maxLength={25}
                                            type="text"
                                            value={editingName}
                                            onChange={(event) => setEditingName(event.target.value)}
                                            onKeyDown={(event) => event.key === 'Enter' && submitRename()}
                                        />
                                        <Button onClick={submitRename}>{LocalizeText('catalog.admin.save')}</Button>
                                    </>
                                ) : (
                                    <>
                                        <span className="grow text-sm">{category.name}</span>
                                        <Hint content={LocalizeText('generic.edit')}>
                                            <BaseButton
                                                aria-label={LocalizeText('generic.edit')}
                                                className="cursor-pointer border-0 bg-transparent p-0 text-base leading-none select-none"
                                                type="button"
                                                onClick={() => {
                                                    setEditingId(category.id);
                                                    setEditingName(category.name);
                                                }}
                                            >
                                                {'✎'}
                                            </BaseButton>
                                        </Hint>
                                        <Hint content={LocalizeText('generic.delete')}>
                                            <BaseButton
                                                aria-label={LocalizeText('generic.delete')}
                                                className="cursor-pointer border-0 bg-transparent p-0 text-base leading-none select-none"
                                                type="button"
                                                onClick={() => removeCategory(category.id)}
                                            >
                                                {'✕'}
                                            </BaseButton>
                                        </Hint>
                                    </>
                                )}
                            </Flex>
                        ))}
                        {!categories.length && <span className="text-muted text-center py-2 text-sm">{LocalizeText('friendlist.search.nofriendsfound')}</span>}
                    </Column>
                </OctaneCardContentView>
            </OctaneCardView>
        </NativeTextTree>
    );
};
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