Files
explorer-monorepo/frontend/src/hooks/useBlockTransactions.ts
2026-04-16 14:48:30 -07:00

78 lines
1.8 KiB
TypeScript

import { useCallback, useEffect, useState } from 'react'
import { transactionsApi, type Transaction } from '@/services/api/transactions'
const DEFAULT_BLOCK_TRANSACTION_PAGE_SIZE = 25
interface UseBlockTransactionsOptions {
blockNumber: number
chainId: number
enabled: boolean
}
export function useBlockTransactions({ blockNumber, chainId, enabled }: UseBlockTransactionsOptions) {
const [transactions, setTransactions] = useState<Transaction[]>([])
const [loading, setLoading] = useState(true)
const [error, setError] = useState(false)
const [hasNextPage, setHasNextPage] = useState(false)
const [page, setPage] = useState(1)
const loadTransactions = useCallback(async () => {
if (!enabled) {
setTransactions([])
setLoading(false)
setError(false)
setHasNextPage(false)
return
}
setLoading(true)
setError(false)
try {
const result = await transactionsApi.listByBlockSafe(
chainId,
blockNumber,
page,
DEFAULT_BLOCK_TRANSACTION_PAGE_SIZE,
)
setTransactions(result.items)
setHasNextPage(result.hasNextPage)
setError(!result.ok)
} catch (loadError) {
console.error('Failed to load block transactions:', loadError)
setTransactions([])
setHasNextPage(false)
setError(true)
} finally {
setLoading(false)
}
}, [blockNumber, chainId, enabled, page])
useEffect(() => {
if (!enabled) {
setPage(1)
setTransactions([])
setLoading(false)
setError(false)
setHasNextPage(false)
return
}
setPage(1)
}, [blockNumber, enabled])
useEffect(() => {
void loadTransactions()
}, [loadTransactions])
return {
transactions,
loading,
error,
hasNextPage,
page,
setPage,
}
}