11"use client" ;
22
3- import { useState , useEffect , useCallback , useRef , useMemo } from "react" ;
3+ import { useState , useEffect , useRef , useMemo } from "react" ;
44import { useWalletStore } from "@/stores/walletStore" ;
55import type { ProcessedMarket } from "@/types" ;
66import {
@@ -22,50 +22,56 @@ export default function OpenOrdersPanel({ markets, onSelectMarket }: OpenOrdersP
2222 const [ loading , setLoading ] = useState ( false ) ;
2323 const [ cancellingIds , setCancellingIds ] = useState < Set < string > > ( new Set ( ) ) ;
2424 const [ cancellingAll , setCancellingAll ] = useState ( false ) ;
25- const intervalRef = useRef < ReturnType < typeof setInterval > | null > ( null ) ;
25+ const sessionTokenRef = useRef ( tradeSession ?. sessionToken ) ;
26+ sessionTokenRef . current = tradeSession ?. sessionToken ;
2627
27- const refresh = useCallback ( async ( ) => {
28- if ( ! tradeSession ?. sessionToken ) return ;
28+ const refresh = async ( ) => {
29+ const token = sessionTokenRef . current ;
30+ if ( ! token ) return ;
2931 setLoading ( true ) ;
3032 try {
31- const result = await fetchOpenOrders ( tradeSession . sessionToken ) ;
33+ const result = await fetchOpenOrders ( token ) ;
3234 setOrders ( result ) ;
3335 } catch { /* ignore */ }
3436 setLoading ( false ) ;
35- } , [ tradeSession ?. sessionToken ] ) ;
37+ } ;
38+ const refreshRef = useRef ( refresh ) ;
39+ refreshRef . current = refresh ;
3640
3741 // Poll every 15s
3842 useEffect ( ( ) => {
3943 if ( ! tradeSession ?. sessionToken ) { setOrders ( [ ] ) ; return ; }
40- void refresh ( ) ;
41- intervalRef . current = setInterval ( refresh , 15_000 ) ;
42- return ( ) => { if ( intervalRef . current ) clearInterval ( intervalRef . current ) ; } ;
43- } , [ tradeSession ?. sessionToken , refresh ] ) ;
44+ void refreshRef . current ( ) ;
45+ const iv = setInterval ( ( ) => { void refreshRef . current ( ) ; } , 15_000 ) ;
46+ return ( ) => clearInterval ( iv ) ;
47+ } , [ tradeSession ?. sessionToken ] ) ;
4448
4549 // Listen for order-placed events
4650 useEffect ( ( ) => {
47- const handler = ( ) => { void refresh ( ) ; } ;
51+ const handler = ( ) => { void refreshRef . current ( ) ; } ;
4852 window . addEventListener ( "polyworld:order-placed" , handler ) ;
4953 return ( ) => window . removeEventListener ( "polyworld:order-placed" , handler ) ;
50- } , [ refresh ] ) ;
54+ } , [ ] ) ;
5155
52- const handleCancel = useCallback ( async ( orderId : string ) => {
53- if ( ! tradeSession ?. sessionToken ) return ;
56+ const handleCancel = async ( orderId : string ) => {
57+ const token = sessionTokenRef . current ;
58+ if ( ! token ) return ;
5459 setCancellingIds ( ( s ) => new Set ( s ) . add ( orderId ) ) ;
5560 try {
56- await cancelOpenOrder ( orderId , tradeSession . sessionToken ) ;
61+ await cancelOpenOrder ( orderId , token ) ;
5762 setOrders ( ( prev ) => prev . filter ( ( o ) => o . id !== orderId ) ) ;
5863 } catch { /* ignore */ }
5964 setCancellingIds ( ( s ) => { const n = new Set ( s ) ; n . delete ( orderId ) ; return n ; } ) ;
60- } , [ tradeSession ?. sessionToken ] ) ;
65+ } ;
6166
62- const handleCancelAll = useCallback ( async ( ) => {
63- if ( ! tradeSession ?. sessionToken || orders . length === 0 ) return ;
67+ const handleCancelAll = async ( ) => {
68+ const token = sessionTokenRef . current ;
69+ if ( ! token || orders . length === 0 ) return ;
6470 setCancellingAll ( true ) ;
65- await cancelAllOpenOrders ( orders . map ( ( o ) => o . id ) , tradeSession . sessionToken ) ;
66- await refresh ( ) ;
71+ await cancelAllOpenOrders ( orders . map ( ( o ) => o . id ) , token ) ;
72+ await refreshRef . current ( ) ;
6773 setCancellingAll ( false ) ;
68- } , [ tradeSession ?. sessionToken , orders , refresh ] ) ;
74+ } ;
6975
7076 const tokenIndex = useMemo ( ( ) => buildTokenIndex ( markets ) , [ markets ] ) ;
7177 const resolved = useMemo (
0 commit comments