blocks/community/event-list/mode-select.tsx (54 lines of code) (raw):

import React, { FC, useCallback, useState } from 'react'; import { DropdownMenu, MenuItem } from '@rescui/dropdown-menu'; import Button from '@rescui/button'; import { DownIcon } from '@rescui/icons'; import styles from './mode-select.module.css'; import cn from 'classnames'; export interface SelectOption { id: string; label: string; } interface ModeSelectProps { label: string; options: SelectOption[]; value: SelectOption; className?: string; onSelect: (value: SelectOption) => void; } export const ModeSelect: FC<ModeSelectProps> = ({ label, value, options, className, onSelect }) => { const [isOpen, setIsOpen] = useState(false); const toggleIsOpen = useCallback(() => setIsOpen((s) => !s), [setIsOpen]); const handleSelect = useCallback( (value) => { onSelect(value); toggleIsOpen(); }, [onSelect, toggleIsOpen] ); return ( <div className={cn(styles.wrapper, className)}> <div className={'ktl-text-2'}>{label}:</div> <DropdownMenu isOpen={isOpen} onRequestClose={() => setIsOpen(false)} trigger={ <Button onClick={toggleIsOpen} mode={'clear'} icon={<DownIcon />} iconPosition={'right'} className={styles.button} > {value.label} </Button> } > {options.map((option) => ( <MenuItem key={option.id} selected={option.id === value.id} onClick={() => handleSelect(option)}> {option.label} </MenuItem> ))} </DropdownMenu> </div> ); };