1- import { useEffect , useState } from 'react'
1+ import { useEffect , useState , useCallback } from 'react'
22import { fetchMarkets } from '../api/client'
33import type { MarketItem } from '../api/types'
44import MarketList from '../components/MarketList'
@@ -23,41 +23,47 @@ export default function Markets() {
2323 const [ activeTag , setActiveTag ] = useState < string | null > ( null )
2424 const [ sort , setSort ] = useState ( 'volume' )
2525
26- const loadMarkets = ( q ?: string , tag ?: string ) => {
27- fetchMarkets ( q || undefined , tag || undefined , sort ) . then ( setMarkets ) . catch ( ( ) => { } )
28- }
26+ const doSearch = useCallback ( ( q ?: string , tag ?: string , s ?: string ) => {
27+ fetchMarkets ( q || undefined , tag || undefined , s || sort )
28+ . then ( setMarkets )
29+ . catch ( err => console . error ( 'Search failed:' , err ) )
30+ } , [ sort ] )
2931
3032 useEffect ( ( ) => {
31- loadMarkets ( )
33+ doSearch ( )
3234 } , [ ] )
3335
34- const handleSearch = ( e : React . FormEvent ) => {
35- e . preventDefault ( )
36+ const handleSearch = useCallback ( ( ) => {
3637 setActiveTag ( null )
37- loadMarkets ( query )
38- }
38+ doSearch ( query )
39+ } , [ query , doSearch ] )
3940
4041 const handleTagClick = ( slug : string ) => {
4142 const next = activeTag === slug ? null : slug
4243 setActiveTag ( next )
4344 setQuery ( '' )
44- loadMarkets ( undefined , next || undefined )
45+ doSearch ( undefined , next || undefined )
4546 }
4647
4748 return (
4849 < div >
4950 { /* Search */ }
50- < form onSubmit = { handleSearch } style = { { marginBottom : 16 } } >
51+ < div style = { { marginBottom : 16 , display : 'flex' , gap : 8 } } >
5152 < input
5253 value = { query } onChange = { e => setQuery ( e . target . value ) }
54+ onKeyDown = { e => { if ( e . key === 'Enter' ) { e . preventDefault ( ) ; handleSearch ( ) } } }
5355 placeholder = "Search markets... e.g. 'Trump', 'Bitcoin', 'Fed rate'"
54- style = { { width : '100%' , padding : '10px 16px' , fontSize : '0.95em' , borderRadius : 8 , border : '1px solid #ddd' , boxSizing : 'border-box' } }
56+ style = { { flex : 1 , padding : '10px 16px' , fontSize : '0.95em' , borderRadius : 8 , border : '1px solid #ddd' , boxSizing : 'border-box' } }
5557 />
56- </ form >
58+ < button onClick = { handleSearch } style = { {
59+ padding : '10px 20px' , borderRadius : 8 , border : '1px solid #ddd' , background : '#111' , color : 'white' ,
60+ fontSize : '0.9em' , cursor : 'pointer' ,
61+ } } > Search</ button >
62+ </ div >
5763
5864 { /* Sort + Categories */ }
5965 < div style = { { display : 'flex' , gap : 8 , marginBottom : 20 , flexWrap : 'wrap' , alignItems : 'center' } } >
60- < select value = { sort } onChange = { e => { setSort ( e . target . value ) ; loadMarkets ( query || undefined , activeTag || undefined ) } }
66+ < select value = { sort } onChange = { e => { setSort ( e . target . value ) ; doSearch ( query || undefined , activeTag || undefined , e . target . value ) } }
6167 style = { { padding : '4px 10px' , borderRadius : 16 , border : '1px solid #ddd' , fontSize : '0.8em' } } >
6268 < option value = "volume" > Sort: Volume</ option >
6369 < option value = "liquidity" > Sort: Liquidity</ option >
@@ -77,7 +83,7 @@ export default function Markets() {
7783 < div style = { { display : 'grid' , gridTemplateColumns : '1fr 1fr' , gap : 16 } } >
7884 < MarketList markets = { markets } selected = { selected } onSelect = { setSelected } />
7985 { selected ? (
80- < TradePanel market = { selected } onTradeComplete = { ( ) => loadMarkets ( query || undefined , activeTag || undefined ) } />
86+ < TradePanel market = { selected } onTradeComplete = { ( ) => doSearch ( query || undefined , activeTag || undefined ) } />
8187 ) : (
8288 < div style = { { background : 'white' , borderRadius : 8 , padding : 40 , textAlign : 'center' , color : '#888' , boxShadow : '0 1px 3px rgba(0,0,0,0.08)' } } >
8389 Select a market to trade
0 commit comments