@alifd/chat 0.1.3 → 0.1.5

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.
@@ -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,30 +34,39 @@
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
+ position: relative;
44
46
 
45
47
  &--has-title {
46
48
  .#{$prefix}float-button-inner-drawer {
47
49
  &-header {
48
- padding: $size-base * 2 $size-base * 3;
50
+ margin: $size-base * 2 $size-base * 3;
49
51
  }
50
52
  &-body {
51
- padding-top: 0;
53
+ margin-top: 0;
54
+ }
55
+ }
56
+ }
57
+ &--has-close {
58
+ .#{$prefix}float-button-inner-drawer {
59
+ &-header-title {
60
+ margin-right: $size-base * 2;
52
61
  }
53
62
  }
54
63
  }
55
64
  }
56
65
  &-header {
57
66
  flex: none;
58
- position: relative;
59
67
  &-title {
60
68
  font-size: $font-size-subhead;
61
69
  line-height: 1.5;
62
- padding-right: $size-base * 2;
63
70
  }
64
71
  &-close {
65
72
  position: absolute;
@@ -81,7 +88,7 @@
81
88
  }
82
89
  &-body {
83
90
  flex: 1;
84
- padding: $size-base * 2 $size-base * 3;
91
+ margin: $size-base * 2 $size-base * 3;
85
92
  }
86
93
  &-footer {
87
94
  flex: none;
@@ -225,4 +225,13 @@ export interface FloatButtonInnerDrawerProps extends FloatButtonProps {
225
225
  target: string | (() => HTMLElement);
226
226
  title?: ReactNode;
227
227
  drawerClassName?: string;
228
+ /**
229
+ * 关闭时是否保留节点
230
+ * @defaultValue false
231
+ */
232
+ cache?: boolean;
233
+ beforeOpen?: () => void;
234
+ afterOpen?: () => void;
235
+ beforeClose?: () => void;
236
+ afterClose?: () => void;
228
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';
@@ -122,7 +122,9 @@ const FloatButton = forwardRef((props, ref) => {
122
122
  };
123
123
  const renderView = () => {
124
124
  if (typeof _renderView === 'function') {
125
- 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 }));
126
128
  }
127
129
  return renderBalloon();
128
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,22 +130,23 @@ 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 } },
133
+ ReactDOM.createPortal(React.createElement("div", { className: cs(cls, { [`${cls}--visible`]: visible }), ref: domRef },
100
134
  React.createElement("div", { className: cs(`${cls}-inner`, {
101
135
  [`${cls}-inner--has-title`]: !!title,
102
- }) },
136
+ [`${cls}-inner--has-close`]: !!closable,
137
+ }), style: { width } },
103
138
  React.createElement("div", { className: cs(`${cls}-header`) },
104
139
  !!title && React.createElement("div", { className: `${cls}-header-title` }, title),
105
140
  !!closable && (React.createElement("button", { className: `${cls}-header-close`, onClick: () => handleVisibleChange(false, 'closeClick') },
106
141
  React.createElement(Icon, { className: `${cls}-header-close-icon`, type: "close", size: 12 })))),
107
- React.createElement("div", { className: `${cls}-body` }, children))), mountTarget)));
142
+ React.createElement("div", { className: `${cls}-body` }, showPane ? children : null))), mountTarget)));
108
143
  }
109
144
  function FloatButtonByInnerDrawer(props) {
110
- const { width, title, target, drawerClassName } = props, rests = __rest(props, ["width", "title", "target", "drawerClassName"]);
145
+ const { width, title, target, drawerClassName, cache = false, beforeOpen, afterOpen, beforeClose, afterClose } = props, rests = __rest(props, ["width", "title", "target", "drawerClassName", "cache", "beforeOpen", "afterOpen", "beforeClose", "afterClose"]);
111
146
  return (React.createElement(FloatButton, Object.assign({}, rests, { _renderView: (prefix, { trigger, triggerType, visible, onVisibleChange, showClose, children }) => {
112
147
  return (React.createElement(InnerDrawer, { className: drawerClassName, prefix: prefix, target: target, width: width, title: title, trigger: trigger, triggerType: triggerType, visible: visible, closable: showClose, onVisibleChange: (...args) => {
113
148
  onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(...args);
114
- } }, children));
149
+ }, cache: cache, beforeOpen: beforeOpen, afterOpen: afterOpen, beforeClose: beforeClose, afterClose: afterClose }, children));
115
150
  } })));
116
151
  }
117
152
  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.3';
8
+ export const version = '0.1.5';
@@ -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,30 +34,39 @@
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
+ position: relative;
44
46
 
45
47
  &--has-title {
46
48
  .#{$prefix}float-button-inner-drawer {
47
49
  &-header {
48
- padding: $size-base * 2 $size-base * 3;
50
+ margin: $size-base * 2 $size-base * 3;
49
51
  }
50
52
  &-body {
51
- padding-top: 0;
53
+ margin-top: 0;
54
+ }
55
+ }
56
+ }
57
+ &--has-close {
58
+ .#{$prefix}float-button-inner-drawer {
59
+ &-header-title {
60
+ margin-right: $size-base * 2;
52
61
  }
53
62
  }
54
63
  }
55
64
  }
56
65
  &-header {
57
66
  flex: none;
58
- position: relative;
59
67
  &-title {
60
68
  font-size: $font-size-subhead;
61
69
  line-height: 1.5;
62
- padding-right: $size-base * 2;
63
70
  }
64
71
  &-close {
65
72
  position: absolute;
@@ -81,7 +88,7 @@
81
88
  }
82
89
  &-body {
83
90
  flex: 1;
84
- padding: $size-base * 2 $size-base * 3;
91
+ margin: $size-base * 2 $size-base * 3;
85
92
  }
86
93
  &-footer {
87
94
  flex: none;
@@ -225,4 +225,13 @@ export interface FloatButtonInnerDrawerProps extends FloatButtonProps {
225
225
  target: string | (() => HTMLElement);
226
226
  title?: ReactNode;
227
227
  drawerClassName?: string;
228
+ /**
229
+ * 关闭时是否保留节点
230
+ * @defaultValue false
231
+ */
232
+ cache?: boolean;
233
+ beforeOpen?: () => void;
234
+ afterOpen?: () => void;
235
+ beforeClose?: () => void;
236
+ afterClose?: () => void;
228
237
  }
@@ -124,7 +124,9 @@ const FloatButton = (0, react_1.forwardRef)((props, ref) => {
124
124
  };
125
125
  const renderView = () => {
126
126
  if (typeof _renderView === 'function') {
127
- 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 }));
128
130
  }
129
131
  return renderBalloon();
130
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,23 +133,24 @@ 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 } },
136
+ react_dom_1.default.createPortal(react_1.default.createElement("div", { className: (0, classnames_1.default)(cls, { [`${cls}--visible`]: visible }), ref: domRef },
103
137
  react_1.default.createElement("div", { className: (0, classnames_1.default)(`${cls}-inner`, {
104
138
  [`${cls}-inner--has-title`]: !!title,
105
- }) },
139
+ [`${cls}-inner--has-close`]: !!closable,
140
+ }), style: { width } },
106
141
  react_1.default.createElement("div", { className: (0, classnames_1.default)(`${cls}-header`) },
107
142
  !!title && react_1.default.createElement("div", { className: `${cls}-header-title` }, title),
108
143
  !!closable && (react_1.default.createElement("button", { className: `${cls}-header-close`, onClick: () => handleVisibleChange(false, 'closeClick') },
109
144
  react_1.default.createElement(next_1.Icon, { className: `${cls}-header-close-icon`, type: "close", size: 12 })))),
110
- react_1.default.createElement("div", { className: `${cls}-body` }, children))), mountTarget)));
145
+ react_1.default.createElement("div", { className: `${cls}-body` }, showPane ? children : null))), mountTarget)));
111
146
  }
112
147
  exports.InnerDrawer = InnerDrawer;
113
148
  function FloatButtonByInnerDrawer(props) {
114
- const { width, title, target, drawerClassName } = props, rests = tslib_1.__rest(props, ["width", "title", "target", "drawerClassName"]);
149
+ 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"]);
115
150
  return (react_1.default.createElement(float_button_1.default, Object.assign({}, rests, { _renderView: (prefix, { trigger, triggerType, visible, onVisibleChange, showClose, children }) => {
116
151
  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) => {
117
152
  onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(...args);
118
- } }, children));
153
+ }, cache: cache, beforeOpen: beforeOpen, afterOpen: afterOpen, beforeClose: beforeClose, afterClose: afterClose }, children));
119
154
  } })));
120
155
  }
121
156
  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.3';
21
+ exports.version = '0.1.5';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alifd/chat",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "A configurable component library for chat built on React.",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",