5180 fichiers 38.5 Mo 0 téléchargements 314 vues mis à jour il y a 6 heures ui
nitro-v36-with-renderer-v36 / src / common / card / accordion / OctaneCardAccordionSetView.tsx
OctaneCardAccordionSetView.tsx 2.4 Ko Télécharger le fichier
import { FC, useCallback, useEffect, useMemo, useState } from 'react';
import { FaCaretDown, FaCaretUp } from 'react-icons/fa';
import { Column, ColumnProps, Flex, Text } from '../..';
import { useOctaneCardAccordionContext } from './OctaneCardAccordionContext';

export interface OctaneCardAccordionSetViewProps extends ColumnProps {
    headerText: string;
    isExpanded?: boolean;
}

export const OctaneCardAccordionSetView: FC<OctaneCardAccordionSetViewProps> = (props) => {
    const { headerText = '', isExpanded = false, gap = 0, classNames = [], children = null, ...rest } = props;
    const [isOpen, setIsOpen] = useState(false);
    const { setClosers = null, closeAll = null } = useOctaneCardAccordionContext();

    const onClick = () => {
        closeAll();

        setIsOpen((prevValue) => !prevValue);
    };

    const onClose = useCallback(() => setIsOpen(false), []);

    const getClassNames = useMemo(() => {
        const newClassNames = ['octane-card-accordion-set'];

        if (isOpen) newClassNames.push('active');

        if (classNames && classNames.length) newClassNames.push(...classNames);

        return newClassNames;
    }, [isOpen, classNames]);

    useEffect(() => {
        setIsOpen(isExpanded);
    }, [isExpanded]);

    useEffect(() => {
        const closeFunction = onClose;

        setClosers((prevValue) => {
            const newClosers = [...prevValue];

            newClosers.push(closeFunction);

            return newClosers;
        });

        return () => {
            setClosers((prevValue) => {
                const newClosers = [...prevValue];

                const index = newClosers.indexOf(closeFunction);

                if (index >= 0) newClosers.splice(index, 1);

                return newClosers;
            });
        };
    }, [onClose, setClosers]);

    return (
        <Column classNames={getClassNames} gap={gap} {...rest}>
            <Flex pointer className="octane-card-accordion-set-header px-2 py-1" justifyContent="between" onClick={onClick}>
                <Text>{headerText}</Text>
                {isOpen && <FaCaretUp className="fa-icon" />}
                {!isOpen && <FaCaretDown className="fa-icon" />}
            </Flex>
            {isOpen && (
                <Column fullHeight className="octane-card-accordion-set-content" gap={0} overflow="auto">
                    {children}
                </Column>
            )}
        </Column>
    );
};
15Sujets
1Dépôts
20Membres
2En 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