@infosoftas/s4-orders-js-sdk 0.1.19 → 0.1.21-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 (62) hide show
  1. package/README.md +471 -426
  2. package/build/postcss-scope-tailwind.cjs +66 -0
  3. package/components.json +21 -0
  4. package/package.json +59 -43
  5. package/src/App.css +409 -0
  6. package/src/App.tsx +639 -569
  7. package/src/api/OrdersApi.ts +2 -2
  8. package/src/components/Alert/Alert.tsx +23 -22
  9. package/src/components/Button/Button.tsx +18 -22
  10. package/src/components/EHFForm/EHFForm.tsx +253 -235
  11. package/src/components/FormFields/AddressField.tsx +55 -62
  12. package/src/components/FormFields/EmailField.tsx +53 -58
  13. package/src/components/FormFields/InputField.tsx +52 -53
  14. package/src/components/FormFields/NameField.tsx +52 -53
  15. package/src/components/FormFields/PhoneField.tsx +53 -58
  16. package/src/components/FormFields/TermsCheckbox.tsx +70 -58
  17. package/src/components/FormFields/ToggleFiled.tsx +52 -63
  18. package/src/components/FormFields/fieldValidators.ts +71 -0
  19. package/src/components/OIOForm/OIOForm.tsx +132 -71
  20. package/src/components/OrderDenialModal/OrderDenialModal.tsx +102 -89
  21. package/src/components/OrderForm/ContactDetailsSection.tsx +71 -0
  22. package/src/components/OrderForm/OrderForm.tsx +177 -224
  23. package/src/components/OrderForm/PaymentMethodContent.tsx +62 -0
  24. package/src/components/OrderForm/PaymentMethodSection.tsx +79 -0
  25. package/src/components/OrderForm/SubmitConfirmationDialog.tsx +55 -0
  26. package/src/components/OrderForm/orderFormState.ts +171 -0
  27. package/src/components/OrderForm/useSlotElement.tsx +89 -0
  28. package/src/components/ui/alert-dialog.tsx +185 -0
  29. package/src/components/ui/alert.tsx +75 -0
  30. package/src/components/ui/button.tsx +55 -0
  31. package/src/components/ui/card.tsx +99 -0
  32. package/src/components/ui/checkbox.tsx +28 -0
  33. package/src/components/ui/field.tsx +238 -0
  34. package/src/components/ui/input.tsx +19 -0
  35. package/src/components/ui/label.tsx +19 -0
  36. package/src/components/ui/radio-group.tsx +37 -0
  37. package/src/components/ui/separator.tsx +24 -0
  38. package/src/components/ui/skeleton.tsx +13 -0
  39. package/src/components/ui/spinner.tsx +10 -0
  40. package/src/components/ui/switch.tsx +29 -0
  41. package/src/components/ui/textarea.tsx +17 -0
  42. package/src/constants/index.ts +0 -2
  43. package/src/custom.d.ts +4 -4
  44. package/src/enums/general.ts +1 -0
  45. package/src/hooks/useMessageEvent.tsx +54 -3
  46. package/src/hooks/useOrderForm.tsx +9 -2
  47. package/src/index.tsx +2 -0
  48. package/src/lib/utils.ts +1 -0
  49. package/src/types/general.ts +136 -111
  50. package/src/types/order.ts +8 -0
  51. package/src/utils/order.helper.ts +14 -3
  52. package/tsconfig.json +37 -38
  53. package/src/App.scss +0 -23
  54. package/src/assets/styles/forms.scss +0 -164
  55. package/src/assets/styles/general.scss +0 -46
  56. package/src/assets/styles/variables.scss +0 -29
  57. package/src/components/Alert/alert.scss +0 -21
  58. package/src/components/Button/button.scss +0 -48
  59. package/src/components/Loader/Loader.tsx +0 -22
  60. package/src/components/Loader/loader.scss +0 -37
  61. package/src/components/OrderDenialModal/orderDenialModal.scss +0 -42
  62. package/src/components/OrderForm/orderForm.scss +0 -10
@@ -1,89 +1,102 @@
1
- import { FC } from 'react';
2
- import { createPortal } from 'react-dom';
3
-
4
- import { OrderDenialFallbackOfferType } from '../../types/general';
5
- import Button from '../Button/Button';
6
-
7
- import './orderDenialModal.scss';
8
-
9
- type Props = {
10
- isOpen: boolean;
11
- message?: string;
12
- offer?: OrderDenialFallbackOfferType;
13
- canContinue?: boolean;
14
- closeButtonText?: string;
15
- continueButtonText?: string;
16
- onContinue: () => void;
17
- onClose: () => void;
18
- };
19
-
20
- const OrderDenialModal: FC<Props> = ({
21
- isOpen,
22
- message,
23
- offer,
24
- canContinue = true,
25
- closeButtonText = 'Close',
26
- continueButtonText = 'Continue',
27
- onContinue,
28
- onClose,
29
- }) => {
30
- if (!isOpen || typeof document === 'undefined') {
31
- return null;
32
- }
33
-
34
- return createPortal(
35
- <div
36
- className="sdk-order-denial-modal-overlay"
37
- data-testid="sdk-order-denial-modal-overlay"
38
- >
39
- <div
40
- className="sdk-order-denial-modal"
41
- role="dialog"
42
- aria-modal="true"
43
- aria-label="Order denial modal"
44
- >
45
- <p
46
- className="sdk-order-denial-modal-text"
47
- style={{ whiteSpace: 'pre-line' }}
48
- >
49
- {message?.replace(/\\n/g, '\n')}
50
- </p>
51
- {offer?.title && offer?.templatePackageId && (
52
- <div className="sdk-order-denial-offer-box">
53
- <h4 className="sdk-order-denial-offer-title">
54
- {offer.title}
55
- </h4>
56
- {offer.description && (
57
- <p className="sdk-order-denial-offer-description">
58
- {offer.description}
59
- </p>
60
- )}
61
- {offer.price && (
62
- <p className="sdk-order-denial-offer-meta">
63
- {offer.price}
64
- </p>
65
- )}
66
- </div>
67
- )}
68
- <div className="sdk-order-denial-modal-actions">
69
- <Button
70
- type="button"
71
- btnType="default"
72
- buttonText={closeButtonText}
73
- onClick={onClose}
74
- />
75
- {canContinue && (
76
- <Button
77
- type="button"
78
- buttonText={continueButtonText}
79
- onClick={onContinue}
80
- />
81
- )}
82
- </div>
83
- </div>
84
- </div>,
85
- document.body
86
- );
87
- };
88
-
89
- export default OrderDenialModal;
1
+ import { FC } from 'react';
2
+
3
+ import { OrderDenialFallbackOfferType } from '../../types/general';
4
+ import {
5
+ AlertDialog,
6
+ AlertDialogAction,
7
+ AlertDialogCancel,
8
+ AlertDialogContent,
9
+ AlertDialogDescription,
10
+ AlertDialogFooter,
11
+ AlertDialogHeader,
12
+ AlertDialogTitle,
13
+ } from '../ui/alert-dialog';
14
+
15
+ type Props = {
16
+ isOpen: boolean;
17
+ message?: string;
18
+ offer?: OrderDenialFallbackOfferType;
19
+ canContinue?: boolean;
20
+ closeButtonText?: string;
21
+ continueButtonText?: string;
22
+ onContinue: () => void;
23
+ onClose: () => void;
24
+ };
25
+
26
+ const splitMessage = (message = '') => {
27
+ const [title = '', ...rest] = message
28
+ .replace(/\\n/g, '\n')
29
+ .split(/\n\s*\n/)
30
+ .map((part) => part.trim())
31
+ .filter(Boolean);
32
+
33
+ return { title, description: rest.join('\n\n') };
34
+ };
35
+
36
+ const OrderDenialModal: FC<Props> = ({
37
+ isOpen,
38
+ message,
39
+ offer,
40
+ canContinue = true,
41
+ closeButtonText = 'Close',
42
+ continueButtonText = 'Continue',
43
+ onContinue,
44
+ onClose,
45
+ }) => {
46
+ const { title, description } = splitMessage(message);
47
+ const showOffer = !!offer?.title && !!offer?.templatePackageId;
48
+
49
+ return (
50
+ <AlertDialog
51
+ open={isOpen}
52
+ onOpenChange={(open) => {
53
+ if (!open) onClose();
54
+ }}
55
+ >
56
+ <AlertDialogContent data-testid="sdk-order-denial-modal">
57
+ <AlertDialogHeader>
58
+ <AlertDialogTitle className="whitespace-pre-line">
59
+ {title}
60
+ </AlertDialogTitle>
61
+ {description && (
62
+ <AlertDialogDescription className="whitespace-pre-line">
63
+ {description}
64
+ </AlertDialogDescription>
65
+ )}
66
+ </AlertDialogHeader>
67
+
68
+ {showOffer && (
69
+ <div
70
+ className="flex flex-col gap-1 rounded-2xl bg-muted p-4 text-sm"
71
+ data-testid="sdk-order-denial-offer"
72
+ >
73
+ <p className="font-medium">{offer?.title}</p>
74
+ {offer?.description && (
75
+ <p className="text-muted-foreground">
76
+ {offer.description}
77
+ </p>
78
+ )}
79
+ {offer?.price && (
80
+ <p className="mt-1 font-semibold tabular-nums">
81
+ {offer.price}
82
+ </p>
83
+ )}
84
+ </div>
85
+ )}
86
+
87
+ <AlertDialogFooter>
88
+ <AlertDialogCancel variant="ghost">
89
+ {closeButtonText}
90
+ </AlertDialogCancel>
91
+ {canContinue && (
92
+ <AlertDialogAction onClick={onContinue}>
93
+ {continueButtonText}
94
+ </AlertDialogAction>
95
+ )}
96
+ </AlertDialogFooter>
97
+ </AlertDialogContent>
98
+ </AlertDialog>
99
+ );
100
+ };
101
+
102
+ export default OrderDenialModal;
@@ -0,0 +1,71 @@
1
+ import { FC } from 'react';
2
+
3
+ import formFieldsMapper from '../FormFields/FormFieldsMapper';
4
+ import ToggleField from '../FormFields/ToggleFiled';
5
+ import { OrderFormFieldType } from '../../types/general';
6
+ import { FieldGroup, FieldLegend, FieldSet } from '../ui/field';
7
+
8
+ type FieldListProps = {
9
+ fields: OrderFormFieldType[];
10
+ };
11
+
12
+ const FieldList: FC<FieldListProps> = ({ fields }) => (
13
+ <>
14
+ {fields.map((field) => {
15
+ const Component = formFieldsMapper[field.name];
16
+
17
+ return Component ? (
18
+ <Component
19
+ key={field.name}
20
+ name={field.name}
21
+ label={field.label}
22
+ required={field.required || false}
23
+ readOnly={field.readOnly || false}
24
+ />
25
+ ) : null;
26
+ })}
27
+ </>
28
+ );
29
+
30
+ type Props = {
31
+ label?: string;
32
+ orderFields: OrderFormFieldType[];
33
+ invoiceOrderFields: OrderFormFieldType[];
34
+ showOrderFields: boolean;
35
+ showInvoiceToggle: boolean;
36
+ showInvoiceFields: boolean;
37
+ invoiceToggleLabel?: string;
38
+ onInvoiceToggle?: (value: boolean) => void;
39
+ };
40
+
41
+ const ContactDetailsSection: FC<Props> = ({
42
+ label,
43
+ orderFields,
44
+ invoiceOrderFields,
45
+ showOrderFields,
46
+ showInvoiceToggle,
47
+ showInvoiceFields,
48
+ invoiceToggleLabel,
49
+ onInvoiceToggle,
50
+ }) => (
51
+ <div className="sdk-order-details-section">
52
+ <FieldSet>
53
+ {label && <FieldLegend variant="label">{label}</FieldLegend>}
54
+ <FieldGroup>
55
+ {showOrderFields && <FieldList fields={orderFields} />}
56
+ {showInvoiceToggle && (
57
+ <ToggleField
58
+ name="invoiceAddressSelection"
59
+ label={invoiceToggleLabel ?? 'Invoice Address'}
60
+ toggleCallback={onInvoiceToggle}
61
+ />
62
+ )}
63
+ {showInvoiceFields && (
64
+ <FieldList fields={invoiceOrderFields} />
65
+ )}
66
+ </FieldGroup>
67
+ </FieldSet>
68
+ </div>
69
+ );
70
+
71
+ export default ContactDetailsSection;