ordering-ui-admin-external 1.28.0 → 1.29.0

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 (169) hide show
  1. package/_bundles/main.css +294 -26
  2. package/_bundles/{ordering-ui-admin.88341b2ec95c8949082e.js → ordering-ui-admin.452c5996b9b7ebdf8016.js} +2 -2
  3. package/_bundles/{ordering-ui-admin.88341b2ec95c8949082e.js.LICENSE.txt → ordering-ui-admin.452c5996b9b7ebdf8016.js.LICENSE.txt} +8 -0
  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/DriversGroupLogs/index.js +5 -2
  8. package/_modules/components/Delivery/UserAddForm/index.js +16 -4
  9. package/_modules/components/Delivery/UserFormDetails/index.js +17 -5
  10. package/_modules/components/Home/HomePage/index.js +5 -1
  11. package/_modules/components/MyProducts/OrderingWebsite/index.js +5 -1
  12. package/_modules/components/OrderingProducts/SiteTheme/index.js +1 -1
  13. package/_modules/components/Orders/CreateCustomOrder/CardForm/index.js +96 -0
  14. package/_modules/components/Orders/CreateCustomOrder/CardForm/styles.js +35 -0
  15. package/_modules/components/Orders/CreateCustomOrder/CardFormCustom/cardUtils.js +102 -0
  16. package/_modules/components/Orders/CreateCustomOrder/CardFormCustom/index.js +148 -0
  17. package/_modules/components/Orders/CreateCustomOrder/CardFormCustom/styles.js +16 -0
  18. package/_modules/components/Orders/CreateCustomOrder/CartBill/index.js +275 -0
  19. package/_modules/components/Orders/CreateCustomOrder/CartBill/styles.js +23 -0
  20. package/_modules/components/Orders/CreateCustomOrder/Checkout/index.js +498 -0
  21. package/_modules/components/Orders/CreateCustomOrder/Checkout/styles.js +31 -0
  22. package/_modules/components/Orders/CreateCustomOrder/CouponControl/index.js +100 -0
  23. package/_modules/components/Orders/CreateCustomOrder/CouponControl/styles.js +17 -0
  24. package/_modules/components/Orders/CreateCustomOrder/CustomOrderDetails/index.js +139 -0
  25. package/_modules/components/Orders/CreateCustomOrder/CustomOrderDetails/styles.js +17 -0
  26. package/_modules/components/Orders/CreateCustomOrder/DriverTips/index.js +101 -0
  27. package/_modules/components/Orders/CreateCustomOrder/DriverTips/styles.js +37 -0
  28. package/_modules/components/Orders/CreateCustomOrder/Map/index.js +131 -0
  29. package/_modules/components/Orders/CreateCustomOrder/Map/styles.js +12 -0
  30. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionCard/index.js +83 -0
  31. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionCash/index.js +81 -0
  32. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionCash/styles.js +23 -0
  33. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionPaypal/index.js +45 -0
  34. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionPaypal/styles.js +12 -0
  35. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionSquare/index.js +112 -0
  36. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionSquare/styles.js +21 -0
  37. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionStripe/index.js +259 -0
  38. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionStripe/styles.js +66 -0
  39. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionWallet/index.js +173 -0
  40. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionWallet/styles.js +26 -0
  41. package/_modules/components/Orders/CreateCustomOrder/PaymentOptions/index.js +400 -0
  42. package/_modules/components/Orders/CreateCustomOrder/PaymentOptions/styles.js +40 -0
  43. package/_modules/components/Orders/CreateCustomOrder/ProductForm/index.js +613 -0
  44. package/_modules/components/Orders/CreateCustomOrder/ProductForm/styles.js +109 -0
  45. package/_modules/components/Orders/CreateCustomOrder/ProductIngredient/index.js +39 -0
  46. package/_modules/components/Orders/CreateCustomOrder/ProductIngredient/styles.js +23 -0
  47. package/_modules/components/Orders/CreateCustomOrder/ProductOption/index.js +51 -0
  48. package/_modules/components/Orders/CreateCustomOrder/ProductOption/styles.js +29 -0
  49. package/_modules/components/Orders/CreateCustomOrder/ProductOptionSubOption/index.js +148 -0
  50. package/_modules/components/Orders/CreateCustomOrder/ProductOptionSubOption/styles.js +79 -0
  51. package/_modules/components/Orders/CreateCustomOrder/SelectBusinesses/index.js +82 -0
  52. package/_modules/components/Orders/CreateCustomOrder/SelectBusinesses/styles.js +21 -0
  53. package/_modules/components/Orders/CreateCustomOrder/SelectCustomer/index.js +191 -0
  54. package/_modules/components/Orders/CreateCustomOrder/SelectCustomer/styles.js +68 -0
  55. package/_modules/components/Orders/CreateCustomOrder/SelectProducts/index.js +234 -0
  56. package/_modules/components/Orders/CreateCustomOrder/SelectProducts/styles.js +54 -0
  57. package/_modules/components/Orders/CreateCustomOrder/SingleProductCard/index.js +99 -0
  58. package/_modules/components/Orders/CreateCustomOrder/SingleProductCard/styles.js +131 -0
  59. package/_modules/components/Orders/CreateCustomOrder/StripeElementsForm/index.js +73 -0
  60. package/_modules/components/Orders/CreateCustomOrder/StripeElementsForm/styles.js +17 -0
  61. package/_modules/components/Orders/CreateCustomOrder/StripeMethodForm/index.js +124 -0
  62. package/_modules/components/Orders/CreateCustomOrder/StripeMethodForm/styles.js +12 -0
  63. package/_modules/components/Orders/CreateCustomOrder/StripeRedirectForm/index.js +83 -0
  64. package/_modules/components/Orders/CreateCustomOrder/StripeRedirectForm/styles.js +21 -0
  65. package/_modules/components/Orders/CreateCustomOrder/TaxInformation/index.js +48 -0
  66. package/_modules/components/Orders/CreateCustomOrder/TaxInformation/styles.js +14 -0
  67. package/_modules/components/Orders/CreateCustomOrder/index.js +59 -0
  68. package/_modules/components/Orders/OrderToPrintTicket/index.js +2 -2
  69. package/_modules/components/Orders/OrdersDashboardControls/index.js +6 -2
  70. package/_modules/components/Orders/OrdersDashboardControls/styles.js +3 -3
  71. package/_modules/components/Orders/OrdersExportCSV/styles.js +14 -8
  72. package/_modules/components/Orders/OrdersManager/index.js +6 -4
  73. package/_modules/components/Orders/OrdersManager/styles.js +1 -1
  74. package/_modules/components/Shared/AutoScroll/index.js +1 -0
  75. package/_modules/components/Shared/LinkableText/index.js +22 -0
  76. package/_modules/components/Shared/Tabs/index.js +32 -0
  77. package/_modules/components/Shared/index.js +20 -0
  78. package/_modules/components/SidebarMenu/index.js +2 -1
  79. package/_modules/components/Stores/BusinessProductsListing/index.js +7 -3
  80. package/_modules/components/Stores/BusinessQRCodeOption/index.js +6 -2
  81. package/_modules/components/Stores/BusinessSummary/index.js +7 -3
  82. package/_modules/components/Users/UserAddForm/index.js +13 -5
  83. package/_modules/components/Users/UserAddForm/styles.js +1 -1
  84. package/_modules/styles/Selects/index.js +1 -1
  85. package/_modules/utils/index.js +9 -2
  86. package/index-template.js +1 -1
  87. package/package.json +6 -4
  88. package/src/components/Delivery/AddressForm/styles.js +3 -3
  89. package/src/components/Delivery/AddressList/index.js +6 -61
  90. package/src/components/Delivery/AddressList/styles.js +1 -1
  91. package/src/components/Delivery/DriversGroupLogs/index.js +8 -2
  92. package/src/components/Delivery/UserAddForm/index.js +32 -13
  93. package/src/components/Delivery/UserFormDetails/index.js +30 -13
  94. package/src/components/Home/HomePage/index.js +3 -2
  95. package/src/components/MyProducts/OrderingWebsite/index.js +9 -8
  96. package/src/components/OrderingProducts/SiteTheme/index.js +1 -1
  97. package/src/components/Orders/CreateCustomOrder/CardForm/index.js +135 -0
  98. package/src/components/Orders/CreateCustomOrder/CardForm/styles.js +135 -0
  99. package/src/components/Orders/CreateCustomOrder/CardFormCustom/cardUtils.js +111 -0
  100. package/src/components/Orders/CreateCustomOrder/CardFormCustom/index.js +161 -0
  101. package/src/components/Orders/CreateCustomOrder/CardFormCustom/styles.js +20 -0
  102. package/src/components/Orders/CreateCustomOrder/CartBill/index.js +267 -0
  103. package/src/components/Orders/CreateCustomOrder/CartBill/styles.js +67 -0
  104. package/src/components/Orders/CreateCustomOrder/Checkout/index.js +519 -0
  105. package/src/components/Orders/CreateCustomOrder/Checkout/styles.js +85 -0
  106. package/src/components/Orders/CreateCustomOrder/CouponControl/index.js +90 -0
  107. package/src/components/Orders/CreateCustomOrder/CouponControl/styles.js +22 -0
  108. package/src/components/Orders/CreateCustomOrder/CustomOrderDetails/index.js +132 -0
  109. package/src/components/Orders/CreateCustomOrder/CustomOrderDetails/styles.js +28 -0
  110. package/src/components/Orders/CreateCustomOrder/DriverTips/index.js +113 -0
  111. package/src/components/Orders/CreateCustomOrder/DriverTips/styles.js +91 -0
  112. package/src/components/Orders/CreateCustomOrder/Map/index.js +115 -0
  113. package/src/components/Orders/CreateCustomOrder/Map/styles.js +10 -0
  114. package/src/components/Orders/CreateCustomOrder/PaymentOptionCard/index.js +70 -0
  115. package/src/components/Orders/CreateCustomOrder/PaymentOptionCash/index.js +83 -0
  116. package/src/components/Orders/CreateCustomOrder/PaymentOptionCash/styles.js +50 -0
  117. package/src/components/Orders/CreateCustomOrder/PaymentOptionPaypal/index.js +43 -0
  118. package/src/components/Orders/CreateCustomOrder/PaymentOptionPaypal/styles.js +5 -0
  119. package/src/components/Orders/CreateCustomOrder/PaymentOptionSquare/index.js +105 -0
  120. package/src/components/Orders/CreateCustomOrder/PaymentOptionSquare/styles.js +27 -0
  121. package/src/components/Orders/CreateCustomOrder/PaymentOptionStripe/index.js +261 -0
  122. package/src/components/Orders/CreateCustomOrder/PaymentOptionStripe/styles.js +159 -0
  123. package/src/components/Orders/CreateCustomOrder/PaymentOptionWallet/index.js +172 -0
  124. package/src/components/Orders/CreateCustomOrder/PaymentOptionWallet/styles.js +33 -0
  125. package/src/components/Orders/CreateCustomOrder/PaymentOptions/index.js +440 -0
  126. package/src/components/Orders/CreateCustomOrder/PaymentOptions/styles.js +132 -0
  127. package/src/components/Orders/CreateCustomOrder/ProductForm/index.js +701 -0
  128. package/src/components/Orders/CreateCustomOrder/ProductForm/styles.js +540 -0
  129. package/src/components/Orders/CreateCustomOrder/ProductIngredient/index.js +43 -0
  130. package/src/components/Orders/CreateCustomOrder/ProductIngredient/styles.js +29 -0
  131. package/src/components/Orders/CreateCustomOrder/ProductOption/index.js +58 -0
  132. package/src/components/Orders/CreateCustomOrder/ProductOption/styles.js +76 -0
  133. package/src/components/Orders/CreateCustomOrder/ProductOptionSubOption/index.js +182 -0
  134. package/src/components/Orders/CreateCustomOrder/ProductOptionSubOption/styles.js +195 -0
  135. package/src/components/Orders/CreateCustomOrder/SelectBusinesses/index.js +67 -0
  136. package/src/components/Orders/CreateCustomOrder/SelectBusinesses/styles.js +63 -0
  137. package/src/components/Orders/CreateCustomOrder/SelectCustomer/index.js +241 -0
  138. package/src/components/Orders/CreateCustomOrder/SelectCustomer/styles.js +235 -0
  139. package/src/components/Orders/CreateCustomOrder/SelectProducts/index.js +237 -0
  140. package/src/components/Orders/CreateCustomOrder/SelectProducts/styles.js +161 -0
  141. package/src/components/Orders/CreateCustomOrder/SingleProductCard/index.js +105 -0
  142. package/src/components/Orders/CreateCustomOrder/SingleProductCard/styles.js +314 -0
  143. package/src/components/Orders/CreateCustomOrder/StripeElementsForm/index.js +71 -0
  144. package/src/components/Orders/CreateCustomOrder/StripeElementsForm/styles.js +13 -0
  145. package/src/components/Orders/CreateCustomOrder/StripeMethodForm/index.js +90 -0
  146. package/src/components/Orders/CreateCustomOrder/StripeMethodForm/styles.js +9 -0
  147. package/src/components/Orders/CreateCustomOrder/StripeRedirectForm/index.js +96 -0
  148. package/src/components/Orders/CreateCustomOrder/StripeRedirectForm/styles.js +73 -0
  149. package/src/components/Orders/CreateCustomOrder/TaxInformation/index.js +69 -0
  150. package/src/components/Orders/CreateCustomOrder/TaxInformation/styles.js +25 -0
  151. package/src/components/Orders/CreateCustomOrder/index.js +45 -0
  152. package/src/components/Orders/OrderToPrintTicket/index.js +1 -1
  153. package/src/components/Orders/OrdersDashboardControls/index.js +4 -1
  154. package/src/components/Orders/OrdersDashboardControls/styles.js +13 -11
  155. package/src/components/Orders/OrdersExportCSV/styles.js +16 -0
  156. package/src/components/Orders/OrdersManager/index.js +5 -1
  157. package/src/components/Orders/OrdersManager/styles.js +2 -0
  158. package/src/components/Shared/AutoScroll/index.js +1 -0
  159. package/src/components/Shared/LinkableText/index.js +17 -0
  160. package/src/components/Shared/Tabs/index.js +28 -0
  161. package/src/components/Shared/index.js +5 -0
  162. package/src/components/SidebarMenu/index.js +1 -1
  163. package/src/components/Stores/BusinessProductsListing/index.js +6 -3
  164. package/src/components/Stores/BusinessQRCodeOption/index.js +5 -3
  165. package/src/components/Stores/BusinessSummary/index.js +6 -4
  166. package/src/components/Users/UserAddForm/index.js +12 -3
  167. package/src/components/Users/UserAddForm/styles.js +2 -2
  168. package/src/styles/Selects/index.js +1 -1
  169. package/src/utils/index.js +5 -0
@@ -0,0 +1,135 @@
1
+ import React from 'react'
2
+ import { CardCvcElement, CardElement, CardExpiryElement, CardNumberElement } from '@stripe/react-stripe-js'
3
+ import { CardForm as CardFormController, useLanguage, useValidationFields } from 'ordering-components-admin-external'
4
+ import { Button } from '../../../../styles'
5
+ import {
6
+ FormStripe,
7
+ FormRow,
8
+ ErrorMessage,
9
+ FormActions,
10
+ CardNumberField,
11
+ CardExpiryCvcField,
12
+ CardExpiryField,
13
+ CardCvcField,
14
+ CardZipcodeField,
15
+ ZipcodeField
16
+ } from './styles'
17
+
18
+ const CARD_ELEMENT_OPTIONS = {
19
+ style: {
20
+ base: {
21
+ color: '#32325d',
22
+ fontSmoothing: 'antialiased',
23
+ fontSize: '16px',
24
+ '::placeholder': {
25
+ color: '#aab7c4'
26
+ }
27
+ },
28
+ invalid: {
29
+ color: '#fa755a',
30
+ iconColor: '#fa755a'
31
+ }
32
+ },
33
+ showIcon: true
34
+ }
35
+
36
+ const CardFormUI = (props) => {
37
+ const {
38
+ error,
39
+ errorExpiry,
40
+ errorCvc,
41
+ loading,
42
+ handleSubmit,
43
+ handleChange,
44
+ isSplitForm,
45
+ handleChangeExpiry,
46
+ handleChangeCvc,
47
+ errorZipcode
48
+ } = props
49
+
50
+ const [, t] = useLanguage()
51
+ const [validationFields] = useValidationFields()
52
+ const zipCodeEnabled = validationFields?.fields?.card?.zipcode?.enabled
53
+ const zipCodeRequired = validationFields?.fields?.card?.zipcode?.required
54
+
55
+ return (
56
+ <>
57
+ <FormStripe onSubmit={handleSubmit}>
58
+ <FormRow>
59
+ {!isSplitForm ? (
60
+ <>
61
+ <CardElement
62
+ options={CARD_ELEMENT_OPTIONS}
63
+ onChange={handleChange}
64
+ />
65
+ <ErrorMessage>{error}</ErrorMessage>
66
+ </>
67
+ ) : (
68
+ <>
69
+ <CardNumberField>
70
+ <label>{t('CARD_NUMBER', 'Card number')}</label>
71
+ <CardNumberElement
72
+ options={CARD_ELEMENT_OPTIONS}
73
+ onChange={handleChange}
74
+ />
75
+ <ErrorMessage>{error}</ErrorMessage>
76
+ </CardNumberField>
77
+ <CardExpiryCvcField>
78
+ <CardExpiryField>
79
+ <label>{t('EXPIRE_DATE', 'Expire date')}</label>
80
+ <CardExpiryElement
81
+ options={CARD_ELEMENT_OPTIONS}
82
+ onChange={handleChangeExpiry}
83
+ />
84
+ <ErrorMessage>{errorExpiry}</ErrorMessage>
85
+ </CardExpiryField>
86
+ <CardCvcField>
87
+ <label>{t('CVC', 'CVC')}</label>
88
+ <CardCvcElement
89
+ options={CARD_ELEMENT_OPTIONS}
90
+ onChange={handleChangeCvc}
91
+ />
92
+ <ErrorMessage>{errorCvc}</ErrorMessage>
93
+ </CardCvcField>
94
+ </CardExpiryCvcField>
95
+ {zipCodeEnabled && (
96
+ <CardZipcodeField>
97
+ <label>{t('ZIPCODE', 'Zipcode')}</label>
98
+ <ZipcodeField
99
+ name='zipcode'
100
+ placeholder={`${t('ZIPCODE', 'Zipcode')}${zipCodeRequired ? '*' : ''}`}
101
+ options={CARD_ELEMENT_OPTIONS}
102
+ onChange={handleChange}
103
+ pattern='[0-9]'
104
+ type='number'
105
+ />
106
+ {errorZipcode && (
107
+ <ErrorMessage>{t('ZIPCODE_IS_INCOMPLETED', 'The zipcode is incompleted.')}</ErrorMessage>
108
+ )}
109
+ </CardZipcodeField>
110
+ )}
111
+ </>
112
+ )}
113
+ </FormRow>
114
+ <FormActions>
115
+ <Button
116
+ borderRadius='8px'
117
+ color='primary'
118
+ type='submit'
119
+ disabled={loading}
120
+ >
121
+ {loading ? t('LOADING', 'Loading...') : t('ADD_CARD', 'Add card')}
122
+ </Button>
123
+ </FormActions>
124
+ </FormStripe>
125
+ </>
126
+ )
127
+ }
128
+
129
+ export const CardForm = (props) => {
130
+ const cardFormProps = {
131
+ ...props,
132
+ UIComponent: CardFormUI
133
+ }
134
+ return <CardFormController {...cardFormProps} />
135
+ }
@@ -0,0 +1,135 @@
1
+ import styled, { css } from 'styled-components'
2
+
3
+ export const FormStripe = styled.form`
4
+ display: flex;
5
+ flex-direction: column;
6
+
7
+ .StripeElement,
8
+ .StripeElementIdeal {
9
+ display: block;
10
+ padding: 10px 14px;
11
+ box-shadow: rgba(50, 50, 93, 0.14902) 0px 1px 3px,
12
+ rgba(0, 0, 0, 0.0196078) 0px 1px 0px;
13
+ border-radius: 4px;
14
+ background: white;
15
+ }
16
+
17
+ .StripeElement--focus,
18
+ .StripeElementIdeal--focus {
19
+ box-shadow: rgba(50, 50, 93, 0.109804) 0px 4px 6px,
20
+ rgba(0, 0, 0, 0.0784314) 0px 1px 3px;
21
+ -webkit-transition: all 150ms ease;
22
+ transition: all 150ms ease;
23
+ }
24
+
25
+ .StripeElement.loading {
26
+ height: 41.6px;
27
+ opacity: 0.6;
28
+ }
29
+
30
+ .StripeElementIdeal {
31
+ padding: 0;
32
+ }
33
+ `
34
+
35
+ export const CardExpiryField = styled.div`
36
+ color: #ADB2B9;
37
+ `
38
+
39
+ export const CardCvcField = styled.div`
40
+ color: #ADB2B9;
41
+ `
42
+
43
+ export const CardZipcodeField = styled.div`
44
+ color: #ADB2B9;
45
+ `
46
+
47
+ export const CardNumberField = styled.div`
48
+ width: 100%;
49
+ color: #ADB2B9;
50
+ `
51
+ export const CardExpiryCvcField = styled.div`
52
+ display: grid;
53
+ grid-template-columns: repeat(2, 1fr);
54
+ grid-gap: 10px;
55
+ `
56
+
57
+ export const FormRow = styled.div`
58
+ input {
59
+ display: block;
60
+ border: none;
61
+ font-size: 18px;
62
+ margin: 10px 0 20px 0;
63
+ max-width: 100%;
64
+ padding: 10px 14px;
65
+ box-shadow: rgba(50, 50, 93, 0.14902) 0px 1px 3px,
66
+ rgba(0, 0, 0, 0.0196078) 0px 1px 0px;
67
+ border-radius: 4px;
68
+ background: white;
69
+ color: #424770;
70
+ letter-spacing: 0.025em;
71
+ width: 500px;
72
+ }
73
+
74
+ input::placeholder {
75
+ color: #aab7c4;
76
+ }
77
+ `
78
+
79
+ export const ErrorMessage = styled.div`
80
+ font-size: 16px;
81
+ font-weight: bold;
82
+ margin-top: 10px;
83
+ margin-bottom: 20px;
84
+ color: #D81212;
85
+ margin: 10px 0px 0px 10px;
86
+ ${props => props.theme?.rtl && css`
87
+ margin: 10px 10px 0px 0px
88
+ `}
89
+ `
90
+
91
+ export const FormActions = styled.div`
92
+ width: 100%;
93
+ margin-top: 20px;
94
+
95
+ button {
96
+ height: 44px;
97
+ width: 100%;
98
+ border-radius: 7.6px;
99
+
100
+ &:disabled {
101
+ opacity: 0.5;
102
+ }
103
+ }
104
+ `
105
+
106
+ export const ZipcodeField = styled.input`
107
+ font-weight: 500;
108
+ font-size: 16px;
109
+ box-sizing: border-box;
110
+ width: 100% !important;
111
+ &:-webkit-autofill {
112
+ color: '#fce883'
113
+ }
114
+ &::placeholder {
115
+ font-weight: 500
116
+ }
117
+ &:focus(){
118
+ box-shadow: rgba(50, 50, 93, 0.109804) 0px 4px 6px,
119
+ rgba(0, 0, 0, 0.0784314) 0px 1px 3px;
120
+ -webkit-transition: all 150ms ease;
121
+ transition: all 150ms ease;
122
+ }
123
+
124
+ &::-webkit-outer-spin-button,
125
+ &::-webkit-inner-spin-button {
126
+ -webkit-appearance: none;
127
+ margin: 0;
128
+ }
129
+
130
+ /* Firefox */
131
+ &[type=number] {
132
+ -moz-appearance: textfield;
133
+ }
134
+
135
+ `
@@ -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
+ `