@ledgerhq/live-common 27.2.0-nightly.4 → 27.2.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 (202) hide show
  1. package/lib/bot/index.d.ts.map +1 -1
  2. package/lib/bot/index.js +3 -8
  3. package/lib/bot/index.js.map +1 -1
  4. package/lib/bot/specs.d.ts +0 -9
  5. package/lib/bot/specs.d.ts.map +1 -1
  6. package/lib/bot/specs.js +1 -49
  7. package/lib/bot/specs.js.map +1 -1
  8. package/lib/currencies/support.d.ts.map +1 -1
  9. package/lib/currencies/support.js +1 -2
  10. package/lib/currencies/support.js.map +1 -1
  11. package/lib/derivation.d.ts.map +1 -1
  12. package/lib/derivation.js +4 -2
  13. package/lib/derivation.js.map +1 -1
  14. package/lib/env.js +1 -1
  15. package/lib/exchange/swap/getExchangeRates.d.ts.map +1 -1
  16. package/lib/exchange/swap/getExchangeRates.js +1 -1
  17. package/lib/exchange/swap/getExchangeRates.js.map +1 -1
  18. package/lib/exchange/swap/getProviders.d.ts.map +1 -1
  19. package/lib/exchange/swap/getProviders.js +5 -45
  20. package/lib/exchange/swap/getProviders.js.map +1 -1
  21. package/lib/exchange/swap/index.d.ts +1 -2
  22. package/lib/exchange/swap/index.d.ts.map +1 -1
  23. package/lib/exchange/swap/index.js +1 -11
  24. package/lib/exchange/swap/index.js.map +1 -1
  25. package/lib/exchange/swap/index.test.js +0 -22
  26. package/lib/exchange/swap/index.test.js.map +1 -1
  27. package/lib/exchange/swap/mock.js +1 -1
  28. package/lib/exchange/swap/mock.js.map +1 -1
  29. package/lib/exchange/swap/types.d.ts +0 -14
  30. package/lib/exchange/swap/types.d.ts.map +1 -1
  31. package/lib/families/algorand/speculos-deviceActions.d.ts.map +1 -1
  32. package/lib/families/algorand/speculos-deviceActions.js +29 -2
  33. package/lib/families/algorand/speculos-deviceActions.js.map +1 -1
  34. package/lib/families/bitcoin/specs.d.ts.map +1 -1
  35. package/lib/families/bitcoin/specs.js +1 -0
  36. package/lib/families/bitcoin/specs.js.map +1 -1
  37. package/lib/families/bitcoin/speculos-deviceActions.d.ts.map +1 -1
  38. package/lib/families/bitcoin/speculos-deviceActions.js +22 -2
  39. package/lib/families/bitcoin/speculos-deviceActions.js.map +1 -1
  40. package/lib/families/cardano/specs.d.ts.map +1 -1
  41. package/lib/families/cardano/specs.js +3 -4
  42. package/lib/families/cardano/specs.js.map +1 -1
  43. package/lib/families/cardano/speculos-deviceActions.d.ts.map +1 -1
  44. package/lib/families/cardano/speculos-deviceActions.js +10 -2
  45. package/lib/families/cardano/speculos-deviceActions.js.map +1 -1
  46. package/lib/families/celo/speculos-deviceActions.d.ts.map +1 -1
  47. package/lib/families/celo/speculos-deviceActions.js +10 -3
  48. package/lib/families/celo/speculos-deviceActions.js.map +1 -1
  49. package/lib/families/elrond/speculos-deviceActions.d.ts.map +1 -1
  50. package/lib/families/elrond/speculos-deviceActions.js +8 -3
  51. package/lib/families/elrond/speculos-deviceActions.js.map +1 -1
  52. package/lib/families/ethereum/speculos-deviceActions.d.ts.map +1 -1
  53. package/lib/families/ethereum/speculos-deviceActions.js +33 -10
  54. package/lib/families/ethereum/speculos-deviceActions.js.map +1 -1
  55. package/lib/families/evm/specs.d.ts.map +1 -1
  56. package/lib/families/evm/specs.js +5 -9
  57. package/lib/families/evm/specs.js.map +1 -1
  58. package/lib/families/evm/speculos-deviceActions.d.ts.map +1 -1
  59. package/lib/families/evm/speculos-deviceActions.js +25 -5
  60. package/lib/families/evm/speculos-deviceActions.js.map +1 -1
  61. package/lib/families/filecoin/speculos-deviceActions.d.ts.map +1 -1
  62. package/lib/families/filecoin/speculos-deviceActions.js +7 -6
  63. package/lib/families/filecoin/speculos-deviceActions.js.map +1 -1
  64. package/lib/families/polkadot/speculos-deviceActions.d.ts.map +1 -1
  65. package/lib/families/polkadot/speculos-deviceActions.js +10 -3
  66. package/lib/families/polkadot/speculos-deviceActions.js.map +1 -1
  67. package/lib/families/ripple/speculos-deviceActions.d.ts.map +1 -1
  68. package/lib/families/ripple/speculos-deviceActions.js +22 -2
  69. package/lib/families/ripple/speculos-deviceActions.js.map +1 -1
  70. package/lib/families/solana/speculos-deviceActions.d.ts.map +1 -1
  71. package/lib/families/solana/speculos-deviceActions.js +7 -5
  72. package/lib/families/solana/speculos-deviceActions.js.map +1 -1
  73. package/lib/families/stellar/api/horizon.d.ts.map +1 -1
  74. package/lib/families/stellar/api/horizon.js +10 -15
  75. package/lib/families/stellar/api/horizon.js.map +1 -1
  76. package/lib/families/stellar/speculos-deviceActions.d.ts.map +1 -1
  77. package/lib/families/stellar/speculos-deviceActions.js +8 -4
  78. package/lib/families/stellar/speculos-deviceActions.js.map +1 -1
  79. package/lib/families/tezos/speculos-deviceActions.d.ts.map +1 -1
  80. package/lib/families/tezos/speculos-deviceActions.js +11 -6
  81. package/lib/families/tezos/speculos-deviceActions.js.map +1 -1
  82. package/lib/families/tron/speculos-deviceActions.d.ts.map +1 -1
  83. package/lib/families/tron/speculos-deviceActions.js +14 -2
  84. package/lib/families/tron/speculos-deviceActions.js.map +1 -1
  85. package/lib/featureFlags/defaultFeatures.d.ts.map +1 -1
  86. package/lib/featureFlags/defaultFeatures.js +0 -3
  87. package/lib/featureFlags/defaultFeatures.js.map +1 -1
  88. package/lib/hw/extractOnboardingState.d.ts +1 -5
  89. package/lib/hw/extractOnboardingState.d.ts.map +1 -1
  90. package/lib/hw/extractOnboardingState.js +9 -17
  91. package/lib/hw/extractOnboardingState.js.map +1 -1
  92. package/lib/hw/extractOnboardingState.test.js +11 -21
  93. package/lib/hw/extractOnboardingState.test.js.map +1 -1
  94. package/package.json +19 -23
  95. package/src/bot/index.ts +12 -11
  96. package/src/bot/specs.ts +0 -45
  97. package/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap +35 -1
  98. package/src/currencies/support.ts +1 -2
  99. package/src/derivation.ts +4 -2
  100. package/src/env.ts +1 -1
  101. package/src/exchange/swap/getExchangeRates.ts +3 -7
  102. package/src/exchange/swap/getProviders.ts +8 -31
  103. package/src/exchange/swap/index.test.ts +1 -36
  104. package/src/exchange/swap/index.ts +0 -15
  105. package/src/exchange/swap/mock.ts +2 -2
  106. package/src/exchange/swap/types.ts +0 -11
  107. package/src/families/algorand/speculos-deviceActions.ts +35 -4
  108. package/src/families/bitcoin/specs.ts +1 -0
  109. package/src/families/bitcoin/speculos-deviceActions.ts +26 -3
  110. package/src/families/cardano/specs.ts +3 -4
  111. package/src/families/cardano/speculos-deviceActions.ts +14 -3
  112. package/src/families/celo/speculos-deviceActions.ts +14 -6
  113. package/src/families/elrond/speculos-deviceActions.ts +9 -4
  114. package/src/families/ethereum/speculos-deviceActions.ts +46 -16
  115. package/src/families/evm/specs.ts +8 -12
  116. package/src/families/evm/speculos-deviceActions.ts +35 -7
  117. package/src/families/filecoin/speculos-deviceActions.ts +8 -7
  118. package/src/families/polkadot/speculos-deviceActions.ts +16 -5
  119. package/src/families/ripple/speculos-deviceActions.ts +28 -3
  120. package/src/families/solana/speculos-deviceActions.ts +8 -6
  121. package/src/families/stellar/api/horizon.ts +6 -10
  122. package/src/families/stellar/speculos-deviceActions.ts +11 -5
  123. package/src/families/tezos/speculos-deviceActions.ts +16 -9
  124. package/src/families/tron/speculos-deviceActions.ts +12 -4
  125. package/src/featureFlags/defaultFeatures.ts +0 -3
  126. package/src/hw/extractOnboardingState.test.ts +12 -29
  127. package/src/hw/extractOnboardingState.ts +9 -17
  128. package/lib/exchange/swap/getProviders.test.d.ts +0 -2
  129. package/lib/exchange/swap/getProviders.test.d.ts.map +0 -1
  130. package/lib/exchange/swap/getProviders.test.js +0 -519
  131. package/lib/exchange/swap/getProviders.test.js.map +0 -1
  132. package/lib/postOnboarding/PostOnboardingProvider.d.ts +0 -20
  133. package/lib/postOnboarding/PostOnboardingProvider.d.ts.map +0 -1
  134. package/lib/postOnboarding/PostOnboardingProvider.js +0 -33
  135. package/lib/postOnboarding/PostOnboardingProvider.js.map +0 -1
  136. package/lib/postOnboarding/actions.d.ts +0 -20
  137. package/lib/postOnboarding/actions.d.ts.map +0 -1
  138. package/lib/postOnboarding/actions.js +0 -37
  139. package/lib/postOnboarding/actions.js.map +0 -1
  140. package/lib/postOnboarding/hooks/index.d.ts +0 -6
  141. package/lib/postOnboarding/hooks/index.d.ts.map +0 -1
  142. package/lib/postOnboarding/hooks/index.js +0 -22
  143. package/lib/postOnboarding/hooks/index.js.map +0 -1
  144. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.d.ts +0 -8
  145. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.d.ts.map +0 -1
  146. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.js +0 -16
  147. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.js.map +0 -1
  148. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.d.ts +0 -2
  149. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.d.ts.map +0 -1
  150. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.js +0 -75
  151. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.js.map +0 -1
  152. package/lib/postOnboarding/hooks/usePostOnboardingContext.d.ts +0 -3
  153. package/lib/postOnboarding/hooks/usePostOnboardingContext.d.ts.map +0 -1
  154. package/lib/postOnboarding/hooks/usePostOnboardingContext.js +0 -10
  155. package/lib/postOnboarding/hooks/usePostOnboardingContext.js.map +0 -1
  156. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.d.ts +0 -8
  157. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.d.ts.map +0 -1
  158. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.js +0 -20
  159. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.js.map +0 -1
  160. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.d.ts +0 -2
  161. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.d.ts.map +0 -1
  162. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.js +0 -64
  163. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.js.map +0 -1
  164. package/lib/postOnboarding/hooks/usePostOnboardingHubState.d.ts +0 -12
  165. package/lib/postOnboarding/hooks/usePostOnboardingHubState.d.ts.map +0 -1
  166. package/lib/postOnboarding/hooks/usePostOnboardingHubState.js +0 -65
  167. package/lib/postOnboarding/hooks/usePostOnboardingHubState.js.map +0 -1
  168. package/lib/postOnboarding/hooks/usePostOnboardingHubState.test.d.ts +0 -2
  169. package/lib/postOnboarding/hooks/usePostOnboardingHubState.test.d.ts.map +0 -1
  170. package/lib/postOnboarding/hooks/usePostOnboardingHubState.test.js +0 -129
  171. package/lib/postOnboarding/hooks/usePostOnboardingHubState.test.js.map +0 -1
  172. package/lib/postOnboarding/hooks/useStartPostOnboardingCallback.d.ts +0 -13
  173. package/lib/postOnboarding/hooks/useStartPostOnboardingCallback.d.ts.map +0 -1
  174. package/lib/postOnboarding/hooks/useStartPostOnboardingCallback.js +0 -34
  175. package/lib/postOnboarding/hooks/useStartPostOnboardingCallback.js.map +0 -1
  176. package/lib/postOnboarding/mock.d.ts +0 -8
  177. package/lib/postOnboarding/mock.d.ts.map +0 -1
  178. package/lib/postOnboarding/mock.js +0 -46
  179. package/lib/postOnboarding/mock.js.map +0 -1
  180. package/lib/postOnboarding/reducer.d.ts +0 -22
  181. package/lib/postOnboarding/reducer.d.ts.map +0 -1
  182. package/lib/postOnboarding/reducer.js +0 -71
  183. package/lib/postOnboarding/reducer.js.map +0 -1
  184. package/lib/postOnboarding/reducer.test.d.ts +0 -2
  185. package/lib/postOnboarding/reducer.test.d.ts.map +0 -1
  186. package/lib/postOnboarding/reducer.test.js +0 -251
  187. package/lib/postOnboarding/reducer.test.js.map +0 -1
  188. package/src/exchange/swap/getProviders.test.ts +0 -450
  189. package/src/postOnboarding/PostOnboardingProvider.tsx +0 -49
  190. package/src/postOnboarding/actions.ts +0 -40
  191. package/src/postOnboarding/hooks/index.ts +0 -5
  192. package/src/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.ts +0 -82
  193. package/src/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.ts +0 -12
  194. package/src/postOnboarding/hooks/usePostOnboardingContext.ts +0 -9
  195. package/src/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.ts +0 -83
  196. package/src/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.ts +0 -22
  197. package/src/postOnboarding/hooks/usePostOnboardingHubState.test.ts +0 -184
  198. package/src/postOnboarding/hooks/usePostOnboardingHubState.ts +0 -56
  199. package/src/postOnboarding/hooks/useStartPostOnboardingCallback.ts +0 -38
  200. package/src/postOnboarding/mock.ts +0 -53
  201. package/src/postOnboarding/reducer.test.ts +0 -247
  202. package/src/postOnboarding/reducer.ts +0 -105
@@ -1,83 +0,0 @@
1
- import { renderHook } from "@testing-library/react-hooks";
2
- import {
3
- postOnboardingDeviceModelIdSelector,
4
- walletPostOnboardingEntryPointDismissedSelector,
5
- } from "../reducer";
6
- import { useAllPostOnboardingActionsCompleted } from "./useAllPostOnboardingActionsCompleted";
7
- import { usePostOnboardingEntryPointVisibleOnWallet } from "./usePostOnboardingEntryPointVisibleOnWallet";
8
- import { DeviceModelId } from "@ledgerhq/types-devices";
9
-
10
- jest.mock("react-redux", () => ({
11
- useSelector: (fun) => fun(),
12
- }));
13
- jest.mock("../reducer");
14
- jest.mock("./useAllPostOnboardingActionsCompleted");
15
-
16
- const mockedUseAllCompleted = jest.mocked(useAllPostOnboardingActionsCompleted);
17
- const mockedDismissedSelector = jest.mocked(
18
- walletPostOnboardingEntryPointDismissedSelector
19
- );
20
- const mockedDeviceModelIdSelector = jest.mocked(
21
- postOnboardingDeviceModelIdSelector
22
- );
23
-
24
- describe("usePostOnboardingEntryPointVisibleOnWallet", () => {
25
- beforeEach(() => {
26
- mockedUseAllCompleted.mockClear();
27
- mockedDismissedSelector.mockClear();
28
- mockedDeviceModelIdSelector.mockClear();
29
- });
30
-
31
- it("should be false if deviceModelId is null", () => {
32
- mockedUseAllCompleted.mockReturnValue(false);
33
- mockedDismissedSelector.mockReturnValue(false);
34
- mockedDeviceModelIdSelector.mockReturnValue(null);
35
-
36
- const { result } = renderHook(() =>
37
- usePostOnboardingEntryPointVisibleOnWallet()
38
- );
39
-
40
- expect(result.current).toBe(false);
41
- });
42
-
43
- it("should be false if the the entry point HAS been dismissed", () => {
44
- mockedDismissedSelector.mockReturnValue(true);
45
- mockedDeviceModelIdSelector.mockReturnValue(DeviceModelId.nanoX);
46
-
47
- mockedUseAllCompleted.mockReturnValue(false);
48
- const { result: res1 } = renderHook(() =>
49
- usePostOnboardingEntryPointVisibleOnWallet()
50
- );
51
- expect(res1.current).toBe(false);
52
-
53
- mockedUseAllCompleted.mockReturnValue(true);
54
- const { result: res2 } = renderHook(() =>
55
- usePostOnboardingEntryPointVisibleOnWallet()
56
- );
57
- expect(res2.current).toBe(false);
58
- });
59
-
60
- it("should be false if all actions are completed", () => {
61
- mockedDismissedSelector.mockReturnValue(false);
62
- mockedUseAllCompleted.mockReturnValue(true);
63
-
64
- mockedDeviceModelIdSelector.mockReturnValue(DeviceModelId.nanoX);
65
- const { result } = renderHook(() =>
66
- usePostOnboardingEntryPointVisibleOnWallet()
67
- );
68
-
69
- expect(result.current).toBe(false);
70
- });
71
-
72
- it("should be true if the entry point HAS NOT been dismissed and all actions are NOT completed", () => {
73
- mockedDismissedSelector.mockReturnValue(false);
74
- mockedUseAllCompleted.mockReturnValue(false);
75
- mockedDeviceModelIdSelector.mockReturnValue(DeviceModelId.nanoX);
76
-
77
- const { result } = renderHook(() =>
78
- usePostOnboardingEntryPointVisibleOnWallet()
79
- );
80
-
81
- expect(result.current).toBe(true);
82
- });
83
- });
@@ -1,22 +0,0 @@
1
- import { useSelector } from "react-redux";
2
- import {
3
- postOnboardingDeviceModelIdSelector,
4
- walletPostOnboardingEntryPointDismissedSelector,
5
- } from "../reducer";
6
- import { useAllPostOnboardingActionsCompleted } from "./useAllPostOnboardingActionsCompleted";
7
-
8
- /**
9
- *
10
- * @returns a boolean representing whether the post onboarding entry point
11
- * should be visible on the wallet page.
12
- * TODO: unit test this
13
- */
14
- export function usePostOnboardingEntryPointVisibleOnWallet(): boolean {
15
- const deviceModelId = useSelector(postOnboardingDeviceModelIdSelector);
16
- const dismissed = useSelector(
17
- walletPostOnboardingEntryPointDismissedSelector
18
- );
19
- const allCompleted = useAllPostOnboardingActionsCompleted();
20
-
21
- return !!deviceModelId && !(dismissed || allCompleted);
22
- }
@@ -1,184 +0,0 @@
1
- import { useFeatureFlags } from "../../featureFlags";
2
- import { hubStateSelector } from "../reducer";
3
- import { usePostOnboardingContext } from "./usePostOnboardingContext";
4
- import { getPostOnboardingAction, mockedFeatureIdToTest } from "../mock";
5
- import { renderHook } from "@testing-library/react-hooks";
6
- import { DeviceModelId } from "@ledgerhq/types-devices";
7
- import { PostOnboardingActionId } from "@ledgerhq/types-live";
8
- import { usePostOnboardingHubState } from "./usePostOnboardingHubState";
9
-
10
- jest.mock("react-redux", () => ({
11
- useSelector: (val) => val(),
12
- }));
13
- jest.mock("../../featureFlags");
14
- jest.mock("./usePostOnboardingContext");
15
- jest.mock("../reducer");
16
-
17
- const mockedUseFeatureFlags = jest.mocked(useFeatureFlags);
18
- const mockedGetFeatureWithMockFeatureEnabled = (enabled) => ({
19
- getFeature: (id) => {
20
- if (id === mockedFeatureIdToTest) return { enabled };
21
- return { enabled: true };
22
- },
23
- overrideFeature: () => {},
24
- resetFeature: () => {},
25
- });
26
-
27
- const mockedUsePostOnboardingContext = jest.mocked(usePostOnboardingContext);
28
-
29
- const mockedHubStateSelector = jest.mocked(hubStateSelector);
30
-
31
- const defaultHubState = {
32
- deviceModelId: DeviceModelId.nanoX,
33
- actionsToComplete: [],
34
- actionsCompleted: {},
35
- lastActionCompleted: null,
36
- };
37
-
38
- const stateAllCompleted = {
39
- deviceModelId: DeviceModelId.nanoX,
40
- actionsToComplete: [
41
- PostOnboardingActionId.claimMock,
42
- PostOnboardingActionId.personalizeMock,
43
- PostOnboardingActionId.migrateAssetsMock,
44
- ],
45
- actionsCompleted: {
46
- [PostOnboardingActionId.claimMock]: true,
47
- [PostOnboardingActionId.personalizeMock]: true,
48
- [PostOnboardingActionId.migrateAssetsMock]: true,
49
- },
50
- lastActionCompleted: PostOnboardingActionId.personalizeMock,
51
- };
52
-
53
- const stateAllNotCompleted = {
54
- deviceModelId: DeviceModelId.nanoX,
55
- actionsToComplete: [
56
- PostOnboardingActionId.claimMock,
57
- PostOnboardingActionId.personalizeMock,
58
- PostOnboardingActionId.migrateAssetsMock,
59
- ],
60
- actionsCompleted: {
61
- [PostOnboardingActionId.claimMock]: false,
62
- [PostOnboardingActionId.personalizeMock]: false,
63
- [PostOnboardingActionId.migrateAssetsMock]: false,
64
- },
65
- lastActionCompleted: null,
66
- };
67
-
68
- describe("usePostOnboardingHubState", () => {
69
- beforeEach(() => {
70
- mockedUseFeatureFlags.mockReturnValue(
71
- mockedGetFeatureWithMockFeatureEnabled(true)
72
- );
73
- mockedUsePostOnboardingContext.mockReturnValue({
74
- getPostOnboardingActionsForDevice: () => [],
75
- navigateToPostOnboardingHub: () => {},
76
- getPostOnboardingAction,
77
- });
78
- });
79
-
80
- it("should return an empty state if the context isn't properly set (`getPostOnboardingAction` missing)", () => {
81
- const state = stateAllCompleted;
82
- mockedHubStateSelector.mockReturnValue(state);
83
- mockedUsePostOnboardingContext.mockReturnValue({
84
- getPostOnboardingActionsForDevice: () => [],
85
- navigateToPostOnboardingHub: () => {},
86
- getPostOnboardingAction: undefined,
87
- });
88
-
89
- const { result } = renderHook(() => usePostOnboardingHubState());
90
-
91
- expect(result.current).toEqual({
92
- deviceModelId: state.deviceModelId,
93
- lastActionCompleted: null,
94
- actionsState: [],
95
- });
96
- });
97
-
98
- it("should return an empty state if the store is in an empty state", () => {
99
- const state = defaultHubState;
100
- mockedHubStateSelector.mockReturnValue(state);
101
-
102
- const { result } = renderHook(() => usePostOnboardingHubState());
103
-
104
- expect(result.current).toEqual({
105
- deviceModelId: state.deviceModelId,
106
- lastActionCompleted: null,
107
- actionsState: [],
108
- });
109
- });
110
-
111
- it("should not return actions that have a disabled feature flag ", () => {
112
- const state = stateAllCompleted;
113
- mockedHubStateSelector.mockReturnValue(state);
114
- mockedUseFeatureFlags.mockReturnValue(
115
- mockedGetFeatureWithMockFeatureEnabled(false)
116
- );
117
-
118
- const {
119
- result: {
120
- current: { actionsState, lastActionCompleted },
121
- },
122
- } = renderHook(() => usePostOnboardingHubState());
123
-
124
- expect(
125
- actionsState.find(
126
- (action) => action.featureFlagId === mockedFeatureIdToTest
127
- )
128
- ).toBe(undefined);
129
- expect(lastActionCompleted).toBe(null);
130
- });
131
-
132
- it("should return actions that have a feature flag enabled", () => {
133
- const state = stateAllCompleted;
134
- mockedHubStateSelector.mockReturnValue(state);
135
- mockedUseFeatureFlags.mockReturnValue(
136
- mockedGetFeatureWithMockFeatureEnabled(true)
137
- );
138
-
139
- const {
140
- result: {
141
- current: { actionsState, lastActionCompleted },
142
- },
143
- } = renderHook(() => usePostOnboardingHubState());
144
-
145
- expect(
146
- actionsState.find(
147
- (action) => action.featureFlagId === mockedFeatureIdToTest
148
- )
149
- ).toBeTruthy();
150
- expect(lastActionCompleted).toBeTruthy();
151
- });
152
-
153
- it("should return actions in their correct state (all actions completed)", () => {
154
- const state = stateAllCompleted;
155
- mockedHubStateSelector.mockReturnValue(state);
156
- mockedUseFeatureFlags.mockReturnValue(
157
- mockedGetFeatureWithMockFeatureEnabled(true)
158
- );
159
-
160
- const {
161
- result: {
162
- current: { actionsState },
163
- },
164
- } = renderHook(() => usePostOnboardingHubState());
165
-
166
- expect(actionsState.every((action) => action.completed)).toBe(true);
167
- });
168
-
169
- it("should return actions in their correct state (no actions completed)", () => {
170
- const state = stateAllNotCompleted;
171
- mockedHubStateSelector.mockReturnValue(state);
172
- mockedUseFeatureFlags.mockReturnValue(
173
- mockedGetFeatureWithMockFeatureEnabled(true)
174
- );
175
-
176
- const {
177
- result: {
178
- current: { actionsState },
179
- },
180
- } = renderHook(() => usePostOnboardingHubState());
181
-
182
- expect(actionsState.every((action) => action.completed)).toBe(false);
183
- });
184
- });
@@ -1,56 +0,0 @@
1
- import { useSelector } from "react-redux";
2
- import { useMemo } from "react";
3
- import { PostOnboardingHubState } from "@ledgerhq/types-live";
4
- import { useFeatureFlags } from "../../featureFlags";
5
- import { hubStateSelector } from "../reducer";
6
- import { usePostOnboardingContext } from "./usePostOnboardingContext";
7
-
8
- /**
9
- * @returns an object representing the state that should be rendered on the post
10
- * onboarding hub screen.
11
- *
12
- * This takes feature flagging into account so the logic is
13
- * resistant to flags getting enabled/disabled over time (for a given disabled
14
- * feature flag, the actions pointing to it will be excluded).
15
- * TODO: unit test this
16
- * */
17
- export function usePostOnboardingHubState(): PostOnboardingHubState {
18
- const hubState = useSelector(hubStateSelector);
19
- const postOnboardingContext = usePostOnboardingContext();
20
- const { getPostOnboardingAction } = postOnboardingContext;
21
- const { getFeature } = useFeatureFlags();
22
- return useMemo(() => {
23
- if (!getPostOnboardingAction)
24
- return {
25
- deviceModelId: hubState.deviceModelId,
26
- lastActionCompleted: null,
27
- actionsState: [],
28
- };
29
- const actionsState = hubState.actionsToComplete
30
- .map((actionId) => ({
31
- ...getPostOnboardingAction(actionId),
32
- completed: !!hubState.actionsCompleted[actionId],
33
- }))
34
- .filter(
35
- (actionWithState) =>
36
- !actionWithState.featureFlagId ||
37
- getFeature(actionWithState.featureFlagId)?.enabled
38
- );
39
- const lastActionCompleted = hubState.lastActionCompleted
40
- ? getPostOnboardingAction(hubState.lastActionCompleted)
41
- : null;
42
-
43
- const isLastActionCompletedEnabled =
44
- lastActionCompleted &&
45
- (!lastActionCompleted.featureFlagId ||
46
- getFeature(lastActionCompleted.featureFlagId)?.enabled);
47
-
48
- return {
49
- deviceModelId: hubState.deviceModelId,
50
- lastActionCompleted: isLastActionCompletedEnabled
51
- ? lastActionCompleted
52
- : null,
53
- actionsState,
54
- };
55
- }, [getFeature, hubState, getPostOnboardingAction]);
56
- }
@@ -1,38 +0,0 @@
1
- import { useDispatch } from "react-redux";
2
- import { DeviceModelId } from "@ledgerhq/types-devices";
3
- import { usePostOnboardingContext } from "./usePostOnboardingContext";
4
- import { useCallback, useMemo } from "react";
5
- import { initPostOnboarding } from "../actions";
6
-
7
- /**
8
- * Use this to initialize AND navigate to the post onboarding hub for a given
9
- * device model.
10
- *
11
- * @param deviceModelId
12
- * @returns a function that can be called to initialize the post
13
- * onboarding for the given device model and navigate to the post onboarding
14
- * hub.
15
- * TODO: unit test this
16
- */
17
- export function useStartPostOnboardingCallback(
18
- deviceModelId: DeviceModelId,
19
- mock = false
20
- ): () => void {
21
- const dispatch = useDispatch();
22
- const { getPostOnboardingActionsForDevice, navigateToPostOnboardingHub } =
23
- usePostOnboardingContext();
24
- const actions = useMemo(
25
- () => getPostOnboardingActionsForDevice(deviceModelId, mock),
26
- [deviceModelId, mock, getPostOnboardingActionsForDevice]
27
- );
28
- return useCallback(() => {
29
- dispatch(
30
- initPostOnboarding({
31
- deviceModelId,
32
- actionsIds: actions.map((action) => action.id),
33
- })
34
- );
35
- if (actions.length === 0) return;
36
- navigateToPostOnboardingHub();
37
- }, [actions, deviceModelId, dispatch, navigateToPostOnboardingHub]);
38
- }
@@ -1,53 +0,0 @@
1
- /** mocks for unit tests */
2
-
3
- import {
4
- FeatureId,
5
- PostOnboardingAction,
6
- PostOnboardingActionId,
7
- } from "@ledgerhq/types-live";
8
-
9
- const MockIcon = (): null => null;
10
-
11
- export const mockedFeatureIdToTest: FeatureId = "mockFeature";
12
-
13
- export const claimTestMock: PostOnboardingAction = {
14
- id: PostOnboardingActionId.claimMock,
15
- Icon: MockIcon,
16
- title: "Claim my NFT",
17
- description: "A special NFT for you.",
18
- tagLabel: "Free",
19
- actionCompletedPopupLabel: "NFT claimed",
20
- actionCompletedHubTitle: "Kickstart your Web3 journey.",
21
- navigationParams: [],
22
- };
23
-
24
- export const personalizeTestMock: PostOnboardingAction = {
25
- id: PostOnboardingActionId.personalizeMock,
26
- Icon: MockIcon,
27
- featureFlagId: mockedFeatureIdToTest,
28
- title: `Personalize my device`,
29
- description: "By customizing the screen.",
30
- actionCompletedPopupLabel: "Device personalized",
31
- actionCompletedHubTitle: "That screen is looking neat.",
32
- navigationParams: [],
33
- };
34
-
35
- export const migrateAssetsTestMock: PostOnboardingAction = {
36
- id: PostOnboardingActionId.migrateAssetsMock,
37
- Icon: MockIcon,
38
- title: "Transfer assets to my Ledger",
39
- description: "Easily secure assets from coinbase or another exchange.",
40
- actionCompletedPopupLabel: "Assets transfered",
41
- actionCompletedHubTitle: "Something about being a crypto pro.",
42
- navigationParams: [],
43
- };
44
-
45
- export function getPostOnboardingAction(
46
- id: PostOnboardingActionId
47
- ): PostOnboardingAction {
48
- return {
49
- [PostOnboardingActionId.claimMock]: claimTestMock,
50
- [PostOnboardingActionId.personalizeMock]: personalizeTestMock,
51
- [PostOnboardingActionId.migrateAssetsMock]: migrateAssetsTestMock,
52
- }[id];
53
- }
@@ -1,247 +0,0 @@
1
- import { DeviceModelId } from "@ledgerhq/types-devices";
2
- import {
3
- PostOnboardingActionId,
4
- PostOnboardingState,
5
- } from "@ledgerhq/types-live";
6
- import reducer, { initialState } from "./reducer";
7
-
8
- import {
9
- importPostOnboardingState,
10
- initPostOnboarding,
11
- setPostOnboardingActionCompleted,
12
- clearPostOnboardingLastActionCompleted,
13
- hidePostOnboardingWalletEntryPoint,
14
- } from "./actions";
15
-
16
- const initializationParamsA: Parameters<typeof initPostOnboarding> = [
17
- {
18
- deviceModelId: DeviceModelId.nanoX,
19
- actionsIds: [
20
- PostOnboardingActionId.claimMock,
21
- PostOnboardingActionId.migrateAssetsMock,
22
- PostOnboardingActionId.personalizeMock,
23
- ],
24
- },
25
- ];
26
-
27
- // initialState -> importPostOnboardingState(...initializationParamsA)
28
- const stateA0: PostOnboardingState = {
29
- deviceModelId: DeviceModelId.nanoX,
30
- walletEntryPointDismissed: false,
31
- actionsToComplete: [
32
- PostOnboardingActionId.claimMock,
33
- PostOnboardingActionId.migrateAssetsMock,
34
- PostOnboardingActionId.personalizeMock,
35
- ],
36
- actionsCompleted: {
37
- [PostOnboardingActionId.claimMock]: false,
38
- [PostOnboardingActionId.migrateAssetsMock]: false,
39
- [PostOnboardingActionId.personalizeMock]: false,
40
- },
41
- lastActionCompleted: null,
42
- };
43
-
44
- // stateA0 -> setPostOnboardingActionCompleted(claimMock)
45
- const stateA1: PostOnboardingState = {
46
- deviceModelId: DeviceModelId.nanoX,
47
- walletEntryPointDismissed: false,
48
- actionsToComplete: [
49
- PostOnboardingActionId.claimMock,
50
- PostOnboardingActionId.migrateAssetsMock,
51
- PostOnboardingActionId.personalizeMock,
52
- ],
53
- actionsCompleted: {
54
- [PostOnboardingActionId.claimMock]: true, // stateA0 -> setPostOnboardingActionCompleted(claimMock)
55
- [PostOnboardingActionId.migrateAssetsMock]: false,
56
- [PostOnboardingActionId.personalizeMock]: false,
57
- },
58
- lastActionCompleted: PostOnboardingActionId.claimMock, // stateA0 -> setPostOnboardingActionCompleted(claimMock)
59
- };
60
-
61
- // stateA1 -> clearPostOnboardingLastActionCompleted()
62
- const stateA2: PostOnboardingState = {
63
- deviceModelId: DeviceModelId.nanoX,
64
- walletEntryPointDismissed: false,
65
- actionsToComplete: [
66
- PostOnboardingActionId.claimMock,
67
- PostOnboardingActionId.migrateAssetsMock,
68
- PostOnboardingActionId.personalizeMock,
69
- ],
70
- actionsCompleted: {
71
- [PostOnboardingActionId.claimMock]: true,
72
- [PostOnboardingActionId.migrateAssetsMock]: false,
73
- [PostOnboardingActionId.personalizeMock]: false,
74
- },
75
- lastActionCompleted: null, // stateA1 -> clearPostOnboardingLastActionCompleted()
76
- };
77
-
78
- // stateA2 -> setPostOnboardingActionCompleted(personalizeMock)
79
- const stateA3: PostOnboardingState = {
80
- deviceModelId: DeviceModelId.nanoX,
81
- walletEntryPointDismissed: false,
82
- actionsToComplete: [
83
- PostOnboardingActionId.claimMock,
84
- PostOnboardingActionId.migrateAssetsMock,
85
- PostOnboardingActionId.personalizeMock,
86
- ],
87
- actionsCompleted: {
88
- [PostOnboardingActionId.claimMock]: true,
89
- [PostOnboardingActionId.migrateAssetsMock]: false,
90
- [PostOnboardingActionId.personalizeMock]: true, // stateA2 -> setPostOnboardingActionCompleted(personalizeMock)
91
- },
92
- lastActionCompleted: PostOnboardingActionId.personalizeMock, // stateA2 -> setPostOnboardingActionCompleted(personalizeMock)
93
- };
94
-
95
- // stateA3 -> hidePostOnboardingWalletEntryPoint()
96
- const stateA4: PostOnboardingState = {
97
- deviceModelId: DeviceModelId.nanoX,
98
- walletEntryPointDismissed: true, // stateA3 -> hidePostOnboardingWalletEntryPoint()
99
- actionsToComplete: [
100
- PostOnboardingActionId.claimMock,
101
- PostOnboardingActionId.migrateAssetsMock,
102
- PostOnboardingActionId.personalizeMock,
103
- ],
104
- actionsCompleted: {
105
- [PostOnboardingActionId.claimMock]: true,
106
- [PostOnboardingActionId.migrateAssetsMock]: false,
107
- [PostOnboardingActionId.personalizeMock]: true,
108
- },
109
- lastActionCompleted: PostOnboardingActionId.personalizeMock,
110
- };
111
-
112
- const initializationParamsB: Parameters<typeof initPostOnboarding> = [
113
- {
114
- deviceModelId: DeviceModelId.nanoS,
115
- actionsIds: [PostOnboardingActionId.claimMock],
116
- },
117
- ];
118
-
119
- // initialState -> importPostOnboardingState(...initializationParamsB)
120
- const stateB0 = {
121
- deviceModelId: DeviceModelId.nanoS,
122
- walletEntryPointDismissed: false,
123
- actionsToComplete: [PostOnboardingActionId.claimMock],
124
- actionsCompleted: { [PostOnboardingActionId.claimMock]: false },
125
- lastActionCompleted: null,
126
- };
127
-
128
- // stateB0 -> setPostOnboardingActionCompleted(claimMock)
129
- const stateB1 = {
130
- deviceModelId: DeviceModelId.nanoS,
131
- walletEntryPointDismissed: false,
132
- actionsToComplete: [PostOnboardingActionId.claimMock],
133
- actionsCompleted: { [PostOnboardingActionId.claimMock]: true },
134
- lastActionCompleted: PostOnboardingActionId.claimMock,
135
- };
136
-
137
- const initializationParamsC: Parameters<typeof initPostOnboarding> = [
138
- {
139
- deviceModelId: DeviceModelId.nanoSP,
140
- actionsIds: [],
141
- },
142
- ];
143
-
144
- // initialState -> importPostOnboardingState(...initializationParamsC)
145
- const stateC0 = {
146
- deviceModelId: DeviceModelId.nanoSP,
147
- walletEntryPointDismissed: false,
148
- actionsToComplete: [],
149
- actionsCompleted: {},
150
- lastActionCompleted: null,
151
- };
152
-
153
- describe("postOnboarding reducer (& action creators)", () => {
154
- let state;
155
- beforeEach(() => {
156
- // reset state to initial state;
157
- state = reducer(undefined, {});
158
- });
159
-
160
- it("should initialize the state properly", () => {
161
- expect(state).toEqual(initialState);
162
- });
163
-
164
- it("should handle importPostOnboardingState", () => {
165
- state = reducer(state, importPostOnboardingState({ newState: stateA0 }));
166
- expect(state).toEqual(stateA0);
167
- state = reducer(state, importPostOnboardingState({ newState: stateA1 }));
168
- expect(state).toEqual(stateA1);
169
- });
170
-
171
- it("it should handle initPostOnboarding", () => {
172
- state = reducer(state, initPostOnboarding(...initializationParamsA));
173
- expect(state).toEqual(stateA0);
174
- });
175
-
176
- it("it should handle setPostOnboardingActionCompleted", () => {
177
- state = stateA0;
178
- state = reducer(
179
- state,
180
- setPostOnboardingActionCompleted({
181
- actionId: PostOnboardingActionId.claimMock,
182
- })
183
- );
184
- expect(state).toEqual(stateA1);
185
- });
186
-
187
- it("it should handle clearPostOnboardingLastActionCompleted", () => {
188
- state = stateA1;
189
- state = reducer(state, clearPostOnboardingLastActionCompleted());
190
- expect(state).toEqual(stateA2);
191
- });
192
-
193
- it("it should handle hidePostOnboardingWalletEntryPoint", () => {
194
- state = stateA3;
195
- state = reducer(state, hidePostOnboardingWalletEntryPoint());
196
- expect(state).toEqual(stateA4);
197
- });
198
-
199
- it("it should handle successive actions properly", () => {
200
- // initializing state with new device & set of actions
201
- state = reducer(state, initPostOnboarding(...initializationParamsA));
202
- expect(state).toEqual(stateA0);
203
-
204
- // setting completed for claimMock
205
- state = reducer(
206
- state,
207
- setPostOnboardingActionCompleted({
208
- actionId: PostOnboardingActionId.claimMock,
209
- })
210
- );
211
- expect(state).toEqual(stateA1);
212
-
213
- // clearing last completed action
214
- state = reducer(state, clearPostOnboardingLastActionCompleted());
215
- expect(state).toEqual(stateA2);
216
-
217
- // setting completed for personalizeMock
218
- state = reducer(
219
- state,
220
- setPostOnboardingActionCompleted({
221
- actionId: PostOnboardingActionId.personalizeMock,
222
- })
223
- );
224
- expect(state).toEqual(stateA3);
225
-
226
- // hiding wallet entrypoint
227
- state = reducer(state, hidePostOnboardingWalletEntryPoint());
228
- expect(state).toEqual(stateA4);
229
-
230
- // initializing state with new device & set of actions
231
- state = reducer(state, initPostOnboarding(...initializationParamsB));
232
- expect(state).toEqual(stateB0);
233
-
234
- // setting completed for claimMock
235
- state = reducer(
236
- state,
237
- setPostOnboardingActionCompleted({
238
- actionId: PostOnboardingActionId.claimMock,
239
- })
240
- );
241
- expect(state).toEqual(stateB1);
242
-
243
- // initializing state with new device & set of actions
244
- state = reducer(state, initPostOnboarding(...initializationParamsC));
245
- expect(state).toEqual(stateC0);
246
- });
247
- });