ordering-ui-react-native 0.23.0 → 0.23.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ordering-ui-react-native",
3
- "version": "0.23.0",
3
+ "version": "0.23.2",
4
4
  "description": "Reusable components made in react native",
5
5
  "main": "src/index.tsx",
6
6
  "author": "ordering.inc",
@@ -577,12 +577,12 @@ export const OrderContentComponent = (props: OrderContent) => {
577
577
  order?.taxes?.length > 0 && order?.taxes?.filter((tax: any) => tax?.type === 2 && tax?.rate !== 0 && tax?.target === 'delivery_fee').map((tax: any, i: number) => (
578
578
  <Table key={`${tax.description}_${i}`}>
579
579
  <OSRow>
580
- <OText size={12} lineHeight={18} numberOfLines={1}>
580
+ <OText mBottom={4}>
581
581
  {tax.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}
582
582
  {`(${verifyDecimals(tax?.rate, parseNumber)}%)`}
583
583
  </OText>
584
584
  </OSRow>
585
- <OText size={12} lineHeight={18}>{parsePrice(tax?.summary?.tax_after_discount ?? tax?.summary?.tax ?? 0)}</OText>
585
+ <OText mBottom={4}>{parsePrice(tax?.summary?.tax_after_discount ?? tax?.summary?.tax ?? 0)}</OText>
586
586
  </Table>
587
587
  ))
588
588
  }
@@ -0,0 +1,33 @@
1
+ import React, { useEffect, useState } from 'react'
2
+ import { useTheme } from 'styled-components/native'
3
+ import { OText } from '../shared'
4
+
5
+ export const MessageAlert = ({ message, resetMsg }: any) => {
6
+ const theme = useTheme()
7
+
8
+ const [text, setText] = useState(message)
9
+
10
+ useEffect(() => {
11
+ setText(message)
12
+ }, [message])
13
+
14
+ useEffect(() => {
15
+ if (text) {
16
+ setTimeout(() => {
17
+ setText(null)
18
+ resetMsg()
19
+ }, 2000);
20
+ }
21
+ }, [text])
22
+
23
+ return (
24
+ text ? (
25
+ <OText
26
+ size={14}
27
+ color={theme.colors.danger500}
28
+ >
29
+ {text}
30
+ </OText>
31
+ ) : null
32
+ )
33
+ }
@@ -1,5 +1,6 @@
1
1
  import React, { useEffect, useState } from 'react'
2
- import { Dimensions, SafeAreaView, StyleSheet, View } from 'react-native';
2
+ import { StarPRNT } from 'react-native-star-prnt';
3
+ import { ActivityIndicator, Dimensions, SafeAreaView, StyleSheet, View } from 'react-native';
3
4
  import SelectDropdown from 'react-native-select-dropdown'
4
5
  import { useLanguage } from 'ordering-components/native'
5
6
  import { useTheme } from 'styled-components/native'
@@ -20,47 +21,36 @@ import {
20
21
  import { Container } from '../../layouts/Container'
21
22
  import { OText, OInput, OIcon, OButton } from '../shared'
22
23
 
23
- const printerList = [
24
- { nickname: 'mPOP', model: 'mPOP', emulation: 'StarPRNT', portName1: 'BT:mPOP', type: 1, ip: '', printMode: 'append' },
25
- { nickname: 'FVP10', model: 'FVP10', emulation: 'StarLine', portName1: 'BT:FVP10', type: 1, ip: '', printMode: 'append' },
26
- { nickname: 'TSP100', model: 'TSP100', emulation: 'StarGraphic', portName1: 'BT:TSP100', type: 1, ip: '', printMode: 'appendBitmapText' },
27
- { nickname: 'TSP100IV', model: 'TSP100IV', emulation: 'StarLine', portName1: 'BT:TSP100iv', type: 1, ip: '', printMode: 'append' },
28
- { nickname: 'TSP65011', model: 'TSP65011', emulation: 'StarLine', portName1: 'BT:TSP65011', type: 1, ip: '', printMode: 'append' },
29
- { nickname: 'TSP7001', model: 'TSP7001', emulation: 'StarLine', portName1: 'BT:TSP7001', type: 1, ip: '', printMode: 'append' },
30
- { nickname: 'TSP80011', model: 'TSP80011', emulation: 'StarLine', portName1: 'BT:TSP80011', type: 1, ip: '', printMode: 'append' },
31
- { nickname: 'SP700', model: 'SP700', emulation: 'StarDotImpact', portName1: 'BT:SP700', type: 1, ip: '', printMode: 'append' },
32
- { nickname: 'SM-S210i', model: 'SM-S210i', emulation: 'EscPosMobile', portName1: 'BT:SMS210i', type: 1, ip: '', printMode: 'append' },
33
- { nickname: 'SM-S220i', model: 'SM-S220i', emulation: 'EscPosMobile', portName1: 'BT:SMS220i', type: 1, ip: '', printMode: 'append' },
34
- { nickname: 'SM-S230i', model: 'SM-S230i', emulation: 'EscosMobile', portName1: 'BT:SMS230i', type: 1, ip: '', printMode: 'append' },
35
- { nickname: 'SM-T300i/T300', model: 'SM-T300i/T300', emulation: 'EscPosMobile', portName1: 'BT:SMT300i/T300', type: 1, ip: '', printMode: 'append' },
36
- { nickname: 'SM-T400i', model: 'SM-T400i', emulation: 'EscosMobile', portName1: 'BT:SMT400i', type: 1, ip: '', printMode: 'append' },
37
- { nickname: 'SM-L200', model: 'SM-L200', emulation: 'StarPRNT', portName1: 'BT:SML200', type: 1, ip: '', printMode: 'append' },
38
- { nickname: 'SM-L300', model: 'SM-L300', emulation: 'StarPRNT', portName1: 'BT:SML300', type: 1, ip: '', printMode: 'append' },
39
- { nickname: 'BSC10', model: 'BSC10', emulation: 'EscPos', portName1: 'BT:BSC10', type: 1, ip: '', printMode: 'append' },
40
- { nickname: 'SM-S210i StarPRNT', model: 'SM-S210i StarPRNT', emulation: 'StarPRNT', portName1: 'BT:SMS210i', type: 1, ip: '', printMode: 'append' },
41
- { nickname: 'SM-S220i StarPRNT', model: 'SM-S220i StarPRNT', emulation: 'StarPRNT', portName1: 'BT:SMS220i', type: 1, ip: '', printMode: 'append' },
42
- { nickname: 'SM-S230i StarPRNT', model: 'SM-S230i StarPRNT', emulation: 'StarPRNT', portName1: 'BT:SMS230i', type: 1, ip: '', printMode: 'append' },
43
- { nickname: 'SM-T300i/T300 StarPRNT', model: 'SM-T300i/T300 StarPRNT', emulation: 'StarPRNT', portName1: 'BT:SMT300i', type: 1, ip: '', printMode: 'append' },
44
- { nickname: 'SM-T400i StarPRNT', model: 'SM-T400i StarPRNT', emulation: 'StarPRNT', portName1: 'BT:SMT400i', type: 1, ip: '', printMode: 'append' },
45
- ]
24
+ import { PRINTERS } from './printerList'
25
+ import { MessageAlert } from './MessageAlert'
26
+
27
+ const printerList = PRINTERS.map(printer => ({
28
+ ...printer,
29
+ ip: '',
30
+ type: 1,
31
+ nickname: printer.model,
32
+ portName1: `BT:${printer.model.split(' ')[0]}`,
33
+ bt: `BT:${printer.model.split(' ')[0]}`
34
+ }))
46
35
 
47
36
  export const PrinterEdition = (props: any) => {
48
- const {
49
- printer,
50
- onClose
51
- } = props
37
+ const { printer, onClose } = props
52
38
 
53
39
  const HEIGHT_SCREEN = Dimensions.get('window').height
54
40
  const [, t] = useLanguage()
55
41
  const theme = useTheme()
56
- const { handleSubmit, control, setValue, watch } = useForm();
42
+ const { control, setValue, watch } = useForm()
43
+
44
+ const [currentPrinter, setCurrentPrinter] = useState(printer)
45
+ const [discoverPort, setDiscoverPort] = useState({ loading: false, msg: null })
57
46
 
58
47
  const watchIp = watch('ip')
48
+ const watchBt = watch('bt')
59
49
  const watchNickname = watch('nickname')
60
- const isErrorIp = !/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i.test(watchIp)
61
- const isErrorNickname = watchNickname && !/^[a-zA-Z0-9\s]+$/i.test(watchNickname)
62
-
63
- const [currentPrinter, setCurrentPrinter] = useState(printer)
50
+ const errorIP = !/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i.test(watchIp)
51
+ const errorBT = !/^[^\n]*$/i.test(watchBt) || !watchBt
52
+ const isErrorInput = currentPrinter?.type === 2 ? errorIP : errorBT
53
+ const isErrorNickname = watchNickname && !/^[^\n]*$/i.test(watchNickname)
64
54
 
65
55
  const styles = StyleSheet.create({
66
56
  icons: {
@@ -98,6 +88,36 @@ export const PrinterEdition = (props: any) => {
98
88
  })
99
89
  }
100
90
 
91
+ const portDiscovery = async () => {
92
+ try {
93
+ setDiscoverPort({ ...discoverPort, loading: true })
94
+ let printers = await StarPRNT.portDiscovery('Bluetooth');
95
+
96
+ if (printers?.length) {
97
+ setValue('bt', printers[0]?.portName)
98
+ setCurrentPrinter({
99
+ ...currentPrinter,
100
+ ['bt']: printers[0]?.portName
101
+ })
102
+ }
103
+ setTimeout(() => {
104
+ setDiscoverPort({
105
+ ...discoverPort,
106
+ loading: false,
107
+ msg: !printers?.length
108
+ ? t('NO_PRINTERS_FOUND', 'No printers found')
109
+ : null
110
+ })
111
+ }, 1000);
112
+ } catch (e) {
113
+ setValue('bt', currentPrinter?.portName)
114
+ setCurrentPrinter({
115
+ ...currentPrinter,
116
+ ['bt']: currentPrinter?.portName
117
+ })
118
+ }
119
+ }
120
+
101
121
  const onSubmit = () => {
102
122
  handleChangePrinter({ edit: !!printer, isAdd: !printer })
103
123
  onClose && onClose()
@@ -105,6 +125,7 @@ export const PrinterEdition = (props: any) => {
105
125
 
106
126
  useEffect(() => {
107
127
  currentPrinter?.ip && setValue('ip', currentPrinter?.ip)
128
+ currentPrinter?.bt && setValue('bt', currentPrinter?.bt)
108
129
  currentPrinter?.nickname && setValue('nickname', currentPrinter?.nickname)
109
130
  }, [currentPrinter?.type])
110
131
 
@@ -281,51 +302,93 @@ export const PrinterEdition = (props: any) => {
281
302
  {t('CONNECTION_VIA_LAN', 'Via LAN')}
282
303
  </OText>
283
304
  </WrapperIcon>
284
- {currentPrinter?.type === 2 && (
285
- <>
286
- <View style={{ flexDirection: 'row' }}>
287
- <Controller
288
- control={control}
289
- name={'ip'}
290
- rules={{
291
- required: t('VALIDATION_ERROR_IP_ADDRESS_REQUIRED', 'Ip address is required'),
292
- pattern: {
293
- value: /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i,
294
- message: t('INVALID_ERROR_IP_ADDRESS', 'Invalid ip address')
295
- }
296
- }}
297
- defaultValue={currentPrinter?.ip ?? ''}
298
- render={() => (
299
- <OInput
300
- placeholder={t('IP_ADDRESS', 'Ip address')}
301
- placeholderTextColor={theme.colors.arrowColor}
302
- style={{
303
- ...styles.inputStyle,
304
- borderColor: isErrorIp ? theme.colors.danger500 : theme.colors.tabBar
305
- }}
306
- value={currentPrinter?.ip ?? ''}
307
- selectionColor={theme.colors.primary}
308
- color={theme.colors.textGray}
309
- onChange={(value: any) => {
310
- setValue('ip', value)
311
- setCurrentPrinter({
312
- ...currentPrinter,
313
- ip: value
314
- })
315
- }}
316
- />
317
- )}
318
- />
319
- </View>
305
+ <View style={{ flexDirection: 'column', marginTop: 30 }}>
306
+ {currentPrinter?.type === 1 && (
320
307
  <OText
321
308
  size={14}
322
- color={theme.colors.tabBar}
323
- style={{ paddingTop: 5, paddingLeft: 10 }}
309
+ color={theme.colors.toastInfo}
310
+ style={{ marginBottom: 10 }}
324
311
  >
325
- {`${t('EXAMPLE_SHORT', 'Ex:')} 8.8.8.8`}
312
+ {t('SEARCH_AVAILABLE_PRINTER_MESSAGE', 'Use the search icon to find an available printer')}
326
313
  </OText>
327
- </>
328
- )}
314
+ )}
315
+ <View style={{ flexDirection: 'row', alignItems: 'center' }}>
316
+ <Controller
317
+ control={control}
318
+ name={currentPrinter?.type === 2 ? 'ip' : 'bt'}
319
+ rules={{
320
+ required: currentPrinter?.type === 2
321
+ ? t('VALIDATION_ERROR_IP_ADDRESS_REQUIRED', 'Ip address is required')
322
+ : t('VALIDATION_ERROR_BLUETOOTH_PORN_REQUIRED', 'Bluetooth port name is required'),
323
+ pattern: {
324
+ value: currentPrinter?.type === 2
325
+ ? /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i
326
+ : /^[a-zA-Z0-9]+$/i,
327
+ message: currentPrinter?.type === 2
328
+ ? t('INVALID_ERROR_IP_ADDRESS', 'Invalid ip address')
329
+ : t('INVALID_ERROR_BLUETOOTH_PORT_NAME', 'Invalid bluetooth port name')
330
+ }
331
+ }}
332
+ defaultValue={currentPrinter?.type === 2 ? currentPrinter?.ip ?? '' : currentPrinter?.bt ?? ''}
333
+ render={() => (
334
+ <OInput
335
+ placeholder={currentPrinter?.type === 2
336
+ ? t('IP_ADDRESS', 'Ip address')
337
+ : t('BLUETOOTH_PORT', 'Bluetooth port')
338
+ }
339
+ placeholderTextColor={theme.colors.arrowColor}
340
+ style={{
341
+ ...styles.inputStyle,
342
+ borderColor: isErrorInput ? theme.colors.danger500 : theme.colors.tabBar
343
+ }}
344
+ value={currentPrinter?.type === 2 ? currentPrinter?.ip ?? '' : currentPrinter?.bt ?? ''}
345
+ selectionColor={theme.colors.primary}
346
+ color={theme.colors.textGray}
347
+ onChange={(value: any) => {
348
+ setValue(currentPrinter?.type === 2 ? 'ip' : 'bt', value)
349
+ setCurrentPrinter({
350
+ ...currentPrinter,
351
+ [currentPrinter?.type === 2 ? 'ip' : 'bt']: value
352
+ })
353
+ }}
354
+ />
355
+ )}
356
+ />
357
+ {currentPrinter?.type === 1 && (
358
+ <>
359
+ {!discoverPort.loading ? (
360
+ <FAIcons
361
+ name='search'
362
+ size={22}
363
+ color={theme.colors.primary}
364
+ style={{ marginLeft: 10 }}
365
+ onPress={() => portDiscovery()}
366
+ />
367
+ ) : (
368
+ <ActivityIndicator
369
+ size="small"
370
+ style={{ marginLeft: 10 }}
371
+ color={theme.colors.primary}
372
+ />
373
+ )}
374
+ </>
375
+ )}
376
+ </View>
377
+ </View>
378
+ <OText
379
+ size={14}
380
+ color={theme.colors.tabBar}
381
+ style={{ paddingTop: 5, paddingLeft: 10 }}
382
+ >
383
+ {discoverPort.msg ? (
384
+ <MessageAlert
385
+ message={discoverPort.msg}
386
+ resetMsg={() => setDiscoverPort({ ...discoverPort, msg: null })}
387
+ />
388
+ ) : (
389
+ `${t('EXAMPLE_SHORT', 'Ex:')} ${currentPrinter?.type === 2 ? '8.8.8.8' : currentPrinter?.portName1}`
390
+ )}
391
+ </OText>
329
392
  </WrapperIcons>
330
393
  )}
331
394
  </ContainerEdition>
@@ -341,6 +404,7 @@ export const PrinterEdition = (props: any) => {
341
404
  isDisabled={
342
405
  isErrorNickname ||
343
406
  !currentPrinter?.model ||
407
+ currentPrinter?.type === 1 && !currentPrinter?.bt ||
344
408
  currentPrinter?.type === 2 && !currentPrinter?.ip
345
409
  }
346
410
  onClick={() => onSubmit()}
@@ -0,0 +1,23 @@
1
+ export const PRINTERS = [
2
+ { model: 'mPOP', emulation: 'StarPRNT', printMode: 'append' },
3
+ { model: 'FVP10', emulation: 'StarLine', printMode: 'append' },
4
+ { model: 'TSP100', emulation: 'StarGraphic', printMode: 'appendBitmapText' },
5
+ { model: 'TSP100IV', emulation: 'StarLine', printMode: 'append' },
6
+ { model: 'TSP65011', emulation: 'StarLine', printMode: 'append' },
7
+ { model: 'TSP7001', emulation: 'StarLine', printMode: 'append' },
8
+ { model: 'TSP80011', emulation: 'StarLine', printMode: 'append' },
9
+ { model: 'SP700', emulation: 'StarDotImpact', printMode: 'append' },
10
+ { model: 'SM-S210i', emulation: 'EscPosMobile', printMode: 'append' },
11
+ { model: 'SM-S220i', emulation: 'EscPosMobile', printMode: 'append' },
12
+ { model: 'SM-S230i', emulation: 'EscosMobile', printMode: 'append' },
13
+ { model: 'SM-T300i/T300', emulation: 'EscPosMobile', printMode: 'append' },
14
+ { model: 'SM-T400i', emulation: 'EscosMobile', printMode: 'append' },
15
+ { model: 'SM-L200', emulation: 'StarPRNT', printMode: 'append' },
16
+ { model: 'SM-L300', emulation: 'StarPRNT', printMode: 'append' },
17
+ { model: 'BSC10', emulation: 'EscPos', bt: 'BT:BSC10', printMode: 'append' },
18
+ { model: 'SM-S210i StarPRNT', emulation: 'StarPRNT', printMode: 'append' },
19
+ { model: 'SM-S220i StarPRNT', emulation: 'StarPRNT', printMode: 'append' },
20
+ { model: 'SM-S230i StarPRNT', emulation: 'StarPRNT', printMode: 'append' },
21
+ { model: 'SM-T300i/T300 StarPRNT', emulation: 'StarPRNT', printMode: 'append' },
22
+ { model: 'SM-T400i StarPRNT', emulation: 'StarPRNT', printMode: 'append' },
23
+ ]
@@ -225,8 +225,9 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
225
225
  cartUuid: cart?.uuid,
226
226
  businessLogo: cart?.business?.logo,
227
227
  businessName: cart?.business?.name,
228
- cartTotal: cart?.total
229
- }, true)
228
+ cartTotal: cart?.total,
229
+ fromProductsList: true
230
+ })
230
231
  } else {
231
232
  const groupKeys: any = {}
232
233
  cartsAvailable.forEach((_cart: any) => {
@@ -377,7 +377,9 @@ const CheckoutUI = (props: any) => {
377
377
  }
378
378
 
379
379
  const handleRedirect = () => {
380
- props.fromProductsList ? navigation?.goBack() : onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)
380
+ props.fromProductsList
381
+ ? navigation?.goBack()
382
+ : onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)
381
383
  }
382
384
 
383
385
  useEffect(() => {