import { Input, InputGroup, InputRightElement, Text } from '@chakra-ui/react'; import { useMemo } from 'react'; import { components } from 'react-select'; import { Select } from '~/components'; import { isSingleValue } from '~/components/select'; import { useDirective, useFormState } from '~/hooks'; import { isSelectDirective } from '~/types'; import { UserIP } from './user-ip'; import { type UseFormRegister } from 'react-hook-form'; import type { GroupBase, OptionProps } from 'react-select'; import type { SelectOnChange } from '~/components/select'; import type { Directive, FormData, OnChangeArgs, SingleOption } from '~/types'; type OptionWithDescription = SingleOption<{ description: string | null }>; interface QueryTargetProps { name: string; placeholder: string; onChange(e: OnChangeArgs): void; register: UseFormRegister; } function buildOptions(directive: Nullable): OptionWithDescription[] { if (directive !== null && isSelectDirective(directive)) { return directive.options.map(o => ({ value: o.value, label: o.name, data: { description: o.description }, })); } return []; } const Option = (props: OptionProps) => { const { label, data } = props; return ( > {...props}> {label}
{data.data?.description} ); }; export const QueryTarget = (props: QueryTargetProps): JSX.Element => { const { name, register, onChange, placeholder } = props; const displayTarget = useFormState(s => s.target.display); const setTarget = useFormState(s => s.setTarget); const queryTarget = useFormState(s => s.form.queryTarget); const directive = useDirective(); const options = useMemo(() => buildOptions(directive), [directive]); const isSelect = useMemo(() => directive !== null && isSelectDirective(directive), [directive]); function handleInputChange(e: React.ChangeEvent): void { setTarget({ display: e.target.value }); onChange({ field: name, value: [e.target.value] }); } const handleSelectChange: SelectOnChange = e => { if (isSingleValue(e)) { onChange({ field: name, value: e.value }); setTarget({ display: e.value }); } }; const handleUserIPChange = (target: string): void => { setTarget({ display: target }); onChange({ field: name, value: target }); }; return ( <> {isSelect ? ( name={name} options={options} components={{ Option }} onChange={handleSelectChange} /> ) : ( )} ); };