Skip to content
Snippets Groups Projects
index.tsx 1.93 KiB
Newer Older
import { ReactNode, useState } from 'react';
import { Link } from 'react-router-dom';
import Popup from 'components/ui/Popup';
import './dropdown.scss';

export interface DropDownItem {
    label: string;
    route?: string;
    popupContent?: ReactNode;
}

interface Props {
    children: ReactNode;
    items: DropDownItem[]
    position?: 'left'|'right';
export default function Dropdown({ children, items, position }: Props) {
    const [isOpen, setOpen] = useState(false);
    const [openPopup, setOpenPopup] = useState<string | null>(null);
    return (
        <>
            <div className={'dropdown-container' + (isOpen ? ' open' : '') + (items.length === 0 ? ' inactive' : '')} onClick={() => setOpen(state => !state)}>
                <div className="current-item">
                    {children}
                {items.length > 0 && (
                    <div className={'dropdown ' + (position ?? '')}>
                        {
                            items.map((item) =>
                                (item.route && (
                                    <Link className="dropdown-item" key={item.label} to={item.route}>
                                        {item.label}
                                    </Link>)) ||
                                (item.popupContent &&
                                    <div className="dropdown-item" key={item.label} onClick={() => setOpenPopup(item.label)}>
                                        {item.label}
                                    </div>))
                        }
                    </div>
                )}
            </div>
            {
                items.filter(item => item.popupContent).map((item) => (
                    openPopup === item.label && (
                        <Popup onClose={() => setOpenPopup(null)}>
                            {item.popupContent}
                        </Popup>)