@lookiero/checkout 12.4.0 → 12.5.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 (85) hide show
  1. package/dist/public/public/assets/adaptive-icon.png +0 -0
  2. package/dist/public/public/assets/favicon.png +0 -0
  3. package/dist/public/public/assets/icon.png +0 -0
  4. package/dist/public/public/assets/splash.png +0 -0
  5. package/dist/public/public/images/not-found.png +0 -0
  6. package/dist/src/ExpoRoot.js +1 -1
  7. package/dist/src/domain/checkoutItem/model/currency.d.ts +6 -0
  8. package/dist/src/domain/checkoutItem/model/currency.js +7 -0
  9. package/dist/src/domain/uiSetting/command/updateUiSetting.d.ts +15 -0
  10. package/dist/src/domain/uiSetting/command/updateUiSetting.js +10 -0
  11. package/dist/src/domain/uiSetting/model/uiSetting.d.ts +9 -0
  12. package/dist/src/domain/uiSetting/model/uiSetting.js +11 -0
  13. package/dist/src/domain/uiSetting/model/uiSettingUpdated.d.ts +15 -0
  14. package/dist/src/domain/uiSetting/model/uiSettingUpdated.js +8 -0
  15. package/dist/src/domain/uiSetting/model/uiSettings.d.ts +7 -0
  16. package/dist/src/domain/uiSetting/model/uiSettings.js +1 -0
  17. package/dist/src/infrastructure/domain/uiSetting/model/storageUiSettings.d.ts +17 -0
  18. package/dist/src/infrastructure/domain/uiSetting/model/storageUiSettings.js +20 -0
  19. package/dist/src/infrastructure/domain/uiSetting/react/useUpdateUiSetting.d.ts +18 -0
  20. package/dist/src/infrastructure/domain/uiSetting/react/useUpdateUiSetting.js +22 -0
  21. package/dist/src/infrastructure/integration/useRedirect.d.ts +7 -0
  22. package/dist/src/infrastructure/integration/useRedirect.js +1 -0
  23. package/dist/src/infrastructure/persistence/asyncStorageStorage.d.ts +5 -0
  24. package/dist/src/infrastructure/persistence/asyncStorageStorage.js +7 -0
  25. package/dist/src/infrastructure/persistence/uiSettingData.d.ts +6 -0
  26. package/dist/src/infrastructure/persistence/uiSettingData.js +1 -0
  27. package/dist/src/infrastructure/projection/checkoutQuestion/checkoutQuestions.mock.d.ts +3 -0
  28. package/dist/src/infrastructure/projection/checkoutQuestion/checkoutQuestions.mock.js +103 -0
  29. package/dist/src/infrastructure/projection/checkoutQuestion/httpCheckoutQuestionsByCheckoutIdView.d.ts +12 -0
  30. package/dist/src/infrastructure/projection/checkoutQuestion/httpCheckoutQuestionsByCheckoutIdView.js +10 -0
  31. package/dist/src/infrastructure/projection/checkoutQuestion/react/useListCheckoutQuestionsByCheckoutId.d.ts +10 -0
  32. package/dist/src/infrastructure/projection/checkoutQuestion/react/useListCheckoutQuestionsByCheckoutId.js +9 -0
  33. package/dist/src/infrastructure/projection/returnQuestion/returnQuestions.mock.js +47 -58
  34. package/dist/src/infrastructure/projection/uiSetting/react/useViewUiSettingByKey.d.ts +10 -0
  35. package/dist/src/infrastructure/projection/uiSetting/react/useViewUiSettingByKey.js +11 -0
  36. package/dist/src/infrastructure/projection/uiSetting/storageUiSettingByKeyView.d.ts +13 -0
  37. package/dist/src/infrastructure/projection/uiSetting/storageUiSettingByKeyView.js +15 -0
  38. package/dist/src/infrastructure/ui/components/organisms/returnQuestions/components/hostDefaultReturnQuestionItem/HostDefaultReturnQuestionItem.js +1 -2
  39. package/dist/src/infrastructure/ui/components/organisms/returnQuestions/components/hostLegacyRadioGroupReturnQuestionItem/HostLegacyRadioGroupReturnQuestionItem.d.ts +4 -0
  40. package/dist/src/infrastructure/ui/components/organisms/returnQuestions/components/hostLegacyRadioGroupReturnQuestionItem/HostLegacyRadioGroupReturnQuestionItem.js +17 -0
  41. package/dist/src/infrastructure/ui/components/organisms/returnQuestions/components/hostLegacyRadioGroupReturnQuestionItem/HostLegacyRadioGroupReturnQuestionItem.style.d.ts +11 -0
  42. package/dist/src/infrastructure/ui/components/organisms/returnQuestions/components/hostLegacyRadioGroupReturnQuestionItem/HostLegacyRadioGroupReturnQuestionItem.style.js +16 -0
  43. package/dist/src/infrastructure/ui/components/organisms/returnQuestions/components/hostRadioGroupReturnQuestionItem/HostRadioGroupReturnQuestionItem.d.ts +1 -1
  44. package/dist/src/infrastructure/ui/components/organisms/returnQuestions/components/hostRadioGroupReturnQuestionItem/HostRadioGroupReturnQuestionItem.js +3 -5
  45. package/dist/src/infrastructure/ui/components/organisms/returnQuestions/components/returnQuestionFeedbackItem/ReturnQuestionFeedbackItem.js +2 -3
  46. package/dist/src/infrastructure/ui/components/organisms/returnQuestions/util/returnQuestionFeedback.js +2 -4
  47. package/dist/src/infrastructure/ui/hooks/useSubmitCheckout.d.ts +27 -0
  48. package/dist/src/infrastructure/ui/hooks/useSubmitCheckout.js +97 -0
  49. package/dist/src/infrastructure/ui/routing/useBasePath.d.ts +8 -0
  50. package/dist/src/infrastructure/ui/routing/useBasePath.js +9 -0
  51. package/dist/src/infrastructure/ui/settings/UISettings.d.ts +3 -0
  52. package/dist/src/infrastructure/ui/settings/UISettings.js +4 -0
  53. package/dist/src/infrastructure/ui/views/checkout/components/checkoutPaymentModal/CheckoutPaymentModal.d.ts +12 -0
  54. package/dist/src/infrastructure/ui/views/checkout/components/checkoutPaymentModal/CheckoutPaymentModal.js +90 -0
  55. package/dist/src/infrastructure/ui/views/item/components/returnQuestionsFeedback/ReturnQuestionsFeedback.js +1 -0
  56. package/dist/src/infrastructure/ui/views/return/components/returnQuestionsForm/ReturnQuestionsForm.js +3 -1
  57. package/dist/src/projection/checkoutQuestion/checkoutQuestion.d.ts +18 -0
  58. package/dist/src/projection/checkoutQuestion/checkoutQuestion.js +10 -0
  59. package/dist/src/projection/checkoutQuestion/listCheckoutQuestionsByCheckoutId.d.ts +25 -0
  60. package/dist/src/projection/checkoutQuestion/listCheckoutQuestionsByCheckoutId.js +8 -0
  61. package/dist/src/projection/returnQuestion/returnQuestion.constants.d.ts +1 -0
  62. package/dist/src/projection/returnQuestion/returnQuestion.constants.js +1 -0
  63. package/dist/src/projection/returnQuestion/returnQuestion.d.ts +2 -2
  64. package/dist/src/projection/returnQuestion/returnQuestion.typeguard.d.ts +2 -4
  65. package/dist/src/projection/returnQuestion/returnQuestion.typeguard.js +2 -2
  66. package/dist/src/projection/uiSetting/viewUiSettingByKey.d.ts +29 -0
  67. package/dist/src/projection/uiSetting/viewUiSettingByKey.js +8 -0
  68. package/dist/src/version.d.ts +1 -1
  69. package/dist/src/version.js +1 -1
  70. package/package.json +1 -1
  71. package/src/ExpoRoot.tsx +1 -1
  72. package/src/infrastructure/projection/returnQuestion/returnQuestions.mock.ts +47 -58
  73. package/src/infrastructure/ui/components/organisms/returnQuestions/components/hostDefaultReturnQuestionItem/HostDefaultReturnQuestionItem.tsx +1 -2
  74. package/src/infrastructure/ui/components/organisms/returnQuestions/components/hostLegacyRadioGroupReturnQuestionItem/HostLegacyRadioGroupReturnQuestionItem.style.ts +19 -0
  75. package/src/infrastructure/ui/components/organisms/returnQuestions/components/hostLegacyRadioGroupReturnQuestionItem/HostLegacyRadioGroupReturnQuestionItem.tsx +36 -0
  76. package/src/infrastructure/ui/components/organisms/returnQuestions/components/hostRadioGroupReturnQuestionItem/HostRadioGroupReturnQuestionItem.test.tsx +46 -0
  77. package/src/infrastructure/ui/components/organisms/returnQuestions/components/hostRadioGroupReturnQuestionItem/HostRadioGroupReturnQuestionItem.tsx +7 -12
  78. package/src/infrastructure/ui/components/organisms/returnQuestions/components/returnQuestionFeedbackItem/ReturnQuestionFeedbackItem.tsx +6 -5
  79. package/src/infrastructure/ui/components/organisms/returnQuestions/util/__snapshots__/returnQuestionFeedback.test.ts.snap +22 -2
  80. package/src/infrastructure/ui/components/organisms/returnQuestions/util/returnQuestionFeedback.ts +2 -7
  81. package/src/infrastructure/ui/views/item/components/returnQuestionsFeedback/ReturnQuestionsFeedback.tsx +1 -0
  82. package/src/infrastructure/ui/views/return/components/returnQuestionsForm/ReturnQuestionsForm.tsx +3 -1
  83. package/src/projection/returnQuestion/returnQuestion.constants.ts +1 -0
  84. package/src/projection/returnQuestion/returnQuestion.ts +6 -2
  85. package/src/projection/returnQuestion/returnQuestion.typeguard.ts +3 -11
@@ -0,0 +1,11 @@
1
+ declare const style: () => {
2
+ title: {
3
+ marginBottom: number;
4
+ };
5
+ wrapper: {
6
+ backgroundColor: string;
7
+ marginBottom: number;
8
+ padding: number;
9
+ };
10
+ };
11
+ export { style };
@@ -0,0 +1,16 @@
1
+ import { StyleSheet } from "react-native";
2
+ import { theme } from "@lookiero/sty-psp-ui";
3
+ const style = () => {
4
+ const { colorBgBase, space2, space6 } = theme();
5
+ return StyleSheet.create({
6
+ title: {
7
+ marginBottom: space2,
8
+ },
9
+ wrapper: {
10
+ backgroundColor: colorBgBase,
11
+ marginBottom: space2,
12
+ padding: space6,
13
+ },
14
+ });
15
+ };
16
+ export { style };
@@ -1,4 +1,4 @@
1
1
  import { ReturnQuestionType } from "../../../../../../../projection/returnQuestion/returnQuestion.constants";
2
2
  import { ReturnQuestionItem } from "../ReturnQuestionItem";
3
- declare const HostRadioGroupReturnQuestionItem: ReturnQuestionItem<ReturnQuestionType.HOST_SELECT>;
3
+ declare const HostRadioGroupReturnQuestionItem: ReturnQuestionItem<ReturnQuestionType.HOST_RADIO_GROUP>;
4
4
  export { HostRadioGroupReturnQuestionItem };
@@ -7,11 +7,9 @@ import { DOMAIN } from "../../../../../i18n/i18n";
7
7
  import { style as hostRadioGroupReturnQuestionItemStyle } from "./HostRadioGroupReturnQuestionItem.style";
8
8
  const HostRadioGroupReturnQuestionItem = ({ returnQuestion, children, testID, }) => {
9
9
  const { formatMessage } = useI18n({ domain: DOMAIN });
10
- const placeholderText = useMemo(() => (returnQuestion.metadata.placeholder ? formatMessage({ id: returnQuestion.metadata.placeholder }) : ""), [formatMessage, returnQuestion.metadata.placeholder]);
11
10
  const style = useMemo(() => hostRadioGroupReturnQuestionItemStyle(), []);
12
- return (React.createElement(React.Fragment, null,
13
- React.createElement(View, { style: style.wrapper, testID: testID },
14
- React.createElement(Text, { level: 3, style: style.title, action: true }, placeholderText),
15
- children)));
11
+ return (React.createElement(View, { style: style.wrapper, testID: testID },
12
+ returnQuestion.translationKey && (React.createElement(Text, { level: 3, style: style.title, action: true }, formatMessage({ id: returnQuestion.translationKey }))),
13
+ children));
16
14
  };
17
15
  export { HostRadioGroupReturnQuestionItem };
@@ -8,15 +8,14 @@ import { useReturnQuestionFeedback } from "../../behaviors/useReturnQuestionFeed
8
8
  import { feedbackForReturnQuestion } from "../../util/returnQuestionFeedback";
9
9
  import { style as returnQuestionFeedbackItemStyle } from "./ReturnQuestionFeedbackItem.style";
10
10
  const ReturnQuestionFeedbackItem = ({ returnQuestion }) => {
11
- const titleText = useI18nMessage({ domain: DOMAIN, id: returnQuestion.translationKey });
11
+ const { formatMessage } = useI18n({ domain: DOMAIN });
12
12
  const unansweredText = useI18nMessage({ domain: DOMAIN, id: I18nMessages.FEEDBACK_UNANSWERED });
13
13
  const returnQuestionFeedback = useReturnQuestionFeedback();
14
- const { formatMessage } = useI18n({ domain: DOMAIN });
15
14
  const translate = useCallback((returnQuestionName) => formatMessage({ id: returnQuestionName, defaultMessage: returnQuestionName }), [formatMessage]);
16
15
  const feedback = feedbackForReturnQuestion({ feedback: returnQuestionFeedback, returnQuestion, translate }).join(" / ");
17
16
  const style = useMemo(() => returnQuestionFeedbackItemStyle(), []);
18
17
  return (React.createElement(View, { style: style.container },
19
- React.createElement(Text, { level: 2, style: style.title, detailBold: true }, titleText),
18
+ returnQuestion.translationKey && (React.createElement(Text, { level: 2, style: style.title, detailBold: true }, formatMessage({ id: returnQuestion.translationKey }))),
20
19
  React.createElement(Text, { level: 1, detail: true }, feedback || unansweredText)));
21
20
  };
22
21
  export { ReturnQuestionFeedbackItem };
@@ -1,5 +1,5 @@
1
1
  import { isUuid } from "@lookiero/sty-psp-uuid";
2
- import { returnQuestionHasChildren, returnQuestionWithTranslationKey, } from "../../../../../../projection/returnQuestion/returnQuestion.typeguard";
2
+ import { returnQuestionHasChildren } from "../../../../../../projection/returnQuestion/returnQuestion.typeguard";
3
3
  const feedbackForReturnQuestion = ({ feedback, returnQuestion, translate, acc = [], }) => {
4
4
  const returnQuestionId = Object.keys(feedback).find((id) => id === returnQuestion.id);
5
5
  if (returnQuestionId) {
@@ -10,9 +10,7 @@ const feedbackForReturnQuestion = ({ feedback, returnQuestion, translate, acc =
10
10
  if (feebackReturnQuestionChild) {
11
11
  return [
12
12
  ...acc,
13
- ...(returnQuestionWithTranslationKey(feebackReturnQuestionChild)
14
- ? [translate(feebackReturnQuestionChild.translationKey)]
15
- : []),
13
+ ...(feebackReturnQuestionChild.translationKey ? [translate(feebackReturnQuestionChild.translationKey)] : []),
16
14
  ...feedbackForReturnQuestion({ feedback, returnQuestion: feebackReturnQuestionChild, translate, acc }),
17
15
  ];
18
16
  }
@@ -0,0 +1,27 @@
1
+ import { RefObject } from "react";
2
+ import { PaymentFlowRef } from "@lookiero/payments-front";
3
+ import { Logger } from "@lookiero/sty-psp-logging";
4
+ import { PaymentFlowPayloadProjection } from "../../../projection/payment/paymentFlowPayload";
5
+ type Status = "idle" | "loading" | "success" | "error";
6
+ interface SubmitCheckoutFunctionArgs {
7
+ readonly paymentFlowPayload: PaymentFlowPayloadProjection;
8
+ readonly sizeChangeEnabled: boolean;
9
+ }
10
+ interface SubmitCheckoutFunction {
11
+ (args: SubmitCheckoutFunctionArgs): Promise<void>;
12
+ }
13
+ type UseSubmitCheckoutResult = [submitCheckout: SubmitCheckoutFunction, status: Status];
14
+ interface UseSubmitCheckoutFunctionArgs {
15
+ readonly checkoutId: string;
16
+ readonly checkoutBookingId: string;
17
+ readonly paymentFlowRef: RefObject<PaymentFlowRef>;
18
+ readonly onError: () => void;
19
+ readonly onSuccess?: () => void;
20
+ readonly logger: Logger;
21
+ }
22
+ interface UseSubmitCheckoutFunction {
23
+ (args: UseSubmitCheckoutFunctionArgs): UseSubmitCheckoutResult;
24
+ }
25
+ declare const useSubmitCheckout: UseSubmitCheckoutFunction;
26
+ export type { Status, SubmitCheckoutFunction };
27
+ export { useSubmitCheckout };
@@ -0,0 +1,97 @@
1
+ import { useCallback, useMemo, useState } from "react";
2
+ import { CommandStatus } from "@lookiero/messaging-react";
3
+ import { NotificationLevel, useCreateToastNotification } from "@lookiero/sty-psp-notifications";
4
+ import { viewCheckoutBookingById, } from "../../../projection/checkoutBooking/viewCheckoutBookingById";
5
+ import { MESSAGING_CONTEXT_ID } from "../../delivery/baseBootstrap";
6
+ import { useSubmitCheckout as useSubmitCheckoutCommand } from "../../domain/checkout/react/useSubmitCheckout";
7
+ import { useBlockCheckoutBooking } from "../../domain/checkoutBooking/react/useBlockCheckoutBooking";
8
+ import { I18nMessages } from "../i18n/i18n";
9
+ import { useQueryBus } from "./useQueryBus";
10
+ var ChargeStatus;
11
+ (function (ChargeStatus) {
12
+ ChargeStatus["EXECUTED"] = "EXECUTED";
13
+ ChargeStatus["REQUIRES_ACTION"] = "REQUIRES_ACTION";
14
+ ChargeStatus["REQUIRED_ACTION_CANCELLED"] = "REQUIRED_ACTION_CANCELLED";
15
+ ChargeStatus["REJECTED"] = "REJECTED";
16
+ ChargeStatus["CANCELLED"] = "CANCELLED";
17
+ ChargeStatus["TO_CONFIRM"] = "TO_CONFIRM";
18
+ ChargeStatus["ERROR"] = "ERROR";
19
+ ChargeStatus["UNKNOWN"] = "UNKNOWN";
20
+ })(ChargeStatus || (ChargeStatus = {}));
21
+ const useSubmitCheckout = ({ checkoutId, checkoutBookingId, paymentFlowRef, onError, onSuccess, logger, }) => {
22
+ const queryBus = useQueryBus();
23
+ const [submitCheckoutCommand, submitCheckoutCommandStatus] = useSubmitCheckoutCommand({ checkoutId, logger });
24
+ const [blockCheckoutBooking, blockCheckoutBookingStatus] = useBlockCheckoutBooking({ checkoutBookingId, logger });
25
+ const [createNotification] = useCreateToastNotification({ contextId: MESSAGING_CONTEXT_ID, logger });
26
+ const [checkoutBookingExpired, setCheckoutBookingExpired] = useState(false);
27
+ const [startLegacyBoxCheckoutStatus, setStartLegacyBoxCheckoutStatus] = useState("idle");
28
+ const submitCheckout = useCallback(async ({ paymentFlowPayload, sizeChangeEnabled }) => {
29
+ try {
30
+ sizeChangeEnabled && (await blockCheckoutBooking());
31
+ }
32
+ catch (error) {
33
+ return;
34
+ }
35
+ const checkoutBooking = await queryBus(viewCheckoutBookingById({ checkoutBookingId }));
36
+ if (checkoutBooking?.isExpired) {
37
+ setCheckoutBookingExpired(true);
38
+ return;
39
+ }
40
+ paymentFlowRef.current?.startLegacyBoxCheckout(
41
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
42
+ // @ts-ignore
43
+ paymentFlowPayload, async ({ status, toaster, final }) => {
44
+ setStartLegacyBoxCheckoutStatus("loading");
45
+ if (final) {
46
+ if (status === ChargeStatus.EXECUTED) {
47
+ setStartLegacyBoxCheckoutStatus("success");
48
+ await submitCheckoutCommand();
49
+ onSuccess?.();
50
+ }
51
+ else {
52
+ createNotification({
53
+ level: NotificationLevel.ERROR,
54
+ bodyI18nKey: toaster?.id || I18nMessages.CHECKOUT_TOAST_PAYMENT_ERROR,
55
+ });
56
+ setStartLegacyBoxCheckoutStatus("error");
57
+ }
58
+ }
59
+ });
60
+ }, [
61
+ queryBus,
62
+ checkoutBookingId,
63
+ paymentFlowRef,
64
+ blockCheckoutBooking,
65
+ submitCheckoutCommand,
66
+ onSuccess,
67
+ createNotification,
68
+ ]);
69
+ const status = useMemo(() => {
70
+ if (blockCheckoutBookingStatus === CommandStatus.LOADING ||
71
+ startLegacyBoxCheckoutStatus === "loading" ||
72
+ submitCheckoutCommandStatus === CommandStatus.LOADING) {
73
+ return "loading";
74
+ }
75
+ if (blockCheckoutBookingStatus === CommandStatus.SUCCESS &&
76
+ startLegacyBoxCheckoutStatus === "success" &&
77
+ submitCheckoutCommandStatus === CommandStatus.SUCCESS) {
78
+ return "success";
79
+ }
80
+ if (blockCheckoutBookingStatus === CommandStatus.ERROR ||
81
+ startLegacyBoxCheckoutStatus === "error" ||
82
+ submitCheckoutCommandStatus === CommandStatus.ERROR ||
83
+ checkoutBookingExpired) {
84
+ onError();
85
+ return "error";
86
+ }
87
+ return "idle";
88
+ }, [
89
+ blockCheckoutBookingStatus,
90
+ startLegacyBoxCheckoutStatus,
91
+ submitCheckoutCommandStatus,
92
+ checkoutBookingExpired,
93
+ onError,
94
+ ]);
95
+ return [submitCheckout, status];
96
+ };
97
+ export { useSubmitCheckout };
@@ -0,0 +1,8 @@
1
+ import { FC } from "react";
2
+ interface BasePathProviderProps {
3
+ readonly children: JSX.Element;
4
+ readonly basePath: string;
5
+ }
6
+ export declare const BasePathProvider: FC<BasePathProviderProps>;
7
+ export declare const useBasePath: () => string;
8
+ export {};
@@ -0,0 +1,9 @@
1
+ import React, { createContext, useContext } from "react";
2
+ import invariant from "tiny-invariant";
3
+ const BasePathContext = createContext(null);
4
+ export const BasePathProvider = ({ basePath, children }) => (React.createElement(BasePathContext.Provider, { value: basePath }, children));
5
+ export const useBasePath = () => {
6
+ const basePath = useContext(BasePathContext);
7
+ invariant(basePath !== null, "Your are trying to use the useBasePath hook without wrapping your app with the <BasePathProvider>.");
8
+ return basePath;
9
+ };
@@ -0,0 +1,3 @@
1
+ declare enum UISettings {
2
+ }
3
+ export { UISettings };
@@ -0,0 +1,4 @@
1
+ var UISettings;
2
+ (function (UISettings) {
3
+ })(UISettings || (UISettings = {}));
4
+ export { UISettings };
@@ -0,0 +1,12 @@
1
+ import { FC } from "react";
2
+ import { Subscription } from "../../../../../../projection/subscription/subscription";
3
+ interface CheckoutPaymentModalProps {
4
+ readonly coupon: string | null;
5
+ readonly orderNumber: number;
6
+ readonly isFirstOrder: boolean;
7
+ readonly subscription: Subscription;
8
+ readonly getAuthToken: () => Promise<string>;
9
+ readonly onCheckoutSubmitted?: () => void;
10
+ }
11
+ declare const CheckoutPaymentModal: FC<CheckoutPaymentModalProps>;
12
+ export { CheckoutPaymentModal };
@@ -0,0 +1,90 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from "react";
2
+ import { useNavigate } from "react-router-native";
3
+ import { QueryStatus } from "@lookiero/messaging-react";
4
+ import { PaymentFlow } from "@lookiero/payments-front";
5
+ import { useLogger } from "@lookiero/sty-psp-logging";
6
+ import { CheckoutItemStatus } from "../../../../../../domain/checkoutItem/model/checkoutItem";
7
+ import { useViewFirstAvailableCheckoutByCustomerId } from "../../../../../projection/checkout/react/useViewFirstAvailableCheckoutByCustomerId";
8
+ import { useViewIsSizeChangeEnabledByCheckoutId } from "../../../../../projection/checkout/react/useViewIsSizeChangeEnabledByCheckoutId";
9
+ import { useViewPaymentFlowPayloadByCheckoutId } from "../../../../../projection/payment/react/useViewPaymentFlowPayloadByCheckoutId";
10
+ import { useViewPricingByCheckoutId } from "../../../../../projection/pricing/react/useViewPricingByCheckoutId";
11
+ import { TrackingPage } from "../../../../../tracking/tracking";
12
+ import { useTrackCheckout } from "../../../../../tracking/useTrackCheckout";
13
+ import { useStaticInfo } from "../../../../hooks/useStaticInfo";
14
+ import { useSubmitCheckout } from "../../../../hooks/useSubmitCheckout";
15
+ import { Routes } from "../../../../routing/routes";
16
+ import { useBasePath } from "../../../../routing/useBasePath";
17
+ const CheckoutPaymentModal = ({ coupon, isFirstOrder, subscription, orderNumber, getAuthToken, onCheckoutSubmitted, }) => {
18
+ const paymentFlowRef = useRef(null);
19
+ const logger = useLogger();
20
+ const { customer: { customerId, country, segment }, } = useStaticInfo();
21
+ const [checkout, checkoutStatus] = useViewFirstAvailableCheckoutByCustomerId({ customerId });
22
+ const [paymentFlowPayload] = useViewPaymentFlowPayloadByCheckoutId({
23
+ checkoutId: checkout?.id,
24
+ });
25
+ const [sizeChangeEnabled] = useViewIsSizeChangeEnabledByCheckoutId({ checkoutId: checkout?.id });
26
+ const [pricing] = useViewPricingByCheckoutId({
27
+ checkoutId: checkout?.id,
28
+ queryOptions: { refetchOnMount: true },
29
+ });
30
+ const [authToken, setAuthToken] = useState();
31
+ useEffect(() => {
32
+ const loadAuthToken = async () => setAuthToken(await getAuthToken());
33
+ loadAuthToken();
34
+ }, [getAuthToken]);
35
+ const basePath = useBasePath();
36
+ const navigate = useNavigate();
37
+ const trackCheckout = useTrackCheckout({
38
+ page: TrackingPage.CHECKOUT,
39
+ checkoutId: checkout?.id,
40
+ country,
41
+ segment,
42
+ });
43
+ const handleOnSubmitCheckoutError = useCallback(() => navigate(`${basePath}/${Routes.CHECKOUT}`, { replace: true }), [basePath, navigate]);
44
+ const handleOnSubmitCheckoutSuccess = useCallback(() => {
45
+ const checkoutItemsKept = checkout?.items.filter((checkoutItem) => checkoutItem.status === CheckoutItemStatus.KEPT || checkoutItem.status === CheckoutItemStatus.REPLACED);
46
+ const totalReplacedFor = checkoutItemsKept?.filter(({ replacedFor }) => Boolean(replacedFor)).length || 0;
47
+ trackCheckout({
48
+ totalCheckoutItemsKept: checkoutItemsKept?.length || 0,
49
+ pendingToPay: pricing?.pendingToPay.amount / 100,
50
+ coupon,
51
+ currencyCode: pricing?.pendingToPay.currency,
52
+ isFirstOrder,
53
+ orderNumber,
54
+ totalReplacedFor,
55
+ subscription,
56
+ userId: customerId,
57
+ });
58
+ onCheckoutSubmitted?.();
59
+ }, [
60
+ checkout?.items,
61
+ coupon,
62
+ customerId,
63
+ isFirstOrder,
64
+ onCheckoutSubmitted,
65
+ orderNumber,
66
+ pricing?.pendingToPay.amount,
67
+ pricing?.pendingToPay.currency,
68
+ subscription,
69
+ trackCheckout,
70
+ ]);
71
+ const [submitCheckout] = useSubmitCheckout({
72
+ checkoutId: checkout?.id,
73
+ checkoutBookingId: checkout?.checkoutBookingId,
74
+ paymentFlowRef,
75
+ onError: handleOnSubmitCheckoutError,
76
+ onSuccess: handleOnSubmitCheckoutSuccess,
77
+ logger,
78
+ });
79
+ useEffect(() => {
80
+ if (paymentFlowPayload && sizeChangeEnabled !== undefined && pricing !== undefined) {
81
+ submitCheckout({ paymentFlowPayload, sizeChangeEnabled });
82
+ }
83
+ }, [paymentFlowPayload, pricing, sizeChangeEnabled, submitCheckout]);
84
+ const dependenciesLoadedStatuses = [QueryStatus.ERROR, QueryStatus.SUCCESS];
85
+ const dependenciesLoaded = (dependenciesLoadedStatuses.includes(checkoutStatus) || checkout) && authToken;
86
+ if (!dependenciesLoaded)
87
+ return null;
88
+ return React.createElement(PaymentFlow, { ref: paymentFlowRef, token: authToken });
89
+ };
90
+ export { CheckoutPaymentModal };
@@ -17,6 +17,7 @@ const returnQuestionItems = {
17
17
  [ReturnQuestionType.HOST_STACK]: ReturnQuestionFeedbackItem,
18
18
  [ReturnQuestionType.TEXTAREA]: ReturnQuestionFeedbackItem,
19
19
  [ReturnQuestionType.OPTION]: ReturnQuestionFeedbackItem,
20
+ [ReturnQuestionType.HOST_RADIO_GROUP]: ReturnQuestionFeedbackItem,
20
21
  };
21
22
  const ReturnQuestionsFeedback = ({ returnQuestions, onEditFeedback }) => {
22
23
  const titleText = useI18nMessage({ domain: DOMAIN, id: I18nMessages.FEEDBACK_TITLE });
@@ -20,6 +20,7 @@ import { ReturnQuestions } from "../../../../components/organisms/returnQuestion
20
20
  import { useReturnQuestionFeedback } from "../../../../components/organisms/returnQuestions/behaviors/useReturnQuestionFeedback";
21
21
  import { ReturnQuestionItemProvider, } from "../../../../components/organisms/returnQuestions/behaviors/useReturnQuestionItem";
22
22
  import { HostDefaultReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/hostDefaultReturnQuestionItem/HostDefaultReturnQuestionItem";
23
+ import { HostLegacyRadioGroupReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/hostLegacyRadioGroupReturnQuestionItem/HostLegacyRadioGroupReturnQuestionItem";
23
24
  import { HostRadioGroupReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/hostRadioGroupReturnQuestionItem/HostRadioGroupReturnQuestionItem";
24
25
  import { HostStackReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/hostStackReturnQuestionItem/form/HostStackReturnQuestionItem";
25
26
  import { RadioReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/radioReturnQuestionItem/RadioReturnQuestionItem";
@@ -34,7 +35,8 @@ const RETURN_QUESTION_FORM_PORTAL_HOST_NAME = "return-question-form-portal";
34
35
  const returnQuestionItems = {
35
36
  [ReturnQuestionType.HOST_DEFAULT]: HostDefaultReturnQuestionItem,
36
37
  [ReturnQuestionType.HOST_TEXTAREA]: HostDefaultReturnQuestionItem,
37
- [ReturnQuestionType.HOST_SELECT]: HostRadioGroupReturnQuestionItem,
38
+ [ReturnQuestionType.HOST_SELECT]: HostLegacyRadioGroupReturnQuestionItem,
39
+ [ReturnQuestionType.HOST_RADIO_GROUP]: HostRadioGroupReturnQuestionItem,
38
40
  [ReturnQuestionType.HOST_STACK]: HostStackReturnQuestionItem,
39
41
  [ReturnQuestionType.TEXTAREA]: TextareaReturnQuestionItem,
40
42
  [ReturnQuestionType.OPTION]: RadioReturnQuestionItem,
@@ -0,0 +1,18 @@
1
+ declare enum CheckoutQuestionType {
2
+ HOST_DEFAULT = "HOST_DEFAULT",
3
+ HOST_TEXTAREA = "HOST_TEXTAREA",
4
+ HOST_SELECT = "HOST_SELECT",
5
+ TEXTAREA = "TEXTAREA",
6
+ ICON = "ICON",
7
+ BUTTON = "BUTTON"
8
+ }
9
+ interface CheckoutQuestionProjection {
10
+ readonly id: string;
11
+ readonly name: string;
12
+ readonly placeholder: string;
13
+ readonly type: CheckoutQuestionType;
14
+ readonly children?: CheckoutQuestionProjection[];
15
+ readonly showCondition: string[];
16
+ }
17
+ export { CheckoutQuestionType };
18
+ export type { CheckoutQuestionProjection };
@@ -0,0 +1,10 @@
1
+ var CheckoutQuestionType;
2
+ (function (CheckoutQuestionType) {
3
+ CheckoutQuestionType["HOST_DEFAULT"] = "HOST_DEFAULT";
4
+ CheckoutQuestionType["HOST_TEXTAREA"] = "HOST_TEXTAREA";
5
+ CheckoutQuestionType["HOST_SELECT"] = "HOST_SELECT";
6
+ CheckoutQuestionType["TEXTAREA"] = "TEXTAREA";
7
+ CheckoutQuestionType["ICON"] = "ICON";
8
+ CheckoutQuestionType["BUTTON"] = "BUTTON";
9
+ })(CheckoutQuestionType || (CheckoutQuestionType = {}));
10
+ export { CheckoutQuestionType };
@@ -0,0 +1,25 @@
1
+ import { CancelableQueryViewArgs, Query, QueryHandlerFunction, QueryHandlerFunctionArgs } from "@lookiero/messaging";
2
+ import { CheckoutQuestionProjection } from "./checkoutQuestion";
3
+ declare const LIST_CHECKOUT_QUESTIONS_BY_CHECKOUT_ID = "list_checkout_questions_by_checkout_id";
4
+ interface ListCheckoutQuestionsByCheckoutIdPayload {
5
+ readonly checkoutId: string;
6
+ }
7
+ interface ListCheckoutQuestionsByCheckoutId extends Query<typeof LIST_CHECKOUT_QUESTIONS_BY_CHECKOUT_ID>, ListCheckoutQuestionsByCheckoutIdPayload {
8
+ }
9
+ interface ListCheckoutQuestionsByCheckoutIdFunction {
10
+ (payload: ListCheckoutQuestionsByCheckoutIdPayload): ListCheckoutQuestionsByCheckoutId;
11
+ }
12
+ declare const listCheckoutQuestionsByCheckoutId: ListCheckoutQuestionsByCheckoutIdFunction;
13
+ type ListCheckoutQuestionsByCheckoutIdResult = CheckoutQuestionProjection[] | null;
14
+ interface CheckoutQuestionsByCheckoutIdViewArgs extends CancelableQueryViewArgs {
15
+ readonly checkoutId: string;
16
+ }
17
+ interface CheckoutQuestionsByCheckoutIdView {
18
+ (args: CheckoutQuestionsByCheckoutIdViewArgs): Promise<ListCheckoutQuestionsByCheckoutIdResult>;
19
+ }
20
+ interface ListCheckoutQuestionsByCheckoutIdHandlerFunctionArgs extends QueryHandlerFunctionArgs {
21
+ readonly view: CheckoutQuestionsByCheckoutIdView;
22
+ }
23
+ declare const listCheckoutQuestionsByCheckoutIdHandler: QueryHandlerFunction<ListCheckoutQuestionsByCheckoutId, ListCheckoutQuestionsByCheckoutIdResult, ListCheckoutQuestionsByCheckoutIdHandlerFunctionArgs>;
24
+ export type { ListCheckoutQuestionsByCheckoutId, CheckoutQuestionsByCheckoutIdView, ListCheckoutQuestionsByCheckoutIdResult, };
25
+ export { LIST_CHECKOUT_QUESTIONS_BY_CHECKOUT_ID, listCheckoutQuestionsByCheckoutId, listCheckoutQuestionsByCheckoutIdHandler, };
@@ -0,0 +1,8 @@
1
+ import { query, } from "@lookiero/messaging";
2
+ const LIST_CHECKOUT_QUESTIONS_BY_CHECKOUT_ID = "list_checkout_questions_by_checkout_id";
3
+ const listCheckoutQuestionsByCheckoutId = (payload) => ({
4
+ ...query({ name: LIST_CHECKOUT_QUESTIONS_BY_CHECKOUT_ID }),
5
+ ...payload,
6
+ });
7
+ const listCheckoutQuestionsByCheckoutIdHandler = ({ view, signal }) => async ({ checkoutId }) => view({ checkoutId, signal });
8
+ export { LIST_CHECKOUT_QUESTIONS_BY_CHECKOUT_ID, listCheckoutQuestionsByCheckoutId, listCheckoutQuestionsByCheckoutIdHandler, };
@@ -3,6 +3,7 @@ declare enum ReturnQuestionType {
3
3
  HOST_TEXTAREA = "HOST_TEXTAREA",
4
4
  HOST_SELECT = "HOST_SELECT",
5
5
  HOST_STACK = "HOST_STACK",
6
+ HOST_RADIO_GROUP = "HOST_RADIO_GROUP",
6
7
  TEXTAREA = "TEXTAREA",
7
8
  OPTION = "OPTION"
8
9
  }
@@ -4,6 +4,7 @@ var ReturnQuestionType;
4
4
  ReturnQuestionType["HOST_TEXTAREA"] = "HOST_TEXTAREA";
5
5
  ReturnQuestionType["HOST_SELECT"] = "HOST_SELECT";
6
6
  ReturnQuestionType["HOST_STACK"] = "HOST_STACK";
7
+ ReturnQuestionType["HOST_RADIO_GROUP"] = "HOST_RADIO_GROUP";
7
8
  ReturnQuestionType["TEXTAREA"] = "TEXTAREA";
8
9
  ReturnQuestionType["OPTION"] = "OPTION";
9
10
  })(ReturnQuestionType || (ReturnQuestionType = {}));
@@ -1,9 +1,9 @@
1
1
  import { EmptyObject, ExcludePropertyIfOptional, NonEmptyArray } from "@lookiero/sty-psp-typescript";
2
2
  import { ReturnQuestionType } from "./returnQuestion.constants";
3
3
  import { Metadata } from "./returnQuestion.metadata";
4
- type ReturnQuestionTypesWithChildren = ReturnQuestionType.HOST_DEFAULT | ReturnQuestionType.HOST_SELECT | ReturnQuestionType.HOST_STACK | ReturnQuestionType.HOST_TEXTAREA;
4
+ type ReturnQuestionTypesWithChildren = ReturnQuestionType.HOST_DEFAULT | ReturnQuestionType.HOST_SELECT | ReturnQuestionType.HOST_STACK | ReturnQuestionType.HOST_TEXTAREA | ReturnQuestionType.HOST_RADIO_GROUP;
5
5
  type ReturnQuestionTypesWithOptionalChildren = ReturnQuestionType.OPTION;
6
- type ReturnQuestionTypesWithOptionalTranslationKeys = ReturnQuestionType.HOST_STACK;
6
+ type ReturnQuestionTypesWithOptionalTranslationKeys = ReturnQuestionType.HOST_DEFAULT | ReturnQuestionType.HOST_STACK | ReturnQuestionType.HOST_RADIO_GROUP;
7
7
  type ReturnQuestionMetadata<RQT extends ReturnQuestionType> = ExcludePropertyIfOptional<"metadata", {
8
8
  readonly metadata: Metadata<RQT>;
9
9
  }>;
@@ -1,5 +1,3 @@
1
- import { ReturnQuestionProjection, ReturnQuestionTypesWithChildren, ReturnQuestionTypesWithOptionalTranslationKeys } from "./returnQuestion";
2
- import { ReturnQuestionType } from "./returnQuestion.constants";
3
- declare const returnQuestionWithTranslationKey: (question: ReturnQuestionProjection) => question is ReturnQuestionProjection<Exclude<ReturnQuestionType, ReturnQuestionTypesWithOptionalTranslationKeys>>;
1
+ import { ReturnQuestionProjection, ReturnQuestionTypesWithChildren } from "./returnQuestion";
4
2
  declare const returnQuestionHasChildren: (question: ReturnQuestionProjection) => question is ReturnQuestionProjection<ReturnQuestionTypesWithChildren>;
5
- export { returnQuestionWithTranslationKey, returnQuestionHasChildren };
3
+ export { returnQuestionHasChildren };
@@ -1,10 +1,10 @@
1
1
  import { ReturnQuestionType } from "./returnQuestion.constants";
2
- const returnQuestionWithTranslationKey = (question) => Boolean(question.translationKey);
3
2
  const returnQuestionHasChildren = (question) => [
4
3
  ReturnQuestionType.HOST_DEFAULT,
5
4
  ReturnQuestionType.HOST_SELECT,
6
5
  ReturnQuestionType.HOST_STACK,
7
6
  ReturnQuestionType.HOST_TEXTAREA,
7
+ ReturnQuestionType.HOST_RADIO_GROUP,
8
8
  ReturnQuestionType.OPTION,
9
9
  ].includes(question.type);
10
- export { returnQuestionWithTranslationKey, returnQuestionHasChildren };
10
+ export { returnQuestionHasChildren };
@@ -0,0 +1,29 @@
1
+ import { Query, QueryHandlerFunction, QueryHandlerFunctionArgs } from "@lookiero/messaging";
2
+ interface UiSettingProjection {
3
+ readonly id: string;
4
+ readonly key: string;
5
+ readonly value: unknown;
6
+ }
7
+ declare const VIEW_UI_SETTING_BY_KEY = "view_ui_setting_by_key";
8
+ interface ViewUiSettingByKeyPayload {
9
+ readonly key: string;
10
+ }
11
+ interface ViewUiSettingByKey extends Query<typeof VIEW_UI_SETTING_BY_KEY>, ViewUiSettingByKeyPayload {
12
+ }
13
+ interface ViewUiSettingByKeyFunction {
14
+ (payload: ViewUiSettingByKeyPayload): ViewUiSettingByKey;
15
+ }
16
+ declare const viewUiSettingByKey: ViewUiSettingByKeyFunction;
17
+ type ViewUiSettingByKeyResult = UiSettingProjection | null;
18
+ interface UiSettingByKeyViewArgs {
19
+ readonly key: string;
20
+ }
21
+ interface UiSettingByKeyView {
22
+ (args: UiSettingByKeyViewArgs): Promise<ViewUiSettingByKeyResult>;
23
+ }
24
+ interface ViewUiSettingByKeyHandlerFunctionArgs extends QueryHandlerFunctionArgs {
25
+ readonly view: UiSettingByKeyView;
26
+ }
27
+ declare const viewUiSettingByKeyHandler: QueryHandlerFunction<ViewUiSettingByKey, ViewUiSettingByKeyResult, ViewUiSettingByKeyHandlerFunctionArgs>;
28
+ export type { UiSettingProjection, UiSettingByKeyView };
29
+ export { VIEW_UI_SETTING_BY_KEY, viewUiSettingByKey, viewUiSettingByKeyHandler };
@@ -0,0 +1,8 @@
1
+ import { query } from "@lookiero/messaging";
2
+ const VIEW_UI_SETTING_BY_KEY = "view_ui_setting_by_key";
3
+ const viewUiSettingByKey = (payload) => ({
4
+ ...query({ name: VIEW_UI_SETTING_BY_KEY }),
5
+ ...payload,
6
+ });
7
+ const viewUiSettingByKeyHandler = ({ view }) => async ({ key }) => view({ key });
8
+ export { VIEW_UI_SETTING_BY_KEY, viewUiSettingByKey, viewUiSettingByKeyHandler };
@@ -1 +1 @@
1
- export declare const VERSION = "12.4.0";
1
+ export declare const VERSION = "12.5.0";
@@ -1 +1 @@
1
- export const VERSION = "12.4.0";
1
+ export const VERSION = "12.5.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lookiero/checkout",
3
- "version": "12.4.0",
3
+ "version": "12.5.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "sideEffects": "false",
package/src/ExpoRoot.tsx CHANGED
@@ -37,7 +37,7 @@ const order: OrderProjection = {
37
37
  };
38
38
 
39
39
  const customer: Customer = {
40
- customerId: "8fc50dda-26b8-4a14-b2bf-7f4f9541f9bd",
40
+ customerId: "c7373f39-cae1-4b6d-9711-19eaf007d6a8",
41
41
  country: Country.NL,
42
42
  segment: Segment.WOMEN,
43
43
  email: "email@example.com",