@sikka/hawa 0.0.105 → 0.0.106
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/dist/styles.css +110 -30
- package/es/blocks/Misc/EmptyState.d.ts +4 -0
- package/es/blocks/Misc/index.d.ts +1 -0
- package/es/elements/HawaCardInput.d.ts +25 -0
- package/es/elements/HawaTimeline.d.ts +8 -0
- package/es/elements/index.d.ts +3 -1
- package/es/index.es.js +1 -1
- package/es/layout/HawaContainer.d.ts +2 -0
- package/lib/blocks/Misc/EmptyState.d.ts +4 -0
- package/lib/blocks/Misc/index.d.ts +1 -0
- package/lib/elements/HawaCardInput.d.ts +25 -0
- package/lib/elements/HawaTimeline.d.ts +8 -0
- package/lib/elements/index.d.ts +3 -1
- package/lib/index.js +1 -1
- package/lib/layout/HawaContainer.d.ts +2 -0
- package/package.json +1 -1
- package/src/blocks/Misc/EmptyState.tsx +24 -0
- package/src/blocks/Misc/NotFound.tsx +15 -12
- package/src/blocks/Misc/index.ts +2 -1
- package/src/elements/HawaAccordian.tsx +21 -10
- package/src/elements/HawaCardInput.tsx +317 -0
- package/src/elements/HawaTimeline.tsx +82 -0
- package/src/elements/index.ts +33 -30
- package/src/layout/HawaContainer.tsx +18 -2
- package/src/styles.css +110 -30
- package/tsconfig.json +30 -25
|
@@ -2,6 +2,8 @@ import React from "react";
|
|
|
2
2
|
type ContainerTypes = {
|
|
3
3
|
maxWidth?: "full" | "small" | "normal";
|
|
4
4
|
children: React.ReactNode;
|
|
5
|
+
variant?: "contained" | "outlined";
|
|
6
|
+
centered?: boolean;
|
|
5
7
|
};
|
|
6
8
|
export declare const HawaContainer: React.FunctionComponent<ContainerTypes>;
|
|
7
9
|
export {};
|
package/package.json
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from "react"
|
|
2
|
+
import { HawaButton } from "../../elements"
|
|
3
|
+
import { HawaContainer } from "../../layout"
|
|
4
|
+
import { FaCheck } from "react-icons/fa"
|
|
5
|
+
type TEmptyState = {}
|
|
6
|
+
|
|
7
|
+
export const EmptyState: React.FunctionComponent<TEmptyState> = (props) => {
|
|
8
|
+
return (
|
|
9
|
+
<HawaContainer variant="outlined" centered={true}>
|
|
10
|
+
<div className="flex h-20 w-20 flex-col items-center justify-center rounded-3xl bg-primary-400 text-6xl font-bold">
|
|
11
|
+
<FaCheck size={30} />
|
|
12
|
+
</div>
|
|
13
|
+
<div className="m-2 text-center text-xl font-bold">
|
|
14
|
+
You're all caught up
|
|
15
|
+
</div>
|
|
16
|
+
<div className="text-center">
|
|
17
|
+
If you're lost please contact us help@sikka.io{" "}
|
|
18
|
+
</div>
|
|
19
|
+
<HawaButton color="primary" width="full">
|
|
20
|
+
Action
|
|
21
|
+
</HawaButton>
|
|
22
|
+
</HawaContainer>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
@@ -6,23 +6,26 @@ type NotFoundTypes = {}
|
|
|
6
6
|
|
|
7
7
|
export const NotFound: React.FunctionComponent<NotFoundTypes> = (props) => {
|
|
8
8
|
return (
|
|
9
|
-
<
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
<HawaContainer variant="outlined">
|
|
10
|
+
<div
|
|
11
|
+
// style={{
|
|
12
|
+
// display: "flex",
|
|
13
|
+
// flexDirection: "column",
|
|
14
|
+
// alignItems: "center",
|
|
15
|
+
// }}
|
|
16
|
+
className="flex flex-col items-center"
|
|
17
|
+
>
|
|
18
|
+
<div className="text-center text-6xl font-bold">404</div>
|
|
19
|
+
<div className="m-2 text-center text-xl font-bold">Page Not Found</div>
|
|
19
20
|
<div className="text-center">
|
|
20
21
|
If you're lost please contact us help@sikka.io{" "}
|
|
21
22
|
</div>
|
|
23
|
+
{/* <div className="flex flex-col content-center items-stretch bg-red-200"> */}
|
|
22
24
|
<HawaButton color="primary" width="full">
|
|
23
25
|
Home
|
|
24
26
|
</HawaButton>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
{/* </div> */}
|
|
28
|
+
</div>
|
|
29
|
+
</HawaContainer>
|
|
27
30
|
)
|
|
28
31
|
}
|
package/src/blocks/Misc/index.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export * from "./NotFound"
|
|
1
|
+
export * from "./NotFound"
|
|
2
|
+
export * from "./EmptyState"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import clsx from "clsx"
|
|
1
2
|
import React from "react"
|
|
2
3
|
|
|
3
4
|
type AccordionItemTypes = {
|
|
@@ -18,12 +19,17 @@ const AccordionItem: React.FunctionComponent<AccordionItemTypes> = (props) => {
|
|
|
18
19
|
"p-5 font-light border border-b-xl border-gray-200 dark:border-gray-700 dark:bg-gray-900"
|
|
19
20
|
let accPaperRounded =
|
|
20
21
|
"p-5 font-light border border-b-xl rounded-b-xl border-gray-200 dark:border-gray-700 dark:bg-gray-900"
|
|
22
|
+
|
|
21
23
|
return (
|
|
22
|
-
<div>
|
|
24
|
+
<div className="rounded-lg ">
|
|
23
25
|
<h2 id={"accordion-collapse-heading-" + props.count}>
|
|
24
26
|
<button
|
|
25
27
|
type="button"
|
|
26
|
-
className={
|
|
28
|
+
className={clsx(
|
|
29
|
+
// props.count === 0 ? roundedTop : noRounding,
|
|
30
|
+
"flex w-full items-center justify-between border border-gray-200 bg-gray-100 p-5 text-left font-medium text-gray-900 hover:bg-gray-100 focus:ring-4 focus:ring-gray-200 dark:border-gray-700 dark:bg-gray-800 dark:text-white dark:hover:bg-gray-800 dark:focus:ring-gray-800",
|
|
31
|
+
!collapse ? "rounded-t-lg" : "rounded-lg"
|
|
32
|
+
)}
|
|
27
33
|
onClick={() => setCollapse(!collapse)}
|
|
28
34
|
data-accordion-target={"#accordion-collapse-body-" + props.count}
|
|
29
35
|
aria-expanded="true"
|
|
@@ -32,7 +38,7 @@ const AccordionItem: React.FunctionComponent<AccordionItemTypes> = (props) => {
|
|
|
32
38
|
<span>{props.title}</span>
|
|
33
39
|
<svg
|
|
34
40
|
data-accordion-icon=""
|
|
35
|
-
className={`h-6 w-6 ${collapse ? "" : "rotate-180"} shrink-0`}
|
|
41
|
+
className={`h-6 w-6 ${collapse ? "" : "rotate-180"} shrink-0 transition-all`}
|
|
36
42
|
fill="currentColor"
|
|
37
43
|
viewBox="0 0 20 20"
|
|
38
44
|
xmlns="http://www.w3.org/2000/svg"
|
|
@@ -47,14 +53,15 @@ const AccordionItem: React.FunctionComponent<AccordionItemTypes> = (props) => {
|
|
|
47
53
|
</h2>
|
|
48
54
|
<div
|
|
49
55
|
id={"accordion-collapse-body-" + props.count}
|
|
50
|
-
className={
|
|
56
|
+
className={clsx(
|
|
57
|
+
collapse ? "invisible hidden" : "visible",
|
|
58
|
+
"border-b-xl rounded-b-xl border border-gray-200 p-5 font-light dark:border-gray-700 dark:bg-gray-900"
|
|
59
|
+
)}
|
|
51
60
|
aria-labelledby={"accordion-collapse-heading-" + props.count}
|
|
52
61
|
>
|
|
53
|
-
<div className={props.count === -1 ? accPaperRounded : accPaper}>
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
</p>
|
|
57
|
-
</div>
|
|
62
|
+
{/* <div className={props.count === -1 ? accPaperRounded : accPaper}> */}
|
|
63
|
+
<p className="mb-2 text-gray-500 dark:text-gray-400">{props.content}</p>
|
|
64
|
+
{/* </div> */}
|
|
58
65
|
</div>
|
|
59
66
|
</div>
|
|
60
67
|
)
|
|
@@ -66,7 +73,11 @@ export const HawaAccordian: React.FunctionComponent<AccordionTypes> = (
|
|
|
66
73
|
props
|
|
67
74
|
) => {
|
|
68
75
|
return (
|
|
69
|
-
<div
|
|
76
|
+
<div
|
|
77
|
+
id="accordion-collapse"
|
|
78
|
+
data-accordion="collapse"
|
|
79
|
+
className="flex flex-col gap-3"
|
|
80
|
+
>
|
|
70
81
|
{props.content.map((acc: any, i: any) => {
|
|
71
82
|
return (
|
|
72
83
|
<AccordionItem
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import React, { useState } from "react"
|
|
2
|
+
import { HawaButton } from "./HawaButton"
|
|
3
|
+
|
|
4
|
+
const CARDS = {
|
|
5
|
+
mada: "^(4(0(0861|1757|3024|6136|6996|7(197|395)|9201)|1(0621|0685|2565|7633|9593)|2(281(7|8|9)|0(132)|1(141)|6(897)|8(1|331|67(1|2|3)))|3(1361|2328|4107|9954)|4(0(533|647|795)|5564|6(393|404|672))|5(5(036|708)|7865|7997|8456)|6(2220|854(0|1|2|3))|7(4491)|8(301(0|1|2)|4783|609(4|5|6)|931(7|8|9))|93428)|5(0(4300|6968|8160)|13213|2(0058|1076|4(130|514)|9(415|741))|3(0060|0906|1095|1196|2013|5(825|989)|6023|7767|9931)|4(3(085|357)|9760)|5(4180|7606|8563|8848)|8(5265|8(8(4(5|6|7|8|9)|5(0|1))|98(2|3))|9(005|206)))|6(0(4906|5141)|36120)|9682(0(1|2|3|4|5|6|7|8|9)|1(0|1)))",
|
|
6
|
+
visa: "^4",
|
|
7
|
+
amex: "^(34|37)",
|
|
8
|
+
mastercard: "^5[1-5]",
|
|
9
|
+
discover: "^6011",
|
|
10
|
+
unionpay: "^62",
|
|
11
|
+
troy: "^9792",
|
|
12
|
+
diners: "^(30[0-5]|36)",
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const currentYear = new Date().getFullYear()
|
|
16
|
+
const monthsArr = Array.from({ length: 12 }, (x, i) => {
|
|
17
|
+
const month = i + 1
|
|
18
|
+
return month <= 9 ? "0" + month : month
|
|
19
|
+
})
|
|
20
|
+
const yearsArr = Array.from({ length: 9 }, (_x, i) => currentYear + i)
|
|
21
|
+
|
|
22
|
+
export const HawaCardInput = ({
|
|
23
|
+
cardHolder,
|
|
24
|
+
cardMonth,
|
|
25
|
+
cardYear,
|
|
26
|
+
cardCvv,
|
|
27
|
+
rememberMe,
|
|
28
|
+
onUpdateState,
|
|
29
|
+
cardNumberRef,
|
|
30
|
+
cardHolderRef,
|
|
31
|
+
cardDateRef,
|
|
32
|
+
cardCvvRef,
|
|
33
|
+
rememberMeRef,
|
|
34
|
+
onCardInputFocus,
|
|
35
|
+
onCardInputBlur,
|
|
36
|
+
children,
|
|
37
|
+
handlePaymentPayfort,
|
|
38
|
+
selectedPaymentMethod,
|
|
39
|
+
isRegister,
|
|
40
|
+
accessCode,
|
|
41
|
+
shaRequestPassphrase,
|
|
42
|
+
transaction,
|
|
43
|
+
signature,
|
|
44
|
+
isCheckout,
|
|
45
|
+
}) => {
|
|
46
|
+
// const token = getToken()
|
|
47
|
+
// const router = useRouter()
|
|
48
|
+
// const formRegister = useRef()
|
|
49
|
+
// const [loading, setLoading] = useState(false)
|
|
50
|
+
const [cardNumber, setCardNumber] = useState("")
|
|
51
|
+
const [expiryDate, setExpiryDate] = useState("")
|
|
52
|
+
const [binCardType, setBinCardType] = useState("")
|
|
53
|
+
// const [tokenName, setTokenName] = useState("")
|
|
54
|
+
// const [registeredCard, setRegisteredCard] = useState("")
|
|
55
|
+
const [registerSignature, setRegisterSignature] = useState("")
|
|
56
|
+
const [card, setCard] = useState("")
|
|
57
|
+
// const [payfortForm, setPayfortForm] = useState("")
|
|
58
|
+
// const classes = useStyles()
|
|
59
|
+
// const [value, setValue] = React.useState("")
|
|
60
|
+
// const [error, setError] = React.useState(false)
|
|
61
|
+
// const [helperText, setHelperText] = React.useState("Choose wisely")
|
|
62
|
+
|
|
63
|
+
// const { data: allCards, loading: loadingCards } = useQuery(getCards(), {
|
|
64
|
+
// variables: { userId: token.User._id },
|
|
65
|
+
// })
|
|
66
|
+
|
|
67
|
+
// const { t, lang } = useTranslation("common")
|
|
68
|
+
|
|
69
|
+
const cardType = (cardNumber) => {
|
|
70
|
+
const number = cardNumber.replace(/\D/g, "")
|
|
71
|
+
let re
|
|
72
|
+
for (const [card, pattern] of Object.entries(CARDS)) {
|
|
73
|
+
re = new RegExp(pattern)
|
|
74
|
+
console.log("number=", number)
|
|
75
|
+
console.log("card=", card)
|
|
76
|
+
console.log("pattern=", pattern)
|
|
77
|
+
console.log("res=", re.test(number))
|
|
78
|
+
if (number.match(re) != null) {
|
|
79
|
+
return card
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return "" // default type
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// TODO: We can improve the regex check with a better approach like in the card component.
|
|
87
|
+
const onCardNumberChange = (event) => {
|
|
88
|
+
let { value, name } = event.target
|
|
89
|
+
let cardNumber = value
|
|
90
|
+
value = value.replace(/\D/g, "")
|
|
91
|
+
if (/^3[47]\d{0,13}$/.test(value)) {
|
|
92
|
+
cardNumber = value
|
|
93
|
+
.replace(/(\d{4})/, "$1 ")
|
|
94
|
+
.replace(/(\d{4}) (\d{6})/, "$1 $2 ")
|
|
95
|
+
} else if (/^3(?:0[0-5]|[68]\d)\d{0,11}$/.test(value)) {
|
|
96
|
+
// diner's club, 14 digits
|
|
97
|
+
cardNumber = value
|
|
98
|
+
.replace(/(\d{4})/, "$1 ")
|
|
99
|
+
.replace(/(\d{4}) (\d{6})/, "$1 $2 ")
|
|
100
|
+
} else if (/^\d{0,16}$/.test(value)) {
|
|
101
|
+
// regular cc number, 16 digits
|
|
102
|
+
cardNumber = value
|
|
103
|
+
.replace(/(\d{4})/, "$1 ")
|
|
104
|
+
.replace(/(\d{4}) (\d{4})/, "$1 $2 ")
|
|
105
|
+
.replace(/(\d{4}) (\d{4}) (\d{4})/, "$1 $2 $3 ")
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
setCardNumber(cardNumber.trimRight())
|
|
109
|
+
setBinCardType(cardType(cardNumber.trimRight()))
|
|
110
|
+
onUpdateState(name, cardNumber)
|
|
111
|
+
}
|
|
112
|
+
const handleFormChange = (event) => {
|
|
113
|
+
const { name, value } = event.target
|
|
114
|
+
if (name === "rememberMe") {
|
|
115
|
+
onUpdateState(name, !rememberMe)
|
|
116
|
+
} else {
|
|
117
|
+
onUpdateState(name, value)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<div>
|
|
123
|
+
<div>
|
|
124
|
+
<div>{children}</div>
|
|
125
|
+
<div>
|
|
126
|
+
<div className="w-fit bg-red-200 p-2">
|
|
127
|
+
<label htmlFor="cardNumber" className="relative">
|
|
128
|
+
Card Number
|
|
129
|
+
<input
|
|
130
|
+
type="tel"
|
|
131
|
+
name="cardNumber"
|
|
132
|
+
className="mb-0 block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500"
|
|
133
|
+
autoComplete="off"
|
|
134
|
+
onChange={onCardNumberChange}
|
|
135
|
+
maxLength={19}
|
|
136
|
+
ref={cardNumberRef}
|
|
137
|
+
onFocus={(e) => onCardInputFocus(e, "cardNumber")}
|
|
138
|
+
onBlur={onCardInputBlur}
|
|
139
|
+
value={cardNumber}
|
|
140
|
+
/>
|
|
141
|
+
{/* {binCardType && (
|
|
142
|
+
<img className="bg-red-700" src={`/${binCardType}.png`} />
|
|
143
|
+
)} */}
|
|
144
|
+
<img
|
|
145
|
+
className="absolute right-2 top-1/2 translate-y-1/2 bg-red-700"
|
|
146
|
+
src={`../Assets/images/card-type/${binCardType}.png`}
|
|
147
|
+
/>
|
|
148
|
+
</label>
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
<div className="flex w-fit flex-col bg-red-300 p-2">
|
|
152
|
+
<label htmlFor="cardName" className="card-input__label">
|
|
153
|
+
Card Holder{" "}
|
|
154
|
+
</label>
|
|
155
|
+
<input
|
|
156
|
+
type="text"
|
|
157
|
+
// className="card-input__input"
|
|
158
|
+
className="mb-0 block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500"
|
|
159
|
+
autoComplete="off"
|
|
160
|
+
name="cardHolder"
|
|
161
|
+
onChange={handleFormChange}
|
|
162
|
+
ref={cardHolderRef}
|
|
163
|
+
onFocus={(e) => onCardInputFocus(e, "cardHolder")}
|
|
164
|
+
onBlur={onCardInputBlur}
|
|
165
|
+
/>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
<div className="flex w-fit flex-col bg-red-400 p-2">
|
|
169
|
+
<div className="flex flex-col">
|
|
170
|
+
<label htmlFor="cardMonth" className="card-input__label">
|
|
171
|
+
Expiration
|
|
172
|
+
</label>
|
|
173
|
+
<div className="flex flex-row gap-2">
|
|
174
|
+
<select
|
|
175
|
+
className="rounded-lg p-2.5"
|
|
176
|
+
value={cardMonth}
|
|
177
|
+
name="cardMonth"
|
|
178
|
+
onChange={handleFormChange}
|
|
179
|
+
ref={cardDateRef}
|
|
180
|
+
onFocus={(e) => onCardInputFocus(e, "cardDate")}
|
|
181
|
+
onBlur={onCardInputBlur}
|
|
182
|
+
>
|
|
183
|
+
<option value="" disabled>
|
|
184
|
+
Month
|
|
185
|
+
</option>
|
|
186
|
+
|
|
187
|
+
{monthsArr.map((val, index) => (
|
|
188
|
+
<option key={index} value={val}>
|
|
189
|
+
{val}
|
|
190
|
+
</option>
|
|
191
|
+
))}
|
|
192
|
+
</select>
|
|
193
|
+
<select
|
|
194
|
+
name="cardYear"
|
|
195
|
+
className="rounded-lg p-2.5"
|
|
196
|
+
value={cardYear}
|
|
197
|
+
onChange={handleFormChange}
|
|
198
|
+
onFocus={(e) => onCardInputFocus(e, "cardDate")}
|
|
199
|
+
onBlur={onCardInputBlur}
|
|
200
|
+
>
|
|
201
|
+
<option value="" disabled>
|
|
202
|
+
Year
|
|
203
|
+
</option>
|
|
204
|
+
|
|
205
|
+
{yearsArr.map((val, index) => (
|
|
206
|
+
<option key={index} value={val}>
|
|
207
|
+
{val}
|
|
208
|
+
</option>
|
|
209
|
+
))}
|
|
210
|
+
</select>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
<div className="flex w-fit flex-col bg-red-500 p-2">
|
|
215
|
+
<label htmlFor="cardCvv">CCV</label>
|
|
216
|
+
<input
|
|
217
|
+
type="tel"
|
|
218
|
+
className="mb-0 block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500"
|
|
219
|
+
maxLength={4}
|
|
220
|
+
autoComplete="off"
|
|
221
|
+
name="cardCvv"
|
|
222
|
+
onChange={handleFormChange}
|
|
223
|
+
// onFocus={onCvvFocus}
|
|
224
|
+
// onBlur={onCvvBlur}
|
|
225
|
+
ref={cardCvvRef}
|
|
226
|
+
/>
|
|
227
|
+
</div>
|
|
228
|
+
{isCheckout && (
|
|
229
|
+
<div className="card-input">
|
|
230
|
+
<label htmlFor="rememberMe" className="card-input__label">
|
|
231
|
+
<input
|
|
232
|
+
type="checkbox"
|
|
233
|
+
autoComplete="off"
|
|
234
|
+
name="rememberMe"
|
|
235
|
+
checked={rememberMe}
|
|
236
|
+
onChange={handleFormChange}
|
|
237
|
+
ref={rememberMeRef}
|
|
238
|
+
/>
|
|
239
|
+
Store Payment Details{" "}
|
|
240
|
+
</label>
|
|
241
|
+
</div>
|
|
242
|
+
)}
|
|
243
|
+
<div className="card-input" style={{ marginTop: "20px" }}>
|
|
244
|
+
<form
|
|
245
|
+
onSubmit={(e) => e.preventDefault()}
|
|
246
|
+
// ref={(ref) => setPayfortForm(ref)}
|
|
247
|
+
id="formSendToAps"
|
|
248
|
+
action={`${process.env.NEXT_PUBLIC_QAWAIM_PAYFORT_ENVIRONMENT_URL}`}
|
|
249
|
+
method="POST"
|
|
250
|
+
>
|
|
251
|
+
<input type="hidden" name="access_code" value={accessCode} />
|
|
252
|
+
<input
|
|
253
|
+
type="hidden"
|
|
254
|
+
name="merchant_identifier"
|
|
255
|
+
value={`${process.env.NEXT_PUBLIC_QAWAIM_PAYFORT_MERCHANT_ID}`}
|
|
256
|
+
/>
|
|
257
|
+
<input type="hidden" name="language" value={"en"} />
|
|
258
|
+
<input
|
|
259
|
+
type="hidden"
|
|
260
|
+
name="card_number"
|
|
261
|
+
value={cardNumber.replace(/\s/g, "")}
|
|
262
|
+
/>
|
|
263
|
+
<input type="hidden" name="expiry_date" value={expiryDate} />
|
|
264
|
+
<input
|
|
265
|
+
type="hidden"
|
|
266
|
+
name="signature"
|
|
267
|
+
value={isCheckout ? signature : registerSignature}
|
|
268
|
+
/>
|
|
269
|
+
<input type="hidden" name="card_holder_name" value={cardHolder} />
|
|
270
|
+
<input
|
|
271
|
+
type="hidden"
|
|
272
|
+
name="merchant_reference"
|
|
273
|
+
// value={isCheckout ? transaction?._id : card?._id}
|
|
274
|
+
/>
|
|
275
|
+
<input
|
|
276
|
+
type="hidden"
|
|
277
|
+
name="service_command"
|
|
278
|
+
value={isCheckout ? "TOKENIZATION" : "CREATE_TOKEN"}
|
|
279
|
+
/>
|
|
280
|
+
<input
|
|
281
|
+
type="hidden"
|
|
282
|
+
name="return_url"
|
|
283
|
+
// value={
|
|
284
|
+
// isCheckout
|
|
285
|
+
// ? `${process.env.NEXT_PUBLIC_QAWAIM_USER_PORTAL_URL}/aps_online/response`
|
|
286
|
+
// : `${process.env.NEXT_PUBLIC_QAWAIM_USER_PORTAL_URL}/aps_online/register`
|
|
287
|
+
// }
|
|
288
|
+
/>
|
|
289
|
+
{!isCheckout && (
|
|
290
|
+
<input
|
|
291
|
+
type="hidden"
|
|
292
|
+
name="currency"
|
|
293
|
+
// value={token.User.default_currency?.toUpperCase()}
|
|
294
|
+
/>
|
|
295
|
+
)}
|
|
296
|
+
{isCheckout && (
|
|
297
|
+
<>
|
|
298
|
+
<input
|
|
299
|
+
type="hidden"
|
|
300
|
+
name="card_security_code"
|
|
301
|
+
value={cardCvv}
|
|
302
|
+
/>
|
|
303
|
+
|
|
304
|
+
{/* {tokenName && (
|
|
305
|
+
<input type="hidden" name="token_name" value={tokenName} />
|
|
306
|
+
)} */}
|
|
307
|
+
</>
|
|
308
|
+
)}
|
|
309
|
+
|
|
310
|
+
<HawaButton>Pay</HawaButton>
|
|
311
|
+
</form>
|
|
312
|
+
</div>
|
|
313
|
+
</div>
|
|
314
|
+
</div>
|
|
315
|
+
</div>
|
|
316
|
+
)
|
|
317
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React from "react"
|
|
2
|
+
import clsx from "clsx"
|
|
3
|
+
|
|
4
|
+
type THawaTimeline = {
|
|
5
|
+
steps: any[any]
|
|
6
|
+
currentStep: any
|
|
7
|
+
orientation: "vertical" | "horizontal"
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const HawaTimeline: React.FunctionComponent<THawaTimeline> = ({
|
|
11
|
+
orientation = "horizontal",
|
|
12
|
+
...props
|
|
13
|
+
}) => {
|
|
14
|
+
let orientationStyles = {
|
|
15
|
+
vertical: "flex flex-col items-start w-fit",
|
|
16
|
+
horizontal: "flex flex-row items-baseline",
|
|
17
|
+
}
|
|
18
|
+
let lineStyles = {
|
|
19
|
+
vertical: {
|
|
20
|
+
default: "w-1 h-32 rounded-lg bg-primary-200 ml-6 my-2",
|
|
21
|
+
selected: "w-1 h-32 rounded-lg bg-primary-400 ml-6 my-2",
|
|
22
|
+
},
|
|
23
|
+
horizontal: {
|
|
24
|
+
default: "h-0.5 w-full rounded-lg bg-primary-200",
|
|
25
|
+
selected: "h-0.5 w-full rounded-lg bg-primary-400",
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
return (
|
|
29
|
+
<div className={clsx(orientationStyles[orientation])}>
|
|
30
|
+
{props.steps.map((step: any, i: number) => {
|
|
31
|
+
if (i == 0) {
|
|
32
|
+
return (
|
|
33
|
+
<TimelineStep
|
|
34
|
+
orientation={orientation}
|
|
35
|
+
current={i + 1 <= props.currentStep}
|
|
36
|
+
stepName={step}
|
|
37
|
+
stepNumber={i + 1}
|
|
38
|
+
/>
|
|
39
|
+
)
|
|
40
|
+
} else {
|
|
41
|
+
return (
|
|
42
|
+
<>
|
|
43
|
+
<div
|
|
44
|
+
className={clsx(
|
|
45
|
+
i == props.currentStep
|
|
46
|
+
? lineStyles[orientation].default
|
|
47
|
+
: lineStyles[orientation].selected
|
|
48
|
+
)}
|
|
49
|
+
></div>
|
|
50
|
+
<TimelineStep
|
|
51
|
+
orientation={orientation}
|
|
52
|
+
current={i + 1 <= props.currentStep}
|
|
53
|
+
stepName={step}
|
|
54
|
+
stepNumber={i + 1}
|
|
55
|
+
/>
|
|
56
|
+
</>
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
})}
|
|
60
|
+
</div>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const TimelineStep = (props) => (
|
|
65
|
+
<div
|
|
66
|
+
className={
|
|
67
|
+
props.orientation === "vertical"
|
|
68
|
+
? "flex w-full flex-row items-center"
|
|
69
|
+
: "flex w-fit flex-col items-center justify-center p-2"
|
|
70
|
+
}
|
|
71
|
+
>
|
|
72
|
+
<div
|
|
73
|
+
className={clsx(
|
|
74
|
+
"m-2 mr-4 flex h-10 w-10 items-center justify-center rounded-xl ring-2 ring-primary-200 ring-offset-2",
|
|
75
|
+
props.current ? "bg-primary-500 text-white" : "bg-primary-200"
|
|
76
|
+
)}
|
|
77
|
+
>
|
|
78
|
+
{props.stepNumber}
|
|
79
|
+
</div>
|
|
80
|
+
<div className="whitespace-nowrap">{props.stepName}</div>
|
|
81
|
+
</div>
|
|
82
|
+
)
|
package/src/elements/index.ts
CHANGED
|
@@ -1,32 +1,35 @@
|
|
|
1
|
-
export * from "./HawaSnackbar"
|
|
2
|
-
export * from "./HawaSwitch"
|
|
3
|
-
export * from "./HawaCheckbox"
|
|
4
|
-
export * from "./HawaPanelTabs"
|
|
5
|
-
export * from "./HawaChip"
|
|
6
|
-
export * from "./HawaSettingsRow"
|
|
7
|
-
export * from "./HawaSelect"
|
|
8
|
-
export * from "./HawaRange"
|
|
9
|
-
export * from "./
|
|
10
|
-
export * from "./
|
|
11
|
-
export * from "./
|
|
12
|
-
export * from "./
|
|
13
|
-
export * from "./
|
|
14
|
-
export * from "./
|
|
15
|
-
export * from "./
|
|
16
|
-
export * from "./
|
|
17
|
-
export * from "./
|
|
18
|
-
export * from "./
|
|
19
|
-
export * from "./
|
|
20
|
-
export * from "./
|
|
21
|
-
export * from "./
|
|
22
|
-
export * from "./
|
|
23
|
-
export * from "./
|
|
24
|
-
export * from "./
|
|
25
|
-
export * from "./
|
|
1
|
+
export * from "./HawaSnackbar"
|
|
2
|
+
export * from "./HawaSwitch"
|
|
3
|
+
export * from "./HawaCheckbox"
|
|
4
|
+
export * from "./HawaPanelTabs"
|
|
5
|
+
export * from "./HawaChip"
|
|
6
|
+
export * from "./HawaSettingsRow"
|
|
7
|
+
export * from "./HawaSelect"
|
|
8
|
+
export * from "./HawaRange"
|
|
9
|
+
export * from "./HawaTypography"
|
|
10
|
+
export * from "./HawaAlert"
|
|
11
|
+
export * from "./HawaTable"
|
|
12
|
+
export * from "./HawaColorPicker"
|
|
13
|
+
export * from "./HawaSearchBar"
|
|
14
|
+
export * from "./HawaAccordian"
|
|
15
|
+
export * from "./DragDropImages"
|
|
16
|
+
export * from "./DraggableCard"
|
|
17
|
+
export * from "./HawaPhoneInput"
|
|
18
|
+
export * from "./HawaDrawerItem"
|
|
19
|
+
export * from "./HawaTooltip"
|
|
20
|
+
export * from "./HawaTabs"
|
|
21
|
+
export * from "./HawaModal"
|
|
22
|
+
export * from "./HawaMenu"
|
|
23
|
+
export * from "./HawaDrawer"
|
|
24
|
+
export * from "./HawaCopyrights"
|
|
25
|
+
export * from "./HawaTimeline"
|
|
26
|
+
// Inputs
|
|
27
|
+
export * from "./HawaTextField"
|
|
28
|
+
export * from "./HawaCardInput"
|
|
26
29
|
// Cards
|
|
27
|
-
export * from "./HawaItemCard"
|
|
28
|
-
export * from "./HawaPricingCard"
|
|
29
|
-
export * from "./HawaAdCard"
|
|
30
|
+
export * from "./HawaItemCard"
|
|
31
|
+
export * from "./HawaPricingCard"
|
|
32
|
+
export * from "./HawaAdCard"
|
|
30
33
|
//Buttons
|
|
31
|
-
export * from "./HawaButton"
|
|
32
|
-
export * from "./HawaLogoButton"
|
|
34
|
+
export * from "./HawaButton"
|
|
35
|
+
export * from "./HawaLogoButton"
|
|
@@ -4,20 +4,36 @@ import clsx from "clsx"
|
|
|
4
4
|
type ContainerTypes = {
|
|
5
5
|
maxWidth?: "full" | "small" | "normal"
|
|
6
6
|
children: React.ReactNode
|
|
7
|
+
variant?: "contained" | "outlined"
|
|
8
|
+
centered?: boolean
|
|
7
9
|
}
|
|
8
10
|
export const HawaContainer: React.FunctionComponent<ContainerTypes> = ({
|
|
9
11
|
maxWidth = "normal",
|
|
12
|
+
variant = "contained",
|
|
13
|
+
centered = false,
|
|
10
14
|
...props
|
|
11
15
|
}) => {
|
|
12
16
|
let defaultStyle =
|
|
13
|
-
"flex w-full max-w-sm flex-col rounded-xl
|
|
17
|
+
"flex w-full max-w-sm flex-col rounded-xl p-4 dark:bg-gray-600"
|
|
14
18
|
let maxWidthStyles: any = {
|
|
15
19
|
full: "md:max-w-xl",
|
|
16
20
|
small: "md:max-w-sm w-1/3 min-w-min",
|
|
17
21
|
normal: "md:max-w-md",
|
|
18
22
|
}
|
|
23
|
+
let variantStyles = {
|
|
24
|
+
contained: "bg-primary-300",
|
|
25
|
+
outlined: "bg-transparent border-2 border-primary-200 w-fit",
|
|
26
|
+
}
|
|
27
|
+
|
|
19
28
|
return (
|
|
20
|
-
<div
|
|
29
|
+
<div
|
|
30
|
+
className={clsx(
|
|
31
|
+
defaultStyle,
|
|
32
|
+
maxWidthStyles[maxWidth],
|
|
33
|
+
variantStyles[variant],
|
|
34
|
+
centered ? "flex items-center text-center" : ""
|
|
35
|
+
)}
|
|
36
|
+
>
|
|
21
37
|
{props.children}
|
|
22
38
|
</div>
|
|
23
39
|
)
|