validation.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import React from 'react';
  2. import { withMulti } from '@polkadot/react-api/with';
  3. import { InputValidationLengthConstraint } from '@joystream/types/forum';
  4. import { withForumCalls } from './calls';
  5. import { componentName } from '@polkadot/joy-utils/react/helpers';
  6. export type ValidationProps = {
  7. categoryTitleConstraint?: InputValidationLengthConstraint;
  8. categoryDescriptionConstraint?: InputValidationLengthConstraint;
  9. threadTitleConstraint?: InputValidationLengthConstraint;
  10. postTextConstraint?: InputValidationLengthConstraint;
  11. threadModerationRationaleConstraint?: InputValidationLengthConstraint;
  12. postModerationRationaleConstraint?: InputValidationLengthConstraint;
  13. };
  14. const loadAllValidationConstraints = withForumCalls<ValidationProps>(
  15. ['categoryTitleConstraint', {}],
  16. ['categoryDescriptionConstraint', {}],
  17. ['threadTitleConstraint', {}],
  18. ['postTextConstraint', {}],
  19. ['threadModerationRationaleConstraint', {}],
  20. ['postModerationRationaleConstraint', {}]
  21. );
  22. function waitForRequiredConstraints (
  23. requiredConstraintNames: Array<keyof ValidationProps>
  24. ) {
  25. return function (Component: React.ComponentType<any>) {
  26. const ResultComponent: React.FunctionComponent<ValidationProps> = (props: ValidationProps) => {
  27. const nonEmptyProps = requiredConstraintNames
  28. .filter(name => props[name] !== undefined)
  29. .length;
  30. if (nonEmptyProps !== requiredConstraintNames.length) {
  31. return <em>Loading validation constraints...</em>;
  32. }
  33. return <Component {...props} />;
  34. };
  35. ResultComponent.displayName = `waitForRequiredConstraints(${componentName(Component)})`;
  36. return ResultComponent;
  37. };
  38. }
  39. function withValidationConstraints (requiredConstraintNames: Array<keyof ValidationProps>) {
  40. return function (Component: React.ComponentType<ValidationProps>) {
  41. return withMulti(
  42. Component,
  43. loadAllValidationConstraints,
  44. waitForRequiredConstraints(requiredConstraintNames)
  45. );
  46. };
  47. }
  48. export const withCategoryValidation = withValidationConstraints(
  49. ['categoryTitleConstraint', 'categoryDescriptionConstraint']);
  50. export const withThreadValidation = withValidationConstraints(
  51. ['threadTitleConstraint', 'postTextConstraint']);
  52. export const withReplyValidation = withValidationConstraints(
  53. ['postTextConstraint']);
  54. export const withThreadModerationValidation = withValidationConstraints(
  55. ['threadModerationRationaleConstraint']);
  56. export const withPostModerationValidation = withValidationConstraints(
  57. ['postModerationRationaleConstraint']);