@@ -8,15 +8,17 @@ import { Button } from "@/components/ui/button";
88import { Badge } from "@/components/ui/badge" ;
99import { TradeDialog } from "@/components/trade-dialog" ;
1010import { useMarketData } from '@/context/market-data-context' ;
11- import { Loader2 , Search } from 'lucide-react' ;
11+ import { Loader2 , Search , List , LayoutGrid } from 'lucide-react' ;
1212import { Input } from '@/components/ui/input' ;
1313import { Select , SelectContent , SelectItem , SelectTrigger , SelectValue } from '@/components/ui/select' ;
14+ import { AssetCard } from '@/components/asset-card' ;
1415
1516
1617export default function TradingPage ( ) {
1718 const { assets, loading } = useMarketData ( ) ;
1819 const [ searchTerm , setSearchTerm ] = useState ( '' ) ;
1920 const [ sortOption , setSortOption ] = useState ( 'marketCap_desc' ) ;
21+ const [ viewMode , setViewMode ] = useState < 'list' | 'grid' > ( 'list' ) ;
2022
2123 const filteredAndSortedAssets = useMemo ( ( ) => {
2224 let processedAssets = [ ...assets ] ;
@@ -96,53 +98,69 @@ export default function TradingPage() {
9698 < SelectItem value = "change_asc" > Variation (Croissant)</ SelectItem >
9799 </ SelectContent >
98100 </ Select >
101+ < div className = "flex items-center gap-1 rounded-md bg-muted p-1" >
102+ < Button variant = { viewMode === 'list' ? 'secondary' : 'ghost' } size = "icon" className = "h-8 w-8" onClick = { ( ) => setViewMode ( 'list' ) } >
103+ < List className = "h-4 w-4" />
104+ </ Button >
105+ < Button variant = { viewMode === 'grid' ? 'secondary' : 'ghost' } size = "icon" className = "h-8 w-8" onClick = { ( ) => setViewMode ( 'grid' ) } >
106+ < LayoutGrid className = "h-4 w-4" />
107+ </ Button >
108+ </ div >
99109 </ div >
100110 </ div >
101111 </ CardHeader >
102112 < CardContent >
103- < Table >
104- < TableHeader >
105- < TableRow >
106- < TableHead > Actif</ TableHead >
107- < TableHead > Type</ TableHead >
108- < TableHead > Prix</ TableHead >
109- < TableHead > Variation (24h)</ TableHead >
110- < TableHead > Cap. Boursière</ TableHead >
111- < TableHead className = "text-right" > Actions</ TableHead >
112- </ TableRow >
113- </ TableHeader >
114- < TableBody >
115- { filteredAndSortedAssets . map ( ( asset ) => {
116- const changeIsPositive = asset . change24h . startsWith ( '+' ) ;
117- return (
118- < TableRow key = { asset . ticker } >
119- < TableCell >
120- < div className = "font-medium" > { asset . name } </ div >
121- < div className = "text-sm text-muted-foreground" > { asset . ticker } </ div >
122- </ TableCell >
123- < TableCell >
124- < Badge variant = "outline" > { asset . type } </ Badge >
125- </ TableCell >
126- < TableCell className = "font-mono" > ${ asset . price . toFixed ( 2 ) } </ TableCell >
127- < TableCell className = { changeIsPositive ? 'text-green-500 dark:text-green-400' : 'text-red-500 dark:text-red-400' } >
128- { asset . change24h }
129- </ TableCell >
130- < TableCell > { asset . marketCap } </ TableCell >
131- < TableCell className = "text-right space-x-2" >
132- < Button asChild variant = "outline" size = "sm" >
133- < Link href = { `/trading/${ asset . ticker } ` } > Détails</ Link >
134- </ Button >
135- < TradeDialog asset = { asset } tradeType = "Buy" >
136- < Button variant = "outline" size = "sm" > Acheter</ Button >
137- </ TradeDialog >
138- < TradeDialog asset = { asset } tradeType = "Sell" >
139- < Button variant = "secondary" size = "sm" > Vendre</ Button >
140- </ TradeDialog >
141- </ TableCell >
142- </ TableRow >
143- ) } ) }
144- </ TableBody >
145- </ Table >
113+ { viewMode === 'list' ? (
114+ < Table >
115+ < TableHeader >
116+ < TableRow >
117+ < TableHead > Actif</ TableHead >
118+ < TableHead > Type</ TableHead >
119+ < TableHead > Prix</ TableHead >
120+ < TableHead > Variation (24h)</ TableHead >
121+ < TableHead > Cap. Boursière</ TableHead >
122+ < TableHead className = "text-right" > Actions</ TableHead >
123+ </ TableRow >
124+ </ TableHeader >
125+ < TableBody >
126+ { filteredAndSortedAssets . map ( ( asset ) => {
127+ const changeIsPositive = asset . change24h . startsWith ( '+' ) ;
128+ return (
129+ < TableRow key = { asset . ticker } >
130+ < TableCell >
131+ < div className = "font-medium" > { asset . name } </ div >
132+ < div className = "text-sm text-muted-foreground" > { asset . ticker } </ div >
133+ </ TableCell >
134+ < TableCell >
135+ < Badge variant = "outline" > { asset . type } </ Badge >
136+ </ TableCell >
137+ < TableCell className = "font-mono" > ${ asset . price . toFixed ( 2 ) } </ TableCell >
138+ < TableCell className = { changeIsPositive ? 'text-green-500 dark:text-green-400' : 'text-red-500 dark:text-red-400' } >
139+ { asset . change24h }
140+ </ TableCell >
141+ < TableCell > { asset . marketCap } </ TableCell >
142+ < TableCell className = "text-right space-x-2" >
143+ < Button asChild variant = "outline" size = "sm" >
144+ < Link href = { `/trading/${ asset . ticker } ` } > Détails</ Link >
145+ </ Button >
146+ < TradeDialog asset = { asset } tradeType = "Buy" >
147+ < Button variant = "outline" size = "sm" > Acheter</ Button >
148+ </ TradeDialog >
149+ < TradeDialog asset = { asset } tradeType = "Sell" >
150+ < Button variant = "secondary" size = "sm" > Vendre</ Button >
151+ </ TradeDialog >
152+ </ TableCell >
153+ </ TableRow >
154+ ) } ) }
155+ </ TableBody >
156+ </ Table >
157+ ) : (
158+ < div className = "grid gap-6 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4" >
159+ { filteredAndSortedAssets . map ( ( asset ) => (
160+ < AssetCard key = { asset . ticker } asset = { asset } />
161+ ) ) }
162+ </ div >
163+ ) }
146164 </ CardContent >
147165 </ Card >
148166 ) ;
0 commit comments