ordering-ui-admin-external 1.28.1 → 1.29.3

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 (190) hide show
  1. package/_bundles/main.css +294 -26
  2. package/_bundles/{ordering-ui-admin.d6c72a98321193c34fe9.js → ordering-ui-admin.e0348521ef103574aa53.js} +2 -2
  3. package/_bundles/{ordering-ui-admin.d6c72a98321193c34fe9.js.LICENSE.txt → ordering-ui-admin.e0348521ef103574aa53.js.LICENSE.txt} +12 -18
  4. package/_modules/components/Delivery/AddressForm/styles.js +2 -2
  5. package/_modules/components/Delivery/AddressList/index.js +9 -56
  6. package/_modules/components/Delivery/AddressList/styles.js +1 -1
  7. package/_modules/components/Delivery/DeliveryUsersListing/index.js +45 -7
  8. package/_modules/components/Delivery/DriversGroupLogs/index.js +5 -2
  9. package/_modules/components/Delivery/UsersList/index.js +17 -4
  10. package/_modules/components/Delivery/UsersList/styles.js +9 -4
  11. package/_modules/components/Home/HomePage/index.js +5 -1
  12. package/_modules/components/MyProducts/OrderingWebsite/index.js +5 -1
  13. package/_modules/components/OrderingProducts/SiteTheme/index.js +1 -1
  14. package/_modules/components/Orders/CompanySelector/index.js +2 -2
  15. package/_modules/components/Orders/CompanySelector/styles.js +1 -1
  16. package/_modules/components/Orders/CreateCustomOrder/CardForm/index.js +96 -0
  17. package/_modules/components/Orders/CreateCustomOrder/CardForm/styles.js +35 -0
  18. package/_modules/components/Orders/CreateCustomOrder/CardFormCustom/cardUtils.js +102 -0
  19. package/_modules/components/Orders/CreateCustomOrder/CardFormCustom/index.js +148 -0
  20. package/_modules/components/Orders/CreateCustomOrder/CardFormCustom/styles.js +16 -0
  21. package/_modules/components/Orders/CreateCustomOrder/CartBill/index.js +275 -0
  22. package/_modules/components/Orders/CreateCustomOrder/CartBill/styles.js +23 -0
  23. package/_modules/components/Orders/CreateCustomOrder/Checkout/index.js +498 -0
  24. package/_modules/components/Orders/CreateCustomOrder/Checkout/styles.js +31 -0
  25. package/_modules/components/Orders/CreateCustomOrder/CouponControl/index.js +100 -0
  26. package/_modules/components/Orders/CreateCustomOrder/CouponControl/styles.js +17 -0
  27. package/_modules/components/Orders/CreateCustomOrder/CustomOrderDetails/index.js +139 -0
  28. package/_modules/components/Orders/CreateCustomOrder/CustomOrderDetails/styles.js +17 -0
  29. package/_modules/components/Orders/CreateCustomOrder/DriverTips/index.js +101 -0
  30. package/_modules/components/Orders/CreateCustomOrder/DriverTips/styles.js +37 -0
  31. package/_modules/components/Orders/CreateCustomOrder/Map/index.js +131 -0
  32. package/_modules/components/Orders/CreateCustomOrder/Map/styles.js +12 -0
  33. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionCard/index.js +83 -0
  34. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionCash/index.js +81 -0
  35. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionCash/styles.js +23 -0
  36. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionPaypal/index.js +45 -0
  37. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionPaypal/styles.js +12 -0
  38. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionSquare/index.js +112 -0
  39. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionSquare/styles.js +21 -0
  40. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionStripe/index.js +259 -0
  41. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionStripe/styles.js +66 -0
  42. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionWallet/index.js +173 -0
  43. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionWallet/styles.js +26 -0
  44. package/_modules/components/Orders/CreateCustomOrder/PaymentOptions/index.js +400 -0
  45. package/_modules/components/Orders/CreateCustomOrder/PaymentOptions/styles.js +40 -0
  46. package/_modules/components/Orders/CreateCustomOrder/ProductForm/index.js +613 -0
  47. package/_modules/components/Orders/CreateCustomOrder/ProductForm/styles.js +109 -0
  48. package/_modules/components/Orders/CreateCustomOrder/ProductIngredient/index.js +39 -0
  49. package/_modules/components/Orders/CreateCustomOrder/ProductIngredient/styles.js +23 -0
  50. package/_modules/components/Orders/CreateCustomOrder/ProductOption/index.js +51 -0
  51. package/_modules/components/Orders/CreateCustomOrder/ProductOption/styles.js +29 -0
  52. package/_modules/components/Orders/CreateCustomOrder/ProductOptionSubOption/index.js +148 -0
  53. package/_modules/components/Orders/CreateCustomOrder/ProductOptionSubOption/styles.js +79 -0
  54. package/_modules/components/Orders/CreateCustomOrder/SelectBusinesses/index.js +82 -0
  55. package/_modules/components/Orders/CreateCustomOrder/SelectBusinesses/styles.js +21 -0
  56. package/_modules/components/Orders/CreateCustomOrder/SelectCustomer/index.js +192 -0
  57. package/_modules/components/Orders/CreateCustomOrder/SelectCustomer/styles.js +68 -0
  58. package/_modules/components/Orders/CreateCustomOrder/SelectProducts/index.js +234 -0
  59. package/_modules/components/Orders/CreateCustomOrder/SelectProducts/styles.js +54 -0
  60. package/_modules/components/Orders/CreateCustomOrder/SingleProductCard/index.js +99 -0
  61. package/_modules/components/Orders/CreateCustomOrder/SingleProductCard/styles.js +131 -0
  62. package/_modules/components/Orders/CreateCustomOrder/StripeElementsForm/index.js +73 -0
  63. package/_modules/components/Orders/CreateCustomOrder/StripeElementsForm/styles.js +17 -0
  64. package/_modules/components/Orders/CreateCustomOrder/StripeMethodForm/index.js +124 -0
  65. package/_modules/components/Orders/CreateCustomOrder/StripeMethodForm/styles.js +12 -0
  66. package/_modules/components/Orders/CreateCustomOrder/StripeRedirectForm/index.js +83 -0
  67. package/_modules/components/Orders/CreateCustomOrder/StripeRedirectForm/styles.js +21 -0
  68. package/_modules/components/Orders/CreateCustomOrder/TaxInformation/index.js +48 -0
  69. package/_modules/components/Orders/CreateCustomOrder/TaxInformation/styles.js +14 -0
  70. package/_modules/components/Orders/CreateCustomOrder/index.js +59 -0
  71. package/_modules/components/Orders/DriverSelector/index.js +2 -2
  72. package/_modules/components/Orders/DriverSelector/styles.js +1 -1
  73. package/_modules/components/Orders/OrderContactInformation/styles.js +1 -1
  74. package/_modules/components/Orders/OrderDetails/styles.js +1 -1
  75. package/_modules/components/Orders/OrderStatusTypeSelector/styles.js +1 -1
  76. package/_modules/components/Orders/OrderToPrintTicket/index.js +2 -2
  77. package/_modules/components/Orders/OrdersContentHeader/index.js +6 -4
  78. package/_modules/components/Orders/OrdersContentHeader/styles.js +13 -7
  79. package/_modules/components/Orders/OrdersDashboardControls/index.js +6 -2
  80. package/_modules/components/Orders/OrdersDashboardControls/styles.js +3 -3
  81. package/_modules/components/Orders/OrdersExportCSV/styles.js +14 -8
  82. package/_modules/components/Orders/OrdersManager/index.js +7 -5
  83. package/_modules/components/Orders/OrdersManager/styles.js +1 -1
  84. package/_modules/components/Shared/AutoScroll/index.js +1 -0
  85. package/_modules/components/Shared/LinkableText/index.js +22 -0
  86. package/_modules/components/Shared/Tabs/index.js +32 -0
  87. package/_modules/components/Shared/index.js +20 -0
  88. package/_modules/components/SidebarMenu/index.js +2 -1
  89. package/_modules/components/Stores/BusinessProductsListing/index.js +7 -3
  90. package/_modules/components/Stores/BusinessQRCodeOption/index.js +6 -2
  91. package/_modules/components/Stores/BusinessSummary/index.js +7 -3
  92. package/_modules/components/Users/UserAddForm/index.js +15 -6
  93. package/_modules/components/Users/UserAddForm/styles.js +1 -1
  94. package/_modules/styles/Selects/index.js +1 -1
  95. package/_modules/utils/index.js +9 -2
  96. package/index-template.js +1 -1
  97. package/package.json +6 -4
  98. package/src/components/Delivery/AddressForm/styles.js +3 -3
  99. package/src/components/Delivery/AddressList/index.js +6 -61
  100. package/src/components/Delivery/AddressList/styles.js +1 -1
  101. package/src/components/Delivery/DeliveryUsersListing/index.js +26 -3
  102. package/src/components/Delivery/DriversGroupLogs/index.js +8 -2
  103. package/src/components/Delivery/UsersList/index.js +27 -12
  104. package/src/components/Delivery/UsersList/styles.js +16 -0
  105. package/src/components/Home/HomePage/index.js +3 -2
  106. package/src/components/MyProducts/OrderingWebsite/index.js +9 -8
  107. package/src/components/OrderingProducts/SiteTheme/index.js +1 -1
  108. package/src/components/Orders/CompanySelector/index.js +4 -6
  109. package/src/components/Orders/CompanySelector/styles.js +10 -0
  110. package/src/components/Orders/CreateCustomOrder/CardForm/index.js +135 -0
  111. package/src/components/Orders/CreateCustomOrder/CardForm/styles.js +135 -0
  112. package/src/components/Orders/CreateCustomOrder/CardFormCustom/cardUtils.js +111 -0
  113. package/src/components/Orders/CreateCustomOrder/CardFormCustom/index.js +161 -0
  114. package/src/components/Orders/CreateCustomOrder/CardFormCustom/styles.js +20 -0
  115. package/src/components/Orders/CreateCustomOrder/CartBill/index.js +267 -0
  116. package/src/components/Orders/CreateCustomOrder/CartBill/styles.js +67 -0
  117. package/src/components/Orders/CreateCustomOrder/Checkout/index.js +519 -0
  118. package/src/components/Orders/CreateCustomOrder/Checkout/styles.js +85 -0
  119. package/src/components/Orders/CreateCustomOrder/CouponControl/index.js +90 -0
  120. package/src/components/Orders/CreateCustomOrder/CouponControl/styles.js +22 -0
  121. package/src/components/Orders/CreateCustomOrder/CustomOrderDetails/index.js +132 -0
  122. package/src/components/Orders/CreateCustomOrder/CustomOrderDetails/styles.js +28 -0
  123. package/src/components/Orders/CreateCustomOrder/DriverTips/index.js +113 -0
  124. package/src/components/Orders/CreateCustomOrder/DriverTips/styles.js +91 -0
  125. package/src/components/Orders/CreateCustomOrder/Map/index.js +115 -0
  126. package/src/components/Orders/CreateCustomOrder/Map/styles.js +10 -0
  127. package/src/components/Orders/CreateCustomOrder/PaymentOptionCard/index.js +70 -0
  128. package/src/components/Orders/CreateCustomOrder/PaymentOptionCash/index.js +83 -0
  129. package/src/components/Orders/CreateCustomOrder/PaymentOptionCash/styles.js +50 -0
  130. package/src/components/Orders/CreateCustomOrder/PaymentOptionPaypal/index.js +43 -0
  131. package/src/components/Orders/CreateCustomOrder/PaymentOptionPaypal/styles.js +5 -0
  132. package/src/components/Orders/CreateCustomOrder/PaymentOptionSquare/index.js +105 -0
  133. package/src/components/Orders/CreateCustomOrder/PaymentOptionSquare/styles.js +27 -0
  134. package/src/components/Orders/CreateCustomOrder/PaymentOptionStripe/index.js +261 -0
  135. package/src/components/Orders/CreateCustomOrder/PaymentOptionStripe/styles.js +159 -0
  136. package/src/components/Orders/CreateCustomOrder/PaymentOptionWallet/index.js +172 -0
  137. package/src/components/Orders/CreateCustomOrder/PaymentOptionWallet/styles.js +33 -0
  138. package/src/components/Orders/CreateCustomOrder/PaymentOptions/index.js +440 -0
  139. package/src/components/Orders/CreateCustomOrder/PaymentOptions/styles.js +132 -0
  140. package/src/components/Orders/CreateCustomOrder/ProductForm/index.js +701 -0
  141. package/src/components/Orders/CreateCustomOrder/ProductForm/styles.js +540 -0
  142. package/src/components/Orders/CreateCustomOrder/ProductIngredient/index.js +43 -0
  143. package/src/components/Orders/CreateCustomOrder/ProductIngredient/styles.js +29 -0
  144. package/src/components/Orders/CreateCustomOrder/ProductOption/index.js +58 -0
  145. package/src/components/Orders/CreateCustomOrder/ProductOption/styles.js +76 -0
  146. package/src/components/Orders/CreateCustomOrder/ProductOptionSubOption/index.js +182 -0
  147. package/src/components/Orders/CreateCustomOrder/ProductOptionSubOption/styles.js +195 -0
  148. package/src/components/Orders/CreateCustomOrder/SelectBusinesses/index.js +67 -0
  149. package/src/components/Orders/CreateCustomOrder/SelectBusinesses/styles.js +63 -0
  150. package/src/components/Orders/CreateCustomOrder/SelectCustomer/index.js +242 -0
  151. package/src/components/Orders/CreateCustomOrder/SelectCustomer/styles.js +235 -0
  152. package/src/components/Orders/CreateCustomOrder/SelectProducts/index.js +237 -0
  153. package/src/components/Orders/CreateCustomOrder/SelectProducts/styles.js +161 -0
  154. package/src/components/Orders/CreateCustomOrder/SingleProductCard/index.js +105 -0
  155. package/src/components/Orders/CreateCustomOrder/SingleProductCard/styles.js +314 -0
  156. package/src/components/Orders/CreateCustomOrder/StripeElementsForm/index.js +71 -0
  157. package/src/components/Orders/CreateCustomOrder/StripeElementsForm/styles.js +13 -0
  158. package/src/components/Orders/CreateCustomOrder/StripeMethodForm/index.js +90 -0
  159. package/src/components/Orders/CreateCustomOrder/StripeMethodForm/styles.js +9 -0
  160. package/src/components/Orders/CreateCustomOrder/StripeRedirectForm/index.js +96 -0
  161. package/src/components/Orders/CreateCustomOrder/StripeRedirectForm/styles.js +73 -0
  162. package/src/components/Orders/CreateCustomOrder/TaxInformation/index.js +69 -0
  163. package/src/components/Orders/CreateCustomOrder/TaxInformation/styles.js +25 -0
  164. package/src/components/Orders/CreateCustomOrder/index.js +45 -0
  165. package/src/components/Orders/DriverSelector/index.js +2 -2
  166. package/src/components/Orders/DriverSelector/styles.js +10 -0
  167. package/src/components/Orders/OrderContactInformation/index.js +32 -32
  168. package/src/components/Orders/OrderContactInformation/styles.js +0 -5
  169. package/src/components/Orders/OrderDetails/styles.js +7 -2
  170. package/src/components/Orders/OrderStatusTypeSelector/styles.js +9 -0
  171. package/src/components/Orders/OrderToPrintTicket/index.js +1 -1
  172. package/src/components/Orders/OrdersContentHeader/index.js +4 -4
  173. package/src/components/Orders/OrdersContentHeader/styles.js +7 -2
  174. package/src/components/Orders/OrdersDashboardControls/index.js +4 -1
  175. package/src/components/Orders/OrdersDashboardControls/styles.js +13 -11
  176. package/src/components/Orders/OrdersExportCSV/styles.js +16 -0
  177. package/src/components/Orders/OrdersManager/index.js +6 -2
  178. package/src/components/Orders/OrdersManager/styles.js +2 -0
  179. package/src/components/Shared/AutoScroll/index.js +1 -0
  180. package/src/components/Shared/LinkableText/index.js +17 -0
  181. package/src/components/Shared/Tabs/index.js +28 -0
  182. package/src/components/Shared/index.js +5 -0
  183. package/src/components/SidebarMenu/index.js +1 -1
  184. package/src/components/Stores/BusinessProductsListing/index.js +6 -3
  185. package/src/components/Stores/BusinessQRCodeOption/index.js +5 -3
  186. package/src/components/Stores/BusinessSummary/index.js +6 -4
  187. package/src/components/Users/UserAddForm/index.js +21 -9
  188. package/src/components/Users/UserAddForm/styles.js +2 -2
  189. package/src/styles/Selects/index.js +1 -1
  190. package/src/utils/index.js +5 -0
@@ -0,0 +1,111 @@
1
+ import Payment from 'payment'
2
+
3
+ const clearNumber = (value = '') => {
4
+ return value.replace(/\D+/g, '')
5
+ }
6
+
7
+ export const formatCreditCardNumber = (value) => {
8
+ if (!value) {
9
+ return value
10
+ }
11
+
12
+ const issuer = Payment.fns.cardType(value)
13
+ const clearValue = clearNumber(value)
14
+ let nextValue
15
+
16
+ switch (issuer) {
17
+ case 'amex':
18
+ nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(
19
+ 4,
20
+ 10
21
+ )} ${clearValue.slice(10, 15)}`
22
+ break
23
+ case 'dinersclub':
24
+ nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(
25
+ 4,
26
+ 10
27
+ )} ${clearValue.slice(10, 14)}`
28
+ break
29
+ default:
30
+ nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(
31
+ 4,
32
+ 8
33
+ )} ${clearValue.slice(8, 12)} ${clearValue.slice(12, 19)}`
34
+ break
35
+ }
36
+
37
+ return nextValue.trim()
38
+ }
39
+
40
+ export const formatCVC = (value, prevValue, allValues = {}) => {
41
+ const clearValue = clearNumber(value)
42
+ let maxLength = 4
43
+
44
+ if (allValues.number) {
45
+ const issuer = Payment.fns.cardType(allValues.number)
46
+ maxLength = issuer === 'amex' ? 4 : 3
47
+ }
48
+
49
+ return clearValue.slice(0, maxLength)
50
+ }
51
+
52
+ export const formatExpirationDate = (value) => {
53
+ const clearValue = clearNumber(value)
54
+
55
+ if (clearValue.length >= 3) {
56
+ return `${clearValue.slice(0, 2)}/${clearValue.slice(2, 4)}`
57
+ }
58
+
59
+ return clearValue
60
+ }
61
+
62
+ export const getCardType = (number) => {
63
+ // visa
64
+ var re = new RegExp('^4')
65
+ if (number.match(re) != null) {
66
+ return 'Visa'
67
+ }
68
+
69
+ // Mastercard
70
+ // Updated for Mastercard 2017 BINs expansion
71
+ if (/^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$/.test(number)) {
72
+ return 'Mastercard'
73
+ }
74
+ // AMEX
75
+ re = new RegExp('^3[47]')
76
+ if (number.match(re) != null) {
77
+ return 'AMEX'
78
+ }
79
+
80
+ // Discover
81
+ re = new RegExp('^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)')
82
+ if (number.match(re) != null) {
83
+ return 'Discover'
84
+ }
85
+
86
+ // Diners
87
+ re = new RegExp('^36')
88
+ if (number.match(re) != null) {
89
+ return 'Diners'
90
+ }
91
+
92
+ // Diners - Carte Blanche
93
+ re = new RegExp('^30[0-5]')
94
+ if (number.match(re) != null) {
95
+ return 'Diners - Carte Blanche'
96
+ }
97
+
98
+ // JCB
99
+ re = new RegExp('^35(2[89]|[3-8][0-9])')
100
+ if (number.match(re) != null) {
101
+ return 'JCB'
102
+ }
103
+
104
+ // Visa Electron
105
+ re = new RegExp('^(4026|417500|4508|4844|491(3|7))')
106
+ if (number.match(re) != null) {
107
+ return 'Visa Electron'
108
+ }
109
+
110
+ return ''
111
+ }
@@ -0,0 +1,161 @@
1
+ import React, { useState } from 'react'
2
+ import { useLanguage } from 'ordering-components-admin-external'
3
+ import Card from 'react-credit-cards-2'
4
+ import 'react-credit-cards-2/dist/es/styles-compiled.css'
5
+ import {
6
+ formatCreditCardNumber,
7
+ formatCVC,
8
+ formatExpirationDate,
9
+ getCardType
10
+ } from './cardUtils'
11
+ import { useForm } from 'react-hook-form'
12
+ import { Button, Input } from '../../../../styles'
13
+ import { FormContainer, InputContainer } from './styles'
14
+
15
+ export const CardFormCustom = (props) => {
16
+ const {
17
+ handleNewCard,
18
+ setAddCardOpen
19
+ } = props
20
+
21
+ const [, t] = useLanguage()
22
+ const [formState, setFormState] = useState({
23
+ cvc: '',
24
+ expiry: '',
25
+ focus: '',
26
+ name: '',
27
+ number: ''
28
+ })
29
+
30
+ const formMethods = useForm()
31
+
32
+ const handleInputFocus = (e) => {
33
+ setFormState({
34
+ ...formState,
35
+ focus: e.target.name
36
+ })
37
+ }
38
+
39
+ const handleInputChange = ({ target }) => {
40
+ if (target.name === 'number') {
41
+ target.value = formatCreditCardNumber(target.value)
42
+ } else if (target.name === 'expiry') {
43
+ target.value = formatExpirationDate(target.value)
44
+ } else if (target.name === 'cvc') {
45
+ target.value = formatCVC(target.value)
46
+ }
47
+ setFormState({
48
+ ...formState,
49
+ [target.name]: target.value
50
+ })
51
+ }
52
+
53
+ const onSubmit = (values) => {
54
+ const cardBrand = getCardType(values?.number)
55
+ const lastFourDigits = values?.number.substr(-4)
56
+ const card = {
57
+ type: 'card',
58
+ brand: cardBrand,
59
+ last4: lastFourDigits,
60
+ ccnumber: values?.number?.replace(/\s/g, ''),
61
+ ccexp: values?.expiry?.replace('/', ''),
62
+ cvv: values?.cvc
63
+ }
64
+ handleNewCard(card)
65
+ setAddCardOpen(false)
66
+ }
67
+
68
+ return (
69
+ <FormContainer id='PaymentForm'>
70
+ <Card
71
+ cvc={formState.cvc}
72
+ expiry={formState.expiry}
73
+ focused={formState.focus}
74
+ name={formState.name}
75
+ number={formState.number}
76
+ placeholders={{
77
+ name: t('YOUR_NAME_HERE', 'Your name here')
78
+ }}
79
+ />
80
+ <form
81
+ onSubmit={formMethods.handleSubmit(onSubmit)}
82
+ >
83
+ <InputContainer>
84
+ <Input
85
+ type='tel'
86
+ name='number'
87
+ placeholder={t('CARD_NUMBER', 'Card number')}
88
+ inputMode='numeric'
89
+ onChange={handleInputChange}
90
+ onFocus={handleInputFocus}
91
+ pattern='[\d| ]{16,22}'
92
+ format={formatCreditCardNumber}
93
+ maxLength={19}
94
+ ref={
95
+ formMethods.register({
96
+ required: t('CARD_NUMBER_REQUIRED', 'Card number is required'),
97
+ pattern: /^[\d| ]{16,22}$/i
98
+ })
99
+ }
100
+ isError={formMethods.errors.number}
101
+ />
102
+ </InputContainer>
103
+ <InputContainer>
104
+ <Input
105
+ type='text'
106
+ name='name'
107
+ placeholder={t('NAME', 'Name')}
108
+ onChange={handleInputChange}
109
+ onFocus={handleInputFocus}
110
+ ref={
111
+ formMethods.register({
112
+ required: t('NAME_REQUIRED', 'Name is required')
113
+ })
114
+ }
115
+ isError={formMethods.errors.name}
116
+ />
117
+ </InputContainer>
118
+ <InputContainer>
119
+ <Input
120
+ type='text'
121
+ name='expiry'
122
+ pattern='\d\d/\d\d'
123
+ placeholder={t('EXPIRY', 'Expiry')}
124
+ onChange={handleInputChange}
125
+ onFocus={handleInputFocus}
126
+ format={formatExpirationDate}
127
+ ref={
128
+ formMethods.register({
129
+ required: t('EXPIRY_DATE_REQUIRED', 'Expiry date required')
130
+ })
131
+ }
132
+ isError={formMethods.errors.expiry}
133
+ />
134
+ <Input
135
+ type='text'
136
+ name='cvc'
137
+ placeholder={t('CVC', 'CVC')}
138
+ pattern='\d{3,4}'
139
+ onChange={handleInputChange}
140
+ onFocus={handleInputFocus}
141
+ format={formatCVC}
142
+ ref={
143
+ formMethods.register({
144
+ required: t('CVC_REQUIRED', 'CVC is required')
145
+ })
146
+ }
147
+ isError={formMethods.errors.cvc}
148
+ />
149
+ </InputContainer>
150
+ <Button
151
+ borderRadius='8px'
152
+ type='submit'
153
+ color='primary'
154
+ disabled={Object.keys(formMethods.errors)?.length > 0}
155
+ >
156
+ {t('SAVE', 'Save')}
157
+ </Button>
158
+ </form>
159
+ </FormContainer>
160
+ )
161
+ }
@@ -0,0 +1,20 @@
1
+ import styled, { css } from 'styled-components'
2
+
3
+ export const InputContainer = styled.div`
4
+ width: 100%;
5
+ display: flex;
6
+ justify-content: space-between;
7
+
8
+ input{
9
+ box-sizing: border-box;
10
+ width: 100%;
11
+ margin: 10px;
12
+ }
13
+ `
14
+
15
+ export const FormContainer = styled.div`
16
+ button{
17
+ width: 100%;
18
+ margin: 10px;
19
+ }
20
+ `
@@ -0,0 +1,267 @@
1
+ import React, { useState } from 'react'
2
+ import { useLanguage, useUtils, useOrder, useConfig, useValidationFields, useCustomer } from 'ordering-components-admin-external'
3
+ import BsInfoCircle from '@meronex/icons/bs/BsInfoCircle'
4
+ import MdCloseCircle from '@meronex/icons/ios/MdCloseCircle'
5
+ import { useTheme } from 'styled-components'
6
+ import { verifyDecimals } from '../../../../utils'
7
+ import { CouponControl } from '../CouponControl'
8
+ import { Confirm, Modal } from '../../../Shared'
9
+ import { TaxInformation } from '../TaxInformation'
10
+
11
+ import {
12
+ CartBillContainer,
13
+ CouponContainer,
14
+ IconContainer
15
+ } from './styles'
16
+
17
+ export const CartBill = (props) => {
18
+ const {
19
+ cart
20
+ } = props
21
+
22
+ const theme = useTheme()
23
+ const [, t] = useLanguage()
24
+ const [{ parsePrice, parseNumber }] = useUtils()
25
+ const [orderState, { removeOffer }] = useOrder()
26
+ const [{ configs }] = useConfig()
27
+ const [validationFields] = useValidationFields()
28
+ const [{ user }] = useCustomer()
29
+
30
+ const [openTaxModal, setOpenTaxModal] = useState({ open: false, tax: null })
31
+ const [confirm, setConfirm] = useState({ open: false, content: null, handleOnAccept: null })
32
+
33
+ const isCouponEnabled = validationFields?.fields?.checkout?.coupon?.enabled
34
+
35
+ const getIncludedTaxes = () => {
36
+ if (cart?.taxes === null) {
37
+ return cart?.business.tax_type === 1 ? cart?.tax : 0
38
+ } else {
39
+ return cart?.taxes.reduce((taxIncluded, tax) => {
40
+ return taxIncluded + (tax.type === 1 ? tax.summary?.tax : 0)
41
+ }, 0)
42
+ }
43
+ }
44
+
45
+ const getIncludedTaxesDiscounts = () => {
46
+ return cart?.taxes?.filter(tax => tax?.type === 1)?.reduce((carry, tax) => carry + (tax?.summary?.tax_after_discount ?? tax?.summary?.tax), 0)
47
+ }
48
+
49
+ const handleRemoveOfferClick = (id, userId) => {
50
+ const dataOffer = {
51
+ business_id: cart?.business_id,
52
+ offer_id: id
53
+ }
54
+ if (userId) dataOffer.user_id = userId
55
+ removeOffer(dataOffer)
56
+ }
57
+
58
+ const onRemoveOffer = (id) => {
59
+ setConfirm({
60
+ open: true,
61
+ content: t('QUESTION_DELETE_OFFER', 'Are you sure that you want to delete the offer?'),
62
+ title: t('OFFER', 'Offer'),
63
+ handleOnAccept: () => {
64
+ setConfirm({ ...confirm, open: false })
65
+ handleRemoveOfferClick(id, user?.id)
66
+ }
67
+ })
68
+ }
69
+
70
+ return (
71
+ <CartBillContainer>
72
+ <h3>{t('SUMMARY', '')}</h3>
73
+ <table>
74
+ <tbody>
75
+ <tr>
76
+ <td>{t('SUBTOTAL', 'Subtotal')}</td>
77
+ <td>{parsePrice(cart?.subtotal + getIncludedTaxes())}</td>
78
+ </tr>
79
+ {cart?.discount > 0 && cart?.total >= 0 && cart?.offers?.length === 0 && (
80
+ <tr>
81
+ {cart?.discount_type === 1 ? (
82
+ <td>
83
+ {t('DISCOUNT', 'Discount')}{' '}
84
+ <span>{`(${verifyDecimals(cart?.discount_rate, parsePrice)}%)`}</span>
85
+ </td>
86
+ ) : (
87
+ <td>{t('DISCOUNT', 'Discount')}</td>
88
+ )}
89
+ <td>- {parsePrice(cart?.discount || 0)}</td>
90
+ </tr>
91
+ )}
92
+ {
93
+ cart?.offers?.length > 0 && cart?.offers?.filter(offer => offer?.target === 1)?.map(offer => (
94
+ <tr key={offer.id}>
95
+ <td className='icon'>
96
+ {offer.name}
97
+ {offer.rate_type === 1 && (
98
+ <span>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</span>
99
+ )}
100
+ <IconContainer>
101
+ <BsInfoCircle size='20' color={theme.colors.primary} onClick={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_1' })} />
102
+ {!!offer?.id && (
103
+ <MdCloseCircle size='24' color={theme.colors.primary} onClick={() => onRemoveOffer(offer?.id)} />
104
+ )}
105
+ </IconContainer>
106
+ </td>
107
+ <td>
108
+ - {parsePrice(offer?.summary?.discount)}
109
+ </td>
110
+ </tr>
111
+ ))
112
+ }
113
+ {
114
+ cart?.offers?.filter(offer => offer?.target === 1)?.length > 0 &&
115
+ cart?.subtotal_with_discount > 0 &&
116
+ cart?.discount > 0 &&
117
+ cart?.total >= 0 &&
118
+ (
119
+ <tr>
120
+ <td>{t('SUBTOTAL_WITH_DISCOUNT', 'Subtotal with discount')}</td>
121
+ {cart?.business?.tax_type === 1 ? (
122
+ <td>{parsePrice(cart?.subtotal_with_discount + getIncludedTaxesDiscounts() ?? 0)}</td>
123
+ ) : (
124
+ <td>{parsePrice(cart?.subtotal_with_discount ?? 0)}</td>
125
+ )}
126
+ </tr>
127
+ )
128
+ }
129
+ {
130
+ cart?.taxes?.length > 0 && cart?.taxes?.filter(tax => tax?.type === 2 && tax?.rate !== 0).map(tax => (
131
+ <tr key={tax?.id}>
132
+ <td className='icon'>
133
+ {tax.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}
134
+ <span>{`(${verifyDecimals(tax?.rate, parseNumber)}%)`}</span>
135
+ <IconContainer onClick={() => setOpenTaxModal({ open: true, data: tax, type: 'tax' })}>
136
+ <BsInfoCircle size='20' color={theme.colors.primary} />
137
+ </IconContainer>
138
+ </td>
139
+ <td>{parsePrice(tax?.summary?.tax_after_discount ?? tax?.summary?.tax ?? 0)}</td>
140
+ </tr>
141
+ ))
142
+ }
143
+ {
144
+ cart?.fees?.length > 0 && cart?.fees?.filter(fee => !(fee.fixed === 0 && fee.percentage === 0)).map((fee, i) => (
145
+ <tr key={fee.id ?? i}>
146
+ <td className='icon'>
147
+ {fee.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}
148
+ ({fee?.fixed > 0 && `${parsePrice(fee?.fixed)}${fee.percentage > 0 ? ' + ' : ''}`}{fee.percentage > 0 && `${fee.percentage}%`})
149
+ <IconContainer onClick={() => setOpenTaxModal({ open: true, data: fee, type: 'fee' })}>
150
+ <BsInfoCircle size='20' color={theme.colors.primary} />
151
+ </IconContainer>
152
+ </td>
153
+ <td>{parsePrice(fee?.summary?.fixed + (fee?.summary?.percentage_after_discount ?? fee?.summary?.percentage) ?? 0)}</td>
154
+ </tr>
155
+ ))
156
+ }
157
+ {
158
+ cart?.offers?.length > 0 && cart?.offers?.filter(offer => offer?.target === 3)?.map(offer => (
159
+ <tr key={offer.id}>
160
+ <td className='icon'>
161
+ {offer.name}
162
+ {offer?.rate_type === 1 && (
163
+ <span>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</span>
164
+ )}
165
+ <IconContainer>
166
+ <BsInfoCircle size='20' color={theme.colors.primary} onClick={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_3' })} />
167
+ {!!offer?.id && (
168
+ <MdCloseCircle size='24' color={theme.colors.primary} onClick={() => onRemoveOffer(offer?.id)} />
169
+ )}
170
+ </IconContainer>
171
+ </td>
172
+ <td>
173
+ - {parsePrice(offer?.summary?.discount)}
174
+ </td>
175
+ </tr>
176
+ ))
177
+ }
178
+ {orderState?.options?.type === 1 && (
179
+ <tr>
180
+ <td>{t('DELIVERY_FEE', 'Delivery Fee')}</td>
181
+ <td>{parsePrice(cart?.delivery_price_with_discount)}</td>
182
+ </tr>
183
+ )}
184
+ {
185
+ cart?.offers?.length > 0 && cart?.offers?.filter(offer => offer?.target === 2)?.map(offer => (
186
+ <tr key={offer.id}>
187
+ <td className='icon'>
188
+ {offer.name}
189
+ {offer?.rate_type === 1 && (
190
+ <span>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</span>
191
+ )}
192
+ <IconContainer>
193
+ <BsInfoCircle size='20' color={theme.colors.primary} onClick={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_2' })} />
194
+ {!!offer?.id && (
195
+ <MdCloseCircle size='24' color={theme.colors.primary} onClick={() => onRemoveOffer(offer?.id)} />
196
+ )}
197
+ </IconContainer>
198
+ </td>
199
+ <td>
200
+ - {parsePrice(offer?.summary?.discount)}
201
+ </td>
202
+ </tr>
203
+ ))
204
+ }
205
+ {cart?.driver_tip > 0 && (
206
+ <tr>
207
+ <td>
208
+ {t('DRIVER_TIP', 'Driver tip')}{' '}
209
+ {cart?.driver_tip_rate > 0 &&
210
+ parseInt(configs?.driver_tip_type?.value, 10) === 2 &&
211
+ !parseInt(configs?.driver_tip_use_custom?.value, 10) &&
212
+ (
213
+ <span>{`(${verifyDecimals(cart?.driver_tip_rate, parseNumber)}%)`}</span>
214
+ )}
215
+ </td>
216
+ <td>{parsePrice(cart?.driver_tip)}</td>
217
+ </tr>
218
+ )}
219
+ </tbody>
220
+ </table>
221
+ {isCouponEnabled && cart?.status !== 2 &&
222
+ (
223
+ <CouponContainer>
224
+ <CouponControl
225
+ businessId={cart?.business_id}
226
+ price={cart?.total}
227
+ />
228
+ </CouponContainer>
229
+ )}
230
+ <table className='total'>
231
+ <tbody>
232
+ <tr>
233
+ <td>{t('TOTAL', 'Total')}</td>
234
+ <td>{parsePrice(cart?.total >= 0 ? cart?.total : 0)}</td>
235
+ </tr>
236
+ </tbody>
237
+ </table>
238
+
239
+ <Modal
240
+ width='70%'
241
+ open={openTaxModal.open}
242
+ padding='20px'
243
+ closeOnBackdrop
244
+ title={`${openTaxModal.data?.name ||
245
+ t('INHERIT_FROM_BUSINESS', 'Inherit from business')} ${openTaxModal.data?.rate_type !== 2 ? `(${typeof openTaxModal.data?.rate === 'number' ? `${openTaxModal.data?.rate}%` : `${parsePrice(openTaxModal.data?.fixed ?? 0)} + ${openTaxModal.data?.percentage}%`})` : ''} `}
246
+ onClose={() => setOpenTaxModal({ open: false, data: null, type: '' })}
247
+ modalTitleStyle={{ display: 'flex', justifyContent: 'center' }}
248
+ >
249
+ <TaxInformation
250
+ type={openTaxModal.type}
251
+ data={openTaxModal.data}
252
+ products={cart?.products}
253
+ />
254
+ </Modal>
255
+ <Confirm
256
+ title={t('PRODUCT', 'Product')}
257
+ content={confirm.content}
258
+ acceptText={t('ACCEPT', 'Accept')}
259
+ open={confirm.open}
260
+ onClose={() => setConfirm({ ...confirm, open: false })}
261
+ onCancel={() => setConfirm({ ...confirm, open: false })}
262
+ onAccept={confirm.handleOnAccept}
263
+ closeOnBackdrop={false}
264
+ />
265
+ </CartBillContainer>
266
+ )
267
+ }
@@ -0,0 +1,67 @@
1
+ import styled, { css } from 'styled-components'
2
+
3
+ export const CartBillContainer = styled.div`
4
+ margin-top: 40px;
5
+ > h3 {
6
+ margin-bottom: 15px;
7
+ }
8
+
9
+ table {
10
+ width: 100%;
11
+ font-size: 14px;
12
+
13
+ td {
14
+ padding: 5px 0;
15
+ }
16
+
17
+ td span {
18
+ unicode-bidi: bidi-override;
19
+ }
20
+
21
+ tr td:nth-child(2) {
22
+ text-align: right;
23
+ ${props => props.theme?.rtl && css`
24
+ text-align: left;
25
+ `}
26
+ }
27
+
28
+ .icon {
29
+ display: flex;
30
+ align-items: center;
31
+ max-height: 25px;
32
+ }
33
+ }
34
+ table.total {
35
+ border-top: 1px solid ${props => props.theme.colors.borderColor};
36
+ margin-top: 10px;
37
+ tr {
38
+ td {
39
+ font-weight: bold;
40
+ font-size: 16px;
41
+
42
+ &#loyalty {
43
+ font-weight: normal;
44
+ font-size: 14px;
45
+ }
46
+ }
47
+ }
48
+ }
49
+ `
50
+ export const CouponContainer = styled.div`
51
+ margin-top: 10px;
52
+ `
53
+ export const IconContainer = styled.div`
54
+ position: relative;
55
+ display: inline-flex;
56
+ cursor: pointer;
57
+ margin-left: 5px;
58
+ height: 20px;
59
+ svg:nth-child(1){
60
+ position: relative;
61
+ top: -1px;
62
+ }
63
+ svg:nth-child(2){
64
+ position: relative;
65
+ top: -3px;
66
+ }
67
+ `