11"use client" ;
22
33import { BoxIcon , CheckCheckIcon , ReceiptTextIcon , UserPenIcon , XIcon } from "lucide-react" ;
4+ import { parseAsString , useQueryState } from "nuqs" ;
45import React , { useEffect , useMemo , useState } from "react" ;
56import { useInView } from "react-intersection-observer" ;
67import { ExpandedState , flexRender , getCoreRowModel , getExpandedRowModel , useReactTable } from "@tanstack/react-table" ;
@@ -122,13 +123,12 @@ export function TransactionsTable() {
122123 const { data : indexedTransactions , fetchNextPage } = useTransactionsQuery ( ) ;
123124 const loadedInitialTransactions = Array . isArray ( indexedTransactions ) && indexedTransactions . length > 0 ;
124125 const [ expanded , setExpanded ] = useState < ExpandedState > ( { } ) ;
125- const [ filters , setFilters ] = useState ( {
126- blockNumber : "" ,
127- from : "" ,
128- calls : "" ,
129- hash : "" ,
130- timestamp : "" ,
131- } ) ;
126+
127+ const [ blockNumberFilter , setBlockNumberFilter ] = useQueryState ( "blockNumber" , parseAsString . withDefault ( "" ) ) ;
128+ const [ fromFilter , setFromFilter ] = useQueryState ( "from" , parseAsString . withDefault ( "" ) ) ;
129+ const [ callsFilter , setCallsFilter ] = useQueryState ( "calls" , parseAsString . withDefault ( "" ) ) ;
130+ const [ hashFilter , setHashFilter ] = useQueryState ( "hash" , parseAsString . withDefault ( "" ) ) ;
131+ const [ timestampFilter , setTimestampFilter ] = useQueryState ( "timestamp" , parseAsString . withDefault ( "" ) ) ;
132132
133133 useEffect ( ( ) => {
134134 if ( inView ) {
@@ -139,27 +139,27 @@ export function TransactionsTable() {
139139 // Filter transactions based on filter values
140140 const filteredTransactions = useMemo ( ( ) => {
141141 return transactions . filter ( ( transaction ) => {
142- if ( filters . blockNumber && ! transaction . blockNumber ?. toString ( ) . includes ( filters . blockNumber ) ) {
142+ if ( blockNumberFilter && ! transaction . blockNumber ?. toString ( ) . includes ( blockNumberFilter ) ) {
143143 return false ;
144144 }
145- if ( filters . from && ! transaction . from ?. toLowerCase ( ) . includes ( filters . from . toLowerCase ( ) ) ) {
145+ if ( fromFilter && ! transaction . from ?. toLowerCase ( ) . includes ( fromFilter . toLowerCase ( ) ) ) {
146146 return false ;
147147 }
148148 if (
149- filters . calls &&
150- ! transaction . calls ?. some ( ( call ) => call . functionName ?. toLowerCase ( ) . includes ( filters . calls . toLowerCase ( ) ) )
149+ callsFilter &&
150+ ! transaction . calls ?. some ( ( call ) => call . functionName ?. toLowerCase ( ) . includes ( callsFilter . toLowerCase ( ) ) )
151151 ) {
152152 return false ;
153153 }
154- if ( filters . hash && ! transaction . hash ?. toLowerCase ( ) . includes ( filters . hash . toLowerCase ( ) ) ) {
154+ if ( hashFilter && ! transaction . hash ?. toLowerCase ( ) . includes ( hashFilter . toLowerCase ( ) ) ) {
155155 return false ;
156156 }
157- if ( filters . timestamp && ! transaction . timestamp ?. toString ( ) . includes ( filters . timestamp ) ) {
157+ if ( timestampFilter && ! transaction . timestamp ?. toString ( ) . includes ( timestampFilter ) ) {
158158 return false ;
159159 }
160160 return true ;
161161 } ) ;
162- } , [ transactions , filters ] ) ;
162+ } , [ transactions , blockNumberFilter , fromFilter , callsFilter , hashFilter , timestampFilter ] ) ;
163163
164164 const table = useReactTable ( {
165165 data : filteredTransactions ,
@@ -181,44 +181,44 @@ export function TransactionsTable() {
181181 < label className = "text-xs font-medium uppercase text-muted-foreground" > Block</ label >
182182 < Input
183183 placeholder = "Filter block..."
184- value = { filters . blockNumber }
185- onChange = { ( e ) => setFilters ( ( prev ) => ( { ... prev , blockNumber : e . target . value } ) ) }
184+ value = { blockNumberFilter }
185+ onChange = { ( e ) => setBlockNumberFilter ( e . target . value ) }
186186 className = "h-8 text-xs"
187187 />
188188 </ div >
189189 < div className = "space-y-2" >
190190 < label className = "text-xs font-medium uppercase text-muted-foreground" > From</ label >
191191 < Input
192192 placeholder = "Filter address..."
193- value = { filters . from }
194- onChange = { ( e ) => setFilters ( ( prev ) => ( { ... prev , from : e . target . value } ) ) }
193+ value = { fromFilter }
194+ onChange = { ( e ) => setFromFilter ( e . target . value ) }
195195 className = "h-8 text-xs"
196196 />
197197 </ div >
198198 < div className = "space-y-2" >
199199 < label className = "text-xs font-medium uppercase text-muted-foreground" > Functions</ label >
200200 < Input
201201 placeholder = "Filter functions..."
202- value = { filters . calls }
203- onChange = { ( e ) => setFilters ( ( prev ) => ( { ... prev , calls : e . target . value } ) ) }
202+ value = { callsFilter }
203+ onChange = { ( e ) => setCallsFilter ( e . target . value ) }
204204 className = "h-8 text-xs"
205205 />
206206 </ div >
207207 < div className = "space-y-2" >
208208 < label className = "text-xs font-medium uppercase text-muted-foreground" > Tx Hash</ label >
209209 < Input
210210 placeholder = "Filter hash..."
211- value = { filters . hash }
212- onChange = { ( e ) => setFilters ( ( prev ) => ( { ... prev , hash : e . target . value } ) ) }
211+ value = { hashFilter }
212+ onChange = { ( e ) => setHashFilter ( e . target . value ) }
213213 className = "h-8 text-xs"
214214 />
215215 </ div >
216216 < div className = "space-y-2" >
217217 < label className = "text-xs font-medium uppercase text-muted-foreground" > Time</ label >
218218 < Input
219219 placeholder = "Filter time..."
220- value = { filters . timestamp }
221- onChange = { ( e ) => setFilters ( ( prev ) => ( { ... prev , timestamp : e . target . value } ) ) }
220+ value = { timestampFilter }
221+ onChange = { ( e ) => setTimestampFilter ( e . target . value ) }
222222 className = "h-8 text-xs"
223223 />
224224 </ div >
0 commit comments