12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import { useCallback, useEffect, useState } from 'react'
- import { useBoolean } from 'ahooks'
- import { uniqueId } from 'lodash'
- import type { KeyValue } from '../types'
- const UNIQUE_ID_PREFIX = 'key-value-'
- const strToKeyValueList = (value: string) => {
- return value.split('\n').map((item) => {
- const [key, ...others] = item.split(':')
- return {
- id: uniqueId(UNIQUE_ID_PREFIX),
- key: key.trim(),
- value: others.join(':').trim(),
- }
- })
- }
- const useKeyValueList = (value: string, onChange: (value: string) => void, noFilter?: boolean) => {
- const [list, doSetList] = useState<KeyValue[]>(value ? strToKeyValueList(value) : [])
- const setList = (l: KeyValue[]) => {
- doSetList(l.map((item) => {
- return {
- ...item,
- id: item.id || uniqueId(UNIQUE_ID_PREFIX),
- }
- }))
- }
- useEffect(() => {
- if (noFilter)
- return
- const newValue = list.filter(item => item.key && item.value).map(item => `${item.key}:${item.value}`).join('\n')
- if (newValue !== value)
- onChange(newValue)
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [list, noFilter])
- const addItem = useCallback(() => {
- setList([...list, {
- id: uniqueId(UNIQUE_ID_PREFIX),
- key: '',
- value: '',
- }])
- }, [list])
- const [isKeyValueEdit, {
- toggle: toggleIsKeyValueEdit,
- }] = useBoolean(true)
- return {
- list: list.length === 0 ? [{ id: uniqueId(UNIQUE_ID_PREFIX), key: '', value: '' }] : list, // no item can not add new item
- setList,
- addItem,
- isKeyValueEdit,
- toggleIsKeyValueEdit,
- }
- }
- export default useKeyValueList
|