@@ -21,6 +21,7 @@ import {
2121} from '../../../components/app/perps/mocks' ;
2222import type { PerpsMarketData } from '../../../components/app/perps/types' ;
2323import { PERPS_MARKET_DETAIL_ROUTE } from '../../../helpers/constants/routes' ;
24+ import { sortMarkets } from '../utils/sortMarkets' ;
2425import { MarketRow , type SortField } from './components/market-row' ;
2526import { MarketRowSkeleton } from './components/market-row-skeleton' ;
2627import {
@@ -42,85 +43,6 @@ const allMarkets: PerpsMarketData[] = [
4243 ...mockHip3Markets ,
4344] ;
4445
45- /**
46- * Sort markets based on field and direction
47- *
48- * @param markets - Array of markets to sort
49- * @param field - Field to sort by
50- * @param direction - Sort direction (asc/desc)
51- * @returns Sorted array of markets
52- */
53- const sortMarkets = (
54- markets : PerpsMarketData [ ] ,
55- field : SortField ,
56- direction : SortDirection ,
57- ) : PerpsMarketData [ ] => {
58- return [ ...markets ] . sort ( ( a , b ) => {
59- let comparison = 0 ;
60-
61- switch ( field ) {
62- case 'volume' : {
63- // Parse volume like "$1.2B", "$850M"
64- const parseVolume = ( vol : string ) : number => {
65- const num = parseFloat ( vol . replace ( / [ $ , ] / gu, '' ) ) ;
66- if ( vol . includes ( 'B' ) ) {
67- return num * 1e9 ;
68- }
69- if ( vol . includes ( 'M' ) ) {
70- return num * 1e6 ;
71- }
72- if ( vol . includes ( 'K' ) ) {
73- return num * 1e3 ;
74- }
75- return num ;
76- } ;
77- comparison = parseVolume ( a . volume ) - parseVolume ( b . volume ) ;
78- break ;
79- }
80- case 'priceChange' : {
81- // Parse change like "+2.84%", "-1.19%"
82- const parseChange = ( change : string ) : number => {
83- return parseFloat ( change . replace ( / [ % + ] / gu, '' ) ) ;
84- } ;
85- comparison =
86- parseChange ( a . change24hPercent ) - parseChange ( b . change24hPercent ) ;
87- break ;
88- }
89- case 'openInterest' : {
90- // Parse OI like "$2.5B", "$450M"
91- const parseOI = ( oi : string | undefined ) : number => {
92- if ( ! oi ) {
93- return 0 ;
94- }
95- const num = parseFloat ( oi . replace ( / [ $ , ] / gu, '' ) ) ;
96- if ( oi . includes ( 'B' ) ) {
97- return num * 1e9 ;
98- }
99- if ( oi . includes ( 'M' ) ) {
100- return num * 1e6 ;
101- }
102- if ( oi . includes ( 'K' ) ) {
103- return num * 1e3 ;
104- }
105- return num ;
106- } ;
107- comparison = parseOI ( a . openInterest ) - parseOI ( b . openInterest ) ;
108- break ;
109- }
110- case 'fundingRate' : {
111- const rateA = a . fundingRate ?? 0 ;
112- const rateB = b . fundingRate ?? 0 ;
113- comparison = rateA - rateB ;
114- break ;
115- }
116- default :
117- comparison = 0 ;
118- }
119-
120- return direction === 'desc' ? - comparison : comparison ;
121- } ) ;
122- } ;
123-
12446/**
12547 * Filter markets based on search query
12648 *
@@ -220,11 +142,11 @@ export const MarketListView: React.FC = () => {
220142 }
221143
222144 if ( currentSortOption ) {
223- markets = sortMarkets (
145+ markets = sortMarkets ( {
224146 markets,
225- currentSortOption . field ,
226- currentSortOption . direction ,
227- ) ;
147+ sortBy : currentSortOption . field ,
148+ direction : currentSortOption . direction ,
149+ } ) ;
228150 }
229151 return markets ;
230152 } , [ selectedFilter , stockSubFilter , searchQuery , currentSortOption ] ) ;
0 commit comments