import './map-editor.scss'; import React, {useCallback, useEffect, useMemo, useRef, useState} from "react"; import {genUuid} from "../../utils/uuid"; import {getIconByName} from "../../icons/icons"; interface KeyValue { key: string; value: string; } const mapToList = (data: Record) => data ? Object.keys(data).map(key => ({key, value: data[key]})) : []; const listToMap = (data: KeyValue[]) => data?.reduce((acc: any, curVal) => {acc[curVal.key] = curVal.value; return acc;}, {}); const containsKey = (key: string, data: KeyValue[]) => data?.find((keyValue: KeyValue) => keyValue.key === key); interface MapEditorProps { name: string; values: Record; onChange: (name: string, values: Record) => void; } export default function MapEditor(props: MapEditorProps) { const {name, values, onChange} = props; const uuid = useMemo(() => genUuid(), []); const keyRef = useRef(null); const valRef = useRef(null); const [data, setData] = useState([]); useEffect(() => { if (values) { setData(mapToList(values)); } }, [values]); useEffect(() => { onChange(name, listToMap(data)); }, [data, name, onChange]); const handleHeaderRemove = useCallback((event: any) => { const key = event.target.dataset.key; if (key) { setData(data => data?.filter((keyValue: KeyValue) => keyValue.key !== key)); } }, []); const handleAddKeyValue = useCallback((event: any) => { let key = keyRef.current?.value?.trim(); let value = valRef.current?.value?.trim(); if (key.length> 0 && value.length > 0) { setData(data => { if (!containsKey(key, data)) { data.push({key, value}); return [...data]; } return data; }); } }, []); return
{data?.map((keyValue: KeyValue, idx) =>
{keyValue.key}
{keyValue.value}
{getIconByName('Delete')}
)}
}