@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.
- package/es/float-button/hooks/useTriggerType.js +1 -1
- package/es/float-button/main.scss +21 -9
- package/es/float-button/types.d.ts +10 -14
- package/es/float-button/view/float-button.js +6 -29
- package/es/float-button/view/inner-drawer.d.ts +6 -1
- package/es/float-button/view/inner-drawer.js +60 -24
- package/es/index.js +1 -1
- package/lib/float-button/hooks/useTriggerType.js +1 -1
- package/lib/float-button/main.scss +21 -9
- package/lib/float-button/types.d.ts +10 -14
- package/lib/float-button/view/float-button.js +5 -28
- package/lib/float-button/view/inner-drawer.d.ts +6 -1
- package/lib/float-button/view/inner-drawer.js +59 -23
- package/lib/index.js +1 -1
- package/package.json +1 -1
|
@@ -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, '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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,
|
|
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:
|
|
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), {
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
58
|
-
if (mountTarget) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
|
100
|
-
React.createElement("div", { className: `${cls}-inner
|
|
101
|
-
|
|
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, '
|
|
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
|
@@ -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, '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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,
|
|
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:
|
|
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), {
|
|
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
|
|
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
|
-
|
|
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.
|
|
61
|
-
if (mountTarget) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
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
|
|
103
|
-
react_1.default.createElement("div", { className: `${cls}-inner
|
|
104
|
-
|
|
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, '
|
|
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.
|
|
21
|
+
exports.version = '0.1.4';
|