ordering-ui-admin-external 1.6.5 → 1.7.1

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.
Files changed (41) hide show
  1. package/_bundles/{ordering-ui-admin.0b48ec00b24a060f7133.js → ordering-ui-admin.4e91d784f3b95343e365.js} +2 -2
  2. package/_bundles/{ordering-ui-admin.0b48ec00b24a060f7133.js.LICENSE.txt → ordering-ui-admin.4e91d784f3b95343e365.js.LICENSE.txt} +0 -0
  3. package/_modules/components/Marketing/EnterprisePromotionDetails/index.js +4 -3
  4. package/_modules/components/OrderingProducts/SiteTheme/index.js +16 -6
  5. package/_modules/components/OrderingProducts/SiteTheme/styles.js +8 -3
  6. package/_modules/components/Orders/Messages/index.js +6 -3
  7. package/_modules/components/Orders/OrderDetails/styles.js +1 -1
  8. package/_modules/components/Orders/OrdersManager/index.js +6 -2
  9. package/_modules/components/Settings/DoordashConnect/index.js +174 -0
  10. package/_modules/components/Settings/DoordashConnect/styles.js +109 -0
  11. package/_modules/components/Settings/IntegrationListing/index.js +26 -2
  12. package/_modules/components/Settings/IntegrationListing/styles.js +1 -1
  13. package/_modules/components/Settings/LalamoveConnect/index.js +176 -0
  14. package/_modules/components/Settings/LalamoveConnect/styles.js +111 -0
  15. package/_modules/components/Settings/index.js +7 -0
  16. package/_modules/components/Shared/Pagination/index.js +3 -2
  17. package/_modules/components/Shared/SelectSites/index.js +3 -4
  18. package/_modules/components/Shared/SelectUsers/index.js +37 -5
  19. package/_modules/components/Stores/BusinessDeliveryZoneInformation/index.js +5 -2
  20. package/_modules/components/Stores/BusinessDetails/index.js +42 -6
  21. package/index-template.js +3 -1
  22. package/package.json +2 -2
  23. package/src/components/Marketing/EnterprisePromotionDetails/index.js +3 -3
  24. package/src/components/OrderingProducts/SiteTheme/index.js +18 -2
  25. package/src/components/OrderingProducts/SiteTheme/styles.js +18 -0
  26. package/src/components/Orders/Messages/index.js +24 -2
  27. package/src/components/Orders/OrderDetails/styles.js +1 -0
  28. package/src/components/Orders/OrdersManager/index.js +5 -1
  29. package/src/components/Settings/DoordashConnect/index.js +222 -0
  30. package/src/components/Settings/DoordashConnect/styles.js +321 -0
  31. package/src/components/Settings/IntegrationListing/index.js +38 -0
  32. package/src/components/Settings/IntegrationListing/styles.js +4 -0
  33. package/src/components/Settings/LalamoveConnect/index.js +222 -0
  34. package/src/components/Settings/LalamoveConnect/styles.js +330 -0
  35. package/src/components/Settings/index.js +2 -0
  36. package/src/components/Shared/Pagination/index.js +3 -2
  37. package/src/components/Shared/SelectSites/index.js +2 -3
  38. package/src/components/Shared/SelectUsers/index.js +50 -21
  39. package/src/components/Stores/BusinessDeliveryZoneInformation/index.js +11 -6
  40. package/src/components/Stores/BusinessDetails/index.js +25 -3
  41. package/template/assets/images/lala-move.png +0 -0
@@ -0,0 +1,321 @@
1
+ import styled, { css } from 'styled-components'
2
+
3
+ export const DoordashConnectContainer = styled.div`
4
+ padding: 26px 20px;
5
+ box-sizing: border-box;
6
+ width: 100%;
7
+ overflow-x: hidden;
8
+ position: relative;
9
+
10
+ @media (min-width: 768px) {
11
+ padding: 26px 40px;
12
+ }
13
+ `
14
+
15
+ export const Header = styled.div`
16
+ display: flex;
17
+ justify-content: space-between;
18
+ align-items: center;
19
+ margin-bottom: 30px;
20
+
21
+ ${props => props.theme?.rtl ? css`
22
+ margin-left: 35px;
23
+ ` : css`
24
+ margin-right: 35px;
25
+ `}
26
+
27
+ h1 {
28
+ font-size: 20px;
29
+ font-weight: 700;
30
+ margin: 0px;
31
+ }
32
+
33
+ button {
34
+ height: 42px;
35
+ }
36
+ `
37
+
38
+ export const ApiKeysListTable = styled.table`
39
+ width: 100%;
40
+ margin-top: 25px;
41
+
42
+ thead {
43
+ border-bottom: 1px solid ${props => props.theme.colors.secundaryLight};
44
+ th {
45
+ padding: 10px 0;
46
+ &:last-child {
47
+ padding-left: 20px;
48
+ padding-right: 20px;
49
+ }
50
+ }
51
+ }
52
+ tr {
53
+ width: 100%;
54
+ th,
55
+ td {
56
+ font-size: 12px;
57
+ word-break: break-all;
58
+
59
+ &:last-child {
60
+ width: 100px;
61
+ > div {
62
+ padding-left: 20px;
63
+ padding-right: 20px;
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ tbody {
70
+ border-bottom: 1px solid ${props => props.theme.colors.borderColor};
71
+ td {
72
+ padding-top: 9px;
73
+ padding-bottom: 9px;
74
+
75
+ &:last-child {
76
+ > div {
77
+ display: flex;
78
+ justify-content: flex-end;
79
+ }
80
+ }
81
+ }
82
+ }
83
+ `
84
+
85
+ export const DropdownButtonWrapper = styled.div`
86
+ ${props => props?.theme?.rtl ? css`
87
+ border-right: 1px solid ${props => props.theme.colors.borderColor};
88
+ ` : css`
89
+ border-left: 1px solid ${props => props.theme.colors.borderColor};
90
+ `}
91
+ padding: 5px 20px;
92
+ button {
93
+ background: transparent !important;
94
+ border: none;
95
+ padding: 0px;
96
+ &:active,
97
+ &:focus {
98
+ border-color: unset !important;
99
+ box-shadow: none !important;
100
+ }
101
+ svg {
102
+ color: ${props => props.theme.colors.headingColor};
103
+ }
104
+
105
+ &:after {
106
+ display: none;
107
+ }
108
+ }
109
+
110
+ .show {
111
+ button {
112
+ background: ${props => props.theme.colors.secundary} !important;
113
+ border-color: unset !important;
114
+ box-shadow: none !important;
115
+ }
116
+ >div {
117
+ border: 1px solid ${props => props.theme.colors.borderColor};
118
+ box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.12);
119
+ }
120
+ }
121
+
122
+ > div {
123
+ > div {
124
+ border-radius: 8px;
125
+ .dropdown-item {
126
+ font-size: 12px;
127
+ color: ${props => props.theme.colors.headingColor};
128
+ }
129
+ .dropdown-item:last-child {
130
+ color: #E63757;
131
+ }
132
+ }
133
+ }
134
+ `
135
+ export const AddNewButton = styled.div`
136
+ cursor: pointer;
137
+ font-size: 12px;
138
+ color: ${props => props.theme.colors.lightGray};
139
+ margin: 20px 0;
140
+ width: fit-content;
141
+
142
+ &:hover {
143
+ color: ${props => props.theme.colors.primary};
144
+ }
145
+ `
146
+
147
+ export const AllSetting = styled.div`
148
+ user-select: none;
149
+ cursor: pointer;
150
+ margin-top: 36px;
151
+ cursor: pointer;
152
+ span {
153
+ font-weight: 600;
154
+ font-size: 14px;
155
+ color: ${props => props.theme.colors.primary};
156
+ }
157
+ svg {
158
+ color: ${props => props.theme.colors.primary};
159
+ margin-left: 5px;
160
+ transition: 0.2s linear;
161
+ ${props => props.theme.rtl && css`
162
+ margin-right: 5px;
163
+ margin-left: 0px;
164
+ `}
165
+ }
166
+ &:hover {
167
+ svg {
168
+ transform: translateX(3px);
169
+ }
170
+ }
171
+ `
172
+
173
+ export const Description = styled.p`
174
+ margin-top: 40px;
175
+ font-size: 14px;
176
+ margin-bottom: 0px;
177
+ text-align: justify;
178
+
179
+ @media (min-width: 768px) {
180
+ text-align: initial;
181
+ }
182
+ `
183
+
184
+ export const CategoryExtraContent = styled.div`
185
+ position: relative;
186
+ padding: 26px 26px 60px 26px;
187
+ box-sizing: border-box;
188
+ width: 100%;
189
+ overflow: auto;
190
+
191
+ ${props => props.theme?.rtl ? css`
192
+ border-right: 1px solid #E9ECEF;
193
+ ` : css`
194
+ border-left: 1px solid #E9ECEF;
195
+ `}
196
+
197
+ > button {
198
+ z-index: 100;
199
+ position: absolute;
200
+ top: 25px;
201
+ ${props => props.theme?.rtl ? css`
202
+ left: 20px;
203
+ ` : css`
204
+ right: 20px;
205
+ `}
206
+ }
207
+ `
208
+
209
+ export const Container = styled.div`
210
+ display: flex;
211
+ width: 0;
212
+ position: fixed;
213
+ box-shadow: -4px 0px 7px #ccc;
214
+
215
+ ${({ isDriverOrders }) => isDriverOrders && css`
216
+ position: absolute;
217
+ box-shadow: none;
218
+
219
+ ${props => props.theme?.rtl ? css`
220
+ border-right: 1px solid #CCC;
221
+ ` : css`
222
+ border-left: 1px solid #CCC;
223
+ `}
224
+ `}
225
+ background: ${props => props.theme.colors?.backgroundPage || '#FFF'};
226
+ height: calc(var(--vh, 1vh) * 100);
227
+ top: 0px;
228
+ z-index: 1001;
229
+ overflow-x: hidden;
230
+ transition: 0.3s;
231
+
232
+ ${props => props.theme?.rtl ? css`
233
+ left: 0px;
234
+ ` : css`
235
+ right: 0px;
236
+ `}
237
+ @media print {
238
+ box-shadow: none;
239
+ }
240
+ `
241
+
242
+ export const DescriptionHeader = styled.div`
243
+ display: flex;
244
+ justify-content: flex-end;
245
+ align-items: center;
246
+ `
247
+
248
+ export const HeaderIcons = styled.div`
249
+ display: flex;
250
+ position: absolute;
251
+ top: 25px;
252
+ right: 20px;
253
+
254
+ > button:first-child {
255
+ ${props => props.theme?.rtl ? css`
256
+ margin-left: 8px;
257
+ ` : css`
258
+ margin-right: 8px;
259
+ `}
260
+ }
261
+ `
262
+
263
+ export const SettingListConatiner = styled.div`
264
+ width: 100%;
265
+ margin: 20px 0;
266
+ border-bottom: 1px solid #E9ECEF;
267
+ `
268
+
269
+ export const Tab = styled.div`
270
+ user-select: none;
271
+ padding: 10px 0px;
272
+ cursor: pointer;
273
+ color: ${props => props.theme.colors?.headingColor};
274
+ font-size: 14px;
275
+ white-space: nowrap;
276
+ ${props => props.theme?.rtl ? css`
277
+ margin-left: 30px;
278
+ ` : css`
279
+ margin-right: 30px;
280
+ `}
281
+
282
+ ${({ active }) => active && css`
283
+ border-bottom: 2px solid;
284
+ font-weight: 500;
285
+ `}
286
+
287
+ ${({ active }) => !active && css`
288
+ color: #909BA9;
289
+ `}
290
+ `
291
+
292
+ export const Paragraph = styled.div`
293
+ margin-top: 20px;
294
+ h2{
295
+ font-size: 16px;
296
+ }
297
+ p{
298
+ white-space: pre-line;
299
+ font-size: 12px;
300
+ margin: 0;
301
+ }
302
+ span {
303
+ font-size: 12px;
304
+ }
305
+ a {
306
+ text-decoration: underline !important;
307
+ cursor: pointer;
308
+ font-size: 12px;
309
+ color: ${props => props.theme.colors.primary} !important;
310
+ }
311
+ .bold {
312
+ font-weight: 600;
313
+ }
314
+ `
315
+
316
+ export const PurchaseWrapper = styled.div`
317
+ button {
318
+ border-radius: 5px;
319
+ }
320
+ margin-top: 15px;
321
+ `
@@ -8,6 +8,7 @@ import { SideBar } from '../../Shared'
8
8
  import { PluginList } from '../PluginList'
9
9
  import { WebhookList } from '../WebhookList'
10
10
  import { ApiKeysList } from '../ApiKeysList'
11
+ import { DoordashConnect } from '../DoordashConnect'
11
12
 
12
13
  import {
13
14
  IntegrationsContainer,
@@ -17,11 +18,14 @@ import {
17
18
  IconWrapper,
18
19
  SettingItemContent
19
20
  } from './styles'
21
+ import { useTheme } from 'styled-components'
22
+ import { LalaMoveConnect } from '../LalaMoveConnect'
20
23
 
21
24
  export const IntegrationListing = (props) => {
22
25
  const [, t] = useLanguage()
23
26
  const { search } = useLocation()
24
27
  const [events] = useEvent()
28
+ const theme = useTheme()
25
29
  const [{ isCollapse }, { handleMenuCollapse }] = useInfoShare()
26
30
  const [showOption, setShowOption] = useState(null)
27
31
 
@@ -112,6 +116,28 @@ export const IntegrationListing = (props) => {
112
116
  <p>{t('APIKEYS_DESCRIPTION', 'These keys serve to obtain a direct connection to the API without the need for authentication.')}</p>
113
117
  </SettingItemContent>
114
118
  </SettingItemContainer>
119
+ <SettingItemContainer
120
+ onClick={() => handleOpenSetting('doordash')}
121
+ >
122
+ <IconWrapper>
123
+ <img src={theme.images.general.doordash} />
124
+ </IconWrapper>
125
+ <SettingItemContent>
126
+ <h5>{t('CONNECT_WITH_DOORDASH', 'Connect with Doordash')}</h5>
127
+ <p>{t('CONNECT_DOORDASH_DESCRIPTION', 'Send orders directly to your driver in Doordash and keep customers happy with their deliveries.')}</p>
128
+ </SettingItemContent>
129
+ </SettingItemContainer>
130
+ <SettingItemContainer
131
+ onClick={() => handleOpenSetting('lalamove')}
132
+ >
133
+ <IconWrapper>
134
+ <img src={theme.images.general.lalamove} />
135
+ </IconWrapper>
136
+ <SettingItemContent>
137
+ <h5>{t('CONNECT_WITH_LALAMOVE', 'Connect with lalamove')}</h5>
138
+ <p>{t('CONNECT_LALAMOVE_DESCRIPTION', 'Send orders directly to your drivers in LalaMove and keep customers happy with their deliveries.')}</p>
139
+ </SettingItemContent>
140
+ </SettingItemContainer>
115
141
  </SettingListContainer>
116
142
  </IntegrationsContainer>
117
143
 
@@ -147,6 +173,18 @@ export const IntegrationListing = (props) => {
147
173
  <ApiKeysList />
148
174
  </SideBar>
149
175
  )}
176
+
177
+ {showOption === 'doordash' && (
178
+ <DoordashConnect
179
+ onClose={() => handleCloseSettings()}
180
+ />
181
+ )}
182
+
183
+ {showOption === 'lalamove' && (
184
+ <LalaMoveConnect
185
+ onClose={() => handleCloseSettings()}
186
+ />
187
+ )}
150
188
  </>
151
189
  )
152
190
  }
@@ -82,6 +82,10 @@ export const IconWrapper = styled.div`
82
82
  font-size: 24px;
83
83
  color: ${props => props.theme.colors.secundaryLight};
84
84
  }
85
+ img{
86
+ width: 100%;
87
+ height: 100%;
88
+ }
85
89
  `
86
90
 
87
91
  export const SettingItemContent = styled.div`
@@ -0,0 +1,222 @@
1
+ import React, { useState, useEffect } from 'react'
2
+ import { useLanguage, ApiKeysList as ApiKeysListController } from 'ordering-components-admin-external'
3
+ import { Button, IconButton } from '../../../styles'
4
+ import { Alert, Confirm, DragScroll, Modal } from '../../Shared'
5
+ import BsArrowRight from '@meronex/icons/bs/BsArrowRight'
6
+ import { XLg } from 'react-bootstrap-icons'
7
+ import { useWindowSize } from '../../../hooks/useWindowSize'
8
+
9
+ import {
10
+ Header,
11
+ AllSetting,
12
+ Description,
13
+ CategoryExtraContent,
14
+ Container,
15
+ DescriptionHeader,
16
+ HeaderIcons,
17
+ LalaMoveConnectContainer,
18
+ SettingListConatiner,
19
+ Tab,
20
+ Paragraph,
21
+ PurchaseWrapper
22
+ } from './styles'
23
+
24
+ const LalaMoveConnectUI = (props) => {
25
+ const {
26
+ actionState,
27
+ onClose
28
+ } = props
29
+
30
+ const [, t] = useLanguage()
31
+ const { width } = useWindowSize()
32
+
33
+ const [alertState, setAlertState] = useState({ open: false, content: [] })
34
+ const [confirm, setConfirm] = useState({ open: false, content: null, handleOnAccept: null })
35
+ const [settingsOpen, setSettingsOpen] = useState(false)
36
+
37
+ const toggleMainContent = () => {
38
+ if (width <= 500) {
39
+ document.getElementById('catDescription').style.width = '100vw'
40
+ } else {
41
+ if ((settingsOpen) && width >= 1000) {
42
+ document.getElementById('catDescription').style.width = '1000px'
43
+ } else {
44
+ document.getElementById('catDescription').style.width = '500px'
45
+ }
46
+ }
47
+ }
48
+
49
+ const handleGoToLink = (link) => {
50
+ window.open(link, '_blank')
51
+ }
52
+
53
+ useEffect(() => {
54
+ if (!actionState?.error) return
55
+ setAlertState({
56
+ open: true,
57
+ content: actionState?.error
58
+ })
59
+ }, [actionState?.error])
60
+
61
+ useEffect(() => {
62
+ if (width < 1000) return
63
+ if (settingsOpen) {
64
+ document.getElementById('catDescription').style.width = '1000px'
65
+ } else {
66
+ toggleMainContent()
67
+ }
68
+ }, [settingsOpen])
69
+
70
+ useEffect(() => {
71
+ toggleMainContent()
72
+ }, [width])
73
+
74
+ const LalaMoveConnectDescription = () => {
75
+ return (
76
+ <CategoryExtraContent>
77
+ <IconButton
78
+ color='black'
79
+ onClick={() => setSettingsOpen(false)}
80
+ >
81
+ <XLg />
82
+ </IconButton>
83
+ <div>
84
+ <Header>
85
+ <h1>{t('MORE_INFO', 'More Info')}</h1>
86
+ </Header>
87
+ <SettingListConatiner>
88
+ <DragScroll>
89
+ <Tab
90
+ active
91
+ >
92
+ {t('GENERAL', 'General')}
93
+ </Tab>
94
+ </DragScroll>
95
+ </SettingListConatiner>
96
+ <Paragraph>
97
+ <h2>{t('REQUIREMENTS', 'Requirements')}</h2>
98
+ <p>
99
+ {t('LALAMOVE_CONNECT_REQUIREMENTS',
100
+ 'For this integration to work you need: \n' +
101
+ '1.- LalaMove account. \n' +
102
+ '2.- The advanced logistics module must be active. \n' +
103
+ '3.- Package of Ordering.'
104
+ )}
105
+ </p>
106
+ </Paragraph>
107
+ <Paragraph>
108
+ <h2>{t('ARTICLE', 'Article')}</h2>
109
+ <p>
110
+ {t('LALAMOVE_CONNECT_ARTICLE', 'To connect with LalaMove, you’ll have to use plugins, put in your LalaMove credentials, connect your LalaMove account, and create a driver company inside this dashboard; follow the next article step by step and get this connected in less than 5 minutes.')}
111
+ </p>
112
+ <a onClick={() => handleGoToLink(t('LALAMOVE_CONNECT_ARTICLE_LINK', 'https://support.ordering.co/hc/en-us/articles/10673894748941'))}>
113
+ {t('VIEW_ARTICLE', 'View Article')}
114
+ </a>
115
+ </Paragraph>
116
+ <Paragraph>
117
+ <h2>{t('SUPPORT', 'Support')}</h2>
118
+ <p>
119
+ {t('LALAMOVE_CONNECT_SUPPORT', 'Are you having trouble connecting this?')}
120
+ </p>
121
+ <p>
122
+ <a onClick={() => handleGoToLink(t('LALAMOVE_CONNECT_SUPPORT_LINK', 'https://www.ordering.co/contact-ordering'))}>{t('CONTACT_US', 'Contact us')}</a>; <span>{t('WE_ARE_HAPPY_TO_HELP', 'we are happy to help.')}</span>
123
+ </p>
124
+ </Paragraph>
125
+ <Paragraph>
126
+ <h2>{t('PRICE_INSTALATION', 'Price and installation time.')}</h2>
127
+ <p>
128
+ <span className='bold'>{t('DOORDASH_CONNECT_PRICE', '$99 monthly')}</span> | {t('DOORDASH_CONNECT_INSTALLATION', 'less than 24 hrs to get it installed in your project.')}
129
+ </p>
130
+ </Paragraph>
131
+ <PurchaseWrapper>
132
+ <Button
133
+ outline
134
+ color='primary'
135
+ onClick={() => handleGoToLink(t('PURCHASE_INTEGRATION_LINK', 'https://www.ordering.co/ordering-sales'))}
136
+ >
137
+ {t('PURCHASE_INTEGRATION', 'Purchase Integration')}
138
+ </Button>
139
+ </PurchaseWrapper>
140
+ </div>
141
+ </CategoryExtraContent>
142
+ )
143
+ }
144
+
145
+ return (
146
+ <Container
147
+ id='catDescription'
148
+ >
149
+ <LalaMoveConnectContainer>
150
+ <DescriptionHeader>
151
+ <HeaderIcons>
152
+ <IconButton
153
+ color='black'
154
+ onClick={onClose}
155
+ >
156
+ <XLg />
157
+ </IconButton>
158
+ </HeaderIcons>
159
+ </DescriptionHeader>
160
+ <Header>
161
+ <h1>{t('CONNECT_WITH_LALAMOVE', 'Connect with Lalamove')}</h1>
162
+ <Button color='lightPrimary'>{t('NEW', 'New')}</Button>
163
+ </Header>
164
+ <Description>
165
+ {t('CONNECT_WITH_LALAMOVE_DESCRIPTION', 'If you have already worked with LalaMove or are running your business with LalaMove and Ordering simultaneously, this integration will help you connect both platforms and assign orders through them, making your job easy and automated.')}
166
+ </Description>
167
+ <AllSetting onClick={() => setSettingsOpen(true)}>
168
+ <span>{t('SETTINGS', 'All settings')}</span>
169
+ <BsArrowRight />
170
+ </AllSetting>
171
+ </LalaMoveConnectContainer>
172
+ {settingsOpen && (
173
+ <>
174
+ {width >= 1000 ? (
175
+ <LalaMoveConnectDescription />
176
+ ) : (
177
+ <>
178
+ <Modal
179
+ width='70%'
180
+ height='90vh'
181
+ open
182
+ padding='0px'
183
+ onClose={() => setSettingsOpen(false)}
184
+ hideCloseDefault
185
+ >
186
+ <LalaMoveConnectDescription />
187
+ </Modal>
188
+ </>
189
+ )}
190
+ </>
191
+ )}
192
+ <Alert
193
+ title={t('WEB_APPNAME', 'Ordering')}
194
+ content={alertState.content}
195
+ acceptText={t('ACCEPT', 'Accept')}
196
+ open={alertState.open}
197
+ onClose={() => setAlertState({ open: false, content: [] })}
198
+ onAccept={() => setAlertState({ open: false, content: [] })}
199
+ closeOnBackdrop={false}
200
+ />
201
+ <Confirm
202
+ title={t('WEB_APPNAME', 'Ordering')}
203
+ content={confirm.content}
204
+ acceptText={t('ACCEPT', 'Accept')}
205
+ open={confirm.open}
206
+ onClose={() => setConfirm({ ...confirm, open: false })}
207
+ onCancel={() => setConfirm({ ...confirm, open: false })}
208
+ onAccept={confirm.handleOnAccept}
209
+ closeOnBackdrop={false}
210
+ />
211
+ </Container>
212
+ )
213
+ }
214
+
215
+ export const LalaMoveConnect = (props) => {
216
+ const apiKeysProps = {
217
+ ...props,
218
+ UIComponent: LalaMoveConnectUI
219
+ }
220
+
221
+ return <ApiKeysListController {...apiKeysProps} />
222
+ }