@hyperix/hooks 0.2.7 → 0.2.8

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.
@@ -27,13 +27,14 @@ export type InfiniteTradeHistoryPageParam = {
27
27
  startTime: number;
28
28
  endTime: number;
29
29
  };
30
- export type UseInfiniteTradeHistoryOptions = Omit<UseInfiniteQueryOptions<TradeHistoryPage, Error, InfiniteTradeHistoryData, [
30
+ type InfiniteTradeHistoryQueryKey = [
31
31
  "infinite-trade-history",
32
32
  `0x${string}`,
33
33
  boolean,
34
34
  number,
35
35
  number | undefined
36
- ], InfiniteTradeHistoryPageParam>, "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam" | "select"> & {
36
+ ];
37
+ export type UseInfiniteTradeHistoryOptions = Omit<UseInfiniteQueryOptions<TradeHistoryPage, Error, InfiniteTradeHistoryData, InfiniteTradeHistoryQueryKey, InfiniteTradeHistoryPageParam>, "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam" | "select"> & {
37
38
  aggregateByTime?: boolean;
38
39
  endTime?: number;
39
40
  pageDurationMs?: number;
@@ -46,3 +47,4 @@ export declare function useTradeHistory(user: `0x${string}`, options?: UseUserFi
46
47
  error?: string;
47
48
  };
48
49
  export declare function useInfiniteTradeHistory(user: `0x${string}`, options?: UseInfiniteTradeHistoryOptions): UseInfiniteQueryResult<InfiniteTradeHistoryData, Error>;
50
+ export {};
@@ -1,4 +1,4 @@
1
- import { useInfiniteQuery, } from "@tanstack/react-query";
1
+ import { useInfiniteQuery, useQueryClient, } from "@tanstack/react-query";
2
2
  import Decimal from "decimal.js";
3
3
  import { useMemo } from "react";
4
4
  import { infoClient } from "./config/hl.js";
@@ -63,6 +63,16 @@ function mergeTradeHistoryFills(pages, realtimeFills) {
63
63
  }
64
64
  return sortTradeHistory([...fillsByKey.values()]);
65
65
  }
66
+ function getLatestPageFromFills(user, fills, fallbackEndTime, pageDurationMs) {
67
+ const endTime = fills[0]?.time ?? fallbackEndTime;
68
+ const startTime = Math.max(0, endTime - pageDurationMs);
69
+ return {
70
+ user,
71
+ startTime,
72
+ endTime,
73
+ fills: fills.filter((fill) => fill.time >= startTime && fill.time <= endTime),
74
+ };
75
+ }
66
76
  export function useTradeHistory(user, options = {}) {
67
77
  const userFillsState = useUserFills(user, options);
68
78
  const symbolConverter = useSymbolConverter();
@@ -83,21 +93,52 @@ export function useTradeHistory(user, options = {}) {
83
93
  };
84
94
  }
85
95
  export function useInfiniteTradeHistory(user, options = {}) {
86
- const { aggregateByTime = true, enabled: enabledOverride, endTime, pageDurationMs = DEFAULT_TRADE_HISTORY_PAGE_DURATION_MS, realtime = true, ...queryOptions } = options;
96
+ const { aggregateByTime = true, enabled: enabledOverride, endTime, pageDurationMs = DEFAULT_TRADE_HISTORY_PAGE_DURATION_MS, realtime = false, ...queryOptions } = options;
87
97
  const enabled = enabledOverride ?? Boolean(user);
88
98
  const symbolConverter = useSymbolConverter();
89
- const realtimeState = useTradeHistory(user, {
99
+ const queryClient = useQueryClient();
100
+ const queryKey = [
101
+ "infinite-trade-history",
102
+ user,
103
+ aggregateByTime,
104
+ pageDurationMs,
105
+ endTime,
106
+ ];
107
+ const selectTradeHistoryData = useMemo(() => (data) => ({
108
+ pages: data.pages,
109
+ user,
110
+ fills: mergeTradeHistoryFills(data.pages, []),
111
+ }), [user]);
112
+ useUserFills(user, {
90
113
  aggregateByTime,
91
114
  enabled: enabled && realtime,
115
+ onUpdate: (event) => {
116
+ const realtimeFills = sortTradeHistory(event.fills.map((fill) => formatTradeHistoryFill(fill, symbolConverter?.getSpotByPairId(fill.coin))));
117
+ if (realtimeFills.length === 0) {
118
+ return;
119
+ }
120
+ queryClient.setQueryData(queryKey, (previousData) => {
121
+ const [latestPage, ...olderPages] = previousData?.pages ?? [];
122
+ if (!previousData || !latestPage) {
123
+ return previousData;
124
+ }
125
+ const fills = mergeTradeHistoryFills([latestPage], realtimeFills);
126
+ return {
127
+ ...previousData,
128
+ pages: [
129
+ {
130
+ ...latestPage,
131
+ endTime: Math.max(latestPage.endTime, fills[0]?.time ?? 0),
132
+ fills,
133
+ },
134
+ ...olderPages,
135
+ ],
136
+ };
137
+ });
138
+ },
92
139
  });
93
140
  return useInfiniteQuery({
94
- queryKey: [
95
- "infinite-trade-history",
96
- user,
97
- aggregateByTime,
98
- pageDurationMs,
99
- endTime,
100
- ],
141
+ queryKey,
101
142
  queryFn: async ({ pageParam }) => {
102
143
  const rawFills = pageParam.latest
103
144
  ? await infoClient.userFills({
@@ -111,12 +152,13 @@ export function useInfiniteTradeHistory(user, options = {}) {
111
152
  aggregateByTime,
112
153
  });
113
154
  const fills = sortTradeHistory(rawFills.map((fill) => formatTradeHistoryFill(fill, symbolConverter?.getSpotByPairId(fill.coin))));
114
- const newestFillTime = fills[0]?.time;
115
- const oldestFillTime = fills.at(-1)?.time;
155
+ if (pageParam.latest) {
156
+ return getLatestPageFromFills(user, fills, pageParam.endTime, pageDurationMs);
157
+ }
116
158
  return {
117
159
  user,
118
- startTime: oldestFillTime ?? pageParam.startTime,
119
- endTime: newestFillTime ?? pageParam.endTime,
160
+ startTime: pageParam.startTime,
161
+ endTime: pageParam.endTime,
120
162
  fills,
121
163
  };
122
164
  },
@@ -138,15 +180,7 @@ export function useInfiniteTradeHistory(user, options = {}) {
138
180
  endTime: nextEndTime,
139
181
  };
140
182
  },
141
- select: (data) => {
142
- const realtimeFills = realtimeState.data?.fills ?? [];
143
- return {
144
- pages: data.pages,
145
- pageParams: data.pageParams,
146
- user,
147
- fills: mergeTradeHistoryFills(data.pages, realtimeFills),
148
- };
149
- },
183
+ select: selectTradeHistoryData,
150
184
  ...queryOptions,
151
185
  enabled,
152
186
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperix/hooks",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",