herald-exchange-onramp_offramp-widget 1.0.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 (37) hide show
  1. package/.babelrc +3 -0
  2. package/Readme.md +166 -0
  3. package/dist/index.css +1 -0
  4. package/dist/index.d.ts +24 -0
  5. package/dist/index.js +47 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.mjs +47 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +59 -0
  10. package/rollup.config.js +90 -0
  11. package/src/assets/css/style.module.css +1435 -0
  12. package/src/assets/icons-one.png +0 -0
  13. package/src/assets/react.svg +1 -0
  14. package/src/components/ButtonStepper.tsx +144 -0
  15. package/src/components/BuyField.tsx +632 -0
  16. package/src/components/CommonCenterLoader.tsx +119 -0
  17. package/src/components/CustomeSelect.tsx +180 -0
  18. package/src/components/DotLoader.tsx +8 -0
  19. package/src/components/NewBuyField.tsx +687 -0
  20. package/src/components/SellAdminCryptoAccount.tsx +601 -0
  21. package/src/components/SellField.tsx +712 -0
  22. package/src/components/WidgetBankDetails.tsx +612 -0
  23. package/src/components/WidgetComponent.tsx +49 -0
  24. package/src/components/WidgetContent.tsx +71 -0
  25. package/src/components/WidgetSuccesDetails.tsx +113 -0
  26. package/src/components/api.ts +59 -0
  27. package/src/components/chains.ts +319 -0
  28. package/src/components/images.d.ts +5 -0
  29. package/src/components/loader.tsx +14 -0
  30. package/src/components/style.module.css.d.ts +4 -0
  31. package/src/components/toast.tsx +51 -0
  32. package/src/components/types.ts +237 -0
  33. package/src/components/utils.ts +17 -0
  34. package/src/hooks/toastProvider.tsx +64 -0
  35. package/src/hooks/useSocketExchange.tsx +48 -0
  36. package/src/index.ts +3 -0
  37. package/tsconfig.json +118 -0
@@ -0,0 +1,612 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import CustomSelect from "./CustomeSelect";
3
+ import { useToast } from "../hooks/toastProvider";
4
+ import { handleApiCall } from "./api";
5
+ import type { tokenSellDataType } from "./SellField";
6
+ import type { BankAccountsAPIResponse, CustomOption, ServiceBankAPiResponse } from "./types";
7
+ import styles from "../assets/css/style.module.css";
8
+ import CommonCenterLoader from "./CommonCenterLoader";
9
+ import { Spinner } from "./loader";
10
+ import { getBaseUrl } from "./utils";
11
+
12
+ const accountTypeOptions = [
13
+ {
14
+ label: "SWIFT",
15
+ currency: "USD",
16
+ },
17
+ {
18
+ label: "SEPA",
19
+ currency: "EUR",
20
+ },
21
+ { label: "Local", currency: "USD" },
22
+ ];
23
+
24
+ type WidgetBankDetailsProps = {
25
+ setStep: (step: number) => void;
26
+ data: tokenSellDataType;
27
+ apiKey: string;
28
+ clientReferenceID: string;
29
+ setTokenSellData: (data: any) => void;
30
+ defaultTab: string;
31
+ mode: string;
32
+ };
33
+ const WidgetBankDetails = ({
34
+ defaultTab,
35
+ setStep,
36
+ data,
37
+ apiKey,
38
+ clientReferenceID,
39
+ setTokenSellData,
40
+ mode,
41
+ }: WidgetBankDetailsProps) => {
42
+ const { addToast } = useToast();
43
+ const [activeTab, setActiveTab] = useState(
44
+ ["select", "addNew"].includes(defaultTab) ? defaultTab : "select"
45
+ );
46
+
47
+ // Select beneficiary
48
+ const [beneficiaryOptions, setBeneficiaryOptions] = useState<CustomOption[] | []>([]);
49
+ const [selectedBeneficiary, setSelectedBeneficiary] = useState<CustomOption | null>(null);
50
+ const [bankOptions, setBankOptions] = useState<CustomOption[] | []>([]);
51
+ const [isFetchingBeneficiary, setIsFetchingBeneficiary] = useState(true);
52
+ const [addingBankAccount, setAddingBankAccount] = useState(false);
53
+ useEffect(() => {
54
+ fetchbeneficiaryOptions();
55
+ }, [activeTab]);
56
+
57
+ useEffect(() => {
58
+ if (data?.selectedBeneficiary && beneficiaryOptions?.length && !selectedBeneficiary) {
59
+ if (data?.selectedBeneficiary) {
60
+ const beneficiary = beneficiaryOptions?.find(
61
+ (item) => item?.value === data?.selectedBeneficiary
62
+ );
63
+ if (beneficiary) setSelectedBeneficiary(beneficiary);
64
+ }
65
+ }
66
+ }, [data, beneficiaryOptions]);
67
+
68
+ const fetchbeneficiaryOptions = () => {
69
+ const baseUrl = getBaseUrl(mode);
70
+ handleApiCall({
71
+ url: `${baseUrl}/api/bank_accounts`,
72
+ headers: {
73
+ "Content-Type": "application/json",
74
+ "X-API-KEY": apiKey,
75
+ "User-Id": clientReferenceID,
76
+ },
77
+ onSuccess: (result: BankAccountsAPIResponse) => {
78
+ if (result?.success) {
79
+ const options = result?.data?.bank_accounts
80
+ ?.filter((item) => item?.currency === data?.selectedFiat)
81
+ ?.map((item) => {
82
+ return {
83
+ label: `${item?.bank_account?.bank_name} - ${
84
+ item?.bank_account?.account_number || item?.bank_account?.iban
85
+ }`,
86
+ value: item?.unique_id,
87
+ };
88
+ });
89
+ setBeneficiaryOptions(options);
90
+ if (options?.length <= 0) {
91
+ setActiveTab("addNew");
92
+ }
93
+ setIsFetchingBeneficiary(false);
94
+ }
95
+ },
96
+ onError: () => {
97
+ addToast("Error fetching Beneficiaries", "error");
98
+ setIsFetchingBeneficiary(false);
99
+ },
100
+ });
101
+ };
102
+
103
+ const handleSelectBeneficiary = (values: CustomOption | null) => {
104
+ setSelectedBeneficiary(values);
105
+ setTokenSellData({ ...data, selectedBeneficiary: values?.value });
106
+ };
107
+
108
+ const handleContinueWithSelectedBeneficiary = () => {
109
+ if (data?.selectedBeneficiary) {
110
+ setStep(3);
111
+ } else {
112
+ addToast("Please select a beneficiary", "error");
113
+ }
114
+ };
115
+
116
+ // Add new beneficiary
117
+
118
+ const [formState, setFormState] = useState({
119
+ type: data?.selectedFiat === "EUR" ? "SEPA" : "SWIFT",
120
+ currency: data?.selectedFiat || "USD",
121
+ bank_name: "",
122
+ account_number: "",
123
+ route_number: "",
124
+ swift_code: "",
125
+ iban: "",
126
+ service_bank: "",
127
+ });
128
+
129
+ const [formErrors, setFormErrors] = useState({
130
+ bank_name: "",
131
+ account_number: "",
132
+ route_number: "",
133
+ swift_code: "",
134
+ iban: "",
135
+ service_bank: "",
136
+ });
137
+
138
+ const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
139
+ const { name, value } = e.target;
140
+ const limitedValue = name === "bank_name" ? value?.slice(0, 100) : value?.trim()?.slice(0, 100);
141
+ let error = "";
142
+
143
+ // Validation
144
+ if (!value) {
145
+ error = "Field is Required";
146
+ } else if (name === "bank_name") {
147
+ const isAlpha = /^[A-Za-z\s]+$/.test(limitedValue);
148
+ if (!isAlpha) {
149
+ error = "Enter only alphabets";
150
+ }
151
+ } else {
152
+ const isAlphanumeric = /^[A-Za-z0-9\s]+$/.test(limitedValue);
153
+ if (!isAlphanumeric) {
154
+ error = "Enter only alphanumeric";
155
+ }
156
+ }
157
+
158
+ if (error) {
159
+ // Set errors (preserve other errors)
160
+ setFormErrors((prevErrors) => ({
161
+ ...prevErrors,
162
+ [name]: error,
163
+ }));
164
+ } else {
165
+ // remove errors
166
+ const errors: any = { ...formErrors };
167
+ delete errors[name];
168
+
169
+ setFormErrors(errors);
170
+ }
171
+ // Set state
172
+ setFormState((prevState) => ({
173
+ ...prevState,
174
+ [name]: limitedValue,
175
+ }));
176
+ };
177
+
178
+ const handleSelectBankOption = (values: CustomOption | null) => {
179
+ setFormState({
180
+ ...formState,
181
+ service_bank: values?.value || "",
182
+ });
183
+ const errors: any = { ...formErrors };
184
+ delete errors.service_bank;
185
+ setFormErrors({ ...errors });
186
+ };
187
+
188
+ const handleSelectTypeOfAccount = (e: React.ChangeEvent<HTMLInputElement>) => {
189
+ if (e.target?.value === "Local") {
190
+ fetchBankOptions();
191
+ }
192
+ setFormState({
193
+ ...formState,
194
+ type: e.target?.value,
195
+ });
196
+ setFormErrors({
197
+ bank_name: "",
198
+ account_number: "",
199
+ route_number: "",
200
+ swift_code: "",
201
+ iban: "",
202
+ service_bank: "",
203
+ });
204
+ };
205
+
206
+ const fetchBankOptions = () => {
207
+ const baseUrl = getBaseUrl(mode);
208
+ handleApiCall({
209
+ url: `${baseUrl}/api/service_banks`,
210
+ headers: {
211
+ "Content-Type": "application/json",
212
+ "X-API-KEY": apiKey,
213
+ "User-Id": clientReferenceID,
214
+ },
215
+ onSuccess: (result: ServiceBankAPiResponse) => {
216
+ if (result?.success) {
217
+ const options = result?.data?.service_banks?.map((item) => {
218
+ return {
219
+ label: item?.bank_name,
220
+ value: item?.service_bank,
221
+ };
222
+ });
223
+ setBankOptions(options);
224
+ }
225
+ },
226
+ onError: () => {
227
+ addToast("Error fetching Bank Accounts", "error");
228
+ },
229
+ });
230
+ };
231
+
232
+ const handleAddbeneficiary = () => {
233
+ const baseUrl = getBaseUrl(mode);
234
+ const error: any = {};
235
+ const formData = new FormData();
236
+ setAddingBankAccount(true);
237
+
238
+ formData.append("currency", formState?.currency);
239
+ formData.append("type", formState?.type?.toLowerCase());
240
+
241
+ switch (formState.type) {
242
+ case "SWIFT":
243
+ if (!formState?.bank_name) error.bank_name = "Field is required";
244
+ if (!formState?.route_number) error.route_number = "Field is required";
245
+ if (!formState?.swift_code) error.swift_code = "Field is required";
246
+ if (!formState?.account_number) error.account_number = "Field is required";
247
+ formData.append("bank_name", formState?.bank_name);
248
+ formData.append("route_number", formState?.route_number);
249
+ formData.append("swift_code", formState?.swift_code);
250
+ formData.append("account_number", formState?.account_number);
251
+
252
+ break;
253
+ case "Local":
254
+ if (!formState?.service_bank) error.service_bank = "Field is required";
255
+ if (!formState?.route_number) error.route_number = "Field is required";
256
+ if (!formState?.account_number) error.account_number = "Field is required";
257
+ formData.append("service_bank", formState?.service_bank);
258
+ formData.append("route_number", formState?.route_number);
259
+ formData.append("account_number", formState?.account_number);
260
+ break;
261
+
262
+ case "SEPA":
263
+ if (!formState?.bank_name) error.bank_name = "Field is required";
264
+ if (!formState?.iban) error.iban = "Field is required";
265
+ formData.append("bank_name", formState?.bank_name);
266
+ formData.append("iban", formState?.iban);
267
+ break;
268
+
269
+ default:
270
+ break;
271
+ }
272
+
273
+ if (Object.keys(error)?.length > 0) {
274
+ setFormErrors(error);
275
+ addToast("Fill all fields", "error");
276
+ setAddingBankAccount(false);
277
+ return;
278
+ }
279
+
280
+ handleApiCall({
281
+ url: `${baseUrl}/api/bank_accounts`,
282
+ method: "POST",
283
+ headers: {
284
+ "X-API-KEY": apiKey,
285
+ "User-Id": clientReferenceID,
286
+ },
287
+ body: formData,
288
+ onSuccess: (result: any) => {
289
+ if (result?.success) {
290
+ setBeneficiaryOptions([
291
+ ...beneficiaryOptions,
292
+ {
293
+ label: `${result?.data?.bank_account?.bank_name} - ${
294
+ result?.data?.bank_account?.account_number ||
295
+ result?.data?.bank_account?.bank_account?.iban
296
+ }`,
297
+ value: result?.data?.bank_account?.unique_id,
298
+ },
299
+ ]);
300
+
301
+ setSelectedBeneficiary({
302
+ label: `${result?.data?.bank_account?.bank_name} - ${
303
+ result?.data?.bank_account?.account_number ||
304
+ result?.data?.bank_account?.bank_account?.iban
305
+ }`,
306
+ value: result?.data?.bank_account?.unique_id,
307
+ });
308
+ setTokenSellData({ ...data, selectedBeneficiary: result?.data?.bank_account?.unique_id });
309
+ setStep(3);
310
+ } else {
311
+ addToast(`Error Adding Bank Account : ${result?.message}`, "error");
312
+ }
313
+ setAddingBankAccount(false);
314
+ },
315
+ onError: (error: any) => {
316
+ addToast(`Error Adding Bank Account : ${error?.message}`, "error");
317
+ setAddingBankAccount(false);
318
+ },
319
+ });
320
+ };
321
+
322
+ const fetchMoreBanks = (value: string) => {
323
+ const baseUrl = getBaseUrl(mode);
324
+
325
+ handleApiCall({
326
+ url: `${baseUrl}/api/service_banks?search_key=${value}`,
327
+ headers: {
328
+ "Content-Type": "application/json",
329
+ "X-API-KEY": apiKey,
330
+ "User-Id": clientReferenceID,
331
+ },
332
+ onSuccess: (result: ServiceBankAPiResponse) => {
333
+ if (result?.success) {
334
+ const options = result?.data?.service_banks?.map((item) => {
335
+ return {
336
+ label: item?.bank_name,
337
+ value: item?.service_bank,
338
+ };
339
+ });
340
+ setBankOptions(options);
341
+ }
342
+ },
343
+ onError: () => {
344
+ addToast("Error fetching Bank Accounts", "error");
345
+ },
346
+ });
347
+ };
348
+
349
+ if (isFetchingBeneficiary) {
350
+ return <CommonCenterLoader />;
351
+ }
352
+
353
+ return (
354
+ <>
355
+ <div className={styles.bank_frame}>
356
+ <div className={styles.bank_head}>
357
+ <div style={{ cursor: "pointer" }} onClick={() => setStep(1)}>
358
+ <svg
359
+ xmlns="http://www.w3.org/2000/svg"
360
+ xmlSpace="preserve"
361
+ width="18"
362
+ height="18"
363
+ viewBox="0 0 240.823 240.823"
364
+ >
365
+ <path
366
+ d="M57.633 129.007 165.93 237.268c4.752 4.74 12.451 4.74 17.215 0 4.752-4.74 4.752-12.439 0-17.179l-99.707-99.671 99.695-99.671c4.752-4.74 4.752-12.439 0-17.191-4.752-4.74-12.463-4.74-17.215 0L57.621 111.816c-4.679 4.691-4.679 12.511.012 17.191"
367
+ data-original="#000000"
368
+ ></path>
369
+ </svg>
370
+ </div>
371
+ <div className={styles.bank_titles}>Bank Details</div>
372
+ </div>
373
+ <div className={styles.bank_tabs_frame}>
374
+ <div className={styles.bank_tabs_link}>
375
+ {beneficiaryOptions?.length > 0 && (
376
+ <button
377
+ className={`${activeTab === "select" && styles.active}`}
378
+ onClick={() => setActiveTab("select")}
379
+ >
380
+ Select Existing
381
+ </button>
382
+ )}
383
+ <button
384
+ className={`${activeTab === "addNew" && styles.active}`}
385
+ onClick={() => setActiveTab("addNew")}
386
+ >
387
+ Add New
388
+ </button>
389
+ </div>
390
+ <div className={styles.bank_tabs_content}>
391
+ {activeTab === "select" && (
392
+ <div className={styles.bank_exist_box}>
393
+ <div className={styles.bank_exist_feilds_frame}>
394
+ <div className={styles.bank_exist_label}>Select Bank</div>
395
+ <div className={styles.bank_exist_feilds}>
396
+ <CustomSelect
397
+ options={beneficiaryOptions}
398
+ onChange={handleSelectBeneficiary}
399
+ isClearable={true}
400
+ placeholder={isFetchingBeneficiary ? "Loading..." : "Select Beneficiary"}
401
+ value={selectedBeneficiary}
402
+ isDisabled={beneficiaryOptions?.length <= 0}
403
+ />
404
+ </div>
405
+ </div>
406
+
407
+ <div className={`${styles.ramp_action} ${styles.space_from} `}>
408
+ <button
409
+ className={`${styles.action_btn} ${styles.primary} `}
410
+ onClick={handleContinueWithSelectedBeneficiary}
411
+ >
412
+ Continue
413
+ </button>
414
+ </div>
415
+ </div>
416
+ )}
417
+ {activeTab === "addNew" && (
418
+ <div className={styles.new_box}>
419
+ <div className={styles.check_wrap}>
420
+ {accountTypeOptions.map((item) =>
421
+ data?.selectedFiat === item.currency ? (
422
+ <div className={styles.form_check} key={item.label}>
423
+ <label className={styles.form_check_label} htmlFor={item.label}>
424
+ <input
425
+ className={styles.form_check_input}
426
+ type="radio"
427
+ name="AccountType"
428
+ value={item.label}
429
+ id={item.label}
430
+ onChange={(e) => handleSelectTypeOfAccount(e)}
431
+ />
432
+ <div className={styles.off_currency_option}>
433
+ <h3>{item.label}</h3>
434
+ <svg
435
+ xmlns="http://www.w3.org/2000/svg"
436
+ width="20"
437
+ height="20"
438
+ viewBox="0 0 408.576 408.576"
439
+ >
440
+ <g>
441
+ <path
442
+ d="M204.288 0C91.648 0 0 91.648 0 204.288s91.648 204.288 204.288 204.288 204.288-91.648 204.288-204.288S316.928 0 204.288 0zm114.176 150.528-130.56 129.536c-7.68 7.68-19.968 8.192-28.16.512L90.624 217.6c-8.192-7.68-8.704-20.48-1.536-28.672 7.68-8.192 20.48-8.704 28.672-1.024l54.784 50.176L289.28 121.344c8.192-8.192 20.992-8.192 29.184 0s8.192 20.992 0 29.184z"
443
+ fill={formState?.type === item.label ? "#F9C201" : "#efefef"}
444
+ ></path>
445
+ </g>
446
+ </svg>
447
+ </div>
448
+ </label>
449
+ </div>
450
+ ) : (
451
+ <></>
452
+ )
453
+ )}
454
+ </div>
455
+
456
+ {formState.type === "Local" ? (
457
+ <div className={styles.ramp_bank_box}>
458
+ <div className={styles.new_bank_label}>
459
+ Bank Name <span className={styles.required}>*</span>
460
+ </div>
461
+ <div className={styles.new_bank_fields}>
462
+ <CustomSelect
463
+ options={bankOptions}
464
+ isClearable={true}
465
+ placeholder="Select Bank"
466
+ value={
467
+ formState?.service_bank
468
+ ? bankOptions?.find(
469
+ (option) => option?.value === formState?.service_bank
470
+ )
471
+ : null
472
+ }
473
+ isSearchable={true}
474
+ onChange={handleSelectBankOption}
475
+ onInputChange={(inputValue: string, { action }: { action: string }) => {
476
+ if (action !== "input-change") return;
477
+
478
+ if (inputValue?.length > 0) {
479
+ fetchMoreBanks(inputValue);
480
+ } else {
481
+ fetchBankOptions();
482
+ }
483
+ }}
484
+ />
485
+ </div>
486
+ {formErrors?.service_bank && (
487
+ <span className={styles.input_error}>{formErrors?.service_bank}</span>
488
+ )}
489
+ </div>
490
+ ) : (
491
+ <div className={styles.ramp_bank_box}>
492
+ <div className={styles.new_bank_label}>
493
+ Bank Name <span className={styles.required}>*</span>
494
+ </div>
495
+ <div className={styles.new_bank_fields}>
496
+ <input
497
+ type="text"
498
+ value={formState.bank_name}
499
+ className={styles.input_control}
500
+ placeholder="Enter Bank Name"
501
+ onChange={handleInputChange}
502
+ name="bank_name"
503
+ />
504
+ </div>
505
+ {formErrors?.bank_name && (
506
+ <span className={styles.input_error}>{formErrors?.bank_name}</span>
507
+ )}
508
+ </div>
509
+ )}
510
+
511
+ {formState.type === "SWIFT" || formState.type === "Local" ? (
512
+ <div className={styles.ramp_bank_box}>
513
+ <div className={styles.new_bank_label}>
514
+ Account Number <span className={styles.required}>*</span>
515
+ </div>
516
+ <div className={styles.new_bank_fields}>
517
+ <input
518
+ type="text"
519
+ value={formState.account_number}
520
+ className={styles.input_control}
521
+ placeholder="Enter Account Number"
522
+ onChange={handleInputChange}
523
+ name="account_number"
524
+ />
525
+ </div>
526
+ {formErrors?.account_number && (
527
+ <span className={styles.input_error}>{formErrors?.account_number}</span>
528
+ )}
529
+ </div>
530
+ ) : null}
531
+ {formState.type === "SWIFT" || formState.type === "Local" ? (
532
+ <div className={styles.ramp_bank_box}>
533
+ <div className={styles.new_bank_label}>
534
+ Route Number <span className={styles.required}>*</span>
535
+ </div>
536
+ <div className={styles.new_bank_fields}>
537
+ <input
538
+ type="text"
539
+ value={formState.route_number}
540
+ className={styles.input_control}
541
+ placeholder="Enter Route Number"
542
+ onChange={handleInputChange}
543
+ name="route_number"
544
+ />
545
+ </div>
546
+ {formErrors?.route_number && (
547
+ <span className={styles.input_error}>{formErrors?.route_number} </span>
548
+ )}
549
+ </div>
550
+ ) : null}
551
+
552
+ {formState.type === "SWIFT" && (
553
+ <div className={styles.ramp_bank_box}>
554
+ <div className={styles.new_bank_label}>
555
+ SWIFT Code <span className={styles.required}>*</span>
556
+ </div>
557
+ <div className={styles.new_bank_fields}>
558
+ <input
559
+ type="text"
560
+ value={formState.swift_code}
561
+ className={styles.input_control}
562
+ placeholder="Enter SWIFT Code"
563
+ onChange={handleInputChange}
564
+ name="swift_code"
565
+ />
566
+ </div>
567
+ {formErrors?.swift_code && (
568
+ <span className={styles.input_error}>{formErrors?.swift_code}</span>
569
+ )}
570
+ </div>
571
+ )}
572
+
573
+ {formState.type === "SEPA" && (
574
+ <div className={styles.ramp_bank_box}>
575
+ <div className={styles.new_bank_label}>
576
+ IBAN <span className={styles.required}>*</span>
577
+ </div>
578
+ <div className={styles.new_bank_fields}>
579
+ <input
580
+ type="text"
581
+ value={formState.iban}
582
+ className={styles.input_control}
583
+ placeholder="Enter IBAN"
584
+ onChange={handleInputChange}
585
+ name="iban"
586
+ />
587
+ </div>
588
+ {formErrors?.iban && (
589
+ <span className={styles.input_error}>{formErrors?.iban}</span>
590
+ )}
591
+ </div>
592
+ )}
593
+
594
+ <div className={styles.ramp_action}>
595
+ <button
596
+ className={`${styles.action_btn} ${styles.primary} `}
597
+ onClick={handleAddbeneficiary}
598
+ disabled={addingBankAccount}
599
+ >
600
+ Continue {addingBankAccount && <Spinner />}
601
+ </button>
602
+ </div>
603
+ </div>
604
+ )}
605
+ </div>
606
+ </div>
607
+ </div>
608
+ </>
609
+ );
610
+ };
611
+
612
+ export default WidgetBankDetails;
@@ -0,0 +1,49 @@
1
+ import React from "react";
2
+ import styles from "../assets/css/style.module.css";
3
+ import WidgetContent from "./WidgetContent";
4
+ import { ToastProvider } from "../hooks/toastProvider";
5
+ import type { BuyParamsType, SellParamsType } from "./types";
6
+
7
+ type WidgetComponentProps = {
8
+ apiKey: string;
9
+ redirectUrl: string;
10
+ buyParameters: BuyParamsType;
11
+ sellParameters: SellParamsType;
12
+ defaultTab: string;
13
+ clientReferenceID: string;
14
+ mode?: "development" | "production";
15
+ };
16
+
17
+ const WidgetComponent = ({
18
+ apiKey,
19
+ redirectUrl,
20
+ buyParameters,
21
+ sellParameters,
22
+ defaultTab,
23
+ clientReferenceID,
24
+ mode = "development",
25
+ }: WidgetComponentProps) => {
26
+ return (
27
+ <div style={{ position: "relative" }} className={styles.widgetcomponent} id="widget-container">
28
+ <div className={styles.widget_wrapped}>
29
+ <div className={styles.widget_modal}>
30
+ <div className={styles.widget_content}>
31
+ <ToastProvider>
32
+ <WidgetContent
33
+ redirectUrl={redirectUrl}
34
+ defaultTab={defaultTab}
35
+ buyParameters={buyParameters}
36
+ sellParameters={sellParameters}
37
+ apiKey={apiKey}
38
+ clientReferenceID={clientReferenceID}
39
+ mode={mode}
40
+ />
41
+ </ToastProvider>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ );
47
+ };
48
+
49
+ export default WidgetComponent;