@ledgerhq/live-common 34.47.0-nightly.0 → 34.47.0-nightly.2

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 (171) hide show
  1. package/lib/__tests__/test-helpers/environment.js +2 -0
  2. package/lib/__tests__/test-helpers/environment.js.map +1 -1
  3. package/lib/bridge/crypto-assets/cal-integration.d.ts +4 -0
  4. package/lib/bridge/crypto-assets/cal-integration.d.ts.map +1 -0
  5. package/lib/bridge/crypto-assets/cal-integration.js +26 -0
  6. package/lib/bridge/crypto-assets/cal-integration.js.map +1 -0
  7. package/lib/bridge/crypto-assets/cal-integration.test.d.ts +2 -0
  8. package/lib/bridge/crypto-assets/cal-integration.test.d.ts.map +1 -0
  9. package/lib/bridge/crypto-assets/cal-integration.test.js +45 -0
  10. package/lib/bridge/crypto-assets/cal-integration.test.js.map +1 -0
  11. package/lib/bridge/crypto-assets/cal-store.d.ts +14 -0
  12. package/lib/bridge/crypto-assets/cal-store.d.ts.map +1 -0
  13. package/lib/bridge/crypto-assets/cal-store.js +42 -0
  14. package/lib/bridge/crypto-assets/cal-store.js.map +1 -0
  15. package/lib/bridge/crypto-assets/cal-store.test.d.ts +2 -0
  16. package/lib/bridge/crypto-assets/cal-store.test.d.ts.map +1 -0
  17. package/lib/bridge/crypto-assets/cal-store.test.js +70 -0
  18. package/lib/bridge/crypto-assets/cal-store.test.js.map +1 -0
  19. package/lib/bridge/crypto-assets/index.d.ts.map +1 -1
  20. package/lib/bridge/crypto-assets/index.js +4 -0
  21. package/lib/bridge/crypto-assets/index.js.map +1 -1
  22. package/lib/bridge/crypto-assets/index.test.js +36 -0
  23. package/lib/bridge/crypto-assets/index.test.js.map +1 -1
  24. package/lib/bridge/generic-alpaca/alpaca/network/network-alpaca.js +1 -1
  25. package/lib/bridge/generic-alpaca/alpaca/network/network-alpaca.js.map +1 -1
  26. package/lib/bridge/generic-alpaca/buildSubAccounts.d.ts +2 -3
  27. package/lib/bridge/generic-alpaca/buildSubAccounts.d.ts.map +1 -1
  28. package/lib/bridge/generic-alpaca/buildSubAccounts.js +3 -12
  29. package/lib/bridge/generic-alpaca/buildSubAccounts.js.map +1 -1
  30. package/lib/bridge/generic-alpaca/getAccountShape.d.ts.map +1 -1
  31. package/lib/bridge/generic-alpaca/getAccountShape.js +4 -4
  32. package/lib/bridge/generic-alpaca/getAccountShape.js.map +1 -1
  33. package/lib/e2e/enum/DeviceLabels.d.ts +1 -0
  34. package/lib/e2e/enum/DeviceLabels.d.ts.map +1 -1
  35. package/lib/e2e/enum/DeviceLabels.js +1 -0
  36. package/lib/e2e/enum/DeviceLabels.js.map +1 -1
  37. package/lib/e2e/families/tezos.d.ts.map +1 -1
  38. package/lib/e2e/families/tezos.js +2 -0
  39. package/lib/e2e/families/tezos.js.map +1 -1
  40. package/lib/e2e/index.d.ts +4 -4
  41. package/lib/exchange/platform/transfer/completeExchange.d.ts.map +1 -1
  42. package/lib/exchange/platform/transfer/completeExchange.js +3 -5
  43. package/lib/exchange/platform/transfer/completeExchange.js.map +1 -1
  44. package/lib/exchange/swap/completeExchange.d.ts.map +1 -1
  45. package/lib/exchange/swap/completeExchange.js +5 -2
  46. package/lib/exchange/swap/completeExchange.js.map +1 -1
  47. package/lib/exchange/swap/initSwap.d.ts.map +1 -1
  48. package/lib/exchange/swap/initSwap.js +5 -2
  49. package/lib/exchange/swap/initSwap.js.map +1 -1
  50. package/lib/families/canton/config.d.ts.map +1 -1
  51. package/lib/families/canton/config.js +35 -1
  52. package/lib/families/canton/config.js.map +1 -1
  53. package/lib/featureFlags/defaultFeatures.js +1 -1
  54. package/lib/featureFlags/defaultFeatures.js.map +1 -1
  55. package/lib/featureFlags/useFeature.d.ts +1 -1
  56. package/lib/featureFlags/useFeature.d.ts.map +1 -1
  57. package/lib/modularDrawer/__mocks__/dada.mock.d.ts +3336 -0
  58. package/lib/modularDrawer/__mocks__/dada.mock.d.ts.map +1 -0
  59. package/lib/modularDrawer/__mocks__/dada.mock.js +3879 -0
  60. package/lib/modularDrawer/__mocks__/dada.mock.js.map +1 -0
  61. package/lib/modularDrawer/data/state-manager/api.d.ts +729 -24
  62. package/lib/modularDrawer/data/state-manager/api.d.ts.map +1 -1
  63. package/lib/modularDrawer/data/state-manager/api.js +29 -11
  64. package/lib/modularDrawer/data/state-manager/api.js.map +1 -1
  65. package/lib/modularDrawer/hooks/__test__/useAssetsData.test.js +129 -73
  66. package/lib/modularDrawer/hooks/__test__/useAssetsData.test.js.map +1 -1
  67. package/lib/modularDrawer/hooks/useAssetsData.d.ts +4 -5
  68. package/lib/modularDrawer/hooks/useAssetsData.d.ts.map +1 -1
  69. package/lib/modularDrawer/hooks/useAssetsData.js +34 -15
  70. package/lib/modularDrawer/hooks/useAssetsData.js.map +1 -1
  71. package/lib/modularDrawer/utils/getLoadingStatus.d.ts +9 -0
  72. package/lib/modularDrawer/utils/getLoadingStatus.d.ts.map +1 -0
  73. package/lib/modularDrawer/utils/getLoadingStatus.js +18 -0
  74. package/lib/modularDrawer/utils/getLoadingStatus.js.map +1 -0
  75. package/lib-es/__tests__/test-helpers/environment.js +2 -0
  76. package/lib-es/__tests__/test-helpers/environment.js.map +1 -1
  77. package/lib-es/bridge/crypto-assets/cal-integration.d.ts +4 -0
  78. package/lib-es/bridge/crypto-assets/cal-integration.d.ts.map +1 -0
  79. package/lib-es/bridge/crypto-assets/cal-integration.js +21 -0
  80. package/lib-es/bridge/crypto-assets/cal-integration.js.map +1 -0
  81. package/lib-es/bridge/crypto-assets/cal-integration.test.d.ts +2 -0
  82. package/lib-es/bridge/crypto-assets/cal-integration.test.d.ts.map +1 -0
  83. package/lib-es/bridge/crypto-assets/cal-integration.test.js +43 -0
  84. package/lib-es/bridge/crypto-assets/cal-integration.test.js.map +1 -0
  85. package/lib-es/bridge/crypto-assets/cal-store.d.ts +14 -0
  86. package/lib-es/bridge/crypto-assets/cal-store.d.ts.map +1 -0
  87. package/lib-es/bridge/crypto-assets/cal-store.js +38 -0
  88. package/lib-es/bridge/crypto-assets/cal-store.js.map +1 -0
  89. package/lib-es/bridge/crypto-assets/cal-store.test.d.ts +2 -0
  90. package/lib-es/bridge/crypto-assets/cal-store.test.d.ts.map +1 -0
  91. package/lib-es/bridge/crypto-assets/cal-store.test.js +68 -0
  92. package/lib-es/bridge/crypto-assets/cal-store.test.js.map +1 -0
  93. package/lib-es/bridge/crypto-assets/index.d.ts.map +1 -1
  94. package/lib-es/bridge/crypto-assets/index.js +4 -0
  95. package/lib-es/bridge/crypto-assets/index.js.map +1 -1
  96. package/lib-es/bridge/crypto-assets/index.test.js +36 -0
  97. package/lib-es/bridge/crypto-assets/index.test.js.map +1 -1
  98. package/lib-es/bridge/generic-alpaca/alpaca/network/network-alpaca.js +1 -1
  99. package/lib-es/bridge/generic-alpaca/alpaca/network/network-alpaca.js.map +1 -1
  100. package/lib-es/bridge/generic-alpaca/buildSubAccounts.d.ts +2 -3
  101. package/lib-es/bridge/generic-alpaca/buildSubAccounts.d.ts.map +1 -1
  102. package/lib-es/bridge/generic-alpaca/buildSubAccounts.js +2 -9
  103. package/lib-es/bridge/generic-alpaca/buildSubAccounts.js.map +1 -1
  104. package/lib-es/bridge/generic-alpaca/getAccountShape.d.ts.map +1 -1
  105. package/lib-es/bridge/generic-alpaca/getAccountShape.js +3 -3
  106. package/lib-es/bridge/generic-alpaca/getAccountShape.js.map +1 -1
  107. package/lib-es/e2e/enum/DeviceLabels.d.ts +1 -0
  108. package/lib-es/e2e/enum/DeviceLabels.d.ts.map +1 -1
  109. package/lib-es/e2e/enum/DeviceLabels.js +1 -0
  110. package/lib-es/e2e/enum/DeviceLabels.js.map +1 -1
  111. package/lib-es/e2e/families/tezos.d.ts.map +1 -1
  112. package/lib-es/e2e/families/tezos.js +2 -0
  113. package/lib-es/e2e/families/tezos.js.map +1 -1
  114. package/lib-es/e2e/index.d.ts +4 -4
  115. package/lib-es/exchange/platform/transfer/completeExchange.d.ts.map +1 -1
  116. package/lib-es/exchange/platform/transfer/completeExchange.js +3 -2
  117. package/lib-es/exchange/platform/transfer/completeExchange.js.map +1 -1
  118. package/lib-es/exchange/swap/completeExchange.d.ts.map +1 -1
  119. package/lib-es/exchange/swap/completeExchange.js +5 -2
  120. package/lib-es/exchange/swap/completeExchange.js.map +1 -1
  121. package/lib-es/exchange/swap/initSwap.d.ts.map +1 -1
  122. package/lib-es/exchange/swap/initSwap.js +5 -2
  123. package/lib-es/exchange/swap/initSwap.js.map +1 -1
  124. package/lib-es/families/canton/config.d.ts.map +1 -1
  125. package/lib-es/families/canton/config.js +35 -1
  126. package/lib-es/families/canton/config.js.map +1 -1
  127. package/lib-es/featureFlags/defaultFeatures.js +1 -1
  128. package/lib-es/featureFlags/defaultFeatures.js.map +1 -1
  129. package/lib-es/featureFlags/useFeature.d.ts +1 -1
  130. package/lib-es/featureFlags/useFeature.d.ts.map +1 -1
  131. package/lib-es/modularDrawer/__mocks__/dada.mock.d.ts +3336 -0
  132. package/lib-es/modularDrawer/__mocks__/dada.mock.d.ts.map +1 -0
  133. package/lib-es/modularDrawer/__mocks__/dada.mock.js +3876 -0
  134. package/lib-es/modularDrawer/__mocks__/dada.mock.js.map +1 -0
  135. package/lib-es/modularDrawer/data/state-manager/api.d.ts +729 -24
  136. package/lib-es/modularDrawer/data/state-manager/api.d.ts.map +1 -1
  137. package/lib-es/modularDrawer/data/state-manager/api.js +28 -10
  138. package/lib-es/modularDrawer/data/state-manager/api.js.map +1 -1
  139. package/lib-es/modularDrawer/hooks/__test__/useAssetsData.test.js +130 -74
  140. package/lib-es/modularDrawer/hooks/__test__/useAssetsData.test.js.map +1 -1
  141. package/lib-es/modularDrawer/hooks/useAssetsData.d.ts +4 -5
  142. package/lib-es/modularDrawer/hooks/useAssetsData.d.ts.map +1 -1
  143. package/lib-es/modularDrawer/hooks/useAssetsData.js +36 -17
  144. package/lib-es/modularDrawer/hooks/useAssetsData.js.map +1 -1
  145. package/lib-es/modularDrawer/utils/getLoadingStatus.d.ts +9 -0
  146. package/lib-es/modularDrawer/utils/getLoadingStatus.d.ts.map +1 -0
  147. package/lib-es/modularDrawer/utils/getLoadingStatus.js +14 -0
  148. package/lib-es/modularDrawer/utils/getLoadingStatus.js.map +1 -0
  149. package/package.json +48 -48
  150. package/src/__tests__/test-helpers/environment.ts +2 -0
  151. package/src/bridge/crypto-assets/cal-integration.test.ts +53 -0
  152. package/src/bridge/crypto-assets/cal-integration.ts +23 -0
  153. package/src/bridge/crypto-assets/cal-store.test.ts +93 -0
  154. package/src/bridge/crypto-assets/cal-store.ts +46 -0
  155. package/src/bridge/crypto-assets/index.test.ts +47 -0
  156. package/src/bridge/crypto-assets/index.ts +5 -0
  157. package/src/bridge/generic-alpaca/alpaca/network/network-alpaca.ts +1 -1
  158. package/src/bridge/generic-alpaca/buildSubAccounts.ts +3 -11
  159. package/src/bridge/generic-alpaca/getAccountShape.ts +3 -4
  160. package/src/e2e/enum/DeviceLabels.ts +1 -0
  161. package/src/e2e/families/tezos.ts +2 -0
  162. package/src/exchange/platform/transfer/completeExchange.ts +3 -2
  163. package/src/exchange/swap/completeExchange.ts +5 -2
  164. package/src/exchange/swap/initSwap.ts +5 -4
  165. package/src/families/canton/config.ts +36 -1
  166. package/src/featureFlags/defaultFeatures.ts +1 -1
  167. package/src/modularDrawer/__mocks__/dada.mock.ts +3890 -0
  168. package/src/modularDrawer/data/state-manager/api.ts +32 -11
  169. package/src/modularDrawer/hooks/__test__/useAssetsData.test.ts +136 -75
  170. package/src/modularDrawer/hooks/useAssetsData.ts +40 -17
  171. package/src/modularDrawer/utils/getLoadingStatus.ts +24 -0
@@ -8,11 +8,14 @@ export enum AssetsDataTags {
8
8
  }
9
9
 
10
10
  export interface GetAssetsDataParams {
11
- cursor?: string;
12
11
  search?: string;
13
12
  currencyIds?: string[];
14
13
  }
15
14
 
15
+ export interface PageParam {
16
+ cursor?: string;
17
+ }
18
+
16
19
  export interface AssetsDataWithPagination extends AssetsData {
17
20
  pagination: {
18
21
  nextCursor?: string;
@@ -43,20 +46,38 @@ export const assetsDataApi = createApi({
43
46
  }),
44
47
  tagTypes: [AssetsDataTags.Assets],
45
48
  endpoints: build => ({
46
- getAssetsData: build.query<AssetsDataWithPagination, GetAssetsDataParams>({
47
- query: ({ cursor, search, currencyIds: _currencyIds }) => ({
48
- url: "assets",
49
- params: {
50
- ...(cursor && { cursor }),
51
- ...(search && { search }),
52
- // ...(currencyIds && currencyIds.length > 0 && { currencyIds }),
49
+ getAssetsData: build.infiniteQuery<AssetsDataWithPagination, GetAssetsDataParams, PageParam>({
50
+ query: ({ pageParam, queryArg }) => {
51
+ const params = {
53
52
  pageSize: 100,
54
- },
55
- }),
53
+ ...(pageParam?.cursor && { cursor: pageParam.cursor }),
54
+ // ...(queryArg?.currencyIds && queryArg?.currencyIds.length > 0 && { currencyIds: queryArg.currencyIds }),
55
+ ...(queryArg?.search && { search: queryArg.search }),
56
+ };
57
+
58
+ return {
59
+ url: "assets",
60
+ params,
61
+ };
62
+ },
56
63
  providesTags: [AssetsDataTags.Assets],
57
64
  transformResponse: transformAssetsResponse,
65
+ infiniteQueryOptions: {
66
+ initialPageParam: {
67
+ cursor: "",
68
+ },
69
+ getNextPageParam: lastPage => {
70
+ if (lastPage.pagination.nextCursor) {
71
+ return {
72
+ cursor: lastPage.pagination.nextCursor,
73
+ };
74
+ } else {
75
+ return undefined;
76
+ }
77
+ },
78
+ },
58
79
  }),
59
80
  }),
60
81
  });
61
82
 
62
- export const { useGetAssetsDataQuery } = assetsDataApi;
83
+ export const { useGetAssetsDataInfiniteQuery } = assetsDataApi;
@@ -4,21 +4,27 @@
4
4
 
5
5
  import { renderHook } from "@testing-library/react";
6
6
  import { useAssetsData } from "../useAssetsData";
7
- import { useGetAssetsDataQuery } from "../../data/state-manager/api";
7
+ import { useGetAssetsDataInfiniteQuery } from "../../data/state-manager/api";
8
8
 
9
9
  jest.mock("../../data/state-manager/api", () => ({
10
- useGetAssetsDataQuery: jest.fn(),
10
+ useGetAssetsDataInfiniteQuery: jest.fn(),
11
11
  }));
12
12
 
13
- const mockSetCursor = jest.fn();
14
- jest.mock("react", () => ({
15
- ...jest.requireActual("react"),
16
- useState: jest.fn(() => [undefined, mockSetCursor]),
17
- useCallback: jest.fn(fn => fn),
18
- useMemo: jest.fn(fn => fn()),
19
- }));
20
-
21
- const mockUseGetAssetsDataQuery = jest.mocked(useGetAssetsDataQuery);
13
+ const mockuseGetAssetsDataInfiniteQuery = jest.mocked(useGetAssetsDataInfiniteQuery);
14
+
15
+ const defaultMockValues = {
16
+ data: undefined,
17
+ isLoading: false,
18
+ error: undefined,
19
+ fetchNextPage: jest.fn(),
20
+ isSuccess: true,
21
+ isFetching: false,
22
+ isError: false,
23
+ fetchPreviousPage: jest.fn(),
24
+ isFetchingPreviousPage: false,
25
+ refetch: jest.fn(),
26
+ status: "success",
27
+ };
22
28
 
23
29
  describe("useAssetsData", () => {
24
30
  beforeEach(() => {
@@ -26,58 +32,92 @@ describe("useAssetsData", () => {
26
32
  });
27
33
 
28
34
  it("should return loading state when API is loading", () => {
29
- mockUseGetAssetsDataQuery.mockReturnValue({
30
- data: undefined,
35
+ mockuseGetAssetsDataInfiniteQuery.mockReturnValue({
36
+ ...defaultMockValues,
31
37
  isLoading: true,
32
- error: undefined,
33
- refetch: jest.fn(),
34
- isFetching: false,
35
- isSuccess: false,
36
- isError: false,
37
- currentData: undefined,
38
+ status: "pending",
38
39
  });
39
40
 
40
41
  const { result } = renderHook(() => useAssetsData({}));
41
42
 
42
43
  expect(result.current.isLoading).toBe(true);
43
44
  expect(result.current.data).toBe(undefined);
44
- expect(result.current.hasMore).toBe(false);
45
45
  });
46
46
 
47
- it("should return data and hasMore when API returns data", () => {
48
- const mockData = {
49
- assetsData: [],
50
- pagination: { nextCursor: "test-cursor" },
51
- };
52
- mockUseGetAssetsDataQuery.mockReturnValue({
53
- data: mockData,
54
- isLoading: false,
55
- error: undefined,
56
- refetch: jest.fn(),
57
- isFetching: false,
58
- isSuccess: true,
59
- isError: false,
60
- currentData: mockData,
47
+ it("should return combined data from multiple pages", () => {
48
+ const mockPages = [
49
+ {
50
+ cryptoAssets: { bitcoin: { id: "bitcoin", name: "Bitcoin" } },
51
+ networks: { bitcoin: { id: "bitcoin", name: "Bitcoin" } },
52
+ cryptoOrTokenCurrencies: { bitcoin: { id: "bitcoin" } },
53
+ interestRates: {},
54
+ markets: {},
55
+ currenciesOrder: {
56
+ currenciesIds: ["bitcoin"],
57
+ metaCurrencyIds: ["bitcoin"],
58
+ key: "marketCap",
59
+ order: "desc",
60
+ },
61
+ pagination: { nextCursor: "cursor-2" },
62
+ },
63
+ {
64
+ cryptoAssets: { ethereum: { id: "ethereum", name: "Ethereum" } },
65
+ networks: { ethereum: { id: "ethereum", name: "Ethereum" } },
66
+ cryptoOrTokenCurrencies: { ethereum: { id: "ethereum" } },
67
+ interestRates: {},
68
+ markets: {},
69
+ currenciesOrder: {
70
+ currenciesIds: ["ethereum"],
71
+ metaCurrencyIds: ["ethereum"],
72
+ key: "marketCap",
73
+ order: "desc",
74
+ },
75
+ pagination: { nextCursor: undefined },
76
+ },
77
+ ];
78
+
79
+ mockuseGetAssetsDataInfiniteQuery.mockReturnValue({
80
+ ...defaultMockValues,
81
+ data: { pages: mockPages, pageParams: [{ cursor: "" }, { cursor: "cursor-2" }] },
61
82
  });
62
83
 
63
84
  const { result } = renderHook(() => useAssetsData({}));
64
85
 
65
- expect(result.current.data).toBe(mockData);
86
+ expect(result.current.data).toEqual({
87
+ cryptoAssets: {
88
+ bitcoin: { id: "bitcoin", name: "Bitcoin" },
89
+ ethereum: { id: "ethereum", name: "Ethereum" },
90
+ },
91
+ networks: {
92
+ bitcoin: { id: "bitcoin", name: "Bitcoin" },
93
+ ethereum: { id: "ethereum", name: "Ethereum" },
94
+ },
95
+ cryptoOrTokenCurrencies: {
96
+ bitcoin: { id: "bitcoin" },
97
+ ethereum: { id: "ethereum" },
98
+ },
99
+ interestRates: {},
100
+ markets: {},
101
+ currenciesOrder: {
102
+ currenciesIds: ["bitcoin", "ethereum"],
103
+ metaCurrencyIds: ["bitcoin", "ethereum"],
104
+ key: "marketCap",
105
+ order: "desc",
106
+ },
107
+ pagination: { nextCursor: undefined },
108
+ });
66
109
  expect(result.current.isLoading).toBe(false);
67
- expect(result.current.hasMore).toBe(true);
68
110
  });
69
111
 
70
112
  it("should return error when API has error", () => {
71
113
  const mockError = new Error("API Error");
72
- mockUseGetAssetsDataQuery.mockReturnValue({
114
+ mockuseGetAssetsDataInfiniteQuery.mockReturnValue({
115
+ ...defaultMockValues,
73
116
  data: undefined,
74
- isLoading: false,
75
117
  error: mockError,
76
- refetch: jest.fn(),
77
- isFetching: false,
78
118
  isSuccess: false,
79
119
  isError: true,
80
- currentData: undefined,
120
+ status: "error",
81
121
  });
82
122
 
83
123
  const { result } = renderHook(() => useAssetsData({}));
@@ -86,54 +126,75 @@ describe("useAssetsData", () => {
86
126
  expect(result.current.isLoading).toBe(false);
87
127
  });
88
128
 
89
- it("should call setCursor when loadNext is called and there's a nextCursor", () => {
90
- const nextCursor = "next-cursor-456";
91
- mockUseGetAssetsDataQuery.mockReturnValue({
92
- data: {
93
- assetsData: [],
94
- pagination: { nextCursor },
95
- },
96
- isLoading: false,
97
- error: undefined,
98
- refetch: jest.fn(),
99
- isFetching: false,
100
- isSuccess: true,
101
- isError: false,
102
- currentData: {
103
- assetsData: [],
104
- pagination: { nextCursor },
129
+ it("should provide loadNext function when there's a nextCursor", () => {
130
+ const mockFetchNextPage = jest.fn();
131
+ const mockPages = [
132
+ {
133
+ cryptoAssets: {},
134
+ networks: {},
135
+ cryptoOrTokenCurrencies: {},
136
+ interestRates: {},
137
+ markets: {},
138
+ currenciesOrder: {
139
+ currenciesIds: [],
140
+ metaCurrencyIds: [],
141
+ key: "marketCap",
142
+ order: "desc",
143
+ },
144
+ pagination: { nextCursor: "next-cursor-456" },
105
145
  },
146
+ ];
147
+
148
+ mockuseGetAssetsDataInfiniteQuery.mockReturnValue({
149
+ ...defaultMockValues,
150
+ data: { pages: mockPages, pageParams: [{ cursor: "" }] },
151
+ fetchNextPage: mockFetchNextPage,
106
152
  });
107
153
 
108
154
  const { result } = renderHook(() => useAssetsData({}));
109
155
 
110
- result.current.loadNext();
156
+ expect(result.current.loadNext).toBeDefined();
157
+ result.current.loadNext?.();
111
158
 
112
- expect(mockSetCursor).toHaveBeenCalledWith(nextCursor);
159
+ expect(mockFetchNextPage).toHaveBeenCalled();
113
160
  });
114
161
 
115
- it("should not call setCursor when there's no nextCursor", () => {
116
- mockUseGetAssetsDataQuery.mockReturnValue({
117
- data: {
118
- assetsData: [],
119
- pagination: { nextCursor: undefined },
120
- },
121
- isLoading: false,
122
- error: undefined,
123
- refetch: jest.fn(),
124
- isFetching: false,
125
- isSuccess: true,
126
- isError: false,
127
- currentData: {
128
- assetsData: [],
162
+ it("should not provide loadNext function when there's no nextCursor", () => {
163
+ const mockPages = [
164
+ {
165
+ cryptoAssets: {},
166
+ networks: {},
167
+ cryptoOrTokenCurrencies: {},
168
+ interestRates: {},
169
+ markets: {},
170
+ currenciesOrder: {
171
+ currenciesIds: [],
172
+ metaCurrencyIds: [],
173
+ key: "marketCap",
174
+ order: "desc",
175
+ },
129
176
  pagination: { nextCursor: undefined },
130
177
  },
178
+ ];
179
+
180
+ mockuseGetAssetsDataInfiniteQuery.mockReturnValue({
181
+ ...defaultMockValues,
182
+ data: { pages: mockPages, pageParams: [{ cursor: "" }] },
131
183
  });
132
184
 
133
185
  const { result } = renderHook(() => useAssetsData({}));
134
186
 
135
- result.current.loadNext();
187
+ expect(result.current.loadNext).toBeUndefined();
188
+ });
189
+
190
+ it("should return undefined data when no pages exist", () => {
191
+ mockuseGetAssetsDataInfiniteQuery.mockReturnValue({
192
+ ...defaultMockValues,
193
+ });
194
+
195
+ const { result } = renderHook(() => useAssetsData({}));
136
196
 
137
- expect(mockSetCursor).not.toHaveBeenCalled();
197
+ expect(result.current.data).toBeUndefined();
198
+ expect(result.current.loadNext).toBeUndefined();
138
199
  });
139
200
  });
@@ -1,5 +1,20 @@
1
- import { useState, useCallback } from "react";
2
- import { useGetAssetsDataQuery } from "../data/state-manager/api";
1
+ import { useMemo } from "react";
2
+ import { AssetsDataWithPagination, useGetAssetsDataInfiniteQuery } from "../data/state-manager/api";
3
+
4
+ const emptyData = () => ({
5
+ cryptoAssets: {},
6
+ networks: {},
7
+ cryptoOrTokenCurrencies: {},
8
+ interestRates: {},
9
+ markets: {},
10
+ currenciesOrder: {
11
+ currenciesIds: [],
12
+ metaCurrencyIds: [],
13
+ key: "",
14
+ order: "",
15
+ },
16
+ pagination: { nextCursor: "" },
17
+ });
3
18
 
4
19
  export function useAssetsData({
5
20
  search,
@@ -8,29 +23,37 @@ export function useAssetsData({
8
23
  search?: string;
9
24
  currencyIds?: string[];
10
25
  }) {
11
- const [cursor, setCursor] = useState<string | undefined>(undefined);
12
- const { data, error, isLoading, isSuccess } = useGetAssetsDataQuery({
13
- cursor,
26
+ const { data, isLoading, error, fetchNextPage, isSuccess } = useGetAssetsDataInfiniteQuery({
14
27
  search,
15
28
  currencyIds,
16
29
  });
17
30
 
18
- const loadNext = useCallback(() => {
19
- const nextCursor = data?.pagination?.nextCursor;
20
- if (nextCursor) {
21
- setCursor(nextCursor);
22
- }
23
- }, [data?.pagination?.nextCursor]);
31
+ const joinedPages = useMemo(() => {
32
+ return data?.pages.reduce<AssetsDataWithPagination>((acc, page) => {
33
+ Object.assign(acc.cryptoAssets, page.cryptoAssets);
34
+ Object.assign(acc.networks, page.networks);
35
+ Object.assign(acc.cryptoOrTokenCurrencies, page.cryptoOrTokenCurrencies);
36
+ Object.assign(acc.interestRates, page.interestRates);
37
+ Object.assign(acc.markets, page.markets);
38
+
39
+ acc.currenciesOrder.currenciesIds.push(...page.currenciesOrder.currenciesIds);
40
+ acc.currenciesOrder.metaCurrencyIds.push(...page.currenciesOrder.metaCurrencyIds);
41
+
42
+ acc.currenciesOrder.key = page.currenciesOrder.key;
43
+ acc.currenciesOrder.order = page.currenciesOrder.order;
44
+ acc.pagination.nextCursor = page.pagination.nextCursor;
24
45
 
25
- const hasMore = Boolean(data?.pagination?.nextCursor);
46
+ return acc;
47
+ }, emptyData());
48
+ }, [data]);
49
+
50
+ const hasMore = Boolean(joinedPages?.pagination.nextCursor);
26
51
 
27
52
  return {
28
- data,
29
- error,
53
+ data: joinedPages,
30
54
  isLoading,
55
+ error,
56
+ loadNext: hasMore ? fetchNextPage : undefined,
31
57
  isSuccess,
32
- hasMore,
33
- cursor,
34
- loadNext,
35
58
  };
36
59
  }
@@ -0,0 +1,24 @@
1
+ import { LoadingStatus } from "../../deposit/type";
2
+ import { SerializedError } from "@reduxjs/toolkit";
3
+ import { FetchBaseQueryError } from "@reduxjs/toolkit/query";
4
+
5
+ export const getLoadingStatus = ({
6
+ isLoading,
7
+ isSuccess,
8
+ error,
9
+ }: {
10
+ isLoading: boolean;
11
+ isSuccess: boolean;
12
+ error?: FetchBaseQueryError | SerializedError;
13
+ }): LoadingStatus => {
14
+ if (isLoading) {
15
+ return LoadingStatus.Pending;
16
+ }
17
+ if (error) {
18
+ return LoadingStatus.Error;
19
+ }
20
+ if (isSuccess) {
21
+ return LoadingStatus.Success;
22
+ }
23
+ return LoadingStatus.Idle;
24
+ };