import React, { MouseEvent, useCallback, useMemo, useRef, useState } from 'react' import useTheme from '../styles/use-theme' import useClickAway from '../utils/use-click-away' import { getColor } from './styles' import ButtonDropdownIcon from './icon' import ButtonDropdownItem from './button-dropdown-item' import { ButtonDropdownContext } from './button-dropdown-context' import { NormalSizes, NormalTypes } from '../utils/prop-types' import { pickChild, pickChildByProps } from '../utils/collections' import { getButtonSize } from '../button/styles' interface Props { type?: NormalTypes size?: NormalSizes auto?: boolean loading?: boolean disabled?: boolean className?: string } const defaultProps = { type: 'default' as NormalTypes, size: 'medium' as NormalSizes, auto: false, loading: false, disabled: false, className: '', } type NativeAttrs = Omit, keyof Props> export type ButtonDropdownProps = Props & typeof defaultProps & NativeAttrs const stopPropagation = (event: MouseEvent) => { event.stopPropagation() event.nativeEvent.stopImmediatePropagation() } const ButtonDropdown: React.FC> = ({ children, type, size, auto, className, disabled, loading, ...props }) => { const ref = useRef(null) const theme = useTheme() const colors = getColor(theme.palette, type) const sizes = getButtonSize(size, auto) const itemChildren = pickChild(children, ButtonDropdownItem)[1] const [itemChildrenWithoutMain, mainItemChildren] = pickChildByProps(itemChildren, 'main', true) const [visible, setVisible] = useState(false) const clickHandler = useCallback( (event: MouseEvent) => { event.preventDefault() stopPropagation(event) if (disabled || loading) return setVisible(!visible) }, [visible], ) const initialValue = useMemo( () => ({ type, size, auto, disabled, loading, }), [type, size], ) const bgColor = useMemo(() => { if (disabled || loading) return theme.palette.accents_1 return visible ? colors.hoverBgColor : colors.bgColor }, [visible, colors, theme.palette]) useClickAway(ref, () => setVisible(false)) return (
{mainItemChildren}
{itemChildrenWithoutMain}
) } type MemoButtonDropdownComponent

= React.NamedExoticComponent

& { Item: typeof ButtonDropdownItem } type ComponentProps = Partial & Omit & NativeAttrs ButtonDropdown.defaultProps = defaultProps export default React.memo(ButtonDropdown) as MemoButtonDropdownComponent