{"version":3,"file":"JsonInput.mjs","sources":["../../../src/components/JsonInput/JsonInput.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useUncontrolled } from '@raikou/hooks';\nimport { factory, Factory, useProps } from '../../core';\nimport { __InputStylesNames } from '../Input';\nimport { InputBase } from '../InputBase';\nimport { Textarea, TextareaProps } from '../Textarea';\nimport { validateJson } from './validate-json/validate-json';\n\nexport interface JsonInputProps extends Omit<TextareaProps, 'onChange'> {\n  /** Value for controlled component */\n  value?: string;\n\n  /** Default value for uncontrolled component */\n  defaultValue?: string;\n\n  /** Called when value changes */\n  onChange?: (value: string) => void;\n\n  /** Determines whether the value should be formatted on blur, `false` by default */\n  formatOnBlur?: boolean;\n\n  /** Error message displayed when value is not valid JSON */\n  validationError?: React.ReactNode;\n\n  /** Function to serialize value into a string, used for value formatting, `JSON.stringify` by default */\n  serialize?: typeof JSON.stringify;\n\n  /** Function to deserialize string value, used for value formatting and input JSON validation, must throw error if string cannot be processed, `JSON.parse` by default */\n  deserialize?: typeof JSON.parse;\n}\n\nexport type JsonInputFactory = Factory<{\n  props: JsonInputProps;\n  ref: HTMLTextAreaElement;\n  stylesNames: __InputStylesNames;\n}>;\n\nconst defaultProps: Partial<JsonInputProps> = {\n  serialize: JSON.stringify,\n  deserialize: JSON.parse,\n};\n\nexport const JsonInput = factory<JsonInputFactory>((props, ref) => {\n  const {\n    value,\n    defaultValue,\n    onChange,\n    formatOnBlur,\n    validationError,\n    serialize,\n    deserialize,\n    onFocus,\n    onBlur,\n    readOnly,\n    error,\n    ...others\n  } = useProps('JsonInput', defaultProps, props);\n\n  const [_value, setValue] = useUncontrolled({\n    value,\n    defaultValue,\n    finalValue: '',\n    onChange,\n  });\n\n  const [valid, setValid] = useState(validateJson(_value, deserialize!));\n\n  const handleFocus = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n    onFocus?.(event);\n    setValid(true);\n  };\n\n  const handleBlur = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n    typeof onBlur === 'function' && onBlur(event);\n    const isValid = validateJson(event.currentTarget.value, deserialize!);\n    formatOnBlur &&\n      !readOnly &&\n      isValid &&\n      event.currentTarget.value.trim() !== '' &&\n      setValue(serialize!(deserialize!(event.currentTarget.value), null, 2));\n    setValid(isValid);\n  };\n\n  return (\n    <Textarea\n      value={_value}\n      onChange={(event) => setValue(event.currentTarget.value)}\n      onFocus={handleFocus}\n      onBlur={handleBlur}\n      ref={ref}\n      readOnly={readOnly}\n      {...others}\n      autoComplete=\"off\"\n      __staticSelector=\"JsonInput\"\n      error={valid ? error : validationError || true}\n      data-monospace\n    />\n  );\n});\n\nJsonInput.classes = InputBase.classes;\nJsonInput.displayName = '@raikou/core/JsonInput';\n"],"names":[],"mappings":";;;;;;;;;;;;;AAqCA,MAAM,YAAwC,GAAA;AAAA,EAC5C,WAAW,IAAK,CAAA,SAAA;AAAA,EAChB,aAAa,IAAK,CAAA;AACpB,CAAA;AAEO,MAAM,SAAY,GAAA,OAAA,CAA0B,CAAC,KAAA,EAAO,GAAQ,KAAA;AACjE,EAAM,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAG;AAAA,GACD,GAAA,QAAA,CAAS,WAAa,EAAA,YAAA,EAAc,KAAK,CAAA;AAE7C,EAAA,MAAM,CAAC,MAAA,EAAQ,QAAQ,CAAA,GAAI,eAAgB,CAAA;AAAA,IACzC,KAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAY,EAAA,EAAA;AAAA,IACZ;AAAA,GACD,CAAA;AAED,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,SAAS,YAAa,CAAA,MAAA,EAAQ,WAAY,CAAC,CAAA;AAErE,EAAM,MAAA,WAAA,GAAc,CAAC,KAAiD,KAAA;AACpE,IAAA,OAAA,GAAU,KAAK,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,GACf;AAEA,EAAM,MAAA,UAAA,GAAa,CAAC,KAAiD,KAAA;AACnE,IAAO,OAAA,MAAA,KAAW,UAAc,IAAA,MAAA,CAAO,KAAK,CAAA;AAC5C,IAAA,MAAM,OAAU,GAAA,YAAA,CAAa,KAAM,CAAA,aAAA,CAAc,OAAO,WAAY,CAAA;AACpE,IAAA,YAAA,IACE,CAAC,QACD,IAAA,OAAA,IACA,MAAM,aAAc,CAAA,KAAA,CAAM,MAAW,KAAA,EAAA,IACrC,QAAS,CAAA,SAAA,CAAW,YAAa,KAAM,CAAA,aAAA,CAAc,KAAK,CAAG,EAAA,IAAA,EAAM,CAAC,CAAC,CAAA;AACvE,IAAA,QAAA,CAAS,OAAO,CAAA;AAAA,GAClB;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA,MAAA;AAAA,MACP,UAAU,CAAC,KAAA,KAAU,QAAS,CAAA,KAAA,CAAM,cAAc,KAAK,CAAA;AAAA,MACvD,OAAS,EAAA,WAAA;AAAA,MACT,MAAQ,EAAA,UAAA;AAAA,MACR,GAAA;AAAA,MACA,QAAA;AAAA,MACC,GAAG,MAAA;AAAA,MACJ,YAAa,EAAA,KAAA;AAAA,MACb,gBAAiB,EAAA,WAAA;AAAA,MACjB,KAAA,EAAO,KAAQ,GAAA,KAAA,GAAQ,eAAmB,IAAA,IAAA;AAAA,MAC1C,gBAAc,EAAA;AAAA;AAAA,GAChB;AAEJ,CAAC;AAED,SAAA,CAAU,UAAU,SAAU,CAAA,OAAA;AAC9B,SAAA,CAAU,WAAc,GAAA,wBAAA;;;;"}