CustomParamSelect.tsx 1.7 KB

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