import React, { useState, useEffect, useRef } from 'react'; import Icon from '../Icon'; import Divider from '../Divider'; import { Wrapper, Selected, Content, InputContent, OptionWrapper, Option, } from './styled'; type Option = { key: string | number; content: React.ReactNode; }; type Props = { onChange?: (item: Option | React.ReactNode) => void; options: Option[]; defaultValue?: React.ReactNode; isDivide?: boolean; width?: string; useInput?: boolean; style?: {}; }; const SelectBox: React.FunctionComponent= ({ onChange, options , defaultValue, isDivide, width = 'auto', useInput = false, style, }) => { const selectRef = useRef(null); const optionRef = useRef(null); const [isCollapse, setCollapse] = useState(true); const [value, setValue] = useState(defaultValue); const handleClick = () => { setCollapse(!isCollapse); } const handleSelect = (index: number) => { setValue(options[index].content); if (onChange) { onChange(options[index]); } } const handleBlur = () => { setCollapse(true); } const handleChange = (e: React.ChangeEvent) => { setValue(e.target.value || 0); } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.keyCode === 13 && onChange && value) { onChange(value); setCollapse(true); } } useEffect(() => { if (!defaultValue || options[0]) { setValue(options[0].content); } }, []); useEffect(() => { if (!isCollapse && selectRef.current) { const position = selectRef.current.getBoundingClientRect(); if (optionRef.current) { optionRef.current.style.top = `${selectRef.current.clientHeight + position.top}px`; optionRef.current.style.left = `${position.left}px`; } } }); return ( { useInput && (typeof value === "string" || typeof value === "number") ? ( ) : ( {value} ) } {isDivide ? : null} { !isCollapse ? ( { options.map((option: Option, index: number) => ( )) } ) : null } ); }; SelectBox.defaultProps = { defaultValue: '', onChange: () => {}, isDivide: false, }; export default SelectBox;