ordering-ui-react-native 0.12.33 → 0.12.37

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 (30) hide show
  1. package/package.json +1 -1
  2. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +6 -5
  3. package/themes/business/src/components/OrderDetails/Business.tsx +2 -4
  4. package/themes/business/src/components/OrderDetails/Delivery.tsx +231 -202
  5. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +344 -334
  6. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +83 -69
  7. package/themes/business/src/components/OrdersOption/index.tsx +122 -77
  8. package/themes/business/src/components/PreviousOrders/index.tsx +124 -73
  9. package/themes/business/src/components/PreviousOrders/styles.tsx +7 -0
  10. package/themes/business/src/components/ProductItemAccordion/index.tsx +26 -25
  11. package/themes/business/src/components/shared/OIcon.tsx +2 -0
  12. package/themes/business/src/types/index.tsx +5 -0
  13. package/themes/single-business/src/components/BusinessBasicInformation/index.tsx +1 -1
  14. package/themes/single-business/src/components/BusinessProductsListing/index.tsx +9 -8
  15. package/themes/single-business/src/components/BusinessesListing/index.tsx +307 -296
  16. package/themes/single-business/src/components/BusinessesListing/styles.tsx +41 -14
  17. package/themes/single-business/src/components/HelpAccountAndPayment/index.tsx +7 -6
  18. package/themes/single-business/src/components/HelpGuide/index.tsx +7 -6
  19. package/themes/single-business/src/components/HelpOrder/index.tsx +7 -6
  20. package/themes/single-business/src/components/LanguageSelector/index.tsx +87 -70
  21. package/themes/single-business/src/components/LoginForm/index.tsx +2 -2
  22. package/themes/single-business/src/components/OrderDetails/index.tsx +21 -21
  23. package/themes/single-business/src/components/ProductForm/index.tsx +682 -656
  24. package/themes/single-business/src/components/ProductForm/styles.tsx +1 -1
  25. package/themes/single-business/src/components/UserProfile/index.tsx +2 -2
  26. package/themes/single-business/src/components/shared/OIconButton.tsx +2 -2
  27. package/themes/single-business/src/components/shared/OInput.tsx +1 -0
  28. package/themes/single-business/src/components/shared/OLink.tsx +80 -0
  29. package/themes/single-business/src/components/shared/index.tsx +2 -0
  30. package/themes/single-business/src/types/index.tsx +3 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ordering-ui-react-native",
3
- "version": "0.12.33",
3
+ "version": "0.12.37",
4
4
  "description": "Reusable components made in react native",
5
5
  "main": "src/index.tsx",
6
6
  "author": "ordering.inc",
@@ -40,12 +40,14 @@ export const AcceptOrRejectOrder = (props: AcceptOrRejectOrderParams) => {
40
40
  const [time, setTime] = useState('');
41
41
  const [comments, setComments] = useState('');
42
42
  const [isKeyboardShow, setIsKeyboardShow] = useState(false);
43
- const phoneNumber = customerCellphone;
44
- let codeNumberPhone, numberPhone, numberToShow;
45
43
  const { top, bottom } = useSafeAreaInsets()
46
- const titleOrder = t(orderTitle[action].key, orderTitle[action].text)
47
- const buttonText = t(orderTitle[action].btnKey, orderTitle[action].btnText)
44
+
45
+ let codeNumberPhone, numberPhone, numberToShow;
46
+ const phoneNumber = customerCellphone;
47
+ const titleOrder = t(orderTitle[action]?.key, orderTitle[action]?.text)
48
+ const buttonText = t(orderTitle[action]?.btnKey, orderTitle[action]?.btnText)
48
49
  const showTextArea = ['reject', 'deliveryFailed', 'pickupFailed', 'notReady'].includes(action)
50
+
49
51
  const handleFocus = () => {
50
52
  viewRef?.current?.measure((x: any, y: any) => {
51
53
  scrollViewRef?.current?.scrollTo({ x: 0, y });
@@ -210,7 +212,6 @@ export const AcceptOrRejectOrder = (props: AcceptOrRejectOrderParams) => {
210
212
  }
211
213
 
212
214
  bodyToSend.id = orderId;
213
-
214
215
  handleUpdateOrder && handleUpdateOrder(bodyToSend.status, bodyToSend);
215
216
  };
216
217
 
@@ -48,8 +48,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
48
48
  isFromCheckout,
49
49
  driverLocation,
50
50
  actions,
51
- titleAccept,
52
- titleReject,
51
+ orderTitle,
53
52
  appTitle,
54
53
  } = props;
55
54
 
@@ -607,8 +606,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
607
606
  orderId={order?.id}
608
607
  notShowCustomerPhone={false}
609
608
  actions={actions}
610
- titleAccept={titleAccept}
611
- titleReject={titleReject}
609
+ orderTitle={orderTitle}
612
610
  appTitle={appTitle}
613
611
  />
614
612
  </OModal>
@@ -50,10 +50,11 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
50
50
  setDriverUpdateLocation,
51
51
  orderTitle,
52
52
  appTitle,
53
+ handleClickLogisticOrder
53
54
  } = props;
54
55
 
55
56
  const [, { showToast }] = useToast();
56
- const { order, loading, error } = props.order;
57
+ const { order } = props.order
57
58
  const theme = useTheme();
58
59
  const [, t] = useLanguage();
59
60
  const [session] = useSession();
@@ -71,6 +72,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
71
72
  key?: string | null;
72
73
  }>({ open: false, content: [], key: null });
73
74
 
75
+ const logisticOrderStatus = [4, 6, 7]
76
+
74
77
  const showFloatButtonsPickUp: any = {
75
78
  8: true,
76
79
  3: true,
@@ -125,6 +128,36 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
125
128
  setOpenModalForAccept(true);
126
129
  };
127
130
 
131
+ const handleCloseModal = () => {
132
+ setOpenModalForBusiness(false);
133
+ };
134
+
135
+ const handleArrowBack: any = () => {
136
+ navigation?.canGoBack() && navigation.goBack();
137
+ };
138
+
139
+ const handleRejectLogisticOrder = () => {
140
+ handleClickLogisticOrder?.(2, order?.logistic_order_id)
141
+ handleArrowBack()
142
+ }
143
+
144
+ const locations = [
145
+ {
146
+ ...order?.business?.location,
147
+ title: order?.business?.name,
148
+ icon: order?.business?.logo || theme.images.dummies.businessLogo,
149
+ type: 'Business',
150
+ },
151
+ {
152
+ ...order?.customer?.location,
153
+ title: order?.customer?.name,
154
+ icon:
155
+ order?.customer?.photo ||
156
+ 'https://res.cloudinary.com/demo/image/upload/c_thumb,g_face,r_max/d_avatar.png/non_existing_id.png',
157
+ type: 'Customer',
158
+ },
159
+ ];
160
+
128
161
  useEffect(() => {
129
162
  if (permissions.locationStatus !== 'granted' && openModalForMapView) {
130
163
  setOpenModalForMapView(false);
@@ -143,15 +176,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
143
176
  if (openModalForMapView) {
144
177
  setOpenModalForMapView(false);
145
178
  }
146
- }, [loading]);
147
-
148
- const handleCloseModal = () => {
149
- setOpenModalForBusiness(false);
150
- };
151
-
152
- const handleArrowBack: any = () => {
153
- navigation?.canGoBack() && navigation.goBack();
154
- };
179
+ }, [props.order?.loading]);
155
180
 
156
181
  useEffect(() => {
157
182
  if (order?.driver === null && session?.user?.level === 4) {
@@ -168,23 +193,6 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
168
193
  }
169
194
  }, [order?.driver]);
170
195
 
171
- const locations = [
172
- {
173
- ...order?.business?.location,
174
- title: order?.business?.name,
175
- icon: order?.business?.logo || theme.images.dummies.businessLogo,
176
- type: 'Business',
177
- },
178
- {
179
- ...order?.customer?.location,
180
- title: order?.customer?.name,
181
- icon:
182
- order?.customer?.photo ||
183
- 'https://res.cloudinary.com/demo/image/upload/c_thumb,g_face,r_max/d_avatar.png/non_existing_id.png',
184
- type: 'Customer',
185
- },
186
- ];
187
-
188
196
  useEffect(() => {
189
197
  if (driverLocation) {
190
198
  locations[0] = driverLocation;
@@ -207,7 +215,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
207
215
  },
208
216
  });
209
217
 
210
- let locationMarker;
218
+ let locationMarker: any;
211
219
  let isToFollow = false;
212
220
  let isBusinessMarker = false;
213
221
 
@@ -235,10 +243,176 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
235
243
  );
236
244
  }
237
245
 
246
+ const OrderDetailsInformation = (_order: any, isOrderGroup: boolean) => {
247
+ const { order } = _order
248
+ return (
249
+ <>
250
+ <OrderDetailsContainer
251
+ keyboardShouldPersistTaps="handled"
252
+ showsVerticalScrollIndicator={false}
253
+ >
254
+ <>
255
+ <OrderContentComponent
256
+ order={order}
257
+ logisticOrderStatus={logisticOrderStatus}
258
+ isOrderGroup={isOrderGroup}
259
+ />
260
+ {(order?.status === 8 || order?.status === 18) && order?.delivery_type === 1 && (
261
+ <Pickup>
262
+ <OButton
263
+ style={styles.btnPickUp}
264
+ textStyle={{ color: theme.colors.primary }}
265
+ text={t('ARRIVED_TO_BUSINESS', 'Arrived to bussiness')}
266
+ onClick={() =>
267
+ handleChangeOrderStatus && handleChangeOrderStatus(3)
268
+ }
269
+ imgLeftStyle={{ tintColor: theme.colors.backArrow }}
270
+ />
271
+ </Pickup>
272
+ )}
273
+ {(order?.status === 3) && order?.delivery_type === 1 && (
274
+ <View style={{ paddingVertical: 20, marginBottom: 20 }}>
275
+ <OButton
276
+ style={styles.btnPickUp}
277
+ textStyle={{ color: theme.colors.white }}
278
+ text={t('ORDER_NOT_READY', 'Order not ready')}
279
+ onClick={() =>
280
+ handleViewActionOrder && handleViewActionOrder('notReady')
281
+ }
282
+ imgLeftStyle={{ tintColor: theme.colors.backArrow }}
283
+ bgColor={theme.colors.red}
284
+ />
285
+ </View>
286
+ )}
287
+ </>
288
+
289
+ <OModal
290
+ open={openModalForBusiness}
291
+ order={order}
292
+ title={`${t('INVOICE_ORDER_NO', 'Order No.')} ${order.id}`}
293
+ entireModal
294
+ onClose={() => handleCloseModal()}>
295
+ <Chat
296
+ type={
297
+ openModalForBusiness ? USER_TYPE.BUSINESS : USER_TYPE.DRIVER
298
+ }
299
+ orderId={order?.id}
300
+ messages={messages}
301
+ order={order}
302
+ setMessages={setMessages}
303
+ />
304
+ </OModal>
305
+
306
+ <OModal
307
+ open={openModalForAccept}
308
+ onClose={() => setOpenModalForAccept(false)}
309
+ entireModal
310
+ customClose>
311
+ <AcceptOrRejectOrder
312
+ handleUpdateOrder={handleChangeOrderStatus}
313
+ closeModal={setOpenModalForAccept}
314
+ customerCellphone={order?.customer?.cellphone}
315
+ loading={props.order?.loading}
316
+ action={actionOrder}
317
+ orderId={order?.id}
318
+ notShowCustomerPhone
319
+ actions={actions}
320
+ orderTitle={orderTitle}
321
+ appTitle={appTitle}
322
+ />
323
+ </OModal>
324
+
325
+ <OModal
326
+ open={openModalForMapView}
327
+ onClose={() => handleOpenMapView()}
328
+ entireModal
329
+ customClose>
330
+ <DriverMap
331
+ navigation={navigation}
332
+ order={order}
333
+ orderStatus={getOrderStatus(order?.status, t)?.value || ''}
334
+ location={locationMarker}
335
+ readOnly
336
+ updateDriverPosition={updateDriverPosition}
337
+ driverUpdateLocation={driverUpdateLocation}
338
+ setDriverUpdateLocation={setDriverUpdateLocation}
339
+ handleViewActionOrder={handleViewActionOrder}
340
+ isBusinessMarker={isBusinessMarker}
341
+ isToFollow={isToFollow}
342
+ showAcceptOrReject={
343
+ showFloatButtonsAcceptOrReject[order?.status]
344
+ }
345
+ handleOpenMapView={handleOpenMapView}
346
+ />
347
+ </OModal>
348
+
349
+ <View
350
+ style={{
351
+ height:
352
+ order?.status === 8 && order?.delivery_type === 1 ? 50 : 35,
353
+ }}
354
+ />
355
+ </OrderDetailsContainer>
356
+
357
+ {showFloatButtonsPickUp[order?.status] && (
358
+ <FloatingButton
359
+ disabled={props.order?.loading}
360
+ btnText={t('PICKUP_FAILED', 'Pickup failed')}
361
+ isSecondaryBtn={false}
362
+ secondButtonClick={() =>
363
+ handleChangeOrderStatus && handleChangeOrderStatus(9)
364
+ }
365
+ firstButtonClick={() =>
366
+ handleViewActionOrder && handleViewActionOrder('pickupFailed')
367
+ }
368
+ secondBtnText={t('PICKUP_COMPLETE', 'Pickup complete')}
369
+ secondButton={true}
370
+ firstColorCustom={theme.colors.red}
371
+ secondColorCustom={theme.colors.green}
372
+ widthButton={'45%'}
373
+ />
374
+ )}
375
+ {(order?.status === 9 || order?.status === 19) && (
376
+ <>
377
+ <FloatingButton
378
+ disabled={props.order?.loading}
379
+ btnText={t('DELIVERY_FAILED', 'Delivery Failed')}
380
+ isSecondaryBtn={false}
381
+ secondButtonClick={() =>
382
+ handleChangeOrderStatus && handleChangeOrderStatus(11)
383
+ }
384
+ firstButtonClick={() =>
385
+ handleViewActionOrder && handleViewActionOrder('deliveryFailed')
386
+ }
387
+ secondBtnText={t('DELIVERY_COMPLETE', 'Delivery complete')}
388
+ secondButton={true}
389
+ firstColorCustom={theme.colors.red}
390
+ secondColorCustom={theme.colors.green}
391
+ widthButton={'45%'}
392
+ />
393
+ </>
394
+ )}
395
+ {showFloatButtonsAcceptOrReject[order?.status] && (
396
+ <FloatingButton
397
+ btnText={t('REJECT', 'Reject')}
398
+ isSecondaryBtn={false}
399
+ secondButtonClick={() => order?.isLogistic && logisticOrderStatus.includes(order?.status) ? handleClickLogisticOrder?.(1, order?.logistic_order_id) : handleViewActionOrder('accept')}
400
+ firstButtonClick={() => order?.isLogistic && logisticOrderStatus.includes(order?.status) ? handleRejectLogisticOrder() : handleViewActionOrder('reject')}
401
+ secondBtnText={t('ACCEPT', 'Accept')}
402
+ secondButton={true}
403
+ firstColorCustom={theme.colors.red}
404
+ secondColorCustom={theme.colors.green}
405
+ widthButton={'45%'}
406
+ />
407
+ )}
408
+ </>
409
+ )
410
+ }
411
+
238
412
  return (
239
413
  <>
240
414
  {(!order || Object.keys(order).length === 0) &&
241
- (error?.length < 1 || !error) && (
415
+ (props.order?.error?.length < 1 || !props.order?.error) && (
242
416
  <View style={{ flex: 1 }}>
243
417
  {[...Array(6)].map((item, i) => (
244
418
  <Placeholder key={i} Animation={Fade}>
@@ -255,7 +429,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
255
429
  </View>
256
430
  )}
257
431
 
258
- {(!!error || error) && (
432
+ {(!!props.order?.error || props.order?.error) && (
259
433
  <NotFoundSource
260
434
  btnTitle={t('GO_TO_MY_ORDERS', 'Go to my orders')}
261
435
  content={
@@ -266,178 +440,33 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
266
440
  onClickButton={() => navigation.navigate('Orders')}
267
441
  />
268
442
  )}
269
- {order && Object.keys(order).length > 0 && (error?.length < 1 || !error) && (
270
- <View style={{ flex: 1 }}>
271
- <OrderHeaderComponent
272
- order={order}
273
- handleOpenMapView={handleOpenMapView}
274
- handleOpenMessagesForBusiness={handleOpenMessagesForBusiness}
275
- getOrderStatus={getOrderStatus}
276
- handleArrowBack={handleArrowBack}
277
- />
278
- <OrderDetailsContainer
279
- keyboardShouldPersistTaps="handled"
280
- showsVerticalScrollIndicator={false}
281
- >
282
- <>
283
- <OrderContentComponent order={order} />
284
- {(order?.status === 8 || order?.status === 18) && order?.delivery_type === 1 && (
285
- <Pickup>
286
- <OButton
287
- style={styles.btnPickUp}
288
- textStyle={{ color: theme.colors.primary }}
289
- text={t('ARRIVED_TO_BUSINESS', 'Arrived to bussiness')}
290
- onClick={() =>
291
- handleChangeOrderStatus && handleChangeOrderStatus(3)
292
- }
293
- imgLeftStyle={{ tintColor: theme.colors.backArrow }}
294
- />
295
- </Pickup>
296
- )}
297
- {(order?.status === 3) && order?.delivery_type === 1 && (
298
- <View style={{ paddingVertical: 20, marginBottom: 20 }}>
299
- <OButton
300
- style={styles.btnPickUp}
301
- textStyle={{ color: theme.colors.white }}
302
- text={t('ORDER_NOT_READY', 'Order not ready')}
303
- onClick={() =>
304
- handleViewActionOrder && handleViewActionOrder('notReady')
305
- }
306
- imgLeftStyle={{ tintColor: theme.colors.backArrow }}
307
- bgColor={theme.colors.red}
308
- />
309
- </View>
310
- )}
311
- </>
312
-
313
- <OModal
314
- open={openModalForBusiness}
315
- order={order}
316
- title={`${t('INVOICE_ORDER_NO', 'Order No.')} ${order.id}`}
317
- entireModal
318
- onClose={() => handleCloseModal()}>
319
- <Chat
320
- type={
321
- openModalForBusiness ? USER_TYPE.BUSINESS : USER_TYPE.DRIVER
322
- }
323
- orderId={order?.id}
324
- messages={messages}
325
- order={order}
326
- setMessages={setMessages}
327
- />
328
- </OModal>
329
-
330
- <OModal
331
- open={openModalForAccept}
332
- onClose={() => setOpenModalForAccept(false)}
333
- entireModal
334
- customClose>
335
- <AcceptOrRejectOrder
336
- handleUpdateOrder={handleChangeOrderStatus}
337
- closeModal={setOpenModalForAccept}
338
- customerCellphone={order?.customer?.cellphone}
339
- loading={loading}
340
- action={actionOrder}
341
- orderId={order?.id}
342
- notShowCustomerPhone
343
- actions={actions}
344
- orderTitle={orderTitle}
345
- appTitle={appTitle}
346
- />
347
- </OModal>
348
-
349
- <OModal
350
- open={openModalForMapView}
351
- onClose={() => handleOpenMapView()}
352
- entireModal
353
- customClose>
354
- <DriverMap
355
- navigation={navigation}
356
- order={order}
357
- orderStatus={getOrderStatus(order?.status, t)?.value || ''}
358
- location={locationMarker}
359
- readOnly
360
- updateDriverPosition={updateDriverPosition}
361
- driverUpdateLocation={driverUpdateLocation}
362
- setDriverUpdateLocation={setDriverUpdateLocation}
363
- handleViewActionOrder={handleViewActionOrder}
364
- isBusinessMarker={isBusinessMarker}
365
- isToFollow={isToFollow}
366
- showAcceptOrReject={
367
- showFloatButtonsAcceptOrReject[order?.status]
368
- }
369
- handleOpenMapView={handleOpenMapView}
370
- />
371
- </OModal>
372
-
373
- <View
374
- style={{
375
- height:
376
- order?.status === 8 && order?.delivery_type === 1 ? 50 : 35,
377
- }}
378
- />
379
- </OrderDetailsContainer>
380
-
381
- {showFloatButtonsPickUp[order?.status] && (
382
- <FloatingButton
383
- disabled={loading}
384
- btnText={t('PICKUP_FAILED', 'Pickup failed')}
385
- isSecondaryBtn={false}
386
- secondButtonClick={() =>
387
- handleChangeOrderStatus && handleChangeOrderStatus(9)
388
- }
389
- firstButtonClick={() =>
390
- handleViewActionOrder && handleViewActionOrder('pickupFailed')
391
- }
392
- secondBtnText={t('PICKUP_COMPLETE', 'Pickup complete')}
393
- secondButton={true}
394
- firstColorCustom={theme.colors.red}
395
- secondColorCustom={theme.colors.green}
396
- widthButton={'45%'}
397
- />
398
- )}
399
- {(order?.status === 9 || order?.status === 19) && (
400
- <>
401
- <FloatingButton
402
- disabled={loading}
403
- btnText={t('DELIVERY_FAILED', 'Delivery Failed')}
404
- isSecondaryBtn={false}
405
- secondButtonClick={() =>
406
- handleChangeOrderStatus && handleChangeOrderStatus(11)
407
- }
408
- firstButtonClick={() =>
409
- handleViewActionOrder && handleViewActionOrder('deliveryFailed')
410
- }
411
- secondBtnText={t('DELIVERY_COMPLETE', 'Delivery complete')}
412
- secondButton={true}
413
- firstColorCustom={theme.colors.red}
414
- secondColorCustom={theme.colors.green}
415
- widthButton={'45%'}
416
- />
417
- </>
418
- )}
419
- {showFloatButtonsAcceptOrReject[order?.status] && (
420
- <FloatingButton
421
- btnText={t('REJECT', 'Reject')}
422
- isSecondaryBtn={false}
423
- secondButtonClick={() => handleViewActionOrder('accept')}
424
- firstButtonClick={() => handleViewActionOrder('reject')}
425
- secondBtnText={t('ACCEPT', 'Accept')}
426
- secondButton={true}
427
- firstColorCustom={theme.colors.red}
428
- secondColorCustom={theme.colors.green}
429
- widthButton={'45%'}
430
- />
431
- )}
432
-
433
- <Alert
434
- open={alertState.open}
435
- onAccept={handleArrowBack}
436
- onClose={handleArrowBack}
437
- content={alertState.content}
438
- title={t('WARNING', 'Warning')}
439
- />
440
- </View>
443
+ <View style={{ flex: 1 }}>
444
+ <OrderHeaderComponent
445
+ order={order}
446
+ handleOpenMapView={handleOpenMapView}
447
+ handleOpenMessagesForBusiness={handleOpenMessagesForBusiness}
448
+ getOrderStatus={getOrderStatus}
449
+ handleArrowBack={handleArrowBack}
450
+ logisticOrderStatus={logisticOrderStatus}
451
+ />
452
+ {order && Object.keys(order).length > 0 && (props.order?.error?.length < 1 || !props.order?.error) && (
453
+ <>
454
+ {order?.order_group && order?.order_group_id ? order?.order_group?.orders.map((order: any) => (
455
+ <OrderDetailsInformation order={order} />
456
+ )) : (
457
+ <OrderDetailsInformation order={order} />
458
+ )}
459
+ </>
460
+ )}
461
+ </View>
462
+ {alertState?.open && (
463
+ <Alert
464
+ open={alertState.open}
465
+ onAccept={handleArrowBack}
466
+ onClose={handleArrowBack}
467
+ content={alertState.content}
468
+ title={t('WARNING', 'Warning')}
469
+ />
441
470
  )}
442
471
  </>
443
472
  );