/* @jsx jsx */ import AsyncSelect, { Props, AsyncResult } from 'react-select-async-paginate'; import type { Styles } from 'react-select'; // External dependencies import { css, jsx } from '@emotion/react'; import type { CSSProperties } from 'react'; const WORDPRESS_TEXT_COLOR = '#32373c'; const WORDPRESS_ACCENT_COLOR = '#007cba'; export type AsyncSelectControlProps< T > = Props< T, number > & { readonly page?: number; }; export type AsyncSelectControlResult< T > = AsyncResult< T, number >; type State = { readonly isFocused?: boolean; readonly isSelected?: boolean; readonly isDisabled?: boolean; }; export const DEFAULT_STYLE: Styles = { container: ( style ) => ( { ...style, margin: 0, padding: 0, } ), singleValue: ( style, state: State ) => { return { ...style, color: state.isDisabled ? '#8d96a0' : 'black', textShadow: '0 1px 0 #fff', }; }, control: ( style, state: State ) => ( { background: state.isDisabled ? '#f3f4f5' : '#fff', border: `1px solid ${ getBorderColor( state ) }`, borderRadius: '2px', boxShadow: state.isFocused ? `0 0 0 1px ${ WORDPRESS_ACCENT_COLOR }` : '', boxSizing: 'border-box', display: 'flex', flexDirection: 'row', fontSize: '13px', height: '30px', padding: '0', paddingRight: '0.5em', } ), input: () => ( { margin: 0, marginTop: '-1px', padding: 0, } ), groupHeading: ( style ) => ( { ...style, padding: '1em', } ), loadingIndicator: () => ( { display: 'none', } ), indicatorSeparator: () => ( { display: 'none', } ), multiValue: ( style ) => ( { ...style, marginRight: '0.5em', } ), menuPortal: ( style ) => { const sls = style && style.left ? `${ style.left }` : `0`; const styleLeft = isNaN( parseInt( sls ) ) ? 0 : parseInt( sls ); const margin = 14; const bodyWidth = document.body.clientWidth; const width = Math.min( bodyWidth - 2 * margin, 300 ); const overflowX = Math.abs( Math.min( 0, bodyWidth - ( styleLeft + width + 14 ) ) ); const left = styleLeft - overflowX; return { ...style, zIndex: 999999, width, left, right: left + width - margin, }; }, menu: ( style ) => ( { ...style, borderRadius: 0, } ), option: ( style, state: State ) => ( { ...style, ...getOptionColor( state ), padding: '0.5em 1em', } ), }; const DropdownIndicator = (): JSX.Element => ( ); // eslint-disable-next-line @typescript-eslint/no-explicit-any export const AsyncSelectControl = < T extends any >( { styles, page = 1, components, ...props }: AsyncSelectControlProps< T > ): JSX.Element => { return ( ); }; const getBorderColor = ( { isDisabled, isFocused }: State ): string => { if ( isDisabled ) { return '#cccccc'; } //end if if ( isFocused ) { return WORDPRESS_ACCENT_COLOR; } //end if return '#757575'; }; const getOptionColor = ( { isSelected, isFocused }: State ): CSSProperties => { if ( isFocused ) { return { background: WORDPRESS_ACCENT_COLOR, color: '#fff', }; } //end if if ( isSelected ) { return { background: '#f1f1f1', color: WORDPRESS_TEXT_COLOR, }; } //end if return { background: '#fff', color: WORDPRESS_TEXT_COLOR, }; };