|
1 | | -import { assign } from 'lodash'; |
2 | | -import React from 'react'; |
| 1 | +import React, { PropsWithChildren } from 'react'; |
3 | 2 | import classNames from 'classnames'; |
| 3 | +import { assign } from 'lodash'; |
| 4 | +import RcDrawer from 'rc-drawer'; |
4 | 5 | import './style.scss'; |
5 | 6 |
|
6 | | -export interface SlidePaneProps { |
7 | | - children: React.ReactNode; |
| 7 | +export interface ISlidePaneProps { |
8 | 8 | visible: boolean; |
9 | | - left?: string | number; |
10 | | - width?: string | number; |
11 | 9 | className?: string; |
12 | 10 | style?: React.CSSProperties; |
13 | | - // eslint-disable-next-line @typescript-eslint/no-unused-vars |
14 | | - onClose?<HTMLSpanElement, MouseEvent>(): void; |
15 | | - [propName: string]: any; |
| 11 | + bodyStyle?: React.CSSProperties; |
| 12 | + onClose?: (e: React.MouseEvent | React.KeyboardEvent) => void; |
16 | 13 | } |
| 14 | +const SlidePane = ({ |
| 15 | + visible, |
| 16 | + className, |
| 17 | + style, |
| 18 | + bodyStyle, |
| 19 | + children, |
| 20 | + onClose, |
| 21 | +}: PropsWithChildren<ISlidePaneProps>) => { |
| 22 | + const slidePrefixCls = 'dtc-slide-pane'; |
| 23 | + let rootStyle: React.CSSProperties = { |
| 24 | + top: 0, |
| 25 | + right: 0, |
| 26 | + transform: visible ? undefined : 'translate3d(150%, 0, 0)', |
| 27 | + }; |
| 28 | + const classes = classNames(className); |
17 | 29 |
|
18 | | -class SlidePane extends React.Component<SlidePaneProps, any> { |
19 | | - constructor(props: SlidePaneProps) { |
20 | | - super(props); |
| 30 | + if (!visible) { |
| 31 | + rootStyle['pointerEvents'] = 'none'; |
21 | 32 | } |
| 33 | + if (style) rootStyle = assign(rootStyle, style); |
22 | 34 |
|
23 | | - render() { |
24 | | - const { children, visible, style, className, onClose } = this.props; |
25 | | - const slidePrefixCls = 'dtc-slide-pane'; |
26 | | - let myStyle: any = { |
27 | | - top: 0, |
28 | | - transform: visible ? undefined : 'translate3d(150%, 0, 0)', |
29 | | - }; |
30 | | - const classes = classNames(slidePrefixCls, className); |
31 | | - if (!visible) { |
32 | | - myStyle['pointerEvents'] = 'none'; |
33 | | - } |
34 | | - if (style) myStyle = assign(myStyle, style); |
35 | | - |
| 35 | + const renderButton = () => { |
36 | 36 | return ( |
37 | | - <div className={classes} style={myStyle}> |
38 | | - <div |
39 | | - className={`${slidePrefixCls}-content`} |
40 | | - data-testid="slidepane_container" |
41 | | - style={{ display: visible ? 'block' : 'none', height: '100%' }} |
42 | | - > |
43 | | - {children} |
44 | | - </div> |
45 | | - <img |
46 | | - className={`${slidePrefixCls}-icon`} |
47 | | - data-testid="slidepane_action" |
48 | | - onClick={onClose} |
49 | | - src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAABwCAYAAAAE0LDPAAAAAXNSR0IArs4c6QAAAnlJREFUaEPtmk9IVHEQx78jufpw7ykouuEaBG6dEmrXOmRRt476VgvyEngKlNqQMu3PoSU7iCBq4CW2olNdRMRr7HasnnZb0y57WGODzUDjt/RIonbeyzfQYd51h/m8+c7395u3MOSs5Xexr4dKRLt5AhYJtbPRaNO7velo/4Bf6YhoB8B0R3vzNSLaNr8ECnBRRLTc0d583kBEAJU3J5o6HG0ZkgTs1OBATAxgqqghTIoCiPBeFABQSRggZFOxg/anC0ElYq9JlUglYhVgA9RFKhGrABugLlKJWAXYAHWRSsQqwAaoi1QiVgE2gHVRejKDUKgWQ1cvmj/XbMLfA3jA42dwVvPo7+tBd/xo8ICNzQLG7y3AskIYvz2IcEO9LwhbgcmWebGCpeUcEvEYBvrOBg8ol7cxOjaP4lYJqZEkIm2NniGeKjDZ3mQ/YPbJa7S1NiI1YntuuGeAgTx8lMHqx3XYvWdwOnHMUxW+AJufC7hzdwH1VggTt64gHLZYiC+Ayfb85QoWl3KIn+jEpeS54AHlb98xOjaHYrGEG8M2DkWaqkJ8V2CyZd86mJl7hdaWg7h5PVm14f8EMJD0zxM+ePkCuo4f+WsV/ycgm3MwMy8k0d4mp4ZtRIJusmvTxMlODNgB21T8oLlXRbK3B6cS3maDZxeJXnbudb315Wvl9AZ+XbsDpzseQ3/QA+fTRgET9wVHpvmqcNbWK6PSjEy/D9vkB+mnaLDq5D5b/L6x7+8iBbBNVolUItYDKpFKxCrABqiLVCJWATZAXaQSsQqwAeoilYhVgA1QFzESCS8wia9giS6Rma1B0TU40UU+sVVEoWXK6uugPwBjVkdxauLcgwAAAABJRU5ErkJggg==" |
50 | | - alt="" |
51 | | - /> |
52 | | - </div> |
| 37 | + <img |
| 38 | + className={`${slidePrefixCls}-icon`} |
| 39 | + onClick={onClose} |
| 40 | + src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAABwCAYAAAAE0LDPAAAAAXNSR0IArs4c6QAAAnlJREFUaEPtmk9IVHEQx78jufpw7ykouuEaBG6dEmrXOmRRt476VgvyEngKlNqQMu3PoSU7iCBq4CW2olNdRMRr7HasnnZb0y57WGODzUDjt/RIonbeyzfQYd51h/m8+c7395u3MOSs5Xexr4dKRLt5AhYJtbPRaNO7velo/4Bf6YhoB8B0R3vzNSLaNr8ECnBRRLTc0d583kBEAJU3J5o6HG0ZkgTs1OBATAxgqqghTIoCiPBeFABQSRggZFOxg/anC0ElYq9JlUglYhVgA9RFKhGrABugLlKJWAXYAHWRSsQqwAaoi1QiVgE2gHVRejKDUKgWQ1cvmj/XbMLfA3jA42dwVvPo7+tBd/xo8ICNzQLG7y3AskIYvz2IcEO9LwhbgcmWebGCpeUcEvEYBvrOBg8ol7cxOjaP4lYJqZEkIm2NniGeKjDZ3mQ/YPbJa7S1NiI1YntuuGeAgTx8lMHqx3XYvWdwOnHMUxW+AJufC7hzdwH1VggTt64gHLZYiC+Ayfb85QoWl3KIn+jEpeS54AHlb98xOjaHYrGEG8M2DkWaqkJ8V2CyZd86mJl7hdaWg7h5PVm14f8EMJD0zxM+ePkCuo4f+WsV/ycgm3MwMy8k0d4mp4ZtRIJusmvTxMlODNgB21T8oLlXRbK3B6cS3maDZxeJXnbudb315Wvl9AZ+XbsDpzseQ3/QA+fTRgET9wVHpvmqcNbWK6PSjEy/D9vkB+mnaLDq5D5b/L6x7+8iBbBNVolUItYDKpFKxCrABqiLVCJWATZAXaQSsQqwAeoilYhVgA1QFzESCS8wia9giS6Rma1B0TU40UU+sVVEoWXK6uugPwBjVkdxauLcgwAAAABJRU5ErkJggg==" |
| 41 | + alt="closeBtn" |
| 42 | + /> |
53 | 43 | ); |
54 | | - } |
55 | | -} |
| 44 | + }; |
| 45 | + |
| 46 | + return ( |
| 47 | + <RcDrawer |
| 48 | + prefixCls={slidePrefixCls} |
| 49 | + rootClassName={classes} |
| 50 | + width="100%" |
| 51 | + onClose={onClose} |
| 52 | + open={visible} |
| 53 | + mask={false} |
| 54 | + rootStyle={rootStyle} |
| 55 | + placement="right" |
| 56 | + > |
| 57 | + {renderButton()} |
| 58 | + <div className={`${slidePrefixCls}-content`} style={bodyStyle}> |
| 59 | + {children} |
| 60 | + </div> |
| 61 | + </RcDrawer> |
| 62 | + ); |
| 63 | +}; |
56 | 64 |
|
57 | 65 | export default SlidePane; |
0 commit comments