sideSheetFoundation.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  2. import { noop } from 'lodash';
  3. import KeyCode from '../utils/keyCode';
  4. export interface SideSheetProps {
  5. afterVisibleChange?: (isVisible: boolean) => void;
  6. bodyStyle?: Record<string, any>;
  7. className?: string;
  8. closable?: boolean;
  9. closeIcon?: any;
  10. closeOnEsc?: boolean;
  11. disableScroll?: boolean;
  12. footer?: any;
  13. getPopupContainer?: () => HTMLElement;
  14. headerStyle?: Record<string, any>;
  15. height?: number | string;
  16. keepDOM?: boolean;
  17. mask?: boolean;
  18. maskClosable?: boolean;
  19. maskStyle?: Record<string, any>;
  20. motion?: boolean;
  21. onCancel?: (e: any) => void;
  22. placement?: 'top' | 'bottom' | 'left' | 'right';
  23. size?: 'small' | 'medium' | 'large';
  24. style?: Record<string, any>;
  25. title?: any;
  26. visible?: boolean;
  27. width?: number | string;
  28. zIndex?: number;
  29. children?: any;
  30. 'aria-label'?: string
  31. }
  32. export interface SideSheetState {
  33. displayNone: boolean
  34. }
  35. export interface SideSheetAdapter extends DefaultAdapter<SideSheetProps, SideSheetState> {
  36. disabledBodyScroll: () => void;
  37. enabledBodyScroll: () => void;
  38. notifyCancel: (e: any) => void;
  39. notifyVisibleChange: (visible: boolean) => void;
  40. setOnKeyDownListener: () => void;
  41. removeKeyDownListener: () => void;
  42. toggleDisplayNone: (displayNone: boolean) => void
  43. }
  44. export default class SideSheetFoundation extends BaseFoundation<SideSheetAdapter> {
  45. constructor(adapter: SideSheetAdapter) {
  46. super({ ...SideSheetFoundation.defaultAdapter, ...adapter });
  47. }
  48. get defaultAdapter() {
  49. return ({
  50. handleCancel: noop,
  51. beforeShow: noop,
  52. afterHide: noop,
  53. });
  54. }
  55. destroy() {
  56. this.afterHide();
  57. }
  58. handleCancel(e: any) {
  59. this._adapter.notifyCancel(e);
  60. }
  61. beforeShow() {
  62. const allowDisable = this.getProp('disableScroll');
  63. allowDisable && this._adapter.disabledBodyScroll();
  64. this._adapter.setOnKeyDownListener();
  65. }
  66. afterHide() {
  67. const allowDisable = this.getProp('disableScroll');
  68. allowDisable && this._adapter.enabledBodyScroll();
  69. this._adapter.removeKeyDownListener();
  70. }
  71. handleKeyDown(e: any) {
  72. const { closeOnEsc } = this.getProps();
  73. if (closeOnEsc && e.keyCode === KeyCode.ESC) {
  74. e.stopPropagation();
  75. this.handleCancel(e);
  76. return;
  77. }
  78. }
  79. onVisibleChange(visible: boolean) {
  80. this._adapter.notifyVisibleChange(visible);
  81. }
  82. toggleDisplayNone = (displayNone: boolean)=>{
  83. this._adapter.toggleDisplayNone(displayNone);
  84. }
  85. }