@ledgerhq/live-common 21.26.2 → 21.29.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 (236) hide show
  1. package/lib/__tests__/currencies.js +1 -1
  2. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.synced.unit.test.js +27 -26
  3. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.synced.unit.test.js.map +1 -1
  4. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.js +9 -7
  5. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.js.map +1 -1
  6. package/lib/apps/support.d.ts.map +1 -1
  7. package/lib/apps/support.js +2 -1
  8. package/lib/apps/support.js.map +1 -1
  9. package/lib/bridge/jsHelpers.js +1 -1
  10. package/lib/bridge/jsHelpers.js.map +1 -1
  11. package/lib/data/icons/react/index.d.ts +1 -0
  12. package/lib/data/icons/react/index.d.ts.map +1 -1
  13. package/lib/data/icons/react/index.js +4 -2
  14. package/lib/data/icons/react/index.js.map +1 -1
  15. package/lib/data/icons/react/sol.js +3 -3
  16. package/lib/data/icons/react/sol.js.map +1 -1
  17. package/lib/data/icons/react/tyc.d.ts +8 -0
  18. package/lib/data/icons/react/tyc.d.ts.map +1 -0
  19. package/lib/data/icons/react/tyc.js +33 -0
  20. package/lib/data/icons/react/tyc.js.map +1 -0
  21. package/lib/data/icons/reactNative/index.d.ts +1 -0
  22. package/lib/data/icons/reactNative/index.d.ts.map +1 -1
  23. package/lib/data/icons/reactNative/index.js +4 -2
  24. package/lib/data/icons/reactNative/index.js.map +1 -1
  25. package/lib/data/icons/reactNative/sol.js +3 -3
  26. package/lib/data/icons/reactNative/sol.js.map +1 -1
  27. package/lib/data/icons/reactNative/tyc.d.ts +8 -0
  28. package/lib/data/icons/reactNative/tyc.d.ts.map +1 -0
  29. package/lib/data/icons/reactNative/tyc.js +34 -0
  30. package/lib/data/icons/reactNative/tyc.js.map +1 -0
  31. package/lib/env.d.ts +15 -6
  32. package/lib/env.d.ts.map +1 -1
  33. package/lib/env.js +11 -2
  34. package/lib/env.js.map +1 -1
  35. package/lib/env.react.d.ts +1 -1
  36. package/lib/env.react.d.ts.map +1 -1
  37. package/lib/exchange/hw-app-exchange/Exchange.d.ts +12 -15
  38. package/lib/exchange/hw-app-exchange/Exchange.d.ts.map +1 -1
  39. package/lib/exchange/hw-app-exchange/Exchange.js +4 -13
  40. package/lib/exchange/hw-app-exchange/Exchange.js.map +1 -1
  41. package/lib/exchange/index.d.ts.map +1 -1
  42. package/lib/exchange/index.js +9 -2
  43. package/lib/exchange/index.js.map +1 -1
  44. package/lib/exchange/platform/completeExchange.d.ts +6 -0
  45. package/lib/exchange/platform/completeExchange.d.ts.map +1 -0
  46. package/lib/exchange/platform/completeExchange.js +24 -0
  47. package/lib/exchange/platform/completeExchange.js.map +1 -0
  48. package/lib/exchange/platform/serialization.d.ts +4 -0
  49. package/lib/exchange/platform/serialization.d.ts.map +1 -0
  50. package/lib/exchange/platform/serialization.js +57 -0
  51. package/lib/exchange/platform/serialization.js.map +1 -0
  52. package/lib/exchange/{swap → platform}/startExchange.d.ts +0 -0
  53. package/lib/exchange/platform/startExchange.d.ts.map +1 -0
  54. package/lib/exchange/{swap → platform}/startExchange.js +3 -3
  55. package/lib/exchange/platform/startExchange.js.map +1 -0
  56. package/lib/exchange/platform/transfer/completeExchange.d.ts +5 -0
  57. package/lib/exchange/platform/transfer/completeExchange.d.ts.map +1 -0
  58. package/lib/exchange/platform/transfer/completeExchange.js +198 -0
  59. package/lib/exchange/platform/transfer/completeExchange.js.map +1 -0
  60. package/lib/exchange/platform/transfer/index.d.ts +5 -0
  61. package/lib/exchange/platform/transfer/index.d.ts.map +1 -0
  62. package/lib/exchange/platform/transfer/index.js +49 -0
  63. package/lib/exchange/platform/transfer/index.js.map +1 -0
  64. package/lib/exchange/platform/types.d.ts +59 -0
  65. package/lib/exchange/platform/types.d.ts.map +1 -0
  66. package/lib/exchange/platform/types.js +3 -0
  67. package/lib/exchange/platform/types.js.map +1 -0
  68. package/lib/exchange/sell/checkSignatureAndPrepare.js +1 -2
  69. package/lib/exchange/sell/checkSignatureAndPrepare.js.map +1 -1
  70. package/lib/exchange/sell/getTransactionId.js +1 -2
  71. package/lib/exchange/sell/getTransactionId.js.map +1 -1
  72. package/lib/exchange/sell/index.d.ts +6 -0
  73. package/lib/exchange/sell/index.d.ts.map +1 -1
  74. package/lib/exchange/sell/index.js +3 -3
  75. package/lib/exchange/sell/index.js.map +1 -1
  76. package/lib/exchange/swap/completeExchange.d.ts +2 -13
  77. package/lib/exchange/swap/completeExchange.d.ts.map +1 -1
  78. package/lib/exchange/swap/completeExchange.js +2 -4
  79. package/lib/exchange/swap/completeExchange.js.map +1 -1
  80. package/lib/exchange/swap/hooks/usePickDefaultAccount.d.ts.map +1 -1
  81. package/lib/exchange/swap/hooks/usePickDefaultAccount.js +4 -9
  82. package/lib/exchange/swap/hooks/usePickDefaultAccount.js.map +1 -1
  83. package/lib/exchange/swap/initSwap.d.ts.map +1 -1
  84. package/lib/exchange/swap/initSwap.js +3 -4
  85. package/lib/exchange/swap/initSwap.js.map +1 -1
  86. package/lib/exchange/swap/types.d.ts +0 -12
  87. package/lib/exchange/swap/types.d.ts.map +1 -1
  88. package/lib/exchange/swap/utils/index.d.ts +6 -1
  89. package/lib/exchange/swap/utils/index.d.ts.map +1 -1
  90. package/lib/exchange/swap/utils/index.js +8 -1
  91. package/lib/exchange/swap/utils/index.js.map +1 -1
  92. package/lib/exchange/swap/utils/index.test.js +27 -0
  93. package/lib/exchange/swap/utils/index.test.js.map +1 -1
  94. package/lib/exchange/testCurrencyConfig/data/coins.d.ts +8 -0
  95. package/lib/exchange/testCurrencyConfig/data/coins.d.ts.map +1 -0
  96. package/lib/exchange/testCurrencyConfig/data/coins.js +21 -0
  97. package/lib/exchange/testCurrencyConfig/data/coins.js.map +1 -0
  98. package/lib/exchange/testCurrencyConfig/index.d.ts +8 -0
  99. package/lib/exchange/testCurrencyConfig/index.d.ts.map +1 -0
  100. package/lib/exchange/testCurrencyConfig/index.js +68 -0
  101. package/lib/exchange/testCurrencyConfig/index.js.map +1 -0
  102. package/lib/families/algorand/api/algodv2.d.ts +2 -1
  103. package/lib/families/algorand/api/algodv2.d.ts.map +1 -1
  104. package/lib/families/algorand/api/algodv2.js +2 -2
  105. package/lib/families/algorand/api/algodv2.js.map +1 -1
  106. package/lib/families/algorand/js-broadcast.js +1 -1
  107. package/lib/families/algorand/js-broadcast.js.map +1 -1
  108. package/lib/families/algorand/js-signOperation.d.ts.map +1 -1
  109. package/lib/families/algorand/js-signOperation.js +1 -1
  110. package/lib/families/algorand/js-signOperation.js.map +1 -1
  111. package/lib/families/bitcoin/wallet-btc/wallet.d.ts.map +1 -1
  112. package/lib/families/bitcoin/wallet-btc/wallet.js +8 -2
  113. package/lib/families/bitcoin/wallet-btc/wallet.js.map +1 -1
  114. package/lib/families/bitcoin/wallet-btc/xpub.js +1 -1
  115. package/lib/families/bitcoin/wallet-btc/xpub.js.map +1 -1
  116. package/lib/families/ethereum/datasets/ethereum.scanAccounts.1.js +1 -1
  117. package/lib/families/ethereum/datasets/ethereum.scanAccounts.1.js.map +1 -1
  118. package/lib/families/ethereum/nft.integration.test.js +1 -36
  119. package/lib/families/ethereum/nft.integration.test.js.map +1 -1
  120. package/lib/families/ethereum/specs.d.ts.map +1 -1
  121. package/lib/families/ethereum/specs.js +2 -0
  122. package/lib/families/ethereum/specs.js.map +1 -1
  123. package/lib/families/ethereum/synchronisation.d.ts.map +1 -1
  124. package/lib/families/ethereum/synchronisation.js +2 -7
  125. package/lib/families/ethereum/synchronisation.js.map +1 -1
  126. package/lib/families/solana/api/chain/index.d.ts.map +1 -1
  127. package/lib/families/solana/api/chain/index.js +3 -1
  128. package/lib/families/solana/api/chain/index.js.map +1 -1
  129. package/lib/families/tezos/datasets/tezos.scanAccounts.1.js +1 -1
  130. package/lib/families/tezos/datasets/tezos.scanAccounts.1.js.map +1 -1
  131. package/lib/hw/actions/app.d.ts +3 -0
  132. package/lib/hw/actions/app.d.ts.map +1 -1
  133. package/lib/hw/actions/app.js +7 -1
  134. package/lib/hw/actions/app.js.map +1 -1
  135. package/lib/hw/actions/completeExchange.d.ts +1 -0
  136. package/lib/hw/actions/completeExchange.d.ts.map +1 -1
  137. package/lib/hw/actions/completeExchange.js +4 -3
  138. package/lib/hw/actions/completeExchange.js.map +1 -1
  139. package/lib/hw/connectApp.d.ts +5 -0
  140. package/lib/hw/connectApp.d.ts.map +1 -1
  141. package/lib/hw/connectApp.js +37 -26
  142. package/lib/hw/connectApp.js.map +1 -1
  143. package/lib/market/MarketDataProvider.d.ts +26 -0
  144. package/lib/market/MarketDataProvider.d.ts.map +1 -0
  145. package/lib/market/MarketDataProvider.js +339 -0
  146. package/lib/market/MarketDataProvider.js.map +1 -0
  147. package/lib/market/api/api.d.ts +15 -0
  148. package/lib/market/api/api.d.ts.map +1 -0
  149. package/lib/market/api/api.js +261 -0
  150. package/lib/market/api/api.js.map +1 -0
  151. package/lib/market/api/api.mock.d.ts +15 -0
  152. package/lib/market/api/api.mock.d.ts.map +1 -0
  153. package/lib/market/api/api.mock.js +454 -0
  154. package/lib/market/api/api.mock.js.map +1 -0
  155. package/lib/market/types.d.ts +83 -0
  156. package/lib/market/types.d.ts.map +1 -0
  157. package/lib/market/types.js +3 -0
  158. package/lib/market/types.js.map +1 -0
  159. package/lib/market/utils/countervalueFormatter.d.ts +8 -0
  160. package/lib/market/utils/countervalueFormatter.d.ts.map +1 -0
  161. package/lib/market/utils/countervalueFormatter.js +18 -0
  162. package/lib/market/utils/countervalueFormatter.js.map +1 -0
  163. package/lib/market/utils/rangeDataTable.d.ts +10 -0
  164. package/lib/market/utils/rangeDataTable.d.ts.map +1 -0
  165. package/lib/market/utils/rangeDataTable.js +36 -0
  166. package/lib/market/utils/rangeDataTable.js.map +1 -0
  167. package/lib/nft/support.d.ts.map +1 -1
  168. package/lib/nft/support.js +1 -1
  169. package/lib/nft/support.js.map +1 -1
  170. package/lib/platform/PlatformAppProvider/api/api.mock.d.ts.map +1 -1
  171. package/lib/platform/PlatformAppProvider/api/api.mock.js +27 -0
  172. package/lib/platform/PlatformAppProvider/api/api.mock.js.map +1 -1
  173. package/package.json +17 -17
  174. package/src/__tests__/__snapshots__/all.libcore.ts.snap +221 -212
  175. package/src/__tests__/currencies.ts +1 -1
  176. package/src/__tests__/families/bitcoin/wallet-btc/xpub.synced.unit.test.ts +26 -25
  177. package/src/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.ts +2 -0
  178. package/src/apps/support.ts +1 -0
  179. package/src/bridge/jsHelpers.ts +1 -1
  180. package/src/data/icons/react/index.tsx +1 -0
  181. package/src/data/icons/react/sol.tsx +1 -1
  182. package/src/data/icons/react/tyc.tsx +12 -0
  183. package/src/data/icons/reactNative/index.tsx +1 -0
  184. package/src/data/icons/reactNative/sol.tsx +1 -1
  185. package/src/data/icons/reactNative/tyc.tsx +13 -0
  186. package/src/data/icons/svg/SOL.svg +8 -1
  187. package/src/data/icons/svg/TYC.svg +6 -0
  188. package/src/env.ts +11 -2
  189. package/src/exchange/hw-app-exchange/Exchange.ts +22 -18
  190. package/src/exchange/index.ts +19 -1
  191. package/src/exchange/platform/completeExchange.ts +42 -0
  192. package/src/exchange/platform/serialization.ts +78 -0
  193. package/src/exchange/{swap → platform}/startExchange.ts +6 -2
  194. package/src/exchange/platform/transfer/completeExchange.ts +187 -0
  195. package/src/exchange/platform/transfer/index.ts +66 -0
  196. package/src/exchange/platform/types.ts +76 -0
  197. package/src/exchange/sell/checkSignatureAndPrepare.ts +2 -2
  198. package/src/exchange/sell/getTransactionId.ts +2 -2
  199. package/src/exchange/sell/index.ts +1 -1
  200. package/src/exchange/swap/completeExchange.ts +41 -50
  201. package/src/exchange/swap/hooks/usePickDefaultAccount.ts +4 -9
  202. package/src/exchange/swap/initSwap.ts +4 -7
  203. package/src/exchange/swap/types.ts +1 -14
  204. package/src/exchange/swap/utils/index.test.ts +44 -1
  205. package/src/exchange/swap/utils/index.ts +12 -1
  206. package/src/exchange/testCurrencyConfig/data/coins.ts +20 -0
  207. package/src/exchange/testCurrencyConfig/index.ts +24 -0
  208. package/src/families/algorand/api/algodv2.ts +2 -2
  209. package/src/families/algorand/js-broadcast.ts +1 -1
  210. package/src/families/algorand/js-signOperation.ts +8 -3
  211. package/src/families/bitcoin/wallet-btc/wallet.ts +6 -2
  212. package/src/families/bitcoin/wallet-btc/xpub.ts +1 -1
  213. package/src/families/ethereum/datasets/ethereum.scanAccounts.1.ts +43 -43
  214. package/src/families/ethereum/nft.integration.test.ts +1 -18
  215. package/src/families/ethereum/specs.ts +2 -0
  216. package/src/families/ethereum/synchronisation.ts +1 -6
  217. package/src/families/solana/api/chain/index.ts +6 -2
  218. package/src/families/tezos/datasets/tezos.scanAccounts.1.ts +39 -39
  219. package/src/hw/actions/app.ts +17 -1
  220. package/src/hw/actions/completeExchange.ts +9 -3
  221. package/src/hw/connectApp.ts +53 -31
  222. package/src/market/MarketDataProvider.tsx +440 -0
  223. package/src/market/api/api.mock.ts +374 -0
  224. package/src/market/api/api.ts +227 -0
  225. package/src/market/types.ts +92 -0
  226. package/src/market/utils/countervalueFormatter.ts +24 -0
  227. package/src/market/utils/rangeDataTable.ts +40 -0
  228. package/src/nft/support.ts +1 -3
  229. package/src/platform/PlatformAppProvider/api/api.mock.ts +27 -0
  230. package/lib/exchange/swap/startExchange.d.ts.map +0 -1
  231. package/lib/exchange/swap/startExchange.js.map +0 -1
  232. package/lib/families/ethereum/versions.d.ts +0 -2
  233. package/lib/families/ethereum/versions.d.ts.map +0 -1
  234. package/lib/families/ethereum/versions.js +0 -5
  235. package/lib/families/ethereum/versions.js.map +0 -1
  236. package/src/families/ethereum/versions.ts +0 -1
@@ -0,0 +1,440 @@
1
+ /* eslint-disable @typescript-eslint/no-empty-function */
2
+ // @flow
3
+ import React, {
4
+ createContext,
5
+ useCallback,
6
+ useContext,
7
+ ReactElement,
8
+ useReducer,
9
+ useEffect,
10
+ useState,
11
+ } from "react";
12
+
13
+ import { useDebounce } from "../hooks/useDebounce";
14
+ import { Currency } from "../types";
15
+ import {
16
+ State,
17
+ MarketDataApi,
18
+ MarketListRequestParams,
19
+ MarketCurrencyChartDataRequestParams,
20
+ CurrencyData,
21
+ SingleCoinState,
22
+ } from "./types";
23
+ import defaultFetchApi from "./api/api";
24
+
25
+ type Props = {
26
+ children: React.ReactNode;
27
+ fetchApi?: MarketDataApi;
28
+ countervalue?: Currency;
29
+ initState?: Partial<State>;
30
+ };
31
+ type API = {
32
+ refresh: (param?: MarketListRequestParams) => void;
33
+ refreshChart: (param?: MarketCurrencyChartDataRequestParams) => void;
34
+ selectCurrency: (key: string) => void;
35
+ loadNextPage: () => Promise<boolean>;
36
+ setCounterCurrency: (counterCurrency: string) => void;
37
+ };
38
+
39
+ export type MarketDataContextType = State & API;
40
+
41
+ const initialState: State = {
42
+ ready: false,
43
+ marketData: [],
44
+ selectedCurrency: undefined,
45
+ requestParams: {
46
+ range: "24h",
47
+ limit: 50,
48
+ ids: [],
49
+ starred: [],
50
+ orderBy: "market_cap",
51
+ order: "desc",
52
+ search: "",
53
+ liveCompatible: false,
54
+ },
55
+ page: 1,
56
+ chartRequestParams: {
57
+ range: "24h",
58
+ },
59
+ loading: false,
60
+ loadingChart: false,
61
+ endOfList: false,
62
+ error: undefined,
63
+ totalCoinsAvailable: 0,
64
+ supportedCounterCurrencies: [],
65
+ selectedCoinData: undefined,
66
+ counterCurrency: undefined,
67
+ };
68
+
69
+ const MarketDataContext = createContext<MarketDataContextType>({
70
+ ...initialState,
71
+ refresh: () => {},
72
+ refreshChart: () => {},
73
+ selectCurrency: () => {},
74
+ loadNextPage: () => Promise.resolve(true),
75
+ setCounterCurrency: () => {},
76
+ });
77
+
78
+ const ACTIONS = {
79
+ IS_READY: "IS_READY",
80
+
81
+ UPDATE_MARKET_DATA: "UPDATE_MARKET_DATA",
82
+ UPDATE_SINGLE_MARKET_DATA: "UPDATE_SINGLE_MARKET_DATA",
83
+ UPDATE_SINGLE_CHART_DATA: "UPDATE_SINGLE_CHART_DATA",
84
+
85
+ REFRESH_MARKET_DATA: "REFRESH_MARKET_DATA",
86
+ REFRESH_CHART_DATA: "REFRESH_CHART_DATA",
87
+
88
+ SET_LOADING: "SET_LOADING",
89
+ SET_LOADING_CHART: "SET_LOADING_CHART",
90
+ SET_ERROR: "SET_ERROR",
91
+
92
+ SELECT_CURRENCY: "SELECT_CURRENCY",
93
+ UPDATE_COUNTERVALUE: "UPDATE_COUNTERVALUE",
94
+ };
95
+
96
+ function marketDataReducer(state, action) {
97
+ switch (action.type) {
98
+ case ACTIONS.IS_READY:
99
+ return { ...state, ...action.payload, isReady: true };
100
+ case ACTIONS.UPDATE_MARKET_DATA: {
101
+ const newData = action.payload.marketData;
102
+ const page = action.payload.page || state.requestParams.page;
103
+ const marketData = [...state.marketData.map((data) => ({ ...data }))];
104
+ if (!newData.length || marketData.some(({ id }) => id === newData[0].id))
105
+ return { ...state, loading: false };
106
+
107
+ return {
108
+ ...state,
109
+ marketData: marketData.concat(newData),
110
+ endOfList: newData.length < state.requestParams.limit,
111
+ loading: false,
112
+ page,
113
+ };
114
+ }
115
+ case ACTIONS.UPDATE_SINGLE_MARKET_DATA: {
116
+ const marketData = [...state.marketData.map((data) => ({ ...data }))];
117
+ const index = marketData.findIndex(({ id }) => id === action.payload.id);
118
+ if (index >= 0) {
119
+ marketData[index] = { ...marketData[index], ...action.payload };
120
+ }
121
+ return { ...state, marketData, loading: false };
122
+ }
123
+ case ACTIONS.UPDATE_SINGLE_CHART_DATA: {
124
+ const marketData = [...state.marketData.map((data) => ({ ...data }))];
125
+ const index = marketData.findIndex(({ id }) => id === action.payload.id);
126
+ if (index >= 0) {
127
+ marketData[index].chartData = {
128
+ ...marketData[index].chartData,
129
+ ...action.payload.chartData,
130
+ };
131
+ }
132
+ return { ...state, marketData, loading: false };
133
+ }
134
+
135
+ case ACTIONS.REFRESH_MARKET_DATA: {
136
+ const requestParams = {
137
+ ...state.requestParams,
138
+ ...action.payload,
139
+ lastRequestTime: Date.now(),
140
+ };
141
+ return {
142
+ ...state,
143
+ marketData: [],
144
+ requestParams,
145
+ loading: true,
146
+ page: 1,
147
+ };
148
+ }
149
+ case ACTIONS.REFRESH_CHART_DATA: {
150
+ const chartRequestParams = {
151
+ ...state.chartRequestParams,
152
+ ...action.payload,
153
+ loadingChart: true,
154
+ lastRequestTime: Date.now(),
155
+ };
156
+ return { ...state, chartRequestParams };
157
+ }
158
+
159
+ case ACTIONS.UPDATE_COUNTERVALUE: {
160
+ const requestParams = {
161
+ ...state.requestParams,
162
+ lastRequestTime: Date.now(),
163
+ page: 1,
164
+ counterCurrency: action.payload,
165
+ };
166
+ const chartRequestParams = {
167
+ ...state.chartRequestParams,
168
+ lastRequestTime: Date.now(),
169
+ counterCurrency: action.payload,
170
+ };
171
+ return {
172
+ ...state,
173
+ counterCurrency: action.payload,
174
+ marketData: [],
175
+ requestParams,
176
+ chartRequestParams,
177
+ loading: true,
178
+ };
179
+ }
180
+
181
+ case ACTIONS.SET_LOADING:
182
+ return { ...state, loading: action.payload };
183
+ case ACTIONS.SET_LOADING_CHART:
184
+ return { ...state, loadingChart: action.payload };
185
+ case ACTIONS.SET_ERROR:
186
+ return { ...state, error: action.payload, loading: false };
187
+ case ACTIONS.SELECT_CURRENCY:
188
+ return {
189
+ ...state,
190
+ selectedCurrency: action.payload,
191
+ loading: !!action.payload,
192
+ };
193
+ default:
194
+ return state;
195
+ }
196
+ }
197
+
198
+ export const MarketDataProvider = ({
199
+ children,
200
+ fetchApi,
201
+ countervalue,
202
+ initState = {},
203
+ }: Props): ReactElement => {
204
+ const [state, dispatch] = useReducer(marketDataReducer, {
205
+ ...initialState,
206
+ ...initState,
207
+ });
208
+ const api = fetchApi || defaultFetchApi;
209
+ const {
210
+ marketData,
211
+ requestParams,
212
+ chartRequestParams,
213
+ loading,
214
+ loadingChart,
215
+ page,
216
+ } = useDebounce(state, 300);
217
+
218
+ const handleError = useCallback((payload) => {
219
+ dispatch({ type: ACTIONS.SET_ERROR, payload });
220
+ }, []);
221
+
222
+ useEffect(() => {
223
+ if (countervalue)
224
+ api.supportedCounterCurrencies().then(
225
+ (supportedCounterCurrencies) =>
226
+ api.setSupportedCoinsList().then((coins) => {
227
+ dispatch({
228
+ type: ACTIONS.IS_READY,
229
+ payload: {
230
+ totalCoinsAvailable: coins.length,
231
+ supportedCounterCurrencies,
232
+ },
233
+ });
234
+ dispatch({
235
+ type: ACTIONS.UPDATE_COUNTERVALUE,
236
+ payload: supportedCounterCurrencies.includes(countervalue.ticker)
237
+ ? countervalue.ticker
238
+ : "usd",
239
+ });
240
+ }, handleError),
241
+ handleError
242
+ );
243
+ }, [api, countervalue, handleError]);
244
+
245
+ useEffect(() => {
246
+ if (
247
+ chartRequestParams?.id &&
248
+ chartRequestParams?.counterCurrency &&
249
+ !loadingChart
250
+ ) {
251
+ const currentMarketData = marketData.find(
252
+ ({ id }: CurrencyData) => id === chartRequestParams.id
253
+ );
254
+ const range = chartRequestParams.range;
255
+
256
+ if (currentMarketData && !currentMarketData?.chartData?.[range]) {
257
+ api.currencyChartData(chartRequestParams).then(
258
+ (chartData) =>
259
+ dispatch({
260
+ type: ACTIONS.UPDATE_SINGLE_CHART_DATA,
261
+ payload: { id: chartRequestParams.id, chartData },
262
+ }),
263
+ handleError
264
+ );
265
+ } else
266
+ dispatch({
267
+ type: ACTIONS.SET_LOADING_CHART,
268
+ payload: false,
269
+ });
270
+ }
271
+ }, [chartRequestParams, marketData, loadingChart, api, handleError]);
272
+
273
+ useEffect(() => {
274
+ if (
275
+ chartRequestParams?.id &&
276
+ chartRequestParams?.counterCurrency &&
277
+ !loading
278
+ ) {
279
+ dispatch({ type: ACTIONS.SET_LOADING, payload: true });
280
+ api
281
+ .listPaginated({
282
+ ...chartRequestParams,
283
+ search: "",
284
+ starred: [],
285
+ liveCompatible: false,
286
+ ids: [chartRequestParams.id],
287
+ limit: 1,
288
+ page: 1,
289
+ })
290
+ .then(
291
+ ([{ chartData: _, ...marketData }]) =>
292
+ dispatch({
293
+ type: ACTIONS.UPDATE_SINGLE_MARKET_DATA,
294
+ payload: marketData,
295
+ }),
296
+ handleError
297
+ );
298
+ }
299
+ }, [api, chartRequestParams, handleError, loading]);
300
+
301
+ useEffect(() => {
302
+ if (requestParams?.counterCurrency) {
303
+ api.listPaginated(requestParams).then(
304
+ (marketData) =>
305
+ dispatch({
306
+ type: ACTIONS.UPDATE_MARKET_DATA,
307
+ payload: { marketData },
308
+ }),
309
+ handleError
310
+ );
311
+ }
312
+ }, [api, handleError, requestParams]);
313
+
314
+ const refresh = useCallback((payload = {}) => {
315
+ dispatch({ type: ACTIONS.REFRESH_MARKET_DATA, payload });
316
+ }, []);
317
+
318
+ const refreshChart = useCallback((payload = {}) => {
319
+ dispatch({ type: ACTIONS.REFRESH_CHART_DATA, payload });
320
+ }, []);
321
+
322
+ const selectCurrency = useCallback((id) => {
323
+ dispatch({
324
+ type: ACTIONS.REFRESH_CHART_DATA,
325
+ payload: {
326
+ id,
327
+ },
328
+ });
329
+ }, []);
330
+
331
+ const loadNextPage = useCallback(() => {
332
+ return new Promise((resolve, reject) => {
333
+ if (loading) {
334
+ reject(new Error());
335
+ } else {
336
+ const newPage = page + 1;
337
+ api.listPaginated({ ...requestParams, page: newPage }).then(
338
+ (marketData) => {
339
+ dispatch({
340
+ type: ACTIONS.UPDATE_MARKET_DATA,
341
+ payload: { marketData, page: newPage },
342
+ });
343
+ resolve(true);
344
+ },
345
+ (err) => {
346
+ handleError(err);
347
+ reject(new Error(err));
348
+ }
349
+ );
350
+ }
351
+ });
352
+ }, [loading, page, api, requestParams, handleError]);
353
+
354
+ const setCounterCurrency = useCallback(
355
+ (payload) => dispatch({ type: ACTIONS.UPDATE_COUNTERVALUE, payload }),
356
+ [dispatch]
357
+ );
358
+
359
+ const value = {
360
+ ...state,
361
+ refresh,
362
+ refreshChart,
363
+ selectCurrency,
364
+ loadNextPage,
365
+ setCounterCurrency,
366
+ };
367
+
368
+ return (
369
+ <MarketDataContext.Provider value={value}>
370
+ {children}
371
+ </MarketDataContext.Provider>
372
+ );
373
+ };
374
+
375
+ export function useMarketData(): MarketDataContextType {
376
+ return useContext(MarketDataContext);
377
+ }
378
+
379
+ type SingleCoinProviderData = SingleCoinState & {
380
+ refreshChart: (param?: MarketCurrencyChartDataRequestParams) => void;
381
+ setCounterCurrency: (counterCurrency: string) => void;
382
+ };
383
+
384
+ export function useSingleCoinMarketData(
385
+ currencyId: string
386
+ ): SingleCoinProviderData {
387
+ const {
388
+ marketData,
389
+ selectedCurrency,
390
+ chartRequestParams,
391
+ loading,
392
+ loadingChart,
393
+ error,
394
+ counterCurrency,
395
+ refreshChart,
396
+ setCounterCurrency,
397
+ supportedCounterCurrencies,
398
+ } = useContext(MarketDataContext);
399
+
400
+ const [state, setState] = useState<SingleCoinProviderData>({
401
+ selectedCoinData: undefined,
402
+ selectedCurrency,
403
+ chartRequestParams,
404
+ loading,
405
+ loadingChart,
406
+ error,
407
+ counterCurrency,
408
+ refreshChart,
409
+ setCounterCurrency,
410
+ supportedCounterCurrencies,
411
+ });
412
+
413
+ useEffect(() => {
414
+ if (marketData)
415
+ setState((s) => ({
416
+ ...s,
417
+ selectedCoinData:
418
+ marketData.find(({ id }) => id === currencyId) || s.selectedCoinData,
419
+ selectedCurrency,
420
+ chartRequestParams,
421
+ loading,
422
+ loadingChart,
423
+ error,
424
+ counterCurrency,
425
+ supportedCounterCurrencies,
426
+ }));
427
+ }, [
428
+ marketData,
429
+ currencyId,
430
+ selectedCurrency,
431
+ chartRequestParams,
432
+ loading,
433
+ loadingChart,
434
+ error,
435
+ counterCurrency,
436
+ supportedCounterCurrencies,
437
+ ]);
438
+
439
+ return state;
440
+ }