sideSheetFoundation.ts 2.6 KB

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