12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- import React, { useState, useRef, useEffect } from 'react';
- interface DropdownProps {
- trigger: React.ReactNode;
- children: React.ReactNode;
- disabled?: boolean;
- }
- export default function Dropdown({ trigger, children, disabled = false }: DropdownProps) {
- const [isOpen, setIsOpen] = useState(false);
- const dropdownRef = useRef<HTMLDivElement>(null);
- useEffect(() => {
- const handleClickOutside = (event: MouseEvent) => {
- if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
- setIsOpen(false);
- }
- };
- document.addEventListener('mousedown', handleClickOutside);
- return () => {
- document.removeEventListener('mousedown', handleClickOutside);
- };
- }, []);
- const handleTriggerClick = () => {
- if (!disabled) {
- setIsOpen(!isOpen);
- }
- };
- return (
- <div className="relative" ref={dropdownRef}>
- <div
- onClick={handleTriggerClick}
- className={disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}
- >
- {trigger}
- </div>
- {isOpen && !disabled && (
- <div className="absolute right-0 mt-2 w-48 bg-white rounded-md shadow-lg border border-gray-200 z-50">
- <div className="py-1">
- {children}
- </div>
- </div>
- )}
- </div>
- );
- }
|