import React, { ChangeEvent, ReactElement, useCallback, useEffect, useState } from 'react' import InputElement from '..' import Label from '../../Label' import styles from './index.module.css' import Tooltip from '@shared/atoms/Tooltip' import Markdown from '@shared/Markdown' import Button from '@shared/atoms/Button' import { InputProps } from '@shared/FormInput' import classNames from 'classnames/bind' const cx = classNames.bind(styles) export interface KeyValuePair { key: string value: string } export interface KeyValueInputProps extends Omit { value: KeyValuePair[] uniqueKeys?: boolean keyPlaceholder?: string valuePlaceholder?: string } export default function InputKeyValue({ uniqueKeys = false, value, keyPlaceholder = 'key', valuePlaceholder = 'value', ...props }: KeyValueInputProps): ReactElement { const { label, help, prominentHelp, form, field } = props const [currentKey, setCurrentKey] = useState('') const [currentValue, setCurrentValue] = useState('') const [disabledButton, setDisabledButton] = useState(true) const [hasOnlyUniqueKeys, setHasOnlyUniqueKeys] = useState(true) const [pairs, setPairs] = useState(value || []) const currentKeyExists = useCallback(() => { return pairs.some((pair) => pair.key === currentKey) }, [currentKey, pairs]) const addPair = () => { if (currentKeyExists()) { setHasOnlyUniqueKeys(false) if (uniqueKeys) return } setPairs((prev) => [ ...prev, { key: currentKey, value: currentValue } ]) setCurrentKey('') setCurrentValue('') } const removePair = (index: number) => { const newPairs = pairs.filter((pair, pairIndex) => pairIndex !== index) setPairs(newPairs) setCurrentKey('') setCurrentValue('') } function handleChange(e: ChangeEvent) { const checkType = e.target.name.search('key') checkType > 0 ? setCurrentKey(e.target.value) : setCurrentValue(e.target.value) return e } useEffect(() => { form.setFieldValue(`${field.name}`, pairs) }, [pairs]) useEffect(() => { setDisabledButton( !currentKey || !currentValue || (uniqueKeys && currentKeyExists()) ) setHasOnlyUniqueKeys(!currentKeyExists()) }, [currentKey, currentValue, uniqueKeys, currentKeyExists]) return (
{uniqueKeys && !hasOnlyUniqueKeys && (

{`The ${keyPlaceholder} field must be unique`}

)}
{pairs.length > 0 && pairs.map((header, i) => { return (
) })}
) }