@lookiero/checkout 7.0.0 → 7.0.1-beta.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.
- package/dist/public/public/assets/adaptive-icon.png +0 -0
- package/dist/public/public/assets/favicon.png +0 -0
- package/dist/public/public/assets/icon.png +0 -0
- package/dist/public/public/assets/splash.png +0 -0
- package/dist/public/public/images/not-found.png +0 -0
- package/dist/src/infrastructure/projection/checkout/react/useViewIsCheckoutAccessibleByCustomerId.d.ts +10 -0
- package/dist/src/infrastructure/projection/checkout/react/useViewIsCheckoutAccessibleByCustomerId.js +17 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/Layout.d.ts +21 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/Layout.js +1 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/components/footer/Footer.d.ts +6 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/components/footer/Footer.js +4 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/components/header/Header.d.ts +6 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/components/header/Header.js +5 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/components/header/Header.style.d.ts +4 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/components/header/Header.style.js +19 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/dummyLayout/DummyLayout.d.ts +3 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/dummyLayout/DummyLayout.js +18 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/dummyLayout/DummyLayout.style.d.ts +12 -0
- package/dist/src/infrastructure/ui/components/layouts/layout/dummyLayout/DummyLayout.style.js +13 -0
- package/dist/src/infrastructure/ui/components/templates/header/defaultHeader/DefaultHeader.d.ts +6 -0
- package/dist/src/infrastructure/ui/components/templates/header/defaultHeader/DefaultHeader.js +11 -0
- package/dist/src/infrastructure/ui/components/templates/header/defaultHeader/DefaultHeader.style.d.ts +8 -0
- package/dist/src/infrastructure/ui/components/templates/header/defaultHeader/DefaultHeader.style.js +11 -0
- package/dist/src/infrastructure/ui/hooks/useNewFeedbackExperiment.d.ts +11 -0
- package/dist/src/infrastructure/ui/hooks/useNewFeedbackExperiment.js +49 -0
- package/dist/src/infrastructure/ui/routing/CheckoutAccessibilityMiddleware.d.ts +9 -0
- package/dist/src/infrastructure/ui/routing/CheckoutAccessibilityMiddleware.js +21 -0
- package/dist/src/infrastructure/ui/routing/CheckoutMiddleware.js +5 -1
- package/dist/src/infrastructure/ui/views/feedback/components/checkoutQuestionsForm/CheckoutQuestionsForm.style.d.ts +7 -0
- package/dist/src/infrastructure/ui/views/feedback/components/checkoutQuestionsForm/CheckoutQuestionsForm.style.js +10 -0
- package/dist/src/infrastructure/ui/views/item/components/returnQuestionsForm/ReturnQuestionsForm.d.ts +11 -0
- package/dist/src/infrastructure/ui/views/item/components/returnQuestionsForm/ReturnQuestionsForm.js +40 -0
- package/dist/src/infrastructure/ui/views/item/components/returnQuestionsForm/ReturnQuestionsForm.style.d.ts +12 -0
- package/dist/src/infrastructure/ui/views/item/components/returnQuestionsForm/ReturnQuestionsForm.style.js +15 -0
- package/dist/src/infrastructure/ui/views/return/Return.style.d.ts +40 -0
- package/dist/src/infrastructure/ui/views/return/Return.style.js +43 -0
- package/dist/src/infrastructure/ui/views/summary/components/stickyPricing/StickyPricing.d.ts +13 -0
- package/dist/src/infrastructure/ui/views/summary/components/stickyPricing/StickyPricing.js +9 -0
- package/dist/src/infrastructure/ui/views/summary/components/stickyPricing/StickyPricing.style.d.ts +7 -0
- package/dist/src/infrastructure/ui/views/summary/components/stickyPricing/StickyPricing.style.js +10 -0
- package/dist/src/projection/checkout/viewIsCheckoutAccessibleByCustomerId.d.ts +17 -0
- package/dist/src/projection/checkout/viewIsCheckoutAccessibleByCustomerId.js +13 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/package.json +1 -1
- package/src/infrastructure/ui/routing/CheckoutMiddleware.test.tsx +10 -0
- package/src/infrastructure/ui/routing/CheckoutMiddleware.tsx +7 -1
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { UseQueryFunctionResult } from "@lookiero/messaging-react";
|
|
2
|
+
import { IsCheckoutAccessibleByCustomerIdProjection } from "../../../../projection/checkout/viewIsCheckoutAccessibleByCustomerId";
|
|
3
|
+
interface UseViewIsCheckoutAccessibleByCustomerIdFunctionArgs {
|
|
4
|
+
readonly customerId: string | undefined;
|
|
5
|
+
}
|
|
6
|
+
interface UseViewIsCheckoutAccessibleByCustomerIdFunction {
|
|
7
|
+
(args: UseViewIsCheckoutAccessibleByCustomerIdFunctionArgs): UseQueryFunctionResult<IsCheckoutAccessibleByCustomerIdProjection>;
|
|
8
|
+
}
|
|
9
|
+
declare const useViewIsCheckoutAccessibleByCustomerId: UseViewIsCheckoutAccessibleByCustomerIdFunction;
|
|
10
|
+
export { useViewIsCheckoutAccessibleByCustomerId };
|
package/dist/src/infrastructure/projection/checkout/react/useViewIsCheckoutAccessibleByCustomerId.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useQuery } from "@lookiero/messaging-react";
|
|
2
|
+
import { isCheckoutFeedbackGiven } from "../../../../domain/checkoutFeedback/model/checkoutFeedbackGiven";
|
|
3
|
+
import { viewIsCheckoutAccessibleByCustomerId, } from "../../../../projection/checkout/viewIsCheckoutAccessibleByCustomerId";
|
|
4
|
+
import { MESSAGING_CONTEXT_ID } from "../../../delivery/baseBootstrap";
|
|
5
|
+
const useViewIsCheckoutAccessibleByCustomerId = ({ customerId }) => useQuery({
|
|
6
|
+
query: viewIsCheckoutAccessibleByCustomerId({ customerId }),
|
|
7
|
+
contextId: MESSAGING_CONTEXT_ID,
|
|
8
|
+
invalidation: isCheckoutFeedbackGiven,
|
|
9
|
+
options: {
|
|
10
|
+
refetchOnMount: "always",
|
|
11
|
+
staleTime: Infinity,
|
|
12
|
+
retry: false,
|
|
13
|
+
refetchOnWindowFocus: false,
|
|
14
|
+
cacheTime: 0,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
export { useViewIsCheckoutAccessibleByCustomerId };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FC, ReactNode, RefObject } from "react";
|
|
2
|
+
import { LayoutChangeEvent, ScrollView, StyleProp, ViewStyle } from "react-native";
|
|
3
|
+
interface LayoutStyle {
|
|
4
|
+
readonly safeAreaView: StyleProp<ViewStyle>;
|
|
5
|
+
readonly scrollView: StyleProp<ViewStyle>;
|
|
6
|
+
readonly header: StyleProp<ViewStyle>;
|
|
7
|
+
}
|
|
8
|
+
interface LayoutProps {
|
|
9
|
+
readonly children: ReactNode;
|
|
10
|
+
readonly header?: JSX.Element | null;
|
|
11
|
+
readonly footer?: JSX.Element | null;
|
|
12
|
+
readonly panel?: JSX.Element | null;
|
|
13
|
+
readonly stickyHeader?: boolean;
|
|
14
|
+
readonly stickyHeaderHiddenOnScroll?: boolean;
|
|
15
|
+
readonly scrollRef?: RefObject<ScrollView>;
|
|
16
|
+
readonly scrollEnabled?: boolean;
|
|
17
|
+
readonly style?: Partial<LayoutStyle>;
|
|
18
|
+
readonly onLayout?: (event: LayoutChangeEvent) => void;
|
|
19
|
+
}
|
|
20
|
+
type Layout = FC<LayoutProps>;
|
|
21
|
+
export type { Layout };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/src/infrastructure/ui/components/layouts/layout/components/header/Header.style.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Platform, StyleSheet } from "react-native";
|
|
2
|
+
import { HEADER_HEIGHT } from "../../../../templates/header/Header.style";
|
|
3
|
+
const style = StyleSheet.create({
|
|
4
|
+
header: {
|
|
5
|
+
...Platform.select({
|
|
6
|
+
web: {
|
|
7
|
+
position: "sticky",
|
|
8
|
+
top: 0,
|
|
9
|
+
zIndex: 10,
|
|
10
|
+
height: HEADER_HEIGHT,
|
|
11
|
+
},
|
|
12
|
+
native: {
|
|
13
|
+
position: "relative",
|
|
14
|
+
height: HEADER_HEIGHT,
|
|
15
|
+
},
|
|
16
|
+
}),
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
export { style };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* eslint-disable react/prop-types */
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { View } from "react-native";
|
|
4
|
+
import { GestureHandlerRootView, ScrollView as RNGHScrollView } from "react-native-gesture-handler";
|
|
5
|
+
import { SafeAreaView } from "react-native-safe-area-context";
|
|
6
|
+
import { Footer as DefaultFooter } from "../../../templates/footer/Footer";
|
|
7
|
+
import { DefaultHeader } from "../../../templates/header/defaultHeader/DefaultHeader";
|
|
8
|
+
import { Footer } from "../components/footer/Footer";
|
|
9
|
+
import { Header } from "../components/header/Header";
|
|
10
|
+
import { style } from "./DummyLayout.style";
|
|
11
|
+
const DummyLayout = ({ children, header = React.createElement(DefaultHeader, null), footer = React.createElement(DefaultFooter, null), panel, style: customStyle, scrollEnabled, onLayout, }) => (React.createElement(SafeAreaView, { style: [style.safeAreaView, customStyle?.safeAreaView] },
|
|
12
|
+
React.createElement(GestureHandlerRootView, { style: { flex: 1 } },
|
|
13
|
+
React.createElement(RNGHScrollView, { contentContainerStyle: [style.scrollView, customStyle?.scrollView], scrollEnabled: scrollEnabled, scrollEventThrottle: 16, showsVerticalScrollIndicator: false, stickyHeaderIndices: [0] },
|
|
14
|
+
React.createElement(Header, null, header),
|
|
15
|
+
panel,
|
|
16
|
+
React.createElement(View, { style: style.children, onLayout: onLayout }, children))),
|
|
17
|
+
React.createElement(Footer, null, footer)));
|
|
18
|
+
export { DummyLayout };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ButtonIcon } from "@lookiero/aurora";
|
|
3
|
+
import { Header } from "../Header";
|
|
4
|
+
import { ButtonIconPlaceholder } from "../buttonIconPlaceholder/ButtonIconPlaceholder";
|
|
5
|
+
import { Logo } from "../logo/Logo";
|
|
6
|
+
import { style } from "./DefaultHeader.style";
|
|
7
|
+
const DefaultHeader = ({ onPressMenu }) => (React.createElement(Header, { testID: "default-header" },
|
|
8
|
+
React.createElement(Logo, null),
|
|
9
|
+
React.createElement(ButtonIconPlaceholder, null),
|
|
10
|
+
React.createElement(ButtonIcon, { name: "menu", style: style.button, testID: "menu-button-icon", onPress: onPressMenu })));
|
|
11
|
+
export { DefaultHeader };
|
package/dist/src/infrastructure/ui/components/templates/header/defaultHeader/DefaultHeader.style.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { StyleSheet } from "react-native";
|
|
2
|
+
import { theme } from "@lookiero/sty-psp-ui";
|
|
3
|
+
const { space10 } = theme();
|
|
4
|
+
const style = StyleSheet.create({
|
|
5
|
+
button: {
|
|
6
|
+
alignSelf: "auto",
|
|
7
|
+
height: space10,
|
|
8
|
+
width: space10,
|
|
9
|
+
},
|
|
10
|
+
});
|
|
11
|
+
export { style };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FC, ReactNode } from "react";
|
|
2
|
+
declare enum NewFeedbackExperimentVariation {
|
|
3
|
+
CONTROL = "control",
|
|
4
|
+
RETURN_PAGE = "return_page"
|
|
5
|
+
}
|
|
6
|
+
interface NewFeedbackExperimentProviderProps {
|
|
7
|
+
readonly children: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
declare const NewFeedbackExperimentProvider: FC<NewFeedbackExperimentProviderProps>;
|
|
10
|
+
declare const useNewFeedbackExperiment: () => NewFeedbackExperimentVariation;
|
|
11
|
+
export { useNewFeedbackExperiment, NewFeedbackExperimentProvider, NewFeedbackExperimentVariation };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React, { createContext, useContext, useEffect, useMemo, useRef } from "react";
|
|
2
|
+
import invariant from "tiny-invariant";
|
|
3
|
+
import { Spinner } from "@lookiero/aurora";
|
|
4
|
+
import { useAssignedVariationByExperimentId } from "@lookiero/sty-psp-ab-testing";
|
|
5
|
+
import { useViewFirstAvailableCheckoutByCustomerId } from "../../projection/checkout/react/useViewFirstAvailableCheckoutByCustomerId";
|
|
6
|
+
import { useTrackAssignedVariationByExperiment } from "../../tracking/useTrackAssignedVariationByExperiment";
|
|
7
|
+
import { useStaticInfo } from "./useStaticInfo";
|
|
8
|
+
var NewFeedbackExperimentVariation;
|
|
9
|
+
(function (NewFeedbackExperimentVariation) {
|
|
10
|
+
NewFeedbackExperimentVariation["CONTROL"] = "control";
|
|
11
|
+
NewFeedbackExperimentVariation["RETURN_PAGE"] = "return_page";
|
|
12
|
+
})(NewFeedbackExperimentVariation || (NewFeedbackExperimentVariation = {}));
|
|
13
|
+
const NewFeedbackExperimentContext = createContext(null);
|
|
14
|
+
const NewFeedbackExperimentProvider = ({ children }) => {
|
|
15
|
+
const { kameleoon: { experiments: { newFeedback: { id: newFeedbackId, variations }, }, }, customer: { customerId, country, segment }, } = useStaticInfo();
|
|
16
|
+
const [checkout] = useViewFirstAvailableCheckoutByCustomerId({ customerId });
|
|
17
|
+
const { assignedVariation: newFeedbackVariation } = useAssignedVariationByExperimentId({
|
|
18
|
+
experimentId: newFeedbackId,
|
|
19
|
+
});
|
|
20
|
+
const trackAssignedVariation = useTrackAssignedVariationByExperiment({
|
|
21
|
+
checkoutId: checkout?.id,
|
|
22
|
+
country,
|
|
23
|
+
segment,
|
|
24
|
+
experimentId: newFeedbackId,
|
|
25
|
+
});
|
|
26
|
+
const value = useMemo(() => ({
|
|
27
|
+
variation: newFeedbackVariation?.id === Number(variations.v1)
|
|
28
|
+
? NewFeedbackExperimentVariation.RETURN_PAGE
|
|
29
|
+
: NewFeedbackExperimentVariation.CONTROL,
|
|
30
|
+
}), [newFeedbackVariation?.id, variations.v1]);
|
|
31
|
+
const assignedVariantTracked = useRef(false);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (assignedVariantTracked.current || !newFeedbackVariation || !checkout?.id) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
trackAssignedVariation({ assignedVariation: newFeedbackVariation });
|
|
37
|
+
assignedVariantTracked.current = true;
|
|
38
|
+
}, [checkout?.id, newFeedbackVariation, trackAssignedVariation]);
|
|
39
|
+
if (!checkout) {
|
|
40
|
+
return React.createElement(Spinner, null);
|
|
41
|
+
}
|
|
42
|
+
return React.createElement(NewFeedbackExperimentContext.Provider, { value: value }, children);
|
|
43
|
+
};
|
|
44
|
+
const useNewFeedbackExperiment = () => {
|
|
45
|
+
const newFeedbackExperiment = useContext(NewFeedbackExperimentContext);
|
|
46
|
+
invariant(newFeedbackExperiment, "Your are trying to use the useNewFeedbackExperiment hook without wrapping your app with the <NewFeedbackExperimentProvider>.");
|
|
47
|
+
return newFeedbackExperiment.variation;
|
|
48
|
+
};
|
|
49
|
+
export { useNewFeedbackExperiment, NewFeedbackExperimentProvider, NewFeedbackExperimentVariation };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
interface CheckoutAccessibilityMiddlewareProps {
|
|
3
|
+
readonly customerId: string | undefined;
|
|
4
|
+
readonly onNotAccessible: () => void;
|
|
5
|
+
readonly loader?: JSX.Element;
|
|
6
|
+
readonly children: JSX.Element;
|
|
7
|
+
}
|
|
8
|
+
declare const CheckoutAccessibilityMiddleware: FC<CheckoutAccessibilityMiddlewareProps>;
|
|
9
|
+
export { CheckoutAccessibilityMiddleware };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React, { useEffect, useRef } from "react";
|
|
2
|
+
import { Spinner } from "@lookiero/aurora";
|
|
3
|
+
import { QueryStatus } from "@lookiero/messaging-react";
|
|
4
|
+
import { useViewIsCheckoutAccessibleByCustomerId } from "../../projection/checkout/react/useViewIsCheckoutAccessibleByCustomerId";
|
|
5
|
+
const CheckoutAccessibilityMiddleware = ({ customerId, onNotAccessible, loader = React.createElement(Spinner, null), children, }) => {
|
|
6
|
+
const [accessible, status] = useViewIsCheckoutAccessibleByCustomerId({ customerId });
|
|
7
|
+
const onNotAccessibleRef = useRef(onNotAccessible);
|
|
8
|
+
onNotAccessibleRef.current = onNotAccessible;
|
|
9
|
+
const notAccessible = accessible === false || status === QueryStatus.ERROR;
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (notAccessible) {
|
|
12
|
+
onNotAccessibleRef.current();
|
|
13
|
+
}
|
|
14
|
+
}, [notAccessible]);
|
|
15
|
+
return accessible === undefined && [QueryStatus.IDLE, QueryStatus.LOADING].includes(status)
|
|
16
|
+
? loader
|
|
17
|
+
: accessible
|
|
18
|
+
? children
|
|
19
|
+
: null;
|
|
20
|
+
};
|
|
21
|
+
export { CheckoutAccessibilityMiddleware };
|
|
@@ -78,9 +78,13 @@ const CheckoutMiddleware = ({ customerId, onNotAccessible, loader = React.create
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
}, [basePath, checkout?.status, checkout?.items]);
|
|
81
|
-
if (
|
|
81
|
+
if (checkout === undefined) {
|
|
82
82
|
return loader;
|
|
83
83
|
}
|
|
84
|
+
if (checkout === null) {
|
|
85
|
+
onNotAccessible();
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
84
88
|
/* Prevent direct payment access */
|
|
85
89
|
if (checkoutPaymentRouteMatch && !checkoutShown.current) {
|
|
86
90
|
onNotAccessible();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { StyleSheet } from "react-native";
|
|
2
|
+
import { theme } from "@lookiero/sty-psp-ui";
|
|
3
|
+
const { space6, space8 } = theme();
|
|
4
|
+
const style = StyleSheet.create({
|
|
5
|
+
buttonContainer: {
|
|
6
|
+
paddingHorizontal: space6,
|
|
7
|
+
paddingVertical: space8,
|
|
8
|
+
},
|
|
9
|
+
});
|
|
10
|
+
export { style };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { FeedbackProjection } from "../../../../../../projection/feedback/feedback";
|
|
3
|
+
import { ReturnQuestionProjection } from "../../../../../../projection/returnQuestion/returnQuestion";
|
|
4
|
+
interface ReturnQuestionsFormProps {
|
|
5
|
+
readonly visible: boolean;
|
|
6
|
+
readonly returnQuestions: ReturnQuestionProjection[];
|
|
7
|
+
readonly onSubmit: (feedback: FeedbackProjection) => void;
|
|
8
|
+
readonly onClose: () => void;
|
|
9
|
+
}
|
|
10
|
+
declare const ReturnQuestionsForm: FC<ReturnQuestionsFormProps>;
|
|
11
|
+
export { ReturnQuestionsForm };
|
package/dist/src/infrastructure/ui/views/item/components/returnQuestionsForm/ReturnQuestionsForm.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { PortalHost } from "@gorhom/portal";
|
|
2
|
+
import React, { useCallback } from "react";
|
|
3
|
+
import { View } from "react-native";
|
|
4
|
+
import { Button, Text } from "@lookiero/aurora";
|
|
5
|
+
import { useI18nMessage } from "@lookiero/i18n-react";
|
|
6
|
+
import { Modal } from "@lookiero/sty-psp-ui";
|
|
7
|
+
import { ReturnQuestionType, } from "../../../../../../projection/returnQuestion/returnQuestion";
|
|
8
|
+
import { ReturnQuestions } from "../../../../components/organisms/returnQuestions/ReturnQuestions";
|
|
9
|
+
import { useReturnQuestionFeedback } from "../../../../components/organisms/returnQuestions/behaviors/useReturnQuestionFeedback";
|
|
10
|
+
import { ReturnQuestionItemProvider, } from "../../../../components/organisms/returnQuestions/behaviors/useReturnQuestionItem";
|
|
11
|
+
import { HostDefaultReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/hostDefaultReturnQuestionItem/HostDefaultReturnQuestionItem";
|
|
12
|
+
import { HostSelectReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/hostSelectReturnQuestionItem/HostSelectReturnQuestionItem";
|
|
13
|
+
import { HostStackReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/hostStackReturnQuestionItem/modal/HostStackReturnQuestionItem";
|
|
14
|
+
import { OptionReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/optionReturnQuestionItem/OptionReturnQuestionItem";
|
|
15
|
+
import { TextareaReturnQuestionItem } from "../../../../components/organisms/returnQuestions/components/textareaReturnQuestionItem/TextareaReturnQuestionItem";
|
|
16
|
+
import { I18nMessages } from "../../../../i18n/i18n";
|
|
17
|
+
import { style } from "./ReturnQuestionsForm.style";
|
|
18
|
+
const RETURN_QUESTION_FORM_PORTAL_HOST_NAME = "return-question-form-portal";
|
|
19
|
+
const returnQuestionItems = {
|
|
20
|
+
[ReturnQuestionType.HOST_DEFAULT]: HostDefaultReturnQuestionItem,
|
|
21
|
+
[ReturnQuestionType.HOST_TEXTAREA]: HostDefaultReturnQuestionItem,
|
|
22
|
+
[ReturnQuestionType.HOST_SELECT]: HostSelectReturnQuestionItem,
|
|
23
|
+
[ReturnQuestionType.HOST_STACK]: HostStackReturnQuestionItem,
|
|
24
|
+
[ReturnQuestionType.TEXTAREA]: TextareaReturnQuestionItem,
|
|
25
|
+
[ReturnQuestionType.OPTION]: OptionReturnQuestionItem,
|
|
26
|
+
};
|
|
27
|
+
const ReturnQuestionsForm = ({ returnQuestions, visible, onSubmit, onClose }) => {
|
|
28
|
+
const titleText = useI18nMessage({ id: I18nMessages.RETURN_QUESTIONS_TITLE });
|
|
29
|
+
const submitButtonText = useI18nMessage({ id: I18nMessages.RETURN_QUESTIONS_SUBMIT_BUTTON });
|
|
30
|
+
const feedback = useReturnQuestionFeedback();
|
|
31
|
+
const handleOnSubmit = useCallback(() => onSubmit(feedback), [feedback, onSubmit]);
|
|
32
|
+
return (React.createElement(ReturnQuestionItemProvider, { returnQuestionItems: returnQuestionItems },
|
|
33
|
+
React.createElement(PortalHost, { name: RETURN_QUESTION_FORM_PORTAL_HOST_NAME }),
|
|
34
|
+
React.createElement(Modal, { portalHostName: RETURN_QUESTION_FORM_PORTAL_HOST_NAME, testID: "return-questions-form-modal", visible: visible, scroll: true, showCloseButton: true, onClose: onClose },
|
|
35
|
+
React.createElement(View, { style: style.modalContent },
|
|
36
|
+
React.createElement(Text, { level: 3, style: style.title, heading: true }, titleText),
|
|
37
|
+
React.createElement(ReturnQuestions, { portalHostName: RETURN_QUESTION_FORM_PORTAL_HOST_NAME, returnQuestions: returnQuestions }),
|
|
38
|
+
React.createElement(Button, { style: style.submit, testID: "return-questions-button", onPress: handleOnSubmit }, submitButtonText)))));
|
|
39
|
+
};
|
|
40
|
+
export { ReturnQuestionsForm };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { StyleSheet } from "react-native";
|
|
2
|
+
import { theme } from "@lookiero/sty-psp-ui";
|
|
3
|
+
const { space6, space8 } = theme();
|
|
4
|
+
const style = StyleSheet.create({
|
|
5
|
+
modalContent: {
|
|
6
|
+
paddingHorizontal: space6,
|
|
7
|
+
},
|
|
8
|
+
submit: {
|
|
9
|
+
marginTop: space8,
|
|
10
|
+
},
|
|
11
|
+
title: {
|
|
12
|
+
marginBottom: space6,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
export { style };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
declare const style: {
|
|
2
|
+
description: {
|
|
3
|
+
color: string;
|
|
4
|
+
};
|
|
5
|
+
desktopInfo: {
|
|
6
|
+
borderTopLeftRadius: number;
|
|
7
|
+
borderTopRightRadius: number;
|
|
8
|
+
};
|
|
9
|
+
desktopLayoutSpacing: {
|
|
10
|
+
paddingVertical: number;
|
|
11
|
+
};
|
|
12
|
+
headerWrapper: {
|
|
13
|
+
display: "flex";
|
|
14
|
+
flexDirection: "column";
|
|
15
|
+
};
|
|
16
|
+
info: {
|
|
17
|
+
backgroundColor: string;
|
|
18
|
+
paddingBottom: number;
|
|
19
|
+
paddingHorizontal: number;
|
|
20
|
+
paddingTop: number;
|
|
21
|
+
};
|
|
22
|
+
layout: {
|
|
23
|
+
flex: number;
|
|
24
|
+
justifyContent: "center";
|
|
25
|
+
};
|
|
26
|
+
safeAreaView: {
|
|
27
|
+
backgroundColor: string;
|
|
28
|
+
flex: number;
|
|
29
|
+
};
|
|
30
|
+
scrollView: {
|
|
31
|
+
flex: number;
|
|
32
|
+
};
|
|
33
|
+
submit: {
|
|
34
|
+
backgroundColor: string;
|
|
35
|
+
borderBottomLeftRadius: number;
|
|
36
|
+
borderBottomRightRadius: number;
|
|
37
|
+
padding: number;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export { style };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { StyleSheet } from "react-native";
|
|
2
|
+
import { theme } from "@lookiero/sty-psp-ui";
|
|
3
|
+
const { borderRadius5, colorBgPrimaryLight, colorBgBase, colorTextMedium, space4, space6, space8 } = theme();
|
|
4
|
+
const style = StyleSheet.create({
|
|
5
|
+
description: {
|
|
6
|
+
color: colorTextMedium,
|
|
7
|
+
},
|
|
8
|
+
desktopInfo: {
|
|
9
|
+
borderTopLeftRadius: borderRadius5,
|
|
10
|
+
borderTopRightRadius: borderRadius5,
|
|
11
|
+
},
|
|
12
|
+
desktopLayoutSpacing: {
|
|
13
|
+
paddingVertical: space8,
|
|
14
|
+
},
|
|
15
|
+
headerWrapper: {
|
|
16
|
+
display: "flex",
|
|
17
|
+
flexDirection: "column",
|
|
18
|
+
},
|
|
19
|
+
info: {
|
|
20
|
+
backgroundColor: colorBgBase,
|
|
21
|
+
paddingBottom: space4,
|
|
22
|
+
paddingHorizontal: space6,
|
|
23
|
+
paddingTop: space8,
|
|
24
|
+
},
|
|
25
|
+
layout: {
|
|
26
|
+
flex: 1,
|
|
27
|
+
justifyContent: "center",
|
|
28
|
+
},
|
|
29
|
+
safeAreaView: {
|
|
30
|
+
backgroundColor: colorBgPrimaryLight,
|
|
31
|
+
flex: 1,
|
|
32
|
+
},
|
|
33
|
+
scrollView: {
|
|
34
|
+
flex: 1,
|
|
35
|
+
},
|
|
36
|
+
submit: {
|
|
37
|
+
backgroundColor: colorBgBase,
|
|
38
|
+
borderBottomLeftRadius: borderRadius5,
|
|
39
|
+
borderBottomRightRadius: borderRadius5,
|
|
40
|
+
padding: space6,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
export { style };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { LayoutRectangle } from "react-native";
|
|
3
|
+
import { PricingProjection } from "../../../../../../projection/pricing/pricing";
|
|
4
|
+
interface StickyPricingProps {
|
|
5
|
+
readonly pricing: PricingProjection;
|
|
6
|
+
readonly totalCheckoutItemsKept: number;
|
|
7
|
+
readonly collapsed: boolean;
|
|
8
|
+
readonly onPress: () => void;
|
|
9
|
+
readonly onSubmit: () => void;
|
|
10
|
+
readonly onLayout?: ({ width, height }: LayoutRectangle) => void;
|
|
11
|
+
}
|
|
12
|
+
declare const StickyPricing: FC<StickyPricingProps>;
|
|
13
|
+
export { StickyPricing };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Sticky } from "@lookiero/sty-psp-ui";
|
|
3
|
+
import { Body } from "../../../../components/layouts/body/Body";
|
|
4
|
+
import { Pricing } from "../pricing/Pricing";
|
|
5
|
+
import { style } from "./StickyPricing.style";
|
|
6
|
+
const StickyPricing = ({ pricing, totalCheckoutItemsKept, collapsed, onPress, onSubmit, onLayout, }) => (React.createElement(Sticky, { style: style.sticky, onLayout: onLayout },
|
|
7
|
+
React.createElement(Body, null,
|
|
8
|
+
React.createElement(Pricing, { balanceDiscount: pricing.balanceDiscount, collapsed: collapsed, discount: pricing.discount, discountPercentage: pricing.discountPercentage, pendingToPay: pricing.pendingToPay, service: pricing.service, subtotal: pricing.subtotal, totalCheckoutItemsKept: totalCheckoutItemsKept, onPress: onPress, onSubmit: onSubmit }))));
|
|
9
|
+
export { StickyPricing };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Query, QueryHandlerFunction, QueryHandlerFunctionArgs } from "@lookiero/messaging";
|
|
2
|
+
type IsCheckoutAccessibleByCustomerIdProjection = boolean;
|
|
3
|
+
declare const VIEW_IS_CHECKOUT_ACCESSIBLE_BY_CUSTOMER_ID = "view_is_checkout_accessible_by_customer_id";
|
|
4
|
+
interface ViewIsCheckoutAccessibleByCustomerIdPayload {
|
|
5
|
+
readonly customerId: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
interface ViewIsCheckoutAccessibleByCustomerId extends Query<typeof VIEW_IS_CHECKOUT_ACCESSIBLE_BY_CUSTOMER_ID>, ViewIsCheckoutAccessibleByCustomerIdPayload {
|
|
8
|
+
}
|
|
9
|
+
interface ViewIsCheckoutAccessibleByCustomerIdFunction {
|
|
10
|
+
(payload: ViewIsCheckoutAccessibleByCustomerIdPayload): ViewIsCheckoutAccessibleByCustomerId;
|
|
11
|
+
}
|
|
12
|
+
declare const viewIsCheckoutAccessibleByCustomerId: ViewIsCheckoutAccessibleByCustomerIdFunction;
|
|
13
|
+
interface ViewIsCheckoutAccessibleByCustomerIdHandlerFunctionArgs extends QueryHandlerFunctionArgs {
|
|
14
|
+
}
|
|
15
|
+
declare const viewIsCheckoutAccessibleByCustomerIdHandler: QueryHandlerFunction<ViewIsCheckoutAccessibleByCustomerId, IsCheckoutAccessibleByCustomerIdProjection, ViewIsCheckoutAccessibleByCustomerIdHandlerFunctionArgs>;
|
|
16
|
+
export type { IsCheckoutAccessibleByCustomerIdProjection };
|
|
17
|
+
export { VIEW_IS_CHECKOUT_ACCESSIBLE_BY_CUSTOMER_ID, viewIsCheckoutAccessibleByCustomerId, viewIsCheckoutAccessibleByCustomerIdHandler, };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { query } from "@lookiero/messaging";
|
|
2
|
+
import { viewFirstAvailableCheckoutByCustomerId } from "./viewFirstAvailableCheckoutByCustomerId";
|
|
3
|
+
import { viewIsCheckoutEnabledByCustomerId } from "./viewIsCheckoutEnabledByCustomerId";
|
|
4
|
+
const VIEW_IS_CHECKOUT_ACCESSIBLE_BY_CUSTOMER_ID = "view_is_checkout_accessible_by_customer_id";
|
|
5
|
+
const viewIsCheckoutAccessibleByCustomerId = (payload) => ({
|
|
6
|
+
...query({ name: VIEW_IS_CHECKOUT_ACCESSIBLE_BY_CUSTOMER_ID }),
|
|
7
|
+
...payload,
|
|
8
|
+
});
|
|
9
|
+
const isNonEmptyCustomerId = (customerId) => Boolean(customerId);
|
|
10
|
+
const viewIsCheckoutAccessibleByCustomerIdHandler = ({ queryBus }) => async ({ customerId }) => isNonEmptyCustomerId(customerId) &&
|
|
11
|
+
Boolean(await queryBus(viewFirstAvailableCheckoutByCustomerId({ customerId }))) &&
|
|
12
|
+
Boolean(await queryBus(viewIsCheckoutEnabledByCustomerId({ customerId })));
|
|
13
|
+
export { VIEW_IS_CHECKOUT_ACCESSIBLE_BY_CUSTOMER_ID, viewIsCheckoutAccessibleByCustomerId, viewIsCheckoutAccessibleByCustomerIdHandler, };
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "7.0.0";
|
|
1
|
+
export declare const VERSION = "7.0.1-beta.0";
|
package/dist/src/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = "7.0.0";
|
|
1
|
+
export const VERSION = "7.0.1-beta.0";
|
package/package.json
CHANGED
|
@@ -140,6 +140,16 @@ describe("CheckoutMiddleware component", () => {
|
|
|
140
140
|
expect(mockStartCheckout).toHaveBeenCalled();
|
|
141
141
|
});
|
|
142
142
|
|
|
143
|
+
it("should call onNotAccessible when no checkout is found", async () => {
|
|
144
|
+
(useViewFirstAvailableCheckoutByCustomerId as jest.Mock).mockReturnValue([null, QueryStatus.SUCCESS]);
|
|
145
|
+
(useStartCheckout as jest.Mock).mockReturnValue([mockStartCheckout, CommandStatus.SUCCESS]);
|
|
146
|
+
|
|
147
|
+
const onNotAccessible = jest.fn();
|
|
148
|
+
renderCheckoutMiddleware({ path: Routes.HOME, onNotAccessible });
|
|
149
|
+
|
|
150
|
+
expect(onNotAccessible).toHaveBeenCalled();
|
|
151
|
+
});
|
|
152
|
+
|
|
143
153
|
it("payment route should not be directly accessible", async () => {
|
|
144
154
|
const checkoutMock = checkout({ items: [{ status: CheckoutItemStatus.INITIAL }] });
|
|
145
155
|
(useViewFirstAvailableCheckoutByCustomerId as jest.Mock).mockReturnValue([checkoutMock, QueryStatus.SUCCESS]);
|
|
@@ -117,10 +117,16 @@ const CheckoutMiddleware: FC<CheckoutMiddlewareProps> = ({
|
|
|
117
117
|
}
|
|
118
118
|
}, [basePath, checkout?.status, checkout?.items]);
|
|
119
119
|
|
|
120
|
-
if (
|
|
120
|
+
if (checkout === undefined) {
|
|
121
121
|
return loader;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
if (checkout === null) {
|
|
125
|
+
onNotAccessible();
|
|
126
|
+
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
124
130
|
/* Prevent direct payment access */
|
|
125
131
|
if (checkoutPaymentRouteMatch && !checkoutShown.current) {
|
|
126
132
|
onNotAccessible();
|