@orderly.network/hooks 0.0.24 → 0.0.25

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.
package/dist/index.d.mts CHANGED
@@ -125,11 +125,13 @@ declare const useOrderbookStream: (symbol: string, initial?: OrderbookData, opti
125
125
  bids: OrderBookItem[];
126
126
  onDepthChange?: undefined;
127
127
  depth?: undefined;
128
+ allDepths?: undefined;
128
129
  isLoading?: undefined;
129
130
  onItemClick?: undefined;
130
131
  } | {
131
132
  onDepthChange: (depth: number) => void;
132
- depth: number;
133
+ depth: number | undefined;
134
+ allDepths: any[];
133
135
  isLoading: boolean;
134
136
  onItemClick: (item: OrderBookItem) => void;
135
137
  })[];
@@ -223,12 +225,10 @@ interface MarketTradeStreamOptions {
223
225
  level?: number;
224
226
  }
225
227
  declare const useMarketTradeStream: (symbol: string, options?: MarketTradeStreamOptions) => {
226
- data: API.Trade[] | undefined;
228
+ data: API.Trade[];
227
229
  isLoading: boolean;
228
230
  };
229
231
 
230
- declare const useTradeStream: () => unknown[];
231
-
232
232
  type CollateralOutputs = {
233
233
  totalCollateral: number;
234
234
  freeCollateral: number;
@@ -323,4 +323,4 @@ declare namespace index {
323
323
  };
324
324
  }
325
325
 
326
- export { AppStateErrors, DataSourceProvider, OrderStatus, OrderlyAppConfig, OrderlyContext, OrderlyContextState, OrderlyProvider, index as apis, useAccount, useAccountInfo, useAccountInstance, useAppState, useBalance, useChains, useCollateral, useEventEmitter, useExecutionReport, useFetures, useFundingRate, useHolding, useLeverage, useMarginRatio, useMarkPrice, useMarkPricesStream, useMarketTradeStream, useMarketsStream, useMaxQty, useMutation, useOrderEntry, useOrderStream, useOrderbookStream, usePositionStream, usePreLoadData, usePrivateDataObserver, usePrivateObserve, usePrivateQuery, useQuery, useRunOnce, useSessionStorage, useSymbolsInfo, useTickerStream, useTokenInfo, useTopicObserve, useTradeStream, useTradingView, useWS };
326
+ export { AppStateErrors, DataSourceProvider, OrderStatus, OrderlyAppConfig, OrderlyContext, OrderlyContextState, OrderlyProvider, index as apis, useAccount, useAccountInfo, useAccountInstance, useAppState, useBalance, useChains, useCollateral, useEventEmitter, useExecutionReport, useFetures, useFundingRate, useHolding, useLeverage, useMarginRatio, useMarkPrice, useMarkPricesStream, useMarketTradeStream, useMarketsStream, useMaxQty, useMutation, useOrderEntry, useOrderStream, useOrderbookStream, usePositionStream, usePreLoadData, usePrivateDataObserver, usePrivateObserve, usePrivateQuery, useQuery, useRunOnce, useSessionStorage, useSymbolsInfo, useTickerStream, useTokenInfo, useTopicObserve, useTradingView, useWS };
package/dist/index.d.ts CHANGED
@@ -125,11 +125,13 @@ declare const useOrderbookStream: (symbol: string, initial?: OrderbookData, opti
125
125
  bids: OrderBookItem[];
126
126
  onDepthChange?: undefined;
127
127
  depth?: undefined;
128
+ allDepths?: undefined;
128
129
  isLoading?: undefined;
129
130
  onItemClick?: undefined;
130
131
  } | {
131
132
  onDepthChange: (depth: number) => void;
132
- depth: number;
133
+ depth: number | undefined;
134
+ allDepths: any[];
133
135
  isLoading: boolean;
134
136
  onItemClick: (item: OrderBookItem) => void;
135
137
  })[];
@@ -223,12 +225,10 @@ interface MarketTradeStreamOptions {
223
225
  level?: number;
224
226
  }
225
227
  declare const useMarketTradeStream: (symbol: string, options?: MarketTradeStreamOptions) => {
226
- data: API.Trade[] | undefined;
228
+ data: API.Trade[];
227
229
  isLoading: boolean;
228
230
  };
229
231
 
230
- declare const useTradeStream: () => unknown[];
231
-
232
232
  type CollateralOutputs = {
233
233
  totalCollateral: number;
234
234
  freeCollateral: number;
@@ -323,4 +323,4 @@ declare namespace index {
323
323
  };
324
324
  }
325
325
 
326
- export { AppStateErrors, DataSourceProvider, OrderStatus, OrderlyAppConfig, OrderlyContext, OrderlyContextState, OrderlyProvider, index as apis, useAccount, useAccountInfo, useAccountInstance, useAppState, useBalance, useChains, useCollateral, useEventEmitter, useExecutionReport, useFetures, useFundingRate, useHolding, useLeverage, useMarginRatio, useMarkPrice, useMarkPricesStream, useMarketTradeStream, useMarketsStream, useMaxQty, useMutation, useOrderEntry, useOrderStream, useOrderbookStream, usePositionStream, usePreLoadData, usePrivateDataObserver, usePrivateObserve, usePrivateQuery, useQuery, useRunOnce, useSessionStorage, useSymbolsInfo, useTickerStream, useTokenInfo, useTopicObserve, useTradeStream, useTradingView, useWS };
326
+ export { AppStateErrors, DataSourceProvider, OrderStatus, OrderlyAppConfig, OrderlyContext, OrderlyContextState, OrderlyProvider, index as apis, useAccount, useAccountInfo, useAccountInstance, useAppState, useBalance, useChains, useCollateral, useEventEmitter, useExecutionReport, useFetures, useFundingRate, useHolding, useLeverage, useMarginRatio, useMarkPrice, useMarkPricesStream, useMarketTradeStream, useMarketsStream, useMaxQty, useMutation, useOrderEntry, useOrderStream, useOrderbookStream, usePositionStream, usePreLoadData, usePrivateDataObserver, usePrivateObserve, usePrivateQuery, useQuery, useRunOnce, useSessionStorage, useSymbolsInfo, useTickerStream, useTokenInfo, useTopicObserve, useTradingView, useWS };
package/dist/index.js CHANGED
@@ -535,17 +535,93 @@ var useMarkPrice = (symbol) => {
535
535
  });
536
536
  };
537
537
 
538
+ // src/utils/createGetter.ts
539
+ function createGetter(data, depth = 2) {
540
+ return new Proxy(data || {}, {
541
+ get(target, property, receiver) {
542
+ if (depth === 1) {
543
+ return (defaultValue) => {
544
+ var _a;
545
+ if (!target)
546
+ return defaultValue;
547
+ return (_a = target[property]) != null ? _a : defaultValue;
548
+ };
549
+ }
550
+ return (key, defaultValue) => {
551
+ var _a, _b;
552
+ if (key) {
553
+ return (_b = (_a = target[property]) == null ? void 0 : _a[key]) != null ? _b : defaultValue;
554
+ } else {
555
+ return target[property];
556
+ }
557
+ };
558
+ }
559
+ });
560
+ }
561
+ var useSymbolsInfo = () => {
562
+ const { data = {} } = useQuery(`/v1/public/info`, {
563
+ focusThrottleInterval: 1e3 * 60 * 60 * 24,
564
+ revalidateOnFocus: false,
565
+ formatter(data2) {
566
+ var _a;
567
+ if (!(data2 == null ? void 0 : data2.rows) || !((_a = data2 == null ? void 0 : data2.rows) == null ? void 0 : _a.length)) {
568
+ return {};
569
+ }
570
+ const obj = /* @__PURE__ */ Object.create(null);
571
+ for (let index = 0; index < data2.rows.length; index++) {
572
+ const item = data2.rows[index];
573
+ const arr = item.symbol.split("_");
574
+ const base_dp = utils.getPrecisionByNumber(item.base_tick);
575
+ const quote_dp = utils.getPrecisionByNumber(item.quote_tick);
576
+ obj[item.symbol] = __spreadProps(__spreadValues({}, item), {
577
+ base_dp,
578
+ quote_dp,
579
+ base: arr[1],
580
+ quote: arr[2],
581
+ type: arr[0],
582
+ name: `${arr[1]}-${arr[0]}`
583
+ });
584
+ }
585
+ return obj;
586
+ }
587
+ });
588
+ return createGetter(data);
589
+ };
590
+
538
591
  // src/orderly/useOrderbookStream.ts
539
592
  var paddingFn = (len) => Array(len).fill([Number.NaN, Number.NaN, Number.NaN]);
540
593
  var asksSortFn = (a, b) => a[0] - b[0];
541
594
  var bidsSortFn = (a, b) => b[0] - a[0];
542
- var reduceItems = (depth, level, data) => {
595
+ var reduceItems = (depth, level, data, asks = false) => {
543
596
  if (!Array.isArray(data) || data.length === 0) {
544
597
  return [];
545
598
  }
599
+ let newData = [...data];
546
600
  const result = [];
547
- for (let i = 0; i < data.length; i++) {
548
- const [price, quantity] = data[i];
601
+ if (typeof depth !== "undefined") {
602
+ const prices = /* @__PURE__ */ new Map();
603
+ for (let i = 0; i < data.length; i++) {
604
+ const [price, quantity] = data[i];
605
+ if (isNaN(price) || isNaN(quantity))
606
+ continue;
607
+ let priceKey;
608
+ if (asks) {
609
+ priceKey = Math.ceil(price / depth) * depth;
610
+ } else {
611
+ priceKey = Math.floor(price / depth) * depth;
612
+ }
613
+ if (prices.has(priceKey)) {
614
+ const item = prices.get(priceKey);
615
+ const itemPrice = item[1] + quantity;
616
+ prices.set(priceKey, [priceKey, itemPrice]);
617
+ } else {
618
+ prices.set(priceKey, [priceKey, quantity]);
619
+ }
620
+ }
621
+ newData = Array.from(prices.values());
622
+ }
623
+ for (let i = 0; i < newData.length; i++) {
624
+ const [price, quantity] = newData[i];
549
625
  if (isNaN(price) || isNaN(quantity))
550
626
  continue;
551
627
  result.push([
@@ -560,7 +636,7 @@ var reduceItems = (depth, level, data) => {
560
636
  return result;
561
637
  };
562
638
  var reduceOrderbook = (depth, level, data) => {
563
- const asks = reduceItems(depth, level, data.asks).reverse();
639
+ const asks = reduceItems(depth, level, data.asks, true).reverse();
564
640
  const bids = reduceItems(depth, level, data.bids);
565
641
  return {
566
642
  asks: asks.length < level ? paddingFn(level - asks.length).concat(asks) : asks,
@@ -574,10 +650,6 @@ var mergeItems = (data, update) => {
574
650
  const item = update.shift();
575
651
  if (item) {
576
652
  const [price, quantity] = item;
577
- if (price < data[0][0] && quantity > 0) {
578
- data.unshift(item);
579
- continue;
580
- }
581
653
  const index = data.findIndex(([p], index2) => p === price);
582
654
  if (index === -1) {
583
655
  data.push(item);
@@ -585,8 +657,9 @@ var mergeItems = (data, update) => {
585
657
  if (quantity === 0) {
586
658
  data.splice(index, 1);
587
659
  continue;
660
+ } else {
661
+ data[index] = item;
588
662
  }
589
- data[index] = item;
590
663
  }
591
664
  }
592
665
  }
@@ -605,11 +678,19 @@ var useOrderbookStream = (symbol, initial = { asks: [], bids: [] }, options) =>
605
678
  const [requestData, setRequestData] = React2.useState(null);
606
679
  const [data, setData] = React2.useState(initial);
607
680
  const [isLoading, setIsLoading] = React2.useState(true);
608
- const [depth, setDepth] = React2.useState(1e-3);
609
681
  const [level, setLevel] = React2.useState(() => {
610
682
  var _a;
611
683
  return (_a = options == null ? void 0 : options.level) != null ? _a : 10;
612
684
  });
685
+ const config = useSymbolsInfo()[symbol];
686
+ const [depth, setDepth] = React2.useState();
687
+ const depths = React2.useMemo(() => {
688
+ const tick = config("quote_tick");
689
+ return [tick, tick * 10, tick * 100, tick * 1e3];
690
+ }, [config("quote_tick")]);
691
+ React2.useEffect(() => {
692
+ setDepth(config("quote_tick"));
693
+ }, [config("quote_tick")]);
613
694
  const ws = useWS();
614
695
  const ticker = useTickerStream(symbol);
615
696
  const eventEmitter = useEventEmitter();
@@ -624,7 +705,6 @@ var useOrderbookStream = (symbol, initial = { asks: [], bids: [] }, options) =>
624
705
  },
625
706
  {
626
707
  onMessage: (message) => {
627
- console.log("orderbook request message", message);
628
708
  if (!!message) {
629
709
  const reduceOrderbookData = reduceOrderbook(depth, level, message);
630
710
  setRequestData(reduceOrderbookData);
@@ -637,7 +717,7 @@ var useOrderbookStream = (symbol, initial = { asks: [], bids: [] }, options) =>
637
717
  return () => {
638
718
  setRequestData(null);
639
719
  };
640
- }, [symbol]);
720
+ }, [symbol, depth]);
641
721
  const { data: markPrice } = useMarkPrice(symbol);
642
722
  React2.useEffect(() => {
643
723
  if (!requestData)
@@ -665,7 +745,7 @@ var useOrderbookStream = (symbol, initial = { asks: [], bids: [] }, options) =>
665
745
  eventEmitter.emit("orderbook:item:click", item);
666
746
  }, []);
667
747
  const onDepthChange = React2.useCallback((depth2) => {
668
- console.log("Orderbook depth has changed:", depth2);
748
+ setDepth(() => depth2);
669
749
  }, []);
670
750
  const middlePrice = React2.useMemo(() => {
671
751
  let asksFrist = 0, bidsFirst = 0;
@@ -681,63 +761,10 @@ var useOrderbookStream = (symbol, initial = { asks: [], bids: [] }, options) =>
681
761
  }, [ticker, data]);
682
762
  return [
683
763
  __spreadProps(__spreadValues({}, data), { markPrice, middlePrice }),
684
- { onDepthChange, depth, isLoading, onItemClick }
764
+ { onDepthChange, depth, allDepths: depths, isLoading, onItemClick }
685
765
  ];
686
766
  };
687
767
 
688
- // src/utils/createGetter.ts
689
- function createGetter(data, depth = 2) {
690
- return new Proxy(data || {}, {
691
- get(target, property, receiver) {
692
- if (depth === 1) {
693
- return (defaultValue) => {
694
- var _a;
695
- if (!target)
696
- return defaultValue;
697
- return (_a = target[property]) != null ? _a : defaultValue;
698
- };
699
- }
700
- return (key, defaultValue) => {
701
- var _a, _b;
702
- if (key) {
703
- return (_b = (_a = target[property]) == null ? void 0 : _a[key]) != null ? _b : defaultValue;
704
- } else {
705
- return target[property];
706
- }
707
- };
708
- }
709
- });
710
- }
711
- var useSymbolsInfo = () => {
712
- const { data = {} } = useQuery(`/v1/public/info`, {
713
- focusThrottleInterval: 1e3 * 60 * 60 * 24,
714
- revalidateOnFocus: false,
715
- formatter(data2) {
716
- var _a;
717
- if (!(data2 == null ? void 0 : data2.rows) || !((_a = data2 == null ? void 0 : data2.rows) == null ? void 0 : _a.length)) {
718
- return {};
719
- }
720
- const obj = /* @__PURE__ */ Object.create(null);
721
- for (let index = 0; index < data2.rows.length; index++) {
722
- const item = data2.rows[index];
723
- const arr = item.symbol.split("_");
724
- const base_dp = utils.getPrecisionByNumber(item.base_tick);
725
- const quote_dp = utils.getPrecisionByNumber(item.quote_tick);
726
- obj[item.symbol] = __spreadProps(__spreadValues({}, item), {
727
- base_dp,
728
- quote_dp,
729
- base: arr[1],
730
- quote: arr[2],
731
- type: arr[0],
732
- name: `${arr[1]}-${arr[0]}`
733
- });
734
- }
735
- return obj;
736
- }
737
- });
738
- return createGetter(data);
739
- };
740
-
741
768
  // src/orderly/useTokenInfo.ts
742
769
  var useTokenInfo = () => {
743
770
  const { data = {} } = useQuery(
@@ -995,10 +1022,7 @@ var usePositionStream = (symbol, options) => {
995
1022
  item.symbol,
996
1023
  markPrices
997
1024
  );
998
- const notional = futures.positions.notional(
999
- item.position_qty,
1000
- item.average_open_price
1001
- );
1025
+ const notional = futures.positions.notional(item.position_qty, price);
1002
1026
  const unrealPnl = futures.positions.unrealizedPnL({
1003
1027
  qty: item.position_qty,
1004
1028
  openPrice: item.average_open_price,
@@ -1668,6 +1692,7 @@ var useOrderStream = ({
1668
1692
  side,
1669
1693
  size = 100
1670
1694
  } = {}) => {
1695
+ const ee = useEventEmitter();
1671
1696
  const { data: markPrices = {} } = useMarkPricesStream();
1672
1697
  const [doCancelOrder] = useMutation("/v1/order", "DELETE");
1673
1698
  const [doUpdateOrder] = useMutation("/v1/order", "PUT");
@@ -1708,6 +1733,13 @@ var useOrderStream = ({
1708
1733
  });
1709
1734
  });
1710
1735
  }, [ordersResponse.data, markPrices]);
1736
+ React2.useEffect(() => {
1737
+ const handler = () => ordersResponse.mutate();
1738
+ ee.on("orders:changed", handler);
1739
+ return () => {
1740
+ ee.off("orders:changed", handler);
1741
+ };
1742
+ }, []);
1711
1743
  const cancelAllOrders = React2.useCallback(() => {
1712
1744
  }, [ordersResponse.data]);
1713
1745
  const updateOrder = React2.useCallback((orderId, order2) => {
@@ -1741,38 +1773,31 @@ var useMarketTradeStream = (symbol, options = {}) => {
1741
1773
  if (!symbol) {
1742
1774
  throw new Error("useTradeStream: symbol is required");
1743
1775
  }
1744
- React2.useState([]);
1776
+ const [trades, setTrades] = React2.useState([]);
1745
1777
  const { level = 20 } = options;
1746
- const { data, isLoading } = useQuery(
1747
- `/v1/public/market_trades?symbol=${symbol}&limit=${level}`
1748
- // {
1749
- // onSuccess: (data) => {
1750
- // // console.log("trades ^^^^^^", data);
1751
- // if (Array.isArray(data)) {
1752
- // setTrades(data);
1753
- // }
1754
- // return data;
1755
- // },
1756
- // }
1778
+ const { isLoading } = useQuery(
1779
+ `/v1/public/market_trades?symbol=${symbol}&limit=${level}`,
1780
+ {
1781
+ onSuccess: (data) => {
1782
+ if (Array.isArray(data)) {
1783
+ setTrades(() => data);
1784
+ }
1785
+ return data;
1786
+ }
1787
+ }
1757
1788
  );
1758
1789
  const ws = useWS();
1759
1790
  React2.useEffect(() => {
1760
1791
  const unsubscript = ws.subscribe(`@${symbol}/@trade`, {
1761
- onMessage: (data2) => {
1762
- console.log("trade", data2);
1792
+ onMessage: (data) => {
1793
+ console.log("ws: trade", data);
1763
1794
  }
1764
1795
  });
1765
1796
  return () => {
1766
1797
  unsubscript == null ? void 0 : unsubscript();
1767
1798
  };
1768
1799
  }, []);
1769
- return { data, isLoading };
1770
- };
1771
-
1772
- // src/orderly/useTrades.tsx
1773
- var useTradeStream = () => {
1774
- const { data, isLoading } = usePrivateQuery("/v1/trades");
1775
- return [data, { isLoading }];
1800
+ return { data: trades, isLoading };
1776
1801
  };
1777
1802
  var useMarginRatio = () => {
1778
1803
  const [{ rows }] = usePositionStream();
@@ -1853,12 +1878,12 @@ var useBalance = () => {
1853
1878
  var usePrivateDataObserver = () => {
1854
1879
  const ws = useWS();
1855
1880
  const { mutate: mutate2 } = useSWR.useSWRConfig();
1881
+ const ee = useEventEmitter();
1856
1882
  React2.useEffect(() => {
1857
1883
  console.log("subscribe: executionreport");
1858
1884
  const unsubscribe = ws.privateSubscribe("executionreport", {
1859
1885
  onMessage: (data) => {
1860
- console.info("refresh orders");
1861
- console.log(data);
1886
+ ee.emit("orders:changed");
1862
1887
  }
1863
1888
  });
1864
1889
  return () => unsubscribe == null ? void 0 : unsubscribe();
@@ -1967,7 +1992,6 @@ exports.useSymbolsInfo = useSymbolsInfo;
1967
1992
  exports.useTickerStream = useTickerStream;
1968
1993
  exports.useTokenInfo = useTokenInfo;
1969
1994
  exports.useTopicObserve = useTopicObserve;
1970
- exports.useTradeStream = useTradeStream;
1971
1995
  exports.useTradingView = useTradingView;
1972
1996
  exports.useWS = useWS;
1973
1997
  //# sourceMappingURL=out.js.map