import React, { useCallback, useState } from 'react'; import { Container, StyleSystemThemedProps, TouchableHighlight } from 'components/layout'; import { ChevronDown, ChevronUp } from 'icons'; import { ViewProps as ViewPropsBase } from 'react-native'; import { Card, CardVariant, Text, TouchableTile, TextVariant, Visible } from 'components'; import { ColorName } from '@emotion/react'; import { IconColorVariantsType } from 'icons/types'; import { capitalize } from 'utils/text'; import { TextField, TextFieldSizeVariants, TextFieldVariants } from '../text-field'; const marginTopVariants: Record = { content: 15, 'extra-small': 35, small: 40, medium: 45, large: 50, 'extra-large': 55, }; const dropBackgroundVariants: Record = { primary: 'base-01', outline: 'base-01', text: 'base-01', }; const dropVariants: Record = { primary: 'float', outline: 'float', text: 'plain', }; const dropItemTextVariants: Record = { primary: 'grey-08', outline: 'grey-08', text: 'primary', }; const dropDownIcon: Record = { primary: 'white', outline: 'body', text: 'primary', }; export const Dropdown: React.FC = ({ sizeVariant, titleVariant, onChangeValue, isCompact, dropDownListPositionVariant = 'float', titleColor, value, label, labelColorVariant, placeholder, caption, captionColorVariant, dropdownHeight = 150, items, variant, dropdownVariant, ...props }) => { const [isOpen, setIsOpen] = useState(false); const switchDropDown = useCallback(() => { setIsOpen(!isOpen); }, [isOpen]); const handleSelect = useCallback( (selectedValue: string) => { onChangeValue(selectedValue); setIsOpen(false); }, [onChangeValue] ); let listItems: DropDownItemType[]; const itemsType: any = typeof items[0]; if (itemsType === 'string' || itemsType instanceof String) { listItems = items.map((item) => ({ label: item, value: item })) as DropDownItemType[]; } else { listItems = items as DropDownItemType[]; } const rightIcon = isOpen ? ( ) : ( ); const isFloat = dropDownListPositionVariant === 'float'; const listPosition = isFloat ? 'absolute' : 'relative'; const marginTop = isFloat ? marginTopVariants[sizeVariant] : 5; return ( <> {listItems.map((item) => ( handleSelect(item.value)} leftElement={ {capitalize(item.label)} } variant="text" titleVariant={titleVariant} titleColor={titleColor || dropItemTextVariants[dropdownVariant]} shapeVariant="square" /> ))} ); }; export type DropDownVariant = 'primary' | 'outline' | 'text'; export type DropDownType = StyleSystemThemedProps & DropDownProps; export type DropDownItemType = { label: string; value: string; }; type DropDownListPositionVariant = 'relative' | 'float'; export interface DropDownProps extends ViewPropsBase { sizeVariant: TextFieldSizeVariants; dropdownVariant: DropDownVariant; variant: TextFieldVariants; value: string; placeholder: string; titleColor?: ColorName; dropDownListPositionVariant?: DropDownListPositionVariant; titleVariant?: TextVariant; isCompact?: boolean; items: DropDownItemType[] | string[]; dropdownHeight?: number; caption?: string; label?: string; labelColorVariant?: ColorName; captionColorVariant?: ColorName; onChangeValue: (value: string) => void; }