| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import { useQuery } from '@tanstack/react-query'; |
| import { api } from '../services/api'; |
| import { useAppStore } from '../store/appStore'; |
|
|
| type DataBusChain = |
| | 'token_price' |
| | 'market_overview' |
| | 'trending' |
| | 'alerts' |
| | 'news' |
| | 'wallet_labels' |
| | 'wallet_tokens' |
| | 'wallet_nfts' |
| | 'token_metadata' |
| | 'scanner' |
| | 'rag_search' |
| | 'holder_data' |
| | 'cross_chain' |
| | 'tx_trace'; |
|
|
| interface DataBusParams { |
| |
| mint?: string; |
| token?: string; |
| contract?: string; |
| |
| address?: string; |
| wallet?: string; |
| |
| chain?: string; |
| network?: string; |
| |
| query?: string; |
| collection?: string; |
| |
| limit?: number; |
| offset?: number; |
| |
| timeframe?: string; |
| |
| tx_hash?: string; |
| |
| [key: string]: any; |
| } |
|
|
| interface DataBusResult<T = any> { |
| data_type: string; |
| provider: string; |
| cached: boolean; |
| latency_ms: number; |
| result: T; |
| metadata?: { |
| tier: string; |
| credits_remaining?: number; |
| rate_limit_remaining?: number; |
| }; |
| } |
|
|
| |
| |
| |
| |
| export function useDataBus<T = any>( |
| dataType: DataBusChain | null, |
| params: DataBusParams = {}, |
| options?: { |
| enabled?: boolean; |
| refetchInterval?: number; |
| staleTime?: number; |
| forceFresh?: boolean; |
| } |
| ) { |
| const user = useAppStore((state) => state.user); |
| const tier = user?.tier || 'FREE'; |
|
|
| return useQuery<DataBusResult<T>>({ |
| queryKey: ['databus', dataType, params], |
| queryFn: async () => { |
| if (!dataType) return null; |
| const result = await api.databusFetch(dataType, { |
| ...params, |
| consumer_type: 'authenticated', |
| x402_tier: tier, |
| ...(options?.forceFresh ? { force_fresh: true } : {}), |
| }); |
| return result; |
| }, |
| enabled: !!dataType && (options?.enabled !== false), |
| staleTime: options?.staleTime ?? getDefaultStaleTime(dataType), |
| gcTime: 10 * 60 * 1000, |
| refetchInterval: options?.refetchInterval, |
| }); |
| } |
|
|
| |
| function getDefaultStaleTime(dataType: DataBusChain | null): number { |
| switch (dataType) { |
| case 'token_price': |
| case 'market_overview': |
| case 'trending': |
| return 5 * 60 * 1000; |
| case 'holder_data': |
| case 'wallet_tokens': |
| case 'wallet_nfts': |
| case 'token_metadata': |
| case 'cross_chain': |
| return 60 * 60 * 1000; |
| case 'tx_trace': |
| return 24 * 60 * 60 * 1000; |
| case 'alerts': |
| case 'news': |
| return 60 * 1000; |
| default: |
| return 2 * 60 * 1000; |
| } |
| } |
|
|
| |
| |
| |
| export function useDataBusBatch<T = any>( |
| queries: Array<{ data_type: DataBusChain; params?: DataBusParams }>, |
| options?: { enabled?: boolean; refetchInterval?: number } |
| ) { |
| const user = useAppStore((state) => state.user); |
| const tier = user?.tier || 'FREE'; |
|
|
| return useQuery<DataBusResult<T>[]>({ |
| queryKey: ['databus', 'batch', queries], |
| queryFn: async () => { |
| const results = await api.databusBatch( |
| queries.map((q) => ({ |
| data_type: q.data_type, |
| params: { ...q.params, consumer_type: 'authenticated', x402_tier: tier }, |
| })) |
| ); |
| return results; |
| }, |
| enabled: options?.enabled !== false && queries.length > 0, |
| staleTime: 60 * 1000, |
| gcTime: 5 * 60 * 1000, |
| refetchInterval: options?.refetchInterval, |
| }); |
| } |
|
|
| |
| |
| |
| export function useDataBusChains() { |
| return useQuery({ |
| queryKey: ['databus', 'chains'], |
| queryFn: () => api.databusChains(), |
| staleTime: 10 * 60 * 1000, |
| gcTime: 30 * 60 * 1000, |
| }); |
| } |
|
|
| |
| |
| |
| export function useDataBusHealth() { |
| return useQuery({ |
| queryKey: ['databus', 'health'], |
| queryFn: () => api.databusHealth(), |
| refetchInterval: 60000, |
| staleTime: 30000, |
| }); |
| } |
|
|