bigblocks
Version:
Complete Bitcoin UI component library - authentication, social, wallet, market, inscriptions, and blockchain interactions for React
18 lines • 3.19 kB
JSON
{
"name": "social-hooks-usefetchtransaction",
"type": "registry:hook",
"dependencies": [
"@tanstack/react-query",
"bmap-api-types"
],
"devDependencies": [],
"registryDependencies": [],
"files": [
{
"path": "components/social/hooks/useFetchTransaction.ts",
"type": "registry:hook",
"content": "// useFetchTransaction Hook - Generic transaction fetcher for any BSV transaction\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { FollowTransaction, UnfollowTransaction } from \"bmap-api-types\";\nimport { ApiError } from \"../../../lib/api-error.js\";\nimport { useApiClient } from \"./useApiClient.js\";\n\n// Union type for all possible transaction types\nexport type SocialTransaction = FollowTransaction | UnfollowTransaction;\n\ninterface UseFetchTransactionOptions {\n\ttxid: string;\n\tenabled?: boolean;\n\ttype?: \"follow\" | \"unfollow\" | \"auto\"; // 'auto' will determine from transaction data\n}\n\ninterface UseFetchTransactionResult {\n\ttransaction: SocialTransaction | null;\n\tisLoading: boolean;\n\terror: ApiError | null;\n\trefetch: () => void;\n}\n\n/**\n * Generic hook for fetching any BSV transaction with social protocol data\n * Useful for getting full transaction details after performing social actions\n */\nexport function useFetchTransaction({\n\ttxid,\n\tenabled = true,\n\ttype = \"auto\",\n}: UseFetchTransactionOptions): UseFetchTransactionResult {\n\tconst apiClient = useApiClient();\n\n\tconst {\n\t\tdata: transaction = null,\n\t\tisLoading,\n\t\terror,\n\t\trefetch,\n\t} = useQuery<SocialTransaction | null, ApiError>({\n\t\tqueryKey: [\"transaction\", txid, type],\n\t\tqueryFn: async () => {\n\t\t\tif (!txid) return null;\n\n\t\t\ttry {\n\t\t\t\t// If specific type is requested, use dedicated endpoint\n\t\t\t\tif (type === \"follow\") {\n\t\t\t\t\treturn await apiClient.transactions.follow(txid);\n\t\t\t\t}\n\n\t\t\t\tif (type === \"unfollow\") {\n\t\t\t\t\treturn await apiClient.transactions.unfollow(txid);\n\t\t\t\t}\n\n\t\t\t\t// For 'auto' type, use generic transaction fetcher\n\t\t\t\t// Note: The API returns BaseTransaction, but we need to cast it to our specific types\n\t\t\t\tconst tx = await apiClient.transactions.single(txid);\n\t\t\t\treturn tx as SocialTransaction;\n\t\t\t} catch (error) {\n\t\t\t\tthrow ApiError.fromError(error, \"NETWORK_ERROR\");\n\t\t\t}\n\t\t},\n\t\tenabled: enabled && !!txid,\n\t\tstaleTime: 1000 * 60 * 5, // 5 minutes - transactions are immutable\n\t\trefetchOnWindowFocus: false, // No need to refetch immutable data\n\t});\n\n\treturn {\n\t\ttransaction,\n\t\tisLoading,\n\t\terror: error || null,\n\t\trefetch,\n\t};\n}\n\n/**\n * Hook specifically for fetching follow transactions\n */\nexport function useFetchFollowTransaction(txid: string, enabled = true) {\n\treturn useFetchTransaction({ txid, type: \"follow\", enabled });\n}\n\n/**\n * Hook specifically for fetching unfollow transactions\n */\nexport function useFetchUnfollowTransaction(txid: string, enabled = true) {\n\treturn useFetchTransaction({ txid, type: \"unfollow\", enabled });\n}\n",
"target": "<%- config.aliases.hooks %>/usefetchtransaction.ts"
}
]
}