1- import { useMemo , useRef } from "react" ;
1+ import { useMemo } from "react" ;
22import { SlidingNumber } from "@/components/ui/sliding-number" ;
33import { useRealtimeOrderBook } from "@/hooks/useRealTimeOrderBookData" ;
4- import { useFitRows } from "@/hooks/useFitRows" ;
54import { useOrderBookQuery } from "@/queries/useOrderBookQuery" ;
65import { cn } from "@/lib/utils" ;
76import { parseNumber } from "@/utils/parseNumber" ;
87import type { OrderBookRowProps } from "@/types/orderBook.type" ;
98import * as S from "./OrderBook.styles" ;
109
11- const ROW_HEIGHT = 25 ;
12-
1310const OrderBookRow = ( { price, amount, maxQty, type } : OrderBookRowProps ) => {
1411 const priceNum = parseFloat ( price ) ;
1512 const amountNum = parseFloat ( amount ) ;
@@ -21,22 +18,40 @@ const OrderBookRow = ({ price, amount, maxQty, type }: OrderBookRowProps) => {
2118 return (
2219 < div className = { S . rowContainer } >
2320 < div
24- className = { cn ( S . rowBgBase , isAsk ? S . rowBgAsk : S . rowBgBid ) }
21+ className = { cn (
22+ S . rowBgBase ,
23+ isAsk ? S . rowBgAsk : S . rowBgBid
24+ ) }
2525 style = { { width : widthPercent } }
2626 />
27+
2728 < span
2829 className = { cn (
2930 S . colPrice ,
3031 S . rowTextBase ,
3132 isAsk ? S . rowTextAsk : S . rowTextBid
3233 ) }
3334 >
34- { priceNum . toLocaleString ( undefined , { minimumFractionDigits : 2 } ) }
35+ { priceNum . toLocaleString ( undefined , {
36+ minimumFractionDigits : 2 ,
37+ } ) }
3538 </ span >
36- < span className = { cn ( S . colAmount , S . rowTextSecondary ) } >
39+
40+ < span
41+ className = { cn (
42+ S . colAmount ,
43+ S . rowTextSecondary
44+ ) }
45+ >
3746 { amountNum . toFixed ( 4 ) }
3847 </ span >
39- < span className = { cn ( S . colTotal , S . rowTextSecondary ) } >
48+
49+ < span
50+ className = { cn (
51+ S . colTotal ,
52+ S . rowTextSecondary
53+ ) }
54+ >
4055 { parseNumber ( total ) }
4156 </ span >
4257 </ div >
@@ -45,12 +60,6 @@ const OrderBookRow = ({ price, amount, maxQty, type }: OrderBookRowProps) => {
4560
4661export const OrderBook = ( { symbol } : { symbol : string } ) => {
4762 const { data, isLoading } = useOrderBookQuery ( symbol ) ;
48-
49- const asksRef = useRef < HTMLDivElement > ( null ) ;
50- const bidsRef = useRef < HTMLDivElement > ( null ) ;
51-
52- const asksCount = useFitRows ( asksRef , ROW_HEIGHT ) ;
53- const bidsCount = useFitRows ( bidsRef , ROW_HEIGHT ) ;
5463
5564 useRealtimeOrderBook ( symbol ) ;
5665
@@ -61,40 +70,35 @@ export const OrderBook = ({ symbol }: { symbol: string }) => {
6170 return Math . max ( maxBid , maxAsk ) ;
6271 } , [ data ] ) ;
6372
64- const displayAsks = useMemo ( ( ) => {
65- const originalAsks = data ?. asks || [ ] ;
66-
67- if ( asksCount === 0 ) return originalAsks ;
68-
69- return originalAsks . slice ( 0 , asksCount ) ;
70- } , [ data ?. asks , asksCount ] ) ;
73+ const asks = data ?. asks || [ ] ;
7174
72- const displayBids = useMemo ( ( ) => {
73- const originalBids = data ?. bids || [ ] ;
74-
75- if ( bidsCount === 0 ) return originalBids ;
76-
77- return originalBids . slice ( 0 , bidsCount ) ;
78- } , [ data ?. bids , bidsCount ] ) ;
75+ const bids = data ?. bids || [ ] ;
7976
8077 if ( isLoading ) {
81- return < div className = { S . loadingContainer } > Loading...</ div > ;
78+ return (
79+ < div className = { S . loadingContainer } >
80+ Loading...
81+ </ div >
82+ ) ;
8283 }
8384
8485 if ( ! data ) {
85- return < div className = { S . errorContainer } > Failed to load</ div > ;
86+ return (
87+ < div className = { S . errorContainer } >
88+ Failed to load
89+ </ div >
90+ ) ;
8691 }
8792
8893 return (
8994 < div className = { S . container } >
9095 < div className = { S . headerRow } >
91- < span className = { S . colPrice } > Price(USDT)</ span >
92- < span className = { S . colAmount } > Amount</ span >
93- < span className = { S . colTotal } > Total</ span >
94- </ div >
95-
96- < div ref = { asksRef } className = { S . asksWrapper } >
97- { displayAsks . map ( ( ask ) => (
96+ < span className = { S . colPrice } > Price(USDT)</ span >
97+ < span className = { S . colAmount } > Amount</ span >
98+ < span className = { S . colTotal } > Total</ span >
99+ </ div >
100+ < div className = { S . asksWrapper } >
101+ { asks . map ( ( ask ) => (
98102 < OrderBookRow
99103 key = { ask [ 0 ] }
100104 price = { ask [ 0 ] }
@@ -109,14 +113,14 @@ export const OrderBook = ({ symbol }: { symbol: string }) => {
109113 < span className = { S . middlePriceWrapper } >
110114 < span className = { S . dollarSign } > $</ span >
111115 < SlidingNumber
112- number = { parseFloat ( data . bids [ 0 ] ?. [ 0 ] || "0" ) }
116+ number = { parseFloat ( bids [ 0 ] ?. [ 0 ] || "0" ) }
113117 decimalPlaces = { 2 }
114118 />
115119 </ span >
116120 </ div >
117121
118- < div ref = { bidsRef } className = { S . bidsWrapper } >
119- { displayBids . map ( ( bid ) => (
122+ < div className = { S . bidsWrapper } >
123+ { bids . map ( ( bid ) => (
120124 < OrderBookRow
121125 key = { bid [ 0 ] }
122126 price = { bid [ 0 ] }
0 commit comments