CustomParamSelect.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import React from 'react';
  2. import { useFormContext, ErrorMessage } from 'react-hook-form';
  3. import CustomParamOptions from './CustomParamOptions';
  4. import { isFirstParam, INDEX_PREFIX } from './CustomParams';
  5. import { TopicFormCustomParam } from 'redux/interfaces';
  6. interface Props {
  7. isDisabled: boolean;
  8. index: string;
  9. name: string;
  10. }
  11. const CustomParamSelect: React.FC<Props> = ({
  12. isDisabled,
  13. index,
  14. name,
  15. }) => {
  16. const { register, unregister, errors, getValues, triggerValidation } = useFormContext();
  17. const optInputName = `${index}[name]`;
  18. React.useEffect(
  19. () => { if (isFirstParam(index)) { unregister(optInputName) } },
  20. );
  21. const selectedMustBeUniq = (selected: string) => {
  22. const values: any = getValues({ nest: true });
  23. const customParamsValues: TopicFormCustomParam = values.customParams;
  24. let valid = true;
  25. for (const [key, customParam] of Object.entries(customParamsValues)) {
  26. if (`${INDEX_PREFIX}.${key}` === index) { continue; }
  27. if (selected === customParam.name) {
  28. valid = false;
  29. break;
  30. };
  31. }
  32. return valid ? true : 'Custom Parameter must be unique';
  33. };
  34. return (
  35. <>
  36. <label className="label">Custom Parameter</label>
  37. <div className="select is-block">
  38. <select
  39. name={optInputName}
  40. ref={register({
  41. required: 'Custom Parameter is required.',
  42. validate: { unique: selected => selectedMustBeUniq(selected) },
  43. })}
  44. onChange={() => triggerValidation(optInputName)}
  45. disabled={isDisabled}
  46. defaultValue={name}
  47. >
  48. <CustomParamOptions />
  49. </select>
  50. <p className="help is-danger">
  51. <ErrorMessage errors={errors} name={optInputName}/>
  52. </p>
  53. </div>
  54. </>
  55. );
  56. };
  57. export default React.memo(CustomParamSelect);