StatusProvider.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. "use client";
  2. import * as React from 'react';
  3. import CheckCircleFilled from "@ant-design/icons/es/icons/CheckCircleFilled";
  4. import CloseCircleFilled from "@ant-design/icons/es/icons/CloseCircleFilled";
  5. import ExclamationCircleFilled from "@ant-design/icons/es/icons/ExclamationCircleFilled";
  6. import LoadingOutlined from "@ant-design/icons/es/icons/LoadingOutlined";
  7. import classNames from 'classnames';
  8. import { FormContext, FormItemInputContext } from '../context';
  9. import { getStatus } from '../util';
  10. const iconMap = {
  11. success: CheckCircleFilled,
  12. warning: ExclamationCircleFilled,
  13. error: CloseCircleFilled,
  14. validating: LoadingOutlined
  15. };
  16. export default function StatusProvider({
  17. children,
  18. errors,
  19. warnings,
  20. hasFeedback,
  21. validateStatus,
  22. prefixCls,
  23. meta,
  24. noStyle,
  25. name
  26. }) {
  27. const itemPrefixCls = `${prefixCls}-item`;
  28. const {
  29. feedbackIcons
  30. } = React.useContext(FormContext);
  31. const mergedValidateStatus = getStatus(errors, warnings, meta, null, !!hasFeedback, validateStatus);
  32. const {
  33. isFormItemInput: parentIsFormItemInput,
  34. status: parentStatus,
  35. hasFeedback: parentHasFeedback,
  36. feedbackIcon: parentFeedbackIcon,
  37. name: parentName
  38. } = React.useContext(FormItemInputContext);
  39. // ====================== Context =======================
  40. const formItemStatusContext = React.useMemo(() => {
  41. var _a;
  42. let feedbackIcon;
  43. if (hasFeedback) {
  44. const customIcons = hasFeedback !== true && hasFeedback.icons || feedbackIcons;
  45. const customIconNode = mergedValidateStatus && ((_a = customIcons === null || customIcons === void 0 ? void 0 : customIcons({
  46. status: mergedValidateStatus,
  47. errors,
  48. warnings
  49. })) === null || _a === void 0 ? void 0 : _a[mergedValidateStatus]);
  50. const IconNode = mergedValidateStatus && iconMap[mergedValidateStatus];
  51. feedbackIcon = customIconNode !== false && IconNode ? (/*#__PURE__*/React.createElement("span", {
  52. className: classNames(`${itemPrefixCls}-feedback-icon`, `${itemPrefixCls}-feedback-icon-${mergedValidateStatus}`)
  53. }, customIconNode || /*#__PURE__*/React.createElement(IconNode, null))) : null;
  54. }
  55. const context = {
  56. status: mergedValidateStatus || '',
  57. errors,
  58. warnings,
  59. hasFeedback: !!hasFeedback,
  60. feedbackIcon,
  61. isFormItemInput: true,
  62. name
  63. };
  64. // No style will follow parent context
  65. if (noStyle) {
  66. context.status = (mergedValidateStatus !== null && mergedValidateStatus !== void 0 ? mergedValidateStatus : parentStatus) || '';
  67. context.isFormItemInput = parentIsFormItemInput;
  68. context.hasFeedback = !!(hasFeedback !== null && hasFeedback !== void 0 ? hasFeedback : parentHasFeedback);
  69. context.feedbackIcon = hasFeedback !== undefined ? context.feedbackIcon : parentFeedbackIcon;
  70. context.name = name !== null && name !== void 0 ? name : parentName;
  71. }
  72. return context;
  73. }, [mergedValidateStatus, hasFeedback, noStyle, parentIsFormItemInput, parentStatus]);
  74. // ======================= Render =======================
  75. return /*#__PURE__*/React.createElement(FormItemInputContext.Provider, {
  76. value: formItemStatusContext
  77. }, children);
  78. }