/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ import { Button, Inline, Input, Stack, TokenGroup } from 'aws-northstar'; import { Item as Token } from 'aws-northstar/components/TokenGroup/components/Token'; import { compact, isEmpty } from 'lodash'; import { getErrorText } from 'aws-northstar/components/FormRenderer/utils/getErrorText'; import FormField from 'aws-northstar/components/FormField'; import React, { useEffect, useMemo, useState } from 'react'; import useFieldApi, { UseFieldApiConfig } from '@data-driven-forms/react-form-renderer/use-field-api'; import useUniqueId from 'aws-northstar/components/../hooks/useUniqueId'; export type { Item as Token } from 'aws-northstar/components/TokenGroup/components/Token'; export function tokensFromStrings(values?: string[]): Token[] | undefined { if (values == null || isEmpty(values)) return undefined; return values.map((value) => ({ label: value, value })); } export function tokensToStrings(tokens?: Token[]): string[] | undefined { if (tokens == null) return tokens; return compact( tokens.map(({ value }) => { return value; }), ); } interface Props extends UseFieldApiConfig { placeholder?: string; addButtonText?: string; inputValueResolver?: (value?: any) => Token[]; outputValueResolver?: (tokens?: Token[]) => any; validateValue?: (value?: string) => undefined | string; } export const TokenGroupField: React.FC = ({ placeholder, addButtonText, inputValueResolver, outputValueResolver, validateValue, ...props }) => { const { label, description, helperText, input, validateOnMount, stretch, showError, renderReload, onReloadClick, createNewLinkHref, createNewLink, secondaryControl, meta: { error, submitFailed }, hideField, } = useFieldApi(props); const controlId = useUniqueId(input.name); const errorText = getErrorText(validateOnMount, submitFailed, showError, error); const [tokens, setTokens] = useState( () => (inputValueResolver ? inputValueResolver(input.value) : input.value) || [], ); const [inputValue, setInputValue] = useState(); const inputValueError = useMemo(() => { return validateValue && validateValue(inputValue); }, [inputValue, validateValue]); useEffect(() => { if (tokens) { const value = outputValueResolver ? outputValueResolver(tokens) : tokens; input.onChange(value); } }, [tokens, outputValueResolver]); if (hideField) { return null; } return ( { setTokens((_tokens) => { return _tokens.filter((token) => JSON.stringify(token) !== JSON.stringify(item)); }); }} /> ); }; export const StringGroupField: React.FC> = (props) => { return ( ); };