Spaces:
Paused
Paused
| import React, { useState } from 'react'; | |
| import { Form, Input, Button, Space } from 'antd'; | |
| import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'; | |
| import { TextInput, Grid, Col } from "@tremor/react"; | |
| import { TrashIcon } from "@heroicons/react/outline"; | |
| interface KeyValueInputProps { | |
| value?: Record<string, string>; | |
| onChange?: (value: Record<string, string>) => void; | |
| } | |
| const KeyValueInput: React.FC<KeyValueInputProps> = ({ value = {}, onChange }) => { | |
| const [pairs, setPairs] = useState<[string, string][]>(Object.entries(value)); | |
| const handleAdd = () => { | |
| setPairs([...pairs, ['', '']]); | |
| }; | |
| const handleRemove = (index: number) => { | |
| const newPairs = pairs.filter((_, i) => i !== index); | |
| setPairs(newPairs); | |
| onChange?.(Object.fromEntries(newPairs)); | |
| }; | |
| const handleChange = (index: number, key: string, val: string) => { | |
| const newPairs = [...pairs]; | |
| newPairs[index] = [key, val]; | |
| setPairs(newPairs); | |
| onChange?.(Object.fromEntries(newPairs)); | |
| }; | |
| return ( | |
| <div> | |
| {pairs.map(([key, val], index) => ( | |
| <Space key={index} style={{ display: 'flex', marginBottom: 8 }} align="start"> | |
| <TextInput | |
| placeholder="Header Name" | |
| value={key} | |
| onChange={(e) => handleChange(index, e.target.value, val)} | |
| /> | |
| <TextInput | |
| placeholder="Header Value" | |
| value={val} | |
| onChange={(e) => handleChange(index, key, e.target.value)} | |
| /> | |
| <MinusCircleOutlined onClick={() => handleRemove(index)} /> | |
| </Space> | |
| ))} | |
| <Button type="dashed" onClick={handleAdd} icon={<PlusOutlined />}> | |
| Add Header | |
| </Button> | |
| </div> | |
| ); | |
| }; | |
| export default KeyValueInput; | |