@alifd/chat 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,7 +16,7 @@ export function useTriggerType({ triggerType, visible, onVisibleChange, }) {
16
16
  }, 150);
17
17
  if (allowClick) {
18
18
  triggerHandlerProps.onClick = () => {
19
- onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(!visible, 'fromeTrigger');
19
+ onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(!visible, 'fromTrigger');
20
20
  };
21
21
  }
22
22
  if (allowHover) {
@@ -18,9 +18,7 @@
18
18
 
19
19
  &-inner-drawer {
20
20
  flex: 1;
21
- display: flex;
22
21
  overflow: hidden;
23
- display: flex;
24
22
  box-shadow: $shadow-2;
25
23
  border-radius: $size-base * 2;
26
24
 
@@ -36,24 +34,38 @@
36
34
  width 0.3s,
37
35
  opacity 0.3s;
38
36
  display: flex;
37
+ width: 0;
38
+ opacity: 0;
39
39
  }
40
40
  &-inner {
41
- flex: 1;
41
+ width: 100%;
42
+ height: 100%;
42
43
  display: flex;
43
44
  flex-direction: column;
45
+
46
+ &--has-title {
47
+ .#{$prefix}float-button-inner-drawer {
48
+ &-header {
49
+ padding: $size-base * 2 $size-base * 3;
50
+ }
51
+ &-body {
52
+ padding-top: 0;
53
+ }
54
+ }
55
+ }
44
56
  }
45
57
  &-header {
46
58
  flex: none;
47
- display: flex;
48
- justify-content: end;
49
- padding: $size-base * 2 $size-base * 3;
59
+ position: relative;
50
60
  &-title {
51
- flex: 1;
52
61
  font-size: $font-size-subhead;
53
62
  line-height: 1.5;
63
+ padding-right: $size-base * 2;
54
64
  }
55
65
  &-close {
56
- flex: none;
66
+ position: absolute;
67
+ right: $size-base * 2;
68
+ top: $size-base * 2;
57
69
  color: $color-text1-2;
58
70
  cursor: pointer;
59
71
  transition: color 0.15s;
@@ -70,7 +82,7 @@
70
82
  }
71
83
  &-body {
72
84
  flex: 1;
73
- padding: 0 $size-base * 3 $size-base * 2;
85
+ padding: $size-base * 2 $size-base * 3;
74
86
  }
75
87
  &-footer {
76
88
  flex: none;
@@ -109,20 +109,6 @@ export type RequiredParts<O, K extends keyof O> = Omit<O, K> & Required<Pick<O,
109
109
  export interface FloatButtonProps extends CommonProps {
110
110
  className?: string;
111
111
  style?: React.CSSProperties;
112
- /**
113
- * 面板展示类型
114
- * @defaultValue 'balloon'
115
- * @example
116
- * - `balloon`: 悬浮面板
117
- * - `drawer`: 悬浮侧边抽屉
118
- * - `inner-drawer`: 文档内部抽屉
119
- */
120
- type?: 'balloon' | 'drawer' | 'inner-drawer';
121
- drawerProps?: {
122
- title?: ReactNode;
123
- width?: number | string;
124
- target: string | (() => HTMLElement);
125
- };
126
112
  /**
127
113
  * 弹层位置,适用 `type`: 'balloon'
128
114
  */
@@ -238,4 +224,14 @@ export interface FloatButtonInnerDrawerProps extends FloatButtonProps {
238
224
  width?: string | number;
239
225
  target: string | (() => HTMLElement);
240
226
  title?: ReactNode;
227
+ drawerClassName?: string;
228
+ /**
229
+ * 关闭时是否保留节点
230
+ * @defaultValue false
231
+ */
232
+ cache?: boolean;
233
+ beforeOpen?: () => void;
234
+ afterOpen?: () => void;
235
+ beforeClose?: () => void;
236
+ afterClose?: () => void;
241
237
  }
@@ -1,5 +1,5 @@
1
1
  import { __rest } from "tslib";
2
- import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState, } from 'react';
2
+ import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';
3
3
  import cs from 'classnames';
4
4
  import { Balloon, ConfigProvider } from '@alifd/next';
5
5
  import { PREFIX_DEFAULT, useControlable } from '../../utils/index';
@@ -7,7 +7,6 @@ import { useAutoHide } from '../hooks/useAutoHide';
7
7
  import { useAutoAlign } from '../hooks/useAutoAlign';
8
8
  import { useNestleEdge } from '../hooks/useNestleEdge';
9
9
  import { useDragable } from '../hooks/useDragable';
10
- // import { InnerDrawer } from './inner-drawer';
11
10
  /**
12
11
  * @component 悬浮球
13
12
  * @en FloatButton
@@ -28,7 +27,7 @@ import { useDragable } from '../hooks/useDragable';
28
27
  * | SPACE | Trigger the onClick event |
29
28
  */
30
29
  const FloatButton = forwardRef((props, ref) => {
31
- const { className, style, type = 'balloon', addonAfter, addonBefore, dragable, safeAreaMargin = [10, 10, 10, 10], autoNestleEdge = true, interactiveEdges = ['left', 'right'], autoHide, autoAlign, leftSizeOfHidden, defaultPosition, trigger, triggerType = 'click', showClose = true, align, balloonProps, drawerProps, children, _renderView } = props, others = __rest(props, ["className", "style", "type", "addonAfter", "addonBefore", "dragable", "safeAreaMargin", "autoNestleEdge", "interactiveEdges", "autoHide", "autoAlign", "leftSizeOfHidden", "defaultPosition", "trigger", "triggerType", "showClose", "align", "balloonProps", "drawerProps", "children", "_renderView"]);
30
+ const { className, style, addonAfter, addonBefore, dragable, safeAreaMargin = [10, 10, 10, 10], autoNestleEdge = true, interactiveEdges = ['left', 'right'], autoHide, autoAlign, leftSizeOfHidden, defaultPosition, trigger, triggerType = 'click', showClose = false, align, balloonProps, children, _renderView } = props, others = __rest(props, ["className", "style", "addonAfter", "addonBefore", "dragable", "safeAreaMargin", "autoNestleEdge", "interactiveEdges", "autoHide", "autoAlign", "leftSizeOfHidden", "defaultPosition", "trigger", "triggerType", "showClose", "align", "balloonProps", "children", "_renderView"]);
32
31
  const elRef = useRef(null);
33
32
  const triggerRef = useRef(null);
34
33
  const [el, setEl] = useState(null);
@@ -44,7 +43,7 @@ const FloatButton = forwardRef((props, ref) => {
44
43
  setTriggerEl(triggerRef.current);
45
44
  }, []);
46
45
  const { align: currentAlign, update: _updateAlign } = useAutoAlign(el === null || el === void 0 ? void 0 : el.querySelector(`.${cls}-popup`), triggerEl, {
47
- enable: type === 'balloon' && autoAlign,
46
+ enable: autoAlign,
48
47
  defaultAlign: align,
49
48
  });
50
49
  const updateAlign = () => {
@@ -121,33 +120,11 @@ const FloatButton = forwardRef((props, ref) => {
121
120
  },
122
121
  }, popupClassName: `${cls}-popup`, trigger: trigger, popupContainer: () => el, triggerType: triggerType, align: currentAlign, v2: true, closable: showClose, autoAdjust: false }, balloonProps), children));
123
122
  };
124
- // const renderDrawer = () => {
125
- // return <div></div>;
126
- // };
127
- // const renderInnerDrawer = () => {
128
- // return (
129
- // <InnerDrawer
130
- // {...drawerProps}
131
- // prefix={`${cls}-`}
132
- // target=".card-legal-affairs"
133
- // trigger={trigger}
134
- // triggerType={triggerType}
135
- // visible={visible}
136
- // closable={showClose}
137
- // onVisibleChange={(...args) => {
138
- // if (draggedRef.current) {
139
- // return;
140
- // }
141
- // onVisibleChange?.(...args);
142
- // }}
143
- // >
144
- // {children}
145
- // </InnerDrawer>
146
- // );
147
- // };
148
123
  const renderView = () => {
149
124
  if (typeof _renderView === 'function') {
150
- return _renderView(`${cls}-`, Object.assign(Object.assign({}, props), { visible, onVisibleChange: handleVisibleChange }));
125
+ return _renderView(`${cls}-`, Object.assign(Object.assign({}, props), { triggerType,
126
+ showClose,
127
+ visible, onVisibleChange: handleVisibleChange }));
151
128
  }
152
129
  return renderBalloon();
153
130
  };
@@ -12,7 +12,12 @@ export interface InnerDrawerProps {
12
12
  closable?: boolean;
13
13
  triggerType: FloatButtonProps['triggerType'];
14
14
  width?: string | number;
15
+ cache?: boolean;
16
+ beforeOpen?: () => void;
17
+ afterOpen?: () => void;
18
+ beforeClose?: () => void;
19
+ afterClose?: () => void;
15
20
  }
16
- export declare function InnerDrawer({ className, prefix, target, children, trigger, triggerType, visible, onVisibleChange, closable, title, width, }: InnerDrawerProps): React.JSX.Element;
21
+ export declare function InnerDrawer({ className, prefix, target, children, trigger, triggerType, visible, onVisibleChange, closable, title, cache, width, beforeOpen, beforeClose, afterOpen, afterClose, }: InnerDrawerProps): React.JSX.Element;
17
22
  declare const _default: import("@alifd/next/types/config-provider/types").ConfiguredComponentClass<FloatButtonInnerDrawerProps & import("@alifd/next/types/config-provider/types").ComponentCommonProps, undefined, {}>;
18
23
  export default _default;
@@ -1,5 +1,5 @@
1
1
  import { __rest } from "tslib";
2
- import React, { useRef, useLayoutEffect, useEffect, useState } from 'react';
2
+ import React, { useRef, useEffect, useState } from 'react';
3
3
  import ReactDOM from 'react-dom';
4
4
  import cs from 'classnames';
5
5
  import { Icon, ConfigProvider } from '@alifd/next';
@@ -37,36 +37,70 @@ function getMountTarget(prefix, target) {
37
37
  dom.classList.add(`${prefix}inner-start`);
38
38
  return mountTarget;
39
39
  }
40
- export function InnerDrawer({ className, prefix, target, children, trigger, triggerType, visible, onVisibleChange, closable = true, title, width = 400, }) {
41
- const [mount, setMount] = useState(!!visible);
40
+ export function InnerDrawer({ className, prefix, target, children, trigger, triggerType, visible, onVisibleChange, closable = true, title, cache = false, width = 400, beforeOpen, beforeClose, afterOpen, afterClose, }) {
41
+ const cls = `${prefix}inner-drawer`;
42
+ const [mountTarget, setMountTarget] = useState(null);
43
+ const [showPane, setShowPane] = useState(!!visible);
44
+ const propsRef = useRef({ visible, afterOpen, afterClose });
45
+ propsRef.current = {
46
+ visible,
47
+ afterOpen,
48
+ afterClose() {
49
+ afterClose === null || afterClose === void 0 ? void 0 : afterClose();
50
+ if (!cache) {
51
+ setShowPane(false);
52
+ }
53
+ },
54
+ };
42
55
  useEffect(() => {
43
56
  if (visible) {
44
- setMount(visible);
57
+ setMountTarget(getMountTarget(`${cls}-`, target));
58
+ setShowPane(true);
45
59
  }
46
60
  }, [visible]);
47
- const cls = `${prefix}inner-drawer`;
48
61
  const handleVisibleChange = (nextVisible, type) => {
49
62
  onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(nextVisible, type);
50
63
  };
51
64
  const handleVisibleChangeRef = useRef(handleVisibleChange);
52
65
  handleVisibleChangeRef.current = handleVisibleChange;
53
66
  const handlers = useTriggerType({ visible, onVisibleChange: handleVisibleChange, triggerType });
54
- const mountTarget = mount ? getMountTarget(`${cls}-`, target) : undefined;
55
67
  const domRef = useRef(null);
56
68
  const triggerRef = useRef(null);
57
- useLayoutEffect(() => {
58
- if (mountTarget) {
59
- const timer = setTimeout(() => {
60
- mountTarget.style.width = visible
61
- ? `${typeof width === 'number' ? `${width}px` : width}`
62
- : '0px';
63
- mountTarget.style.opacity = visible ? '1' : '0';
64
- }, 16);
69
+ useEffect(() => {
70
+ if (!mountTarget) {
71
+ return;
72
+ }
73
+ if (visible) {
74
+ beforeOpen === null || beforeOpen === void 0 ? void 0 : beforeOpen();
75
+ const id = requestAnimationFrame(() => {
76
+ mountTarget.style.width = `${typeof width === 'number' ? `${width}px` : width}`;
77
+ mountTarget.style.opacity = '1';
78
+ });
65
79
  return () => {
66
- clearTimeout(timer);
80
+ cancelAnimationFrame(id);
67
81
  };
68
82
  }
69
- });
83
+ else {
84
+ beforeClose === null || beforeClose === void 0 ? void 0 : beforeClose();
85
+ mountTarget.style.width = `0px`;
86
+ mountTarget.style.opacity = '0';
87
+ }
88
+ }, [visible, mountTarget]);
89
+ useEffect(() => {
90
+ if (!mountTarget) {
91
+ return;
92
+ }
93
+ const onEnd = (e) => {
94
+ if (e.target === mountTarget && e.propertyName === 'width') {
95
+ const { visible, afterClose, afterOpen } = propsRef.current;
96
+ visible ? afterOpen === null || afterOpen === void 0 ? void 0 : afterOpen() : afterClose === null || afterClose === void 0 ? void 0 : afterClose();
97
+ }
98
+ };
99
+ mountTarget.addEventListener('transitionend', onEnd);
100
+ return () => {
101
+ mountTarget.removeEventListener('transitionend', onEnd);
102
+ };
103
+ }, [mountTarget]);
70
104
  useEffect(() => {
71
105
  if (!mountTarget || !className) {
72
106
  return;
@@ -96,20 +130,22 @@ export function InnerDrawer({ className, prefix, target, children, trigger, trig
96
130
  return (React.createElement(React.Fragment, null,
97
131
  React.createElement("div", Object.assign({}, handlers, { ref: triggerRef }), trigger),
98
132
  !!mountTarget &&
99
- ReactDOM.createPortal(React.createElement("div", { className: cs(cls, { [`${cls}--visible`]: visible }), ref: domRef, style: { width } },
100
- React.createElement("div", { className: `${cls}-inner` },
101
- React.createElement("div", { className: `${cls}-header` },
133
+ ReactDOM.createPortal(React.createElement("div", { className: cs(cls, { [`${cls}--visible`]: visible }), ref: domRef },
134
+ React.createElement("div", { className: cs(`${cls}-inner`, {
135
+ [`${cls}-inner--has-title`]: !!title,
136
+ }), style: { width } },
137
+ React.createElement("div", { className: cs(`${cls}-header`) },
102
138
  !!title && React.createElement("div", { className: `${cls}-header-title` }, title),
103
- !!closable && (React.createElement("button", { className: `${cls}-header-close`, onClick: () => handleVisibleChange(false, 'close') },
139
+ !!closable && (React.createElement("button", { className: `${cls}-header-close`, onClick: () => handleVisibleChange(false, 'closeClick') },
104
140
  React.createElement(Icon, { className: `${cls}-header-close-icon`, type: "close", size: 12 })))),
105
- React.createElement("div", { className: `${cls}-body` }, children))), mountTarget)));
141
+ React.createElement("div", { className: `${cls}-body` }, showPane ? children : null))), mountTarget)));
106
142
  }
107
143
  function FloatButtonByInnerDrawer(props) {
108
- const { width, title, target } = props, rests = __rest(props, ["width", "title", "target"]);
144
+ const { width, title, target, drawerClassName, cache = false, beforeOpen, afterOpen, beforeClose, afterClose } = props, rests = __rest(props, ["width", "title", "target", "drawerClassName", "cache", "beforeOpen", "afterOpen", "beforeClose", "afterClose"]);
109
145
  return (React.createElement(FloatButton, Object.assign({}, rests, { _renderView: (prefix, { trigger, triggerType, visible, onVisibleChange, showClose, children }) => {
110
- return (React.createElement(InnerDrawer, { prefix: prefix, target: target, width: width, title: title, trigger: trigger, triggerType: triggerType, visible: visible, closable: showClose, onVisibleChange: (...args) => {
146
+ return (React.createElement(InnerDrawer, { className: drawerClassName, prefix: prefix, target: target, width: width, title: title, trigger: trigger, triggerType: triggerType, visible: visible, closable: showClose, onVisibleChange: (...args) => {
111
147
  onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(...args);
112
- } }, children));
148
+ }, cache: cache, beforeOpen: beforeOpen, afterOpen: afterOpen, beforeClose: beforeClose, afterClose: afterClose }, children));
113
149
  } })));
114
150
  }
115
151
  export default ConfigProvider.config(FloatButtonByInnerDrawer);
package/es/index.js CHANGED
@@ -5,4 +5,4 @@ export { default as FloatButton } from './float-button';
5
5
  export { default as Text } from './text';
6
6
  export { default as Tag } from './tag';
7
7
  export { default as Tab } from './tab';
8
- export const version = '0.1.1';
8
+ export const version = '0.1.4';
@@ -19,7 +19,7 @@ function useTriggerType({ triggerType, visible, onVisibleChange, }) {
19
19
  }, 150);
20
20
  if (allowClick) {
21
21
  triggerHandlerProps.onClick = () => {
22
- onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(!visible, 'fromeTrigger');
22
+ onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(!visible, 'fromTrigger');
23
23
  };
24
24
  }
25
25
  if (allowHover) {
@@ -18,9 +18,7 @@
18
18
 
19
19
  &-inner-drawer {
20
20
  flex: 1;
21
- display: flex;
22
21
  overflow: hidden;
23
- display: flex;
24
22
  box-shadow: $shadow-2;
25
23
  border-radius: $size-base * 2;
26
24
 
@@ -36,24 +34,38 @@
36
34
  width 0.3s,
37
35
  opacity 0.3s;
38
36
  display: flex;
37
+ width: 0;
38
+ opacity: 0;
39
39
  }
40
40
  &-inner {
41
- flex: 1;
41
+ width: 100%;
42
+ height: 100%;
42
43
  display: flex;
43
44
  flex-direction: column;
45
+
46
+ &--has-title {
47
+ .#{$prefix}float-button-inner-drawer {
48
+ &-header {
49
+ padding: $size-base * 2 $size-base * 3;
50
+ }
51
+ &-body {
52
+ padding-top: 0;
53
+ }
54
+ }
55
+ }
44
56
  }
45
57
  &-header {
46
58
  flex: none;
47
- display: flex;
48
- justify-content: end;
49
- padding: $size-base * 2 $size-base * 3;
59
+ position: relative;
50
60
  &-title {
51
- flex: 1;
52
61
  font-size: $font-size-subhead;
53
62
  line-height: 1.5;
63
+ padding-right: $size-base * 2;
54
64
  }
55
65
  &-close {
56
- flex: none;
66
+ position: absolute;
67
+ right: $size-base * 2;
68
+ top: $size-base * 2;
57
69
  color: $color-text1-2;
58
70
  cursor: pointer;
59
71
  transition: color 0.15s;
@@ -70,7 +82,7 @@
70
82
  }
71
83
  &-body {
72
84
  flex: 1;
73
- padding: 0 $size-base * 3 $size-base * 2;
85
+ padding: $size-base * 2 $size-base * 3;
74
86
  }
75
87
  &-footer {
76
88
  flex: none;
@@ -109,20 +109,6 @@ export type RequiredParts<O, K extends keyof O> = Omit<O, K> & Required<Pick<O,
109
109
  export interface FloatButtonProps extends CommonProps {
110
110
  className?: string;
111
111
  style?: React.CSSProperties;
112
- /**
113
- * 面板展示类型
114
- * @defaultValue 'balloon'
115
- * @example
116
- * - `balloon`: 悬浮面板
117
- * - `drawer`: 悬浮侧边抽屉
118
- * - `inner-drawer`: 文档内部抽屉
119
- */
120
- type?: 'balloon' | 'drawer' | 'inner-drawer';
121
- drawerProps?: {
122
- title?: ReactNode;
123
- width?: number | string;
124
- target: string | (() => HTMLElement);
125
- };
126
112
  /**
127
113
  * 弹层位置,适用 `type`: 'balloon'
128
114
  */
@@ -238,4 +224,14 @@ export interface FloatButtonInnerDrawerProps extends FloatButtonProps {
238
224
  width?: string | number;
239
225
  target: string | (() => HTMLElement);
240
226
  title?: ReactNode;
227
+ drawerClassName?: string;
228
+ /**
229
+ * 关闭时是否保留节点
230
+ * @defaultValue false
231
+ */
232
+ cache?: boolean;
233
+ beforeOpen?: () => void;
234
+ afterOpen?: () => void;
235
+ beforeClose?: () => void;
236
+ afterClose?: () => void;
241
237
  }
@@ -9,7 +9,6 @@ const useAutoHide_1 = require("../hooks/useAutoHide");
9
9
  const useAutoAlign_1 = require("../hooks/useAutoAlign");
10
10
  const useNestleEdge_1 = require("../hooks/useNestleEdge");
11
11
  const useDragable_1 = require("../hooks/useDragable");
12
- // import { InnerDrawer } from './inner-drawer';
13
12
  /**
14
13
  * @component 悬浮球
15
14
  * @en FloatButton
@@ -30,7 +29,7 @@ const useDragable_1 = require("../hooks/useDragable");
30
29
  * | SPACE | Trigger the onClick event |
31
30
  */
32
31
  const FloatButton = (0, react_1.forwardRef)((props, ref) => {
33
- const { className, style, type = 'balloon', addonAfter, addonBefore, dragable, safeAreaMargin = [10, 10, 10, 10], autoNestleEdge = true, interactiveEdges = ['left', 'right'], autoHide, autoAlign, leftSizeOfHidden, defaultPosition, trigger, triggerType = 'click', showClose = true, align, balloonProps, drawerProps, children, _renderView } = props, others = tslib_1.__rest(props, ["className", "style", "type", "addonAfter", "addonBefore", "dragable", "safeAreaMargin", "autoNestleEdge", "interactiveEdges", "autoHide", "autoAlign", "leftSizeOfHidden", "defaultPosition", "trigger", "triggerType", "showClose", "align", "balloonProps", "drawerProps", "children", "_renderView"]);
32
+ const { className, style, addonAfter, addonBefore, dragable, safeAreaMargin = [10, 10, 10, 10], autoNestleEdge = true, interactiveEdges = ['left', 'right'], autoHide, autoAlign, leftSizeOfHidden, defaultPosition, trigger, triggerType = 'click', showClose = false, align, balloonProps, children, _renderView } = props, others = tslib_1.__rest(props, ["className", "style", "addonAfter", "addonBefore", "dragable", "safeAreaMargin", "autoNestleEdge", "interactiveEdges", "autoHide", "autoAlign", "leftSizeOfHidden", "defaultPosition", "trigger", "triggerType", "showClose", "align", "balloonProps", "children", "_renderView"]);
34
33
  const elRef = (0, react_1.useRef)(null);
35
34
  const triggerRef = (0, react_1.useRef)(null);
36
35
  const [el, setEl] = (0, react_1.useState)(null);
@@ -46,7 +45,7 @@ const FloatButton = (0, react_1.forwardRef)((props, ref) => {
46
45
  setTriggerEl(triggerRef.current);
47
46
  }, []);
48
47
  const { align: currentAlign, update: _updateAlign } = (0, useAutoAlign_1.useAutoAlign)(el === null || el === void 0 ? void 0 : el.querySelector(`.${cls}-popup`), triggerEl, {
49
- enable: type === 'balloon' && autoAlign,
48
+ enable: autoAlign,
50
49
  defaultAlign: align,
51
50
  });
52
51
  const updateAlign = () => {
@@ -123,33 +122,11 @@ const FloatButton = (0, react_1.forwardRef)((props, ref) => {
123
122
  },
124
123
  }, popupClassName: `${cls}-popup`, trigger: trigger, popupContainer: () => el, triggerType: triggerType, align: currentAlign, v2: true, closable: showClose, autoAdjust: false }, balloonProps), children));
125
124
  };
126
- // const renderDrawer = () => {
127
- // return <div></div>;
128
- // };
129
- // const renderInnerDrawer = () => {
130
- // return (
131
- // <InnerDrawer
132
- // {...drawerProps}
133
- // prefix={`${cls}-`}
134
- // target=".card-legal-affairs"
135
- // trigger={trigger}
136
- // triggerType={triggerType}
137
- // visible={visible}
138
- // closable={showClose}
139
- // onVisibleChange={(...args) => {
140
- // if (draggedRef.current) {
141
- // return;
142
- // }
143
- // onVisibleChange?.(...args);
144
- // }}
145
- // >
146
- // {children}
147
- // </InnerDrawer>
148
- // );
149
- // };
150
125
  const renderView = () => {
151
126
  if (typeof _renderView === 'function') {
152
- return _renderView(`${cls}-`, Object.assign(Object.assign({}, props), { visible, onVisibleChange: handleVisibleChange }));
127
+ return _renderView(`${cls}-`, Object.assign(Object.assign({}, props), { triggerType,
128
+ showClose,
129
+ visible, onVisibleChange: handleVisibleChange }));
153
130
  }
154
131
  return renderBalloon();
155
132
  };
@@ -12,7 +12,12 @@ export interface InnerDrawerProps {
12
12
  closable?: boolean;
13
13
  triggerType: FloatButtonProps['triggerType'];
14
14
  width?: string | number;
15
+ cache?: boolean;
16
+ beforeOpen?: () => void;
17
+ afterOpen?: () => void;
18
+ beforeClose?: () => void;
19
+ afterClose?: () => void;
15
20
  }
16
- export declare function InnerDrawer({ className, prefix, target, children, trigger, triggerType, visible, onVisibleChange, closable, title, width, }: InnerDrawerProps): React.JSX.Element;
21
+ export declare function InnerDrawer({ className, prefix, target, children, trigger, triggerType, visible, onVisibleChange, closable, title, cache, width, beforeOpen, beforeClose, afterOpen, afterClose, }: InnerDrawerProps): React.JSX.Element;
17
22
  declare const _default: import("@alifd/next/types/config-provider/types").ConfiguredComponentClass<FloatButtonInnerDrawerProps & import("@alifd/next/types/config-provider/types").ComponentCommonProps, undefined, {}>;
18
23
  export default _default;
@@ -40,36 +40,70 @@ function getMountTarget(prefix, target) {
40
40
  dom.classList.add(`${prefix}inner-start`);
41
41
  return mountTarget;
42
42
  }
43
- function InnerDrawer({ className, prefix, target, children, trigger, triggerType, visible, onVisibleChange, closable = true, title, width = 400, }) {
44
- const [mount, setMount] = (0, react_1.useState)(!!visible);
43
+ function InnerDrawer({ className, prefix, target, children, trigger, triggerType, visible, onVisibleChange, closable = true, title, cache = false, width = 400, beforeOpen, beforeClose, afterOpen, afterClose, }) {
44
+ const cls = `${prefix}inner-drawer`;
45
+ const [mountTarget, setMountTarget] = (0, react_1.useState)(null);
46
+ const [showPane, setShowPane] = (0, react_1.useState)(!!visible);
47
+ const propsRef = (0, react_1.useRef)({ visible, afterOpen, afterClose });
48
+ propsRef.current = {
49
+ visible,
50
+ afterOpen,
51
+ afterClose() {
52
+ afterClose === null || afterClose === void 0 ? void 0 : afterClose();
53
+ if (!cache) {
54
+ setShowPane(false);
55
+ }
56
+ },
57
+ };
45
58
  (0, react_1.useEffect)(() => {
46
59
  if (visible) {
47
- setMount(visible);
60
+ setMountTarget(getMountTarget(`${cls}-`, target));
61
+ setShowPane(true);
48
62
  }
49
63
  }, [visible]);
50
- const cls = `${prefix}inner-drawer`;
51
64
  const handleVisibleChange = (nextVisible, type) => {
52
65
  onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(nextVisible, type);
53
66
  };
54
67
  const handleVisibleChangeRef = (0, react_1.useRef)(handleVisibleChange);
55
68
  handleVisibleChangeRef.current = handleVisibleChange;
56
69
  const handlers = (0, useTriggerType_1.useTriggerType)({ visible, onVisibleChange: handleVisibleChange, triggerType });
57
- const mountTarget = mount ? getMountTarget(`${cls}-`, target) : undefined;
58
70
  const domRef = (0, react_1.useRef)(null);
59
71
  const triggerRef = (0, react_1.useRef)(null);
60
- (0, react_1.useLayoutEffect)(() => {
61
- if (mountTarget) {
62
- const timer = setTimeout(() => {
63
- mountTarget.style.width = visible
64
- ? `${typeof width === 'number' ? `${width}px` : width}`
65
- : '0px';
66
- mountTarget.style.opacity = visible ? '1' : '0';
67
- }, 16);
72
+ (0, react_1.useEffect)(() => {
73
+ if (!mountTarget) {
74
+ return;
75
+ }
76
+ if (visible) {
77
+ beforeOpen === null || beforeOpen === void 0 ? void 0 : beforeOpen();
78
+ const id = requestAnimationFrame(() => {
79
+ mountTarget.style.width = `${typeof width === 'number' ? `${width}px` : width}`;
80
+ mountTarget.style.opacity = '1';
81
+ });
68
82
  return () => {
69
- clearTimeout(timer);
83
+ cancelAnimationFrame(id);
70
84
  };
71
85
  }
72
- });
86
+ else {
87
+ beforeClose === null || beforeClose === void 0 ? void 0 : beforeClose();
88
+ mountTarget.style.width = `0px`;
89
+ mountTarget.style.opacity = '0';
90
+ }
91
+ }, [visible, mountTarget]);
92
+ (0, react_1.useEffect)(() => {
93
+ if (!mountTarget) {
94
+ return;
95
+ }
96
+ const onEnd = (e) => {
97
+ if (e.target === mountTarget && e.propertyName === 'width') {
98
+ const { visible, afterClose, afterOpen } = propsRef.current;
99
+ visible ? afterOpen === null || afterOpen === void 0 ? void 0 : afterOpen() : afterClose === null || afterClose === void 0 ? void 0 : afterClose();
100
+ }
101
+ };
102
+ mountTarget.addEventListener('transitionend', onEnd);
103
+ return () => {
104
+ mountTarget.removeEventListener('transitionend', onEnd);
105
+ };
106
+ }, [mountTarget]);
73
107
  (0, react_1.useEffect)(() => {
74
108
  if (!mountTarget || !className) {
75
109
  return;
@@ -99,21 +133,23 @@ function InnerDrawer({ className, prefix, target, children, trigger, triggerType
99
133
  return (react_1.default.createElement(react_1.default.Fragment, null,
100
134
  react_1.default.createElement("div", Object.assign({}, handlers, { ref: triggerRef }), trigger),
101
135
  !!mountTarget &&
102
- react_dom_1.default.createPortal(react_1.default.createElement("div", { className: (0, classnames_1.default)(cls, { [`${cls}--visible`]: visible }), ref: domRef, style: { width } },
103
- react_1.default.createElement("div", { className: `${cls}-inner` },
104
- react_1.default.createElement("div", { className: `${cls}-header` },
136
+ react_dom_1.default.createPortal(react_1.default.createElement("div", { className: (0, classnames_1.default)(cls, { [`${cls}--visible`]: visible }), ref: domRef },
137
+ react_1.default.createElement("div", { className: (0, classnames_1.default)(`${cls}-inner`, {
138
+ [`${cls}-inner--has-title`]: !!title,
139
+ }), style: { width } },
140
+ react_1.default.createElement("div", { className: (0, classnames_1.default)(`${cls}-header`) },
105
141
  !!title && react_1.default.createElement("div", { className: `${cls}-header-title` }, title),
106
- !!closable && (react_1.default.createElement("button", { className: `${cls}-header-close`, onClick: () => handleVisibleChange(false, 'close') },
142
+ !!closable && (react_1.default.createElement("button", { className: `${cls}-header-close`, onClick: () => handleVisibleChange(false, 'closeClick') },
107
143
  react_1.default.createElement(next_1.Icon, { className: `${cls}-header-close-icon`, type: "close", size: 12 })))),
108
- react_1.default.createElement("div", { className: `${cls}-body` }, children))), mountTarget)));
144
+ react_1.default.createElement("div", { className: `${cls}-body` }, showPane ? children : null))), mountTarget)));
109
145
  }
110
146
  exports.InnerDrawer = InnerDrawer;
111
147
  function FloatButtonByInnerDrawer(props) {
112
- const { width, title, target } = props, rests = tslib_1.__rest(props, ["width", "title", "target"]);
148
+ const { width, title, target, drawerClassName, cache = false, beforeOpen, afterOpen, beforeClose, afterClose } = props, rests = tslib_1.__rest(props, ["width", "title", "target", "drawerClassName", "cache", "beforeOpen", "afterOpen", "beforeClose", "afterClose"]);
113
149
  return (react_1.default.createElement(float_button_1.default, Object.assign({}, rests, { _renderView: (prefix, { trigger, triggerType, visible, onVisibleChange, showClose, children }) => {
114
- return (react_1.default.createElement(InnerDrawer, { prefix: prefix, target: target, width: width, title: title, trigger: trigger, triggerType: triggerType, visible: visible, closable: showClose, onVisibleChange: (...args) => {
150
+ return (react_1.default.createElement(InnerDrawer, { className: drawerClassName, prefix: prefix, target: target, width: width, title: title, trigger: trigger, triggerType: triggerType, visible: visible, closable: showClose, onVisibleChange: (...args) => {
115
151
  onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(...args);
116
- } }, children));
152
+ }, cache: cache, beforeOpen: beforeOpen, afterOpen: afterOpen, beforeClose: beforeClose, afterClose: afterClose }, children));
117
153
  } })));
118
154
  }
119
155
  exports.default = next_1.ConfigProvider.config(FloatButtonByInnerDrawer);
package/lib/index.js CHANGED
@@ -18,4 +18,4 @@ var tag_1 = require("./tag");
18
18
  Object.defineProperty(exports, "Tag", { enumerable: true, get: function () { return __importDefault(tag_1).default; } });
19
19
  var tab_1 = require("./tab");
20
20
  Object.defineProperty(exports, "Tab", { enumerable: true, get: function () { return __importDefault(tab_1).default; } });
21
- exports.version = '0.1.1';
21
+ exports.version = '0.1.4';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alifd/chat",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "A configurable component library for chat built on React.",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",