@hyperix/hooks 0.2.7 → 0.2.9

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,23 @@ function mergeTradeHistoryFills(pages, realtimeFills) {
63
63
  }
64
64
  return sortTradeHistory([...fillsByKey.values()]);
65
65
  }
66
+ function flattenTradeHistoryPages(pages) {
67
+ const fills = [];
68
+ for (const page of pages) {
69
+ fills.push(...page.fills);
70
+ }
71
+ return fills;
72
+ }
73
+ function getLatestPageFromFills(user, fills, fallbackEndTime, pageDurationMs) {
74
+ const endTime = fills[0]?.time ?? fallbackEndTime;
75
+ const startTime = Math.max(0, endTime - pageDurationMs);
76
+ return {
77
+ user,
78
+ startTime,
79
+ endTime,
80
+ fills: fills.filter((fill) => fill.time >= startTime && fill.time <= endTime),
81
+ };
82
+ }
66
83
  export function useTradeHistory(user, options = {}) {
67
84
  const userFillsState = useUserFills(user, options);
68
85
  const symbolConverter = useSymbolConverter();
@@ -83,21 +100,52 @@ export function useTradeHistory(user, options = {}) {
83
100
  };
84
101
  }
85
102
  export function useInfiniteTradeHistory(user, options = {}) {
86
- const { aggregateByTime = true, enabled: enabledOverride, endTime, pageDurationMs = DEFAULT_TRADE_HISTORY_PAGE_DURATION_MS, realtime = true, ...queryOptions } = options;
103
+ const { aggregateByTime = true, enabled: enabledOverride, endTime, pageDurationMs = DEFAULT_TRADE_HISTORY_PAGE_DURATION_MS, realtime = false, ...queryOptions } = options;
87
104
  const enabled = enabledOverride ?? Boolean(user);
88
105
  const symbolConverter = useSymbolConverter();
89
- const realtimeState = useTradeHistory(user, {
106
+ const queryClient = useQueryClient();
107
+ const queryKey = [
108
+ "infinite-trade-history",
109
+ user,
110
+ aggregateByTime,
111
+ pageDurationMs,
112
+ endTime,
113
+ ];
114
+ const selectTradeHistoryData = useMemo(() => (data) => ({
115
+ pages: data.pages,
116
+ user,
117
+ fills: flattenTradeHistoryPages(data.pages),
118
+ }), [user]);
119
+ useUserFills(user, {
90
120
  aggregateByTime,
91
121
  enabled: enabled && realtime,
122
+ onUpdate: (event) => {
123
+ const realtimeFills = sortTradeHistory(event.fills.map((fill) => formatTradeHistoryFill(fill, symbolConverter?.getSpotByPairId(fill.coin))));
124
+ if (realtimeFills.length === 0) {
125
+ return;
126
+ }
127
+ queryClient.setQueryData(queryKey, (previousData) => {
128
+ const [latestPage, ...olderPages] = previousData?.pages ?? [];
129
+ if (!previousData || !latestPage) {
130
+ return previousData;
131
+ }
132
+ const fills = mergeTradeHistoryFills([latestPage], realtimeFills);
133
+ return {
134
+ ...previousData,
135
+ pages: [
136
+ {
137
+ ...latestPage,
138
+ endTime: Math.max(latestPage.endTime, fills[0]?.time ?? 0),
139
+ fills,
140
+ },
141
+ ...olderPages,
142
+ ],
143
+ };
144
+ });
145
+ },
92
146
  });
93
147
  return useInfiniteQuery({
94
- queryKey: [
95
- "infinite-trade-history",
96
- user,
97
- aggregateByTime,
98
- pageDurationMs,
99
- endTime,
100
- ],
148
+ queryKey,
101
149
  queryFn: async ({ pageParam }) => {
102
150
  const rawFills = pageParam.latest
103
151
  ? await infoClient.userFills({
@@ -111,12 +159,13 @@ export function useInfiniteTradeHistory(user, options = {}) {
111
159
  aggregateByTime,
112
160
  });
113
161
  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;
162
+ if (pageParam.latest) {
163
+ return getLatestPageFromFills(user, fills, pageParam.endTime, pageDurationMs);
164
+ }
116
165
  return {
117
166
  user,
118
- startTime: oldestFillTime ?? pageParam.startTime,
119
- endTime: newestFillTime ?? pageParam.endTime,
167
+ startTime: pageParam.startTime,
168
+ endTime: pageParam.endTime,
120
169
  fills,
121
170
  };
122
171
  },
@@ -138,15 +187,7 @@ export function useInfiniteTradeHistory(user, options = {}) {
138
187
  endTime: nextEndTime,
139
188
  };
140
189
  },
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
- },
190
+ select: selectTradeHistoryData,
150
191
  ...queryOptions,
151
192
  enabled,
152
193
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperix/hooks",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",