import styled from '@emotion/styled'; import { useRef, ReactNode } from 'react'; import { useOutsideAlerter } from '../../../hooks/useOutsideAlerter'; import { modalBackground } from '../../../layout/styles/themes'; import { FaAngleDown } from 'react-icons/fa'; type OwnProps = { label: string; isActive: boolean; children?: ReactNode; isUnfolded?: boolean; setIsUnfolded?: React.Dispatch>; resetState?: () => void; }; const StyledDropdownButtonContainer = styled.div` display: flex; flex-direction: column; position: relative; z-index: 1; `; type StyledDropdownButtonProps = { isUnfolded: boolean; isActive: boolean; }; const StyledDropdownButton = styled.div` display: flex; margin-left: ${(props) => props.theme.spacing(3)}; cursor: pointer; user-select: none; background: ${(props) => props.theme.primaryBackground}; color: ${(props) => (props.isActive ? props.theme.blue : 'none')}; padding: ${(props) => props.theme.spacing(1)}; border-radius: 4px; filter: ${(props) => (props.isUnfolded ? 'brightness(0.95)' : 'none')}; &:hover { filter: brightness(0.95); } `; const StyledDropdown = styled.ul` --wraper-border: 1px; --wraper-border-radius: 8px; --outer-border-radius: calc(var(--wraper-border-radius) - 2px); display: flex; flex-direction: column; position: absolute; top: 14px; right: 0; border: var(--wraper-border) solid ${(props) => props.theme.primaryBorder}; box-shadow: 0px 3px 12px rgba(0, 0, 0, 0.09); border-radius: var(--wraper-border-radius); padding: 0px; min-width: 160px; ${modalBackground} li { &:first-of-type { border-top-left-radius: var(--outer-border-radius); border-top-right-radius: var(--outer-border-radius); } &:last-of-type { border-bottom-left-radius: var(--outer-border-radius); border-bottom-right-radius: var(--outer-border-radius); border-bottom: 0; } } `; const StyledDropdownItem = styled.li` display: flex; align-items: center; width: 160px; padding: ${(props) => props.theme.spacing(2)} calc(${(props) => props.theme.spacing(2)} - 2px); margin: 2px; cursor: pointer; user-select: none; color: ${(props) => props.theme.text60}; border-radius: 2px; &:hover { background: rgba(0, 0, 0, 0.04); } `; const StyledDropdownItemClipped = styled.span` overflow: hidden; white-space: nowrap; text-overflow: ellipsis; `; const StyledDropdownTopOption = styled.li` display: flex; align-items: center; justify-content: space-between; padding: calc(${(props) => props.theme.spacing(2)} + 2px) calc(${(props) => props.theme.spacing(2)}); cursor: pointer; user-select: none; color: ${(props) => props.theme.text80}; font-weight: ${(props) => props.theme.fontWeightBold}; &:hover { background: rgba(0, 0, 0, 0.04); } border-bottom: 1px solid ${(props) => props.theme.primaryBorder}; `; const StyledIcon = styled.div` display: flex; margin-right: ${(props) => props.theme.spacing(1)}; min-width: ${(props) => props.theme.spacing(4)}; justify-content: center; `; const StyledSearchField = styled.li` display: flex; align-items: center; justify-content: space-between; cursor: pointer; user-select: none; color: ${(props) => props.theme.text60}; font-weight: ${(props) => props.theme.fontWeightBold}; border-bottom: var(--wraper-border) solid ${(props) => props.theme.primaryBorder}; overflow: hidden; input { height: 36px; width: 100%; border: none; padding: 8px; box-sizing: border-box; font-family: ${(props) => props.theme.fontFamily}; border-radius: 8px; &:focus { outline: 0 none; } } input::placeholder, input::-webkit-input-placeholder { font-family: ${(props) => props.theme.fontFamily}; color: ${(props) => props.theme.text30}; font-weight: ${(props) => props.theme.fontWeightBold}; } `; function DropdownButton({ label, isActive, children, isUnfolded = false, setIsUnfolded, resetState, }: OwnProps) { const onButtonClick = () => { setIsUnfolded && setIsUnfolded(!isUnfolded); }; const onOutsideClick = () => { setIsUnfolded && setIsUnfolded(false); resetState && resetState(); }; const dropdownRef = useRef(null); useOutsideAlerter(dropdownRef, onOutsideClick); return ( {label} {isUnfolded && ( {children} )} ); } const StyleAngleDownContainer = styled.div` margin-left: auto; `; function DropdownTopOptionAngleDown() { return ( ); } DropdownButton.StyledDropdownItem = StyledDropdownItem; DropdownButton.StyledDropdownItemClipped = StyledDropdownItemClipped; DropdownButton.StyledSearchField = StyledSearchField; DropdownButton.StyledDropdownTopOption = StyledDropdownTopOption; DropdownButton.StyledDropdownTopOptionAngleDown = DropdownTopOptionAngleDown; DropdownButton.StyledIcon = StyledIcon; export default DropdownButton;