@lookiero/checkout 1.3.0-beta.3 → 2.0.0-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/README.md CHANGED
@@ -38,7 +38,7 @@ Once we can replace the build of Jenkins for NPM one, we are going to be able to
38
38
  "dependencies": {
39
39
  (...)
40
40
  "@expo/dev-server": "0.1.120",
41
- "expo-modules-core": "^1.2.6",
41
+ "expo-modules-core": "^1.0.3",
42
42
  "inline-style-prefixer": "6.0.1",
43
43
  (...)
44
44
  },
@@ -8,7 +8,7 @@ const useStartCheckout = ({ checkoutId, logger }) => {
8
8
  const start = useCallback(async () => {
9
9
  invariant(checkoutId, "CheckoutId must be defined in order to start checkout");
10
10
  try {
11
- await commandBus(startCheckout({ aggregateId: checkoutId }));
11
+ return await commandBus(startCheckout({ aggregateId: checkoutId }));
12
12
  }
13
13
  catch (error) {
14
14
  if (!error?.message?.includes("Checkout is already started")) {
@@ -4,7 +4,6 @@ import { ComponentType } from "react";
4
4
  import { useRoutes as reactRouterUseRoutes } from "react-router-native";
5
5
  import { Customer } from "../../projection/shared/customer";
6
6
  import { SentryEnvironment } from "../../shared/logging/SentryLogger";
7
- import { Menu, TabBar } from "./views/navigation/Navigation";
8
7
  interface RootFunctionArgs {
9
8
  readonly Messaging: MessagingRoot;
10
9
  readonly I18n: I18n;
@@ -19,9 +18,8 @@ interface RootProps {
19
18
  readonly basePath: string;
20
19
  readonly locale?: string;
21
20
  readonly customer: Customer | undefined;
22
- readonly menu: Menu;
23
- readonly tabBar: TabBar;
24
21
  readonly onNotAccessible: () => void;
22
+ readonly onOpenMenu: () => void;
25
23
  readonly useRedirect: () => Record<string, string>;
26
24
  readonly useRoutes?: typeof reactRouterUseRoutes;
27
25
  }
@@ -6,10 +6,10 @@ import { sentryLoggerHOC } from "../../shared/logging/SentryLoggerHOC";
6
6
  import { Routing } from "./routing/Routing";
7
7
  const root = ({ Messaging, I18n, getAuthToken, development, sentry }) => {
8
8
  // eslint-disable-next-line react/display-name, react/prop-types
9
- const Root = ({ basePath, locale = "en", customer, menu, tabBar, onNotAccessible, useRedirect, useRoutes = reactRouterUseRoutes, }) => {
9
+ const Root = ({ basePath, locale = "en", customer, onNotAccessible, onOpenMenu, useRedirect, useRoutes = reactRouterUseRoutes, }) => {
10
10
  const handleOnI18nError = useCallback(() => void 0, []);
11
11
  return (React.createElement(Messaging, { includeReactQueryDevTools: Platform.OS === "web" },
12
- React.createElement(Routing, { I18n: I18n, basePath: basePath, customer: customer, getAuthToken: getAuthToken, locale: locale, menu: menu, tabBar: tabBar, useRedirect: useRedirect, useRoutes: useRoutes, onI18nError: development ? undefined : handleOnI18nError, onNotAccessible: onNotAccessible })));
12
+ React.createElement(Routing, { I18n: I18n, basePath: basePath, customer: customer, getAuthToken: getAuthToken, locale: locale, useRedirect: useRedirect, useRoutes: useRoutes, onI18nError: development ? undefined : handleOnI18nError, onNotAccessible: onNotAccessible, onOpenMenu: onOpenMenu })));
13
13
  };
14
14
  return sentryLoggerHOC({ logger: sentryLogger(sentry) })(Root);
15
15
  };
@@ -2,16 +2,14 @@ import { I18n } from "@lookiero/i18n-react";
2
2
  import React from "react";
3
3
  import { useRoutes as reactRouterUseRoutes } from "react-router-native";
4
4
  import { Customer } from "../../../projection/shared/customer";
5
- import { Menu, TabBar } from "../views/navigation/Navigation";
6
5
  interface RoutingProps {
7
6
  readonly basePath?: string;
8
7
  readonly customer: Customer | undefined;
9
8
  readonly locale: string;
10
9
  readonly I18n: I18n;
11
- readonly menu: Menu;
12
- readonly tabBar: TabBar;
13
10
  readonly getAuthToken: () => Promise<string>;
14
11
  readonly onNotAccessible: () => void;
12
+ readonly onOpenMenu: () => void;
15
13
  readonly onI18nError?: (err: Error) => void;
16
14
  readonly useRedirect: () => Record<string, string>;
17
15
  readonly useRoutes: typeof reactRouterUseRoutes;
@@ -11,7 +11,7 @@ const Item = lazy(() => import("../views/item/Item").then((module) => ({ default
11
11
  const Summary = lazy(() => import("../views/summary/Summary").then((module) => ({ default: module.Summary })));
12
12
  const Checkout = lazy(() => import("../views/checkout/Checkout").then((module) => ({ default: module.Checkout })));
13
13
  const Feedback = lazy(() => import("../views/feedback/Feedback").then((module) => ({ default: module.Feedback })));
14
- const Routing = ({ basePath = "", customer, locale, I18n, menu, tabBar, getAuthToken, onI18nError, onNotAccessible, useRedirect, useRoutes = reactRouterUseRoutes, }) => {
14
+ const Routing = ({ basePath = "", customer, locale, I18n, getAuthToken, onI18nError, onNotAccessible, onOpenMenu, useRedirect, useRoutes = reactRouterUseRoutes, }) => {
15
15
  return useRoutes([
16
16
  {
17
17
  path: "",
@@ -19,7 +19,7 @@ const Routing = ({ basePath = "", customer, locale, I18n, menu, tabBar, getAuthT
19
19
  React.createElement(CheckoutAccessibilityMiddleware, { customerId: customer?.customerId, onNotAccessible: onNotAccessible },
20
20
  React.createElement(I18n, { loader: React.createElement(Spinner, null), locale: locale, onError: onI18nError },
21
21
  React.createElement(CheckoutMiddleware, { customerId: customer?.customerId },
22
- React.createElement(App, { country: customer?.country, customerId: customer?.customerId, menu: menu, tabBar: tabBar },
22
+ React.createElement(App, { country: customer?.country, customerId: customer?.customerId, onOpenMenu: onOpenMenu },
23
23
  React.createElement(Outlet, null))))))),
24
24
  children: [
25
25
  {
@@ -1,12 +1,10 @@
1
1
  import { FC } from "react";
2
2
  import { Country } from "../../../projection/shared/country";
3
- import { Menu, TabBar } from "./navigation/Navigation";
4
3
  interface AppProps {
4
+ readonly children: JSX.Element;
5
5
  readonly customerId: string;
6
6
  readonly country: Country;
7
- readonly menu: Menu;
8
- readonly tabBar: TabBar;
9
- readonly children: JSX.Element;
7
+ readonly onOpenMenu: () => void;
10
8
  }
11
9
  declare const App: FC<AppProps>;
12
10
  export { App };
@@ -7,9 +7,9 @@ import { MESSAGING_CONTEXT_ID } from "../../delivery/baseBootstrap";
7
7
  import { theme } from "../theme/theme";
8
8
  import { Navigation } from "./navigation/Navigation";
9
9
  const { colorBase } = theme();
10
- const App = ({ customerId, country, menu, tabBar, children }) => (React.createElement(SafeAreaProvider, null,
10
+ const App = ({ children, customerId, country, onOpenMenu }) => (React.createElement(SafeAreaProvider, null,
11
11
  React.createElement(PortalProvider, null,
12
12
  React.createElement(StatusBar, { backgroundColor: colorBase, barStyle: "dark-content", translucent: true }),
13
13
  React.createElement(Notifications, { contextId: MESSAGING_CONTEXT_ID }),
14
- React.createElement(Navigation, { country: country, customerId: customerId, menu: menu, tabBar: tabBar }, children))));
14
+ React.createElement(Navigation, { country: country, customerId: customerId, onOpenMenu: onOpenMenu }, children))));
15
15
  export { App };
@@ -11,11 +11,10 @@ interface TabBarProps {
11
11
  }
12
12
  type TabBar = FC<TabBarProps>;
13
13
  interface NavigationProps {
14
+ readonly children: ReactNode;
14
15
  readonly customerId: string;
15
16
  readonly country: Country;
16
- readonly menu: Menu;
17
- readonly tabBar: TabBar;
18
- readonly children: ReactNode;
17
+ readonly onOpenMenu: () => void;
19
18
  }
20
19
  declare const Navigation: FC<NavigationProps>;
21
20
  export type { Menu, TabBar };
@@ -1,33 +1,21 @@
1
- import { usePortal } from "@lookiero/aurora";
2
- import React, { useCallback, useState } from "react";
3
- import { Platform } from "react-native";
1
+ import React, { useCallback } from "react";
4
2
  import { useTrackPressBack } from "../../../../shared/tracking/infrastructure/useTrackPressBack";
5
3
  import { useTrackPressMenu } from "../../../../shared/tracking/infrastructure/useTrackPressMenu";
6
4
  import { useTrackPressNext } from "../../../../shared/tracking/infrastructure/useTrackPressNext";
7
5
  import { useTrackPressPrevious } from "../../../../shared/tracking/infrastructure/useTrackPressPrevious";
8
6
  import { style } from "./Navigation.style";
9
7
  import { Header } from "./components/header/Header";
10
- const Navigation = ({ customerId, country, menu, tabBar: TabBar, children }) => {
11
- const [menuVisible, setMenuVisible] = useState(false);
8
+ const Navigation = ({ children, customerId, country, onOpenMenu }) => {
12
9
  const trackPressMenu = useTrackPressMenu();
13
10
  const handleOnOpenMenu = useCallback(({ page, checkoutId, collapse }) => {
14
- setMenuVisible(true);
11
+ onOpenMenu();
15
12
  trackPressMenu({
16
13
  page,
17
14
  country,
18
15
  checkoutId,
19
16
  collapse,
20
17
  });
21
- }, [country, trackPressMenu]);
22
- const handleOnCloseMenu = useCallback(({ page, checkoutId, collapse }) => {
23
- setMenuVisible(false);
24
- trackPressMenu({
25
- page,
26
- country,
27
- checkoutId,
28
- collapse,
29
- });
30
- }, [country, trackPressMenu]);
18
+ }, [country, onOpenMenu, trackPressMenu]);
31
19
  const trackPressBack = useTrackPressBack();
32
20
  const handleOnBack = useCallback(({ page, checkoutId }) => trackPressBack({
33
21
  page,
@@ -50,10 +38,8 @@ const Navigation = ({ customerId, country, menu, tabBar: TabBar, children }) =>
50
38
  from,
51
39
  to,
52
40
  }), [country, trackPressPrevious]);
53
- const { busy } = usePortal();
54
41
  return (React.createElement(React.Fragment, null,
55
- React.createElement(Header, { customerId: customerId, menu: menu, menuVisible: menuVisible, style: style.header, onBack: handleOnBack, onCloseMenu: handleOnCloseMenu, onNext: handleOnNext, onOpenMenu: handleOnOpenMenu, onPrevious: handleOnPrevious }),
56
- children,
57
- Platform.OS !== "web" && React.createElement(TabBar, { isPortalBusy: busy, panel: menuVisible })));
42
+ React.createElement(Header, { customerId: customerId, style: style.header, onBack: handleOnBack, onNext: handleOnNext, onOpenMenu: handleOnOpenMenu, onPrevious: handleOnPrevious }),
43
+ children));
58
44
  };
59
45
  export { Navigation };
@@ -1,7 +1,6 @@
1
1
  import { FC } from "react";
2
2
  import { StyleProp, ViewStyle } from "react-native";
3
3
  import { TrackingPage } from "../../../../../tracking/tracking";
4
- import { Menu } from "../../Navigation";
5
4
  interface OnOpenMenuFunctionArgs {
6
5
  readonly page: TrackingPage;
7
6
  readonly checkoutId: string | undefined;
@@ -10,14 +9,6 @@ interface OnOpenMenuFunctionArgs {
10
9
  interface OnOpenMenuFunction {
11
10
  (args: OnOpenMenuFunctionArgs): void;
12
11
  }
13
- interface OnCloseMenuFunctionArgs {
14
- readonly page: TrackingPage;
15
- readonly checkoutId: string | undefined;
16
- readonly collapse: boolean;
17
- }
18
- interface OnCloseMenuFunction {
19
- (args: OnCloseMenuFunctionArgs): void;
20
- }
21
12
  interface OnBackFunctionArgs {
22
13
  readonly page: TrackingPage;
23
14
  readonly checkoutId: string | undefined;
@@ -45,10 +36,7 @@ interface OnPreviousFunction {
45
36
  }
46
37
  interface HeaderProps {
47
38
  readonly customerId: string;
48
- readonly menu: Menu;
49
- readonly menuVisible: boolean;
50
39
  readonly onOpenMenu: OnOpenMenuFunction;
51
- readonly onCloseMenu: OnCloseMenuFunction;
52
40
  readonly onBack?: OnBackFunction;
53
41
  readonly onNext?: OnNextFunction;
54
42
  readonly onPrevious?: OnPreviousFunction;
@@ -66,7 +66,7 @@ const CheckoutHeader = ({ onBack }) => {
66
66
  React.createElement(Text, { level: 3, detail: true, upperCase: true }, title),
67
67
  React.createElement(ButtonIconPlaceholder, null)));
68
68
  };
69
- const Header = ({ customerId, menu: Menu, menuVisible, onOpenMenu, onCloseMenu, onBack, onNext, onPrevious, style: customStyle, }) => {
69
+ const Header = ({ customerId, onOpenMenu, onBack, onNext, onPrevious, style: customStyle }) => {
70
70
  const { id: itemId } = useParams();
71
71
  const [checkout] = useViewFirstAvailableCheckoutByCustomerId({ customerId });
72
72
  const currentItem = checkout?.items.find((item) => item.id === itemId);
@@ -97,7 +97,6 @@ const Header = ({ customerId, menu: Menu, menuVisible, onOpenMenu, onCloseMenu,
97
97
  ]);
98
98
  const { top: safeAreaInsetTop } = useSafeAreaInsets();
99
99
  const handleOnOpenMenu = useCallback(() => onOpenMenu({ page: trackingPage(), checkoutId: checkout?.id, collapse: false }), [checkout?.id, onOpenMenu, trackingPage]);
100
- const handleOnCloseMenu = useCallback(() => onCloseMenu({ page: trackingPage(), checkoutId: checkout?.id, collapse: true }), [checkout?.id, onCloseMenu, trackingPage]);
101
100
  const handleOnBack = useCallback(() => onBack?.({ page: trackingPage(), checkoutId: checkout?.id }), [checkout?.id, onBack, trackingPage]);
102
101
  const handleOnNext = useCallback(({ from, to }) => onNext?.({ page: trackingPage(), checkoutId: checkout?.id, from, to }), [checkout?.id, onNext, trackingPage]);
103
102
  const handleOnPrevious = useCallback(({ from, to }) => onPrevious?.({ page: trackingPage(), checkoutId: checkout?.id, from, to }), [checkout?.id, onPrevious, trackingPage]);
@@ -116,8 +115,6 @@ const Header = ({ customerId, menu: Menu, menuVisible, onOpenMenu, onCloseMenu,
116
115
  else {
117
116
  header = React.createElement(DefaultHeader, { onOpenMenu: handleOnOpenMenu });
118
117
  }
119
- return (React.createElement(React.Fragment, null,
120
- React.createElement(SafeAreaView, { edges: ["top"], style: [style.container, { height: HEADER_HEIGHT + safeAreaInsetTop }, customStyle] }, header),
121
- React.createElement(Menu, { isVisible: menuVisible, onClose: handleOnCloseMenu })));
118
+ return (React.createElement(SafeAreaView, { edges: ["top"], style: [style.container, { height: HEADER_HEIGHT + safeAreaInsetTop }, customStyle] }, header));
122
119
  };
123
120
  export { Header };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lookiero/checkout",
3
- "version": "1.3.0-beta.3",
3
+ "version": "2.0.0-beta.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -19,7 +19,7 @@
19
19
  "build:app": "tsc -p ./tsconfig.build-app.json --noemit && ENTRY_POINT='./src/Expo.tsx' NODE_ENV=production expo export:web --clear",
20
20
  "lint": "eslint --fix --cache --cache-location ./node_modules/.cache/.eslintcache --ext ts,tsx .",
21
21
  "format": "prettier --write \"**/*.+(json|css|ts|tsx|md)\"",
22
- "test": "tsc -p ./tsconfig.test.json --noemit && jest --passWithNoTests --colors --verbose --runInBand --detectOpenHandles --forceExit",
22
+ "test": "tsc -p ./tsconfig.test.json --noemit && jest",
23
23
  "test:coverage": "jest --coverage --coverageReporters=text --detectOpenHandles --forceExit --silent",
24
24
  "test:contract": "TEST_ENV=CONTRACT jest --coverage false --detectOpenHandles --testMatch \"**/?(*.)+(pact).ts\" --testTimeout=3000 --watchAll=false --forceExit",
25
25
  "publish:contract": "BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) node pact.publish.js",
@@ -37,15 +37,15 @@
37
37
  "inline-style-prefixer": "6.0.1",
38
38
  "lodash": "^4.17.21",
39
39
  "react-native-keyboard-aware-scroll-view": "^0.9.5",
40
- "react-native-safe-area-context": "^4.5.0",
41
- "react-native-svg": "^13.4.0",
40
+ "react-native-safe-area-context": "^4.4.1",
41
+ "react-native-svg": "^12.1.1",
42
42
  "tiny-invariant": "^1.3.1",
43
43
  "uuid": "^9.0.0"
44
44
  },
45
45
  "peerDependencies": {
46
- "@lookiero/aurora": "^3.1.0",
47
46
  "@lookiero/aurora-fonts": "^1.0.6",
48
47
  "@lookiero/aurora-iconfont": "^2.0.41",
48
+ "@lookiero/aurora": "^3.1.0",
49
49
  "@lookiero/data-sources": "^0.3",
50
50
  "@lookiero/event": "^0.3",
51
51
  "@lookiero/locale": "^0.3",
@@ -54,20 +54,20 @@
54
54
  "apollo-boost": "0.4.4",
55
55
  "graphql": "16.6.0",
56
56
  "graphql-tag": "2.12.6",
57
- "react": "^18.2.0",
58
- "react-dom": "^18.2.0",
59
- "react-native": "^0.71.4",
57
+ "react": "^18.0.0",
58
+ "react-dom": "^18.0.0",
59
+ "react-native": "^0.70.6",
60
60
  "react-native-get-random-values": "^1.8.0",
61
- "react-native-web": "^0.18.11",
61
+ "react-native-web": "^0.18.9",
62
62
  "react-router-dom": "^6.8.1",
63
63
  "react-router-native": "^6.8.1"
64
64
  },
65
65
  "devDependencies": {
66
- "@babel/core": "^7.20.0",
67
- "@expo/webpack-config": "^0.17.4",
68
- "@lookiero/aurora": "^3.1.0",
66
+ "@babel/core": "^7.19.1",
67
+ "@expo/webpack-config": "^0.17.2",
69
68
  "@lookiero/aurora-fonts": "^1.0.6",
70
69
  "@lookiero/aurora-iconfont": "^2.0.41",
70
+ "@lookiero/aurora": "^3.1.0",
71
71
  "@lookiero/data-sources": "^0.3",
72
72
  "@lookiero/event": "^0.3",
73
73
  "@lookiero/locale": "^0.3",
@@ -77,12 +77,14 @@
77
77
  "@pact-foundation/pact-node": "^10.17.6",
78
78
  "@react-native-firebase/analytics": "10.5.1",
79
79
  "@react-native-firebase/app": "10.5.0",
80
+ "@testing-library/react": "^13.4.0",
81
+ "@testing-library/react-hooks": "^8.0.1",
80
82
  "@testing-library/react-native": "^11.5.0",
81
83
  "@trivago/prettier-plugin-sort-imports": "^3.3.0",
82
84
  "@types/jest": "^29.2.4",
83
- "@types/react": "~18.0.27",
84
- "@types/react-dom": "~18.0.10",
85
- "@types/react-native": "^0.70.13",
85
+ "@types/react": "~18.0.26",
86
+ "@types/react-dom": "~18.0.0",
87
+ "@types/react-native": "~0.69.1",
86
88
  "@types/uuid": "^9.0.0",
87
89
  "abort-controller": "^3.0.0",
88
90
  "apollo-boost": "0.4.4",
@@ -96,30 +98,31 @@
96
98
  "eslint-plugin-react": "^7.31.11",
97
99
  "eslint-plugin-react-hooks": "^4.6.0",
98
100
  "eslint-plugin-react-native": "^4.0.0",
99
- "expo": "^48.0.0",
100
- "expo-modules-core": "^1.2.6",
101
- "expo-status-bar": "~1.4.4",
101
+ "expo": "~46.0.8",
102
+ "expo-modules-core": "^1.0.3",
103
+ "expo-status-bar": "~1.4.0",
102
104
  "graphql": "16.6.0",
103
105
  "graphql-tag": "2.12.6",
104
106
  "husky": "^8.0.2",
105
107
  "jest": "^29.3.1",
106
- "jest-expo": "^48.0.0",
108
+ "jest-expo": "^46.0.1",
107
109
  "jest-fetch-mock": "^3.0.3",
108
110
  "jest-mock-extended": "^3.0.1",
109
111
  "lint-staged": "^13.0.3",
110
112
  "pino-std-serializers": "^6.0.0",
111
113
  "prettier": "^2.7.1",
112
- "react": "^18.2.0",
113
- "react-dom": "^18.2.0",
114
+ "react": "^18.0.0",
115
+ "react-dom": "^18.0.0",
114
116
  "react-error-overlay": "^6.0.9",
115
- "react-native": "^0.71.3",
117
+ "react-native": "^0.70.6",
116
118
  "react-native-adjust": "^4.33.0",
117
119
  "react-native-get-random-values": "^1.8.0",
118
- "react-native-web": "^0.18.11",
120
+ "react-native-unimodules": "^0.14.10",
121
+ "react-native-web": "^0.18.9",
119
122
  "react-router-dom": "^6.8.1",
120
123
  "react-router-native": "^6.8.1",
121
124
  "react-test-renderer": "^18.0.0",
122
- "typescript": "^4.9.4",
125
+ "typescript": "^4.9.3",
123
126
  "webpack-bundle-analyzer": "^4.7.0"
124
127
  }
125
128
  }