import { useEffect, useRef, useState } from 'react' export type GallerySize = 'small' | 'medium' | 'large' export const gallerySizeClasses: Record = { small: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7', medium: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5', large: 'grid-cols-1 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3', } function GridSmallIcon({ className }: { className?: string }) { return ( ) } function GridMediumIcon({ className }: { className?: string }) { return ( ) } function GridLargeIcon({ className }: { className?: string }) { return ( ) } export function GenSpaceGallerySizeMenu({ gallerySize, onGallerySizeChange, }: { gallerySize: GallerySize onGallerySizeChange: (size: GallerySize) => void }) { const [open, setOpen] = useState(false) const menuRef = useRef(null) useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { setOpen(false) } } if (open) { document.addEventListener('mousedown', handleClickOutside) } return () => document.removeEventListener('mousedown', handleClickOutside) }, [open]) const CurrentIcon = gallerySize === 'small' ? GridSmallIcon : gallerySize === 'medium' ? GridMediumIcon : GridLargeIcon return (
{open && (
{([ { value: 'small' as const, label: 'Small', icon: GridSmallIcon }, { value: 'medium' as const, label: 'Medium', icon: GridMediumIcon }, { value: 'large' as const, label: 'Large', icon: GridLargeIcon }, ]).map(option => ( ))}
)}
) }