@hyperix/hooks 0.2.6 → 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.
@@ -23,16 +23,18 @@ export type InfiniteTradeHistoryData = {
23
23
  pages: TradeHistoryPage[];
24
24
  };
25
25
  export type InfiniteTradeHistoryPageParam = {
26
+ latest?: boolean;
26
27
  startTime: number;
27
28
  endTime: number;
28
29
  };
29
- export type UseInfiniteTradeHistoryOptions = Omit<UseInfiniteQueryOptions<TradeHistoryPage, Error, InfiniteTradeHistoryData, [
30
+ type InfiniteTradeHistoryQueryKey = [
30
31
  "infinite-trade-history",
31
32
  `0x${string}`,
32
33
  boolean,
33
34
  number,
34
35
  number | undefined
35
- ], InfiniteTradeHistoryPageParam>, "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam" | "select"> & {
36
+ ];
37
+ export type UseInfiniteTradeHistoryOptions = Omit<UseInfiniteQueryOptions<TradeHistoryPage, Error, InfiniteTradeHistoryData, InfiniteTradeHistoryQueryKey, InfiniteTradeHistoryPageParam>, "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam" | "select"> & {
36
38
  aggregateByTime?: boolean;
37
39
  endTime?: number;
38
40
  pageDurationMs?: number;
@@ -45,3 +47,4 @@ export declare function useTradeHistory(user: `0x${string}`, options?: UseUserFi
45
47
  error?: string;
46
48
  };
47
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,36 +93,77 @@ 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
- const fills = await infoClient.userFillsByTime({
103
- user,
104
- startTime: pageParam.startTime,
105
- endTime: pageParam.endTime,
106
- aggregateByTime,
107
- });
143
+ const rawFills = pageParam.latest
144
+ ? await infoClient.userFills({
145
+ user,
146
+ aggregateByTime,
147
+ })
148
+ : await infoClient.userFillsByTime({
149
+ user,
150
+ startTime: pageParam.startTime,
151
+ endTime: pageParam.endTime,
152
+ aggregateByTime,
153
+ });
154
+ const fills = sortTradeHistory(rawFills.map((fill) => formatTradeHistoryFill(fill, symbolConverter?.getSpotByPairId(fill.coin))));
155
+ if (pageParam.latest) {
156
+ return getLatestPageFromFills(user, fills, pageParam.endTime, pageDurationMs);
157
+ }
108
158
  return {
109
159
  user,
110
160
  startTime: pageParam.startTime,
111
161
  endTime: pageParam.endTime,
112
- fills: sortTradeHistory(fills.map((fill) => formatTradeHistoryFill(fill, symbolConverter?.getSpotByPairId(fill.coin)))),
162
+ fills,
113
163
  };
114
164
  },
115
165
  initialPageParam: {
166
+ latest: endTime === undefined,
116
167
  startTime: Math.max(0, (endTime ?? Date.now()) - pageDurationMs),
117
168
  endTime: endTime ?? Date.now(),
118
169
  },
@@ -129,15 +180,7 @@ export function useInfiniteTradeHistory(user, options = {}) {
129
180
  endTime: nextEndTime,
130
181
  };
131
182
  },
132
- select: (data) => {
133
- const realtimeFills = realtimeState.data?.fills ?? [];
134
- return {
135
- pages: data.pages,
136
- pageParams: data.pageParams,
137
- user,
138
- fills: mergeTradeHistoryFills(data.pages, realtimeFills),
139
- };
140
- },
183
+ select: selectTradeHistoryData,
141
184
  ...queryOptions,
142
185
  enabled,
143
186
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperix/hooks",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",