import React from 'react'; import { useIntl, defineMessages } from 'react-intl'; import Button from '../button/button'; import HStack from '../hstack/hstack'; import IconButton from '../icon-button/icon-button'; import Stack from '../stack/stack'; import Text from '../text/text'; const messages = defineMessages({ add: { id: 'streamfield.add', defaultMessage: 'Add' }, remove: { id: 'streamfield.remove', defaultMessage: 'Remove' }, }); interface IStreamfield { /** Array of values for the streamfield. */ values: any[], /** Input label message. */ labelText?: React.ReactNode, /** Input hint message. */ hintText?: React.ReactNode, /** Callback to add an item. */ onAddItem?: () => void, /** Callback to remove an item by index. */ onRemoveItem?: (i: number) => void, /** Callback when values are changed. */ onChange: (values: any[]) => void, /** Input to render for each value. */ component: React.ComponentType<{ onChange: (value: any) => void, value: any }>, /** Maximum number of allowed inputs. */ maxItems?: number, } /** List of inputs that can be added or removed. */ const Streamfield: React.FC = ({ values, labelText, hintText, onAddItem, onRemoveItem, onChange, component: Component, maxItems = Infinity, }) => { const intl = useIntl(); const handleChange = (i: number) => { return (value: any) => { const newData = [...values]; newData[i] = value; onChange(newData); }; }; return ( {labelText && {labelText}} {hintText && {hintText}} {values.map((value, i) => ( {onRemoveItem && ( onRemoveItem(i)} title={intl.formatMessage(messages.remove)} /> )} ))} {onAddItem && ( )} ); }; export default Streamfield;