@arcblock/ux 0.78.25 → 1.6.59
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/LICENSE +1 -1
- package/README.md +0 -56
- package/lib/ActionButton/index.js +6 -4
- package/lib/ActivityIndicator/index.js +75 -23
- package/lib/Alert/index.js +15 -11
- package/lib/Async/index.js +1 -1
- package/lib/Badge/index.js +17 -15
- package/lib/Blocklet/index.js +261 -0
- package/lib/Button/wrap.js +96 -43
- package/lib/ButtonGroup/index.js +3 -16
- package/lib/Center/index.js +30 -4
- package/lib/ClickToCopy/index.js +10 -8
- package/lib/CodeBlock/index.js +40 -13
- package/lib/Colors/index.js +15 -0
- package/lib/Colors/themes/default.js +85 -0
- package/lib/ContactForm/index.js +9 -10
- package/lib/CookieConsent/index.js +98 -0
- package/lib/CountDown/index.js +18 -14
- package/lib/Dialog/confirm.js +84 -0
- package/lib/Dialog/dialog.js +137 -0
- package/lib/Dialog/index.js +23 -0
- package/lib/Earth/index.js +33 -33
- package/lib/Empty/index.js +61 -0
- package/lib/Footer/index.js +16 -18
- package/lib/Icon/image.js +10 -13
- package/lib/Icon/index.js +10 -8
- package/lib/Img/index.js +212 -0
- package/lib/InfoRow/index.js +7 -6
- package/lib/Layout/dashboard/header.js +60 -42
- package/lib/Layout/dashboard/index.js +72 -60
- package/lib/Layout/dashboard/sidebar.js +41 -25
- package/lib/Layout/index.js +113 -51
- package/lib/Locale/browser-lang.js +0 -2
- package/lib/Locale/context.js +85 -61
- package/lib/Locale/selector.js +33 -20
- package/lib/Logo/index.js +15 -13
- package/lib/Metric/index.js +5 -6
- package/lib/NFTDisplay/README.md +59 -0
- package/lib/NFTDisplay/aspect-ratio-container.js +52 -0
- package/lib/NFTDisplay/broken.js +25 -0
- package/lib/NFTDisplay/index.js +317 -0
- package/lib/NFTDisplay/loading.js +23 -0
- package/lib/NFTDisplay/svg-embedder/img.js +68 -0
- package/lib/NFTDisplay/svg-embedder/inline-svg.js +54 -0
- package/lib/PageScroller/index.js +10 -11
- package/lib/PageScroller/usePrevValue.js +2 -2
- package/lib/PricingTable/PricingPlan.js +12 -15
- package/lib/PricingTable/index.js +5 -5
- package/lib/Result/common.js +176 -0
- package/lib/Result/index.js +61 -0
- package/lib/Result/result.js +69 -0
- package/lib/Result/translations.js +61 -0
- package/lib/Screenshot/index.js +14 -13
- package/lib/Spinner/index.js +37 -0
- package/lib/SplitButton/index.js +126 -0
- package/lib/Switch/index.js +107 -0
- package/lib/Tabs/index.js +24 -47
- package/lib/Tag/index.js +15 -13
- package/lib/Terminal/Player.js +43 -45
- package/lib/Terminal/index.js +3 -1
- package/lib/Terminal/util.js +2 -3
- package/lib/TextCollapse/index.js +21 -14
- package/lib/Theme/index.js +79 -63
- package/lib/Theme/responsiveFontSizes.js +8 -8
- package/lib/Toast/index.js +12 -11
- package/lib/Util/index.js +197 -26
- package/lib/Video/index.js +8 -11
- package/lib/Wallet/Action.js +15 -13
- package/lib/Wallet/Download.js +60 -58
- package/lib/Wallet/Open.js +2 -2
- package/lib/WechatPrompt/index.js +10 -10
- package/lib/index.js +6 -6
- package/lib/withTheme/index.js +5 -17
- package/lib/withTracker/error_boundary.js +3 -3
- package/lib/withTracker/index.js +6 -7
- package/package.json +22 -17
- package/src/ActionButton/index.js +65 -0
- package/src/ActivityIndicator/index.js +141 -0
- package/src/Alert/index.js +104 -0
- package/src/Async/index.js +39 -0
- package/src/Badge/index.js +71 -0
- package/src/Blocklet/index.js +424 -0
- package/src/Button/index.js +4 -0
- package/src/Button/wrap.js +101 -0
- package/src/ButtonGroup/index.js +6 -0
- package/src/Center/index.js +40 -0
- package/src/ClickToCopy/index.js +90 -0
- package/src/CodeBlock/index.js +160 -0
- package/src/Colors/index.js +1 -0
- package/src/Colors/themes/default.js +54 -0
- package/src/ContactForm/index.js +240 -0
- package/src/CookieConsent/index.js +90 -0
- package/src/CountDown/index.js +151 -0
- package/src/Dialog/confirm.js +76 -0
- package/src/Dialog/dialog.js +162 -0
- package/src/Dialog/index.js +2 -0
- package/src/DriftBot/index.js +81 -0
- package/src/Earth/countries.json +8057 -0
- package/src/Earth/index.js +511 -0
- package/src/Earth/util.js +69 -0
- package/src/Empty/index.js +41 -0
- package/src/Footer/index.js +110 -0
- package/src/Icon/image.js +55 -0
- package/src/Icon/index.js +69 -0
- package/src/Img/index.js +172 -0
- package/src/InfoRow/index.js +83 -0
- package/src/Layout/dashboard/header.js +157 -0
- package/src/Layout/dashboard/index.js +150 -0
- package/src/Layout/dashboard/sidebar.js +122 -0
- package/src/Layout/index.js +318 -0
- package/src/Locale/browser-lang.js +63 -0
- package/src/Locale/context.js +94 -0
- package/src/Locale/images/globe-dark.png +0 -0
- package/src/Locale/images/globe-light.png +0 -0
- package/src/Locale/selector.js +135 -0
- package/src/Logo/images/logo-dark-text.svg +3 -0
- package/src/Logo/images/logo-dark-top.svg +6 -0
- package/src/Logo/images/logo-light-text.svg +3 -0
- package/src/Logo/images/logo-light-top.svg +6 -0
- package/src/Logo/index.js +47 -0
- package/src/Metric/index.js +115 -0
- package/src/NFTDisplay/README.md +59 -0
- package/src/NFTDisplay/aspect-ratio-container.js +34 -0
- package/src/NFTDisplay/broken.js +18 -0
- package/src/NFTDisplay/index.js +257 -0
- package/src/NFTDisplay/loading.js +17 -0
- package/src/NFTDisplay/svg-embedder/img.js +36 -0
- package/src/NFTDisplay/svg-embedder/inline-svg.js +37 -0
- package/src/PageScroller/index.js +342 -0
- package/src/PageScroller/usePrevValue.js +12 -0
- package/src/PricingTable/PricingPlan.js +112 -0
- package/src/PricingTable/index.js +43 -0
- package/src/Result/common.js +116 -0
- package/src/Result/index.js +31 -0
- package/src/Result/result.js +57 -0
- package/src/Result/translations.js +56 -0
- package/src/Screenshot/devices.css +1366 -0
- package/src/Screenshot/index.js +181 -0
- package/src/Spinner/index.js +19 -0
- package/src/SplitButton/index.js +112 -0
- package/src/Switch/index.js +78 -0
- package/src/Tabs/index.js +46 -0
- package/src/Tag/index.js +73 -0
- package/src/Terminal/Player.js +364 -0
- package/src/Terminal/index.js +150 -0
- package/src/Terminal/player.css +378 -0
- package/src/Terminal/util.js +167 -0
- package/src/Terminal/xterm.css +171 -0
- package/src/TextCollapse/index.js +92 -0
- package/src/Theme/index.js +184 -0
- package/src/Theme/responsiveFontSizes.js +94 -0
- package/src/Toast/index.js +118 -0
- package/src/Util/index.js +281 -0
- package/src/Video/index.js +72 -0
- package/src/Wallet/Action.js +105 -0
- package/src/Wallet/Download.js +130 -0
- package/src/Wallet/Open.js +50 -0
- package/src/Wallet/images/abtwallet.png +0 -0
- package/src/Wallet/images/android_download.svg +23 -0
- package/src/Wallet/images/app-store.svg +20 -0
- package/src/Wallet/images/google-play.svg +70 -0
- package/src/WechatPrompt/images/android.png +0 -0
- package/src/WechatPrompt/images/ios.png +0 -0
- package/src/WechatPrompt/index.js +81 -0
- package/src/index.js +63 -0
- package/src/withTheme/index.js +72 -0
- package/src/withTracker/README.md +34 -0
- package/src/withTracker/error_boundary.js +34 -0
- package/src/withTracker/index.js +70 -0
- package/lib/GraphQLPlayground/graphiql.css +0 -1850
- package/lib/GraphQLPlayground/index.js +0 -302
- package/lib/GraphQLPlayground/util.js +0 -55
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import Button from '../Button';
|
|
4
|
+
import Dialog from './dialog';
|
|
5
|
+
|
|
6
|
+
// 注意排在 {...rest} 之后的 props 优先级更高
|
|
7
|
+
export default function Confirm({
|
|
8
|
+
title,
|
|
9
|
+
children,
|
|
10
|
+
onConfirm,
|
|
11
|
+
onCancel,
|
|
12
|
+
showCancelButton,
|
|
13
|
+
confirmButton,
|
|
14
|
+
cancelButton,
|
|
15
|
+
PaperProps,
|
|
16
|
+
...rest
|
|
17
|
+
}) {
|
|
18
|
+
// 去除 dialog 默认的 300 最小高度
|
|
19
|
+
PaperProps.style = Object.assign(
|
|
20
|
+
{
|
|
21
|
+
minHeight: 0,
|
|
22
|
+
},
|
|
23
|
+
PaperProps.style
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Dialog
|
|
28
|
+
title={title}
|
|
29
|
+
PaperProps={PaperProps}
|
|
30
|
+
{...rest}
|
|
31
|
+
onClose={() => onCancel()}
|
|
32
|
+
actions={
|
|
33
|
+
<>
|
|
34
|
+
{showCancelButton && (
|
|
35
|
+
<Button onClick={() => onCancel()} color="primary" {...cancelButton.props}>
|
|
36
|
+
{cancelButton.text}
|
|
37
|
+
</Button>
|
|
38
|
+
)}
|
|
39
|
+
<Button onClick={() => onConfirm()} color="primary" autoFocus {...confirmButton.props}>
|
|
40
|
+
{confirmButton.text}
|
|
41
|
+
</Button>
|
|
42
|
+
</>
|
|
43
|
+
}>
|
|
44
|
+
{children}
|
|
45
|
+
</Dialog>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Confirm.propTypes = {
|
|
50
|
+
title: PropTypes.node.isRequired,
|
|
51
|
+
children: PropTypes.node.isRequired,
|
|
52
|
+
onConfirm: PropTypes.func.isRequired,
|
|
53
|
+
onCancel: PropTypes.func.isRequired,
|
|
54
|
+
showCancelButton: PropTypes.bool,
|
|
55
|
+
// 可以传入 {text: ..., props: ...}
|
|
56
|
+
confirmButton: PropTypes.shape({
|
|
57
|
+
text: PropTypes.string.isRequired,
|
|
58
|
+
props: PropTypes.object,
|
|
59
|
+
}),
|
|
60
|
+
cancelButton: PropTypes.shape({
|
|
61
|
+
text: PropTypes.string.isRequired,
|
|
62
|
+
props: PropTypes.object,
|
|
63
|
+
}),
|
|
64
|
+
PaperProps: PropTypes.object,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
Confirm.defaultProps = {
|
|
68
|
+
showCancelButton: true,
|
|
69
|
+
confirmButton: {
|
|
70
|
+
text: 'Confirm',
|
|
71
|
+
},
|
|
72
|
+
cancelButton: {
|
|
73
|
+
text: 'Cancel',
|
|
74
|
+
},
|
|
75
|
+
PaperProps: {},
|
|
76
|
+
};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import styled from 'styled-components';
|
|
4
|
+
import MuiDialog from '@material-ui/core/Dialog';
|
|
5
|
+
import MuiDialogContent from '@material-ui/core/DialogContent';
|
|
6
|
+
import DialogActions from '@material-ui/core/DialogActions';
|
|
7
|
+
import IconButton from '@material-ui/core/IconButton';
|
|
8
|
+
import useMediaQuery from '@material-ui/core/useMediaQuery';
|
|
9
|
+
import { useTheme } from '@material-ui/core/styles';
|
|
10
|
+
import CloseIcon from '@material-ui/icons/Close';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Dialog
|
|
14
|
+
*
|
|
15
|
+
* - 固定尺寸或特殊的尺寸控制需求, 可使用 PaperProps.style (不再提供 width/height 等 props)
|
|
16
|
+
* 注意: 当设置明确的 width 时, 可能需要同时设置 maxWidth=false (mui dialog 默认 maxWidth=sm, 设置的 width 可能受限)
|
|
17
|
+
* - 添加默认最小尺寸 (300x300), 在需要 先展示 loading 再展示异步数据 的时候避免 loading 阶段窗口过小
|
|
18
|
+
*/
|
|
19
|
+
const Dialog = ({
|
|
20
|
+
children,
|
|
21
|
+
title,
|
|
22
|
+
prepend,
|
|
23
|
+
toolbar,
|
|
24
|
+
actions,
|
|
25
|
+
showCloseButton,
|
|
26
|
+
actionsPosition,
|
|
27
|
+
PaperProps,
|
|
28
|
+
...rest
|
|
29
|
+
}) => {
|
|
30
|
+
const theme = useTheme();
|
|
31
|
+
// 不管是否是 mobile 设备, 只要屏宽 < sm, dialog 就处于 mobile 模式
|
|
32
|
+
const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
|
|
33
|
+
const showHeader = title || showCloseButton || toolbar;
|
|
34
|
+
const handleOnClose = (e, reason) => {
|
|
35
|
+
// escapeKeyDown/backdropClick
|
|
36
|
+
const { onClose } = rest;
|
|
37
|
+
if (onClose) {
|
|
38
|
+
onClose(e, reason);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
// 添加默认最小尺寸 (300x300)
|
|
42
|
+
PaperProps.style = Object.assign(
|
|
43
|
+
{
|
|
44
|
+
minWidth: 300,
|
|
45
|
+
minHeight: 300,
|
|
46
|
+
},
|
|
47
|
+
PaperProps.style
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const closeButton = (
|
|
51
|
+
<IconButton className="ux-dialog_closeButton" onClick={e => handleOnClose(e, 'closeButton')}>
|
|
52
|
+
<CloseIcon />
|
|
53
|
+
</IconButton>
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<StyledMuiDialog
|
|
58
|
+
fullScreen={isMobile}
|
|
59
|
+
onClose={handleOnClose}
|
|
60
|
+
PaperProps={PaperProps}
|
|
61
|
+
{...rest}>
|
|
62
|
+
{showHeader && (
|
|
63
|
+
<Header className="ux-dialog_header" isMobile={isMobile}>
|
|
64
|
+
<div className="ux-dialog_left">
|
|
65
|
+
{showCloseButton && isMobile && closeButton}
|
|
66
|
+
{prepend && <div className="ux-dialog_prepend">{prepend}</div>}
|
|
67
|
+
{title && <h6 className="ux-dialog_title">{title}</h6>}
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<div className="ux-dialog_right">
|
|
71
|
+
<div className="ux-dialog_toolbar">{toolbar}</div>
|
|
72
|
+
{showCloseButton && !isMobile && closeButton}
|
|
73
|
+
</div>
|
|
74
|
+
</Header>
|
|
75
|
+
)}
|
|
76
|
+
<MuiDialogContent>{children}</MuiDialogContent>
|
|
77
|
+
{actions && (
|
|
78
|
+
<DialogActions className={`ux-dialog_actions--${actionsPosition}`}>{actions}</DialogActions>
|
|
79
|
+
)}
|
|
80
|
+
</StyledMuiDialog>
|
|
81
|
+
);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
Dialog.propTypes = {
|
|
85
|
+
children: PropTypes.node.isRequired,
|
|
86
|
+
title: PropTypes.node,
|
|
87
|
+
// 在 title 之前追加内容, 比如返回按钮
|
|
88
|
+
prepend: PropTypes.node,
|
|
89
|
+
// 顶部工具栏, 在 close button 另一侧
|
|
90
|
+
toolbar: PropTypes.node,
|
|
91
|
+
actions: PropTypes.node,
|
|
92
|
+
showCloseButton: PropTypes.bool,
|
|
93
|
+
actionsPosition: PropTypes.oneOf(['left', 'center', 'right']),
|
|
94
|
+
PaperProps: PropTypes.object,
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
Dialog.defaultProps = {
|
|
98
|
+
showCloseButton: true,
|
|
99
|
+
title: '',
|
|
100
|
+
prepend: null,
|
|
101
|
+
toolbar: null,
|
|
102
|
+
actions: null,
|
|
103
|
+
actionsPosition: 'right',
|
|
104
|
+
PaperProps: {},
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const StyledMuiDialog = styled(MuiDialog)`
|
|
108
|
+
.MuiDialog-paper {
|
|
109
|
+
${props => (props.fullScreen ? 'border-radius: 0;' : '')};
|
|
110
|
+
}
|
|
111
|
+
.MuiDialogContent-root {
|
|
112
|
+
padding: 16px 24px;
|
|
113
|
+
}
|
|
114
|
+
.MuiDialogActions-root {
|
|
115
|
+
padding: 8px 24px 16px 24px;
|
|
116
|
+
}
|
|
117
|
+
.MuiDialogActions-root.ux-dialog_actions--left {
|
|
118
|
+
justify-content: flex-start;
|
|
119
|
+
}
|
|
120
|
+
.MuiDialogActions-root.ux-dialog_actions--right {
|
|
121
|
+
justify-content: flex-end;
|
|
122
|
+
}
|
|
123
|
+
.MuiDialogActions-root.ux-dialog_actions--center {
|
|
124
|
+
justify-content: center;
|
|
125
|
+
}
|
|
126
|
+
`;
|
|
127
|
+
|
|
128
|
+
const Header = styled.div`
|
|
129
|
+
display: flex;
|
|
130
|
+
justify-content: space-between;
|
|
131
|
+
align-items: center;
|
|
132
|
+
padding: 16px 24px;
|
|
133
|
+
.ux-dialog_left {
|
|
134
|
+
display: flex;
|
|
135
|
+
justify-content: flex-start;
|
|
136
|
+
align-items: center;
|
|
137
|
+
min-width: 0;
|
|
138
|
+
}
|
|
139
|
+
.ux-dialog_right {
|
|
140
|
+
display: flex;
|
|
141
|
+
justify-content: flex-end;
|
|
142
|
+
align-items: center;
|
|
143
|
+
}
|
|
144
|
+
.ux-dialog_toolbar {
|
|
145
|
+
display: flex;
|
|
146
|
+
align-items: center;
|
|
147
|
+
}
|
|
148
|
+
.ux-dialog_title {
|
|
149
|
+
margin: 0;
|
|
150
|
+
font-size: 18px;
|
|
151
|
+
font-weight: 500;
|
|
152
|
+
white-space: nowrap;
|
|
153
|
+
overflow: hidden;
|
|
154
|
+
text-overflow: ellipsis;
|
|
155
|
+
}
|
|
156
|
+
.ux-dialog_closeButton {
|
|
157
|
+
/* 使 closeButton 与 content 左/右对齐 */
|
|
158
|
+
${props => (props.isMobile ? 'margin-left: -12px;' : 'margin-right: -12px;')}
|
|
159
|
+
}
|
|
160
|
+
`;
|
|
161
|
+
|
|
162
|
+
export default Dialog;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* eslint-disable max-len */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
|
|
5
|
+
import { mergeProps } from '../Util';
|
|
6
|
+
|
|
7
|
+
export default class DriftBot extends React.Component {
|
|
8
|
+
constructor(props) {
|
|
9
|
+
super(mergeProps(props, DriftBot, ['attributes']));
|
|
10
|
+
|
|
11
|
+
this.addMainScript = this.addMainScript.bind(this);
|
|
12
|
+
this.addIdentityVariables = this.addIdentityVariables.bind(this);
|
|
13
|
+
this.insertScript = this.insertScript.bind(this);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
insertScript(scriptText) {
|
|
17
|
+
const script = document.createElement('script');
|
|
18
|
+
script.innerText = scriptText;
|
|
19
|
+
script.async = true;
|
|
20
|
+
document.body.appendChild(script);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
addMainScript() {
|
|
24
|
+
const scriptText = `!function() {
|
|
25
|
+
var t = window.driftt = window.drift = window.driftt || [];
|
|
26
|
+
if (!t.init) {
|
|
27
|
+
if (t.invoked) return void (window.console && console.error && console.error("Drift snippet included twice."));
|
|
28
|
+
t.invoked = !0, t.methods = [ "identify", "config", "track", "reset", "debug", "show", "ping", "page", "hide", "off", "on" ],
|
|
29
|
+
t.factory = function(e) {
|
|
30
|
+
return function() {
|
|
31
|
+
var n = Array.prototype.slice.call(arguments);
|
|
32
|
+
return n.unshift(e), t.push(n), t;
|
|
33
|
+
};
|
|
34
|
+
}, t.methods.forEach(function(e) {
|
|
35
|
+
t[e] = t.factory(e);
|
|
36
|
+
}), t.load = function(t) {
|
|
37
|
+
var e = 3e5, n = Math.ceil(new Date() / e) * e, o = document.createElement("script");
|
|
38
|
+
o.type = "text/javascript", o.async = !0, o.crossorigin = "anonymous", o.src = "https://js.driftt.com/include/" + n + "/" + t + ".js";
|
|
39
|
+
var i = document.getElementsByTagName("script")[0];
|
|
40
|
+
i.parentNode.insertBefore(o, i);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}();
|
|
44
|
+
drift.SNIPPET_VERSION = '0.3.1';
|
|
45
|
+
drift.load('${this.props.appId}');`;
|
|
46
|
+
|
|
47
|
+
this.insertScript(scriptText);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
addIdentityVariables() {
|
|
51
|
+
if (typeof this.props.userId !== 'undefined') {
|
|
52
|
+
const scriptText = `
|
|
53
|
+
var t = window.driftt = window.drift = window.driftt || [];
|
|
54
|
+
drift.identify('${this.props.userId}', ${JSON.stringify(this.props.attributes)})
|
|
55
|
+
`;
|
|
56
|
+
this.insertScript(scriptText);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
componentDidMount() {
|
|
61
|
+
if (typeof window !== 'undefined') {
|
|
62
|
+
this.addMainScript();
|
|
63
|
+
this.addIdentityVariables();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
render() {
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
DriftBot.propTypes = {
|
|
73
|
+
appId: PropTypes.string.isRequired,
|
|
74
|
+
userId: PropTypes.string,
|
|
75
|
+
attributes: PropTypes.object,
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
DriftBot.defaultProps = {
|
|
79
|
+
userId: '',
|
|
80
|
+
attributes: {},
|
|
81
|
+
};
|