HookModal.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import React, { PropsWithChildren } from 'react';
  2. import ConfirmModal from '../ConfirmModal';
  3. import { get } from 'lodash';
  4. import { ConfirmProps } from '../confirm';
  5. interface HookModalProps {
  6. afterClose: (...args: any[]) => void;
  7. config: ConfirmProps;
  8. motion?: boolean
  9. }
  10. export interface HookModalRef {
  11. destroy: () => void;
  12. update: (newConfig: ConfirmProps) => void
  13. }
  14. // eslint-disable-next-line max-len
  15. const HookModal = ({ afterClose, config, ...props }: PropsWithChildren<HookModalProps>, ref: React.Ref<any>) => {
  16. const [innerConfig, setInnerConfig] = React.useState(config);
  17. React.useImperativeHandle(ref, () => ({
  18. destroy: () => {
  19. setInnerConfig(originConfig => ({
  20. ...originConfig,
  21. visible: false,
  22. }));
  23. },
  24. update: newConfig => {
  25. setInnerConfig(originConfig => ({
  26. ...originConfig,
  27. ...newConfig,
  28. }));
  29. },
  30. }));
  31. const { motion } = props;
  32. /* istanbul ignore next */
  33. const mergedMotion =
  34. typeof motion === 'undefined' || motion ?
  35. {
  36. ...(motion as any),
  37. didLeave: (...args: any[]) => {
  38. const didLeave = get(props.motion, 'didLeave');
  39. if (typeof didLeave === 'function') {
  40. didLeave(...args);
  41. }
  42. afterClose();
  43. },
  44. } :
  45. false;
  46. return (
  47. <ConfirmModal
  48. {...innerConfig}
  49. // visible={!visible ? visible : undefined}
  50. motion={mergedMotion}
  51. />
  52. );
  53. };
  54. export default React.forwardRef<HookModalRef, HookModalProps>(HookModal);