UNPKG

bigblocks

Version:

Complete Bitcoin UI component library - authentication, social, wallet, market, inscriptions, and blockchain interactions for React

17 lines 3.83 kB
{ "name": "social-hooks-usesocialmessage", "type": "registry:hook", "dependencies": [ "@tanstack/react-query" ], "devDependencies": [], "registryDependencies": [], "files": [ { "path": "components/social/hooks/useSocialMessage.ts", "type": "registry:hook", "content": "// useSocialMessage Hook - Send messages on Bitcoin\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useBitcoinAuth } from \"../../../hooks/useBitcoinAuth.js\";\nimport { broadcastSocialTransaction } from \"../../../lib/broadcast\";\nimport { SocialActions } from \"../../../lib/protocol\";\nimport type {\n\tMessageMutationData,\n\tUseSendMessageResult,\n} from \"../types/hooks.js\";\nimport type {\n\tAuthUserWithSigning,\n\tBroadcastResult,\n\tSocialError,\n} from \"../types/social.js\";\n\ninterface UseSocialMessageOptions {\n\tapp?: string;\n\tonSuccess?: (result: BroadcastResult) => void;\n\tonError?: (error: SocialError) => void;\n}\n\nexport function useSocialMessage(\n\toptions: UseSocialMessageOptions = {},\n): UseSendMessageResult {\n\tconst { app = \"bigblocks\", onSuccess, onError } = options;\n\tconst { user } = useBitcoinAuth();\n\n\tconst mutation = useMutation<\n\t\tBroadcastResult,\n\t\tSocialError,\n\t\tMessageMutationData\n\t>({\n\t\tmutationFn: async ({ recipient, content, encrypted = false, channel }) => {\n\t\t\tif (!user) {\n\t\t\t\tthrow {\n\t\t\t\t\tcode: \"UNAUTHORIZED\",\n\t\t\t\t\tmessage: \"User must be authenticated to send messages\",\n\t\t\t\t} as SocialError;\n\t\t\t}\n\n\t\t\tif (!content.trim()) {\n\t\t\t\tthrow {\n\t\t\t\t\tcode: \"INVALID_CONTENT\",\n\t\t\t\t\tmessage: \"Message content cannot be empty\",\n\t\t\t\t} as SocialError;\n\t\t\t}\n\n\t\t\tif (!recipient && !channel) {\n\t\t\t\tthrow {\n\t\t\t\t\tcode: \"INVALID_CONTENT\",\n\t\t\t\t\tmessage: \"Message must have a recipient or channel\",\n\t\t\t\t} as SocialError;\n\t\t\t}\n\n\t\t\tif (content.length > 1000) {\n\t\t\t\tthrow {\n\t\t\t\t\tcode: \"CONTENT_TOO_LONG\",\n\t\t\t\t\tmessage: \"Message content exceeds maximum length\",\n\t\t\t\t} as SocialError;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst signingKey = (user as AuthUserWithSigning).signingKey;\n\t\t\t\tif (!signingKey) {\n\t\t\t\t\tthrow {\n\t\t\t\t\t\tcode: \"UNAUTHORIZED\",\n\t\t\t\t\t\tmessage: \"No signing key available\",\n\t\t\t\t\t} as SocialError;\n\t\t\t\t}\n\n\t\t\t\t// Build message transaction\n\t\t\t\tconst signedTransaction = await SocialActions.message({\n\t\t\t\t\tcontent: content.trim(),\n\t\t\t\t\trecipient,\n\t\t\t\t\tchannel,\n\t\t\t\t\tencrypted,\n\t\t\t\t\tapp,\n\t\t\t\t});\n\n\t\t\t\t// Broadcast to Bitcoin network\n\t\t\t\tconst result = await broadcastSocialTransaction(signedTransaction);\n\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tthrow {\n\t\t\t\t\t\tcode: \"BROADCAST_FAILED\",\n\t\t\t\t\t\tmessage: result.error || \"Failed to broadcast message\",\n\t\t\t\t\t} as SocialError;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as SocialError).code) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\n\t\t\t\tthrow {\n\t\t\t\t\tcode: \"TRANSACTION_FAILED\",\n\t\t\t\t\tmessage: \"Failed to create message transaction\",\n\t\t\t\t\tdetails: error,\n\t\t\t\t} as SocialError;\n\t\t\t}\n\t\t},\n\t\tonSuccess: (data) => {\n\t\t\tonSuccess?.(data);\n\t\t},\n\t\tonError: (error) => {\n\t\t\tconsole.error(\"Send message failed:\", error);\n\t\t\tonError?.(error);\n\t\t},\n\t});\n\n\treturn {\n\t\tmutate: mutation.mutate,\n\t\tmutateAsync: mutation.mutateAsync,\n\t\tisLoading: mutation.isPending,\n\t\tisError: mutation.isError,\n\t\tisSuccess: mutation.isSuccess,\n\t\terror: mutation.error,\n\t\tdata: mutation.data,\n\t\treset: mutation.reset,\n\t} as UseSendMessageResult;\n}\n", "target": "<%- config.aliases.hooks %>/usesocialmessage.ts" } ] }