{
  "name": "social-hooks-usecontextualposts",
  "type": "registry:hook",
  "dependencies": [
    "@tanstack/react-query",
    "bmap-api-types"
  ],
  "devDependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "components/social/hooks/useContextualPosts.ts",
      "type": "registry:hook",
      "content": "\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { PostsResponse } from \"bmap-api-types\";\nimport { useApiClient } from \"./useApiClient.js\";\n\nexport interface UseContextualPostsOptions {\n\tcontextType: \"tx\" | \"url\" | \"channel\";\n\tcontextValue: string;\n\tpage?: number;\n\tlimit?: number;\n\tenabled?: boolean;\n}\n\nexport interface UseContextualPostsResult {\n\tposts: PostsResponse | null;\n\tisLoading: boolean;\n\terror: Error | null;\n\trefetch: () => void;\n}\n\n/**\n * Hook for fetching posts/comments in a specific context\n *\n * This enables displaying comments on albums, tracks, or any content\n * by providing a context type and value.\n *\n * @example\n * ```tsx\n * // Fetch comments for an album by transaction ID\n * const { posts } = useContextualPosts({\n *   contextType: 'tx',\n *   contextValue: albumTxId\n * });\n *\n * // Fetch comments for a URL\n * const { posts } = useContextualPosts({\n *   contextType: 'url',\n *   contextValue: 'https://jamify.com/album/chromakopia'\n * });\n * ```\n */\nexport function useContextualPosts({\n\tcontextType,\n\tcontextValue,\n\tpage = 1,\n\tlimit = 20,\n\tenabled = true,\n}: UseContextualPostsOptions): UseContextualPostsResult {\n\tconst apiClient = useApiClient();\n\n\tconst {\n\t\tdata: posts = null,\n\t\tisLoading,\n\t\terror,\n\t\trefetch,\n\t} = useQuery<PostsResponse | null, Error>({\n\t\tqueryKey: [\"contextual-posts\", contextType, contextValue, page, limit],\n\t\tqueryFn: async () => {\n\t\t\tif (!contextValue) return null;\n\n\t\t\t// The BMAP API doesn't have a direct endpoint for contextual posts yet,\n\t\t\t// so we'll use the search endpoint with context filtering\n\t\t\t// In a real implementation, you'd have an endpoint like:\n\t\t\t// GET /social/post/context/{type}/{value}\n\n\t\t\t// For now, we'll use the search endpoint and filter client-side\n\t\t\t// This is a placeholder - the actual API would need to support context queries\n\t\t\tconst searchResults = await apiClient.posts.search({\n\t\t\t\tq: contextValue, // SearchParams expects 'q' not 'query'\n\t\t\t\toffset: (page - 1) * limit,\n\t\t\t\tlimit: limit * 2, // Get more to account for filtering\n\t\t\t});\n\n\t\t\tif (!searchResults) return null;\n\n\t\t\t// Filter posts that have matching context\n\t\t\t// Note: This is a client-side filter - ideally the API would do this\n\t\t\tconst filteredResults = searchResults.results.filter((post) => {\n\t\t\t\tconst mapData = post.MAP?.[0];\n\t\t\t\tif (!mapData) return false;\n\n\t\t\t\t// Check if the post has context data\n\t\t\t\t// The MAP protocol stores context as key-value pairs\n\t\t\t\tconst contextKey = `context.${contextType}`;\n\t\t\t\treturn mapData[contextKey] === contextValue;\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...searchResults,\n\t\t\t\tresults: filteredResults.slice(0, limit),\n\t\t\t\tcount: filteredResults.length,\n\t\t\t};\n\t\t},\n\t\tenabled: enabled && !!contextValue,\n\t\tstaleTime: 1000 * 60 * 2, // 2 minutes\n\t});\n\n\treturn { posts, isLoading, error: error as Error | null, refetch };\n}\n",
      "target": "<%- config.aliases.hooks %>/usecontextualposts.ts"
    }
  ]
}