UNPKG

bigblocks

Version:

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

91 lines (90 loc) 3.24 kB
// useSocialMessage Hook - Send messages on Bitcoin import { useMutation } from "@tanstack/react-query"; import { useBitcoinAuth } from "../../../hooks/useBitcoinAuth.js"; import { broadcastSocialTransaction } from "../../../lib/broadcast"; import { SocialActions } from "../../../lib/protocol"; export function useSocialMessage(options = {}) { const { app = "bigblocks", onSuccess, onError } = options; const { user } = useBitcoinAuth(); const mutation = useMutation({ mutationFn: async ({ recipient, content, encrypted = false, channel }) => { if (!user) { throw { code: "UNAUTHORIZED", message: "User must be authenticated to send messages", }; } if (!content.trim()) { throw { code: "INVALID_CONTENT", message: "Message content cannot be empty", }; } if (!recipient && !channel) { throw { code: "INVALID_CONTENT", message: "Message must have a recipient or channel", }; } if (content.length > 1000) { throw { code: "CONTENT_TOO_LONG", message: "Message content exceeds maximum length", }; } try { const signingKey = user.signingKey; if (!signingKey) { throw { code: "UNAUTHORIZED", message: "No signing key available", }; } // Build message transaction const signedTransaction = await SocialActions.message({ content: content.trim(), recipient, channel, encrypted, app, }); // Broadcast to Bitcoin network const result = await broadcastSocialTransaction(signedTransaction); if (!result.success) { throw { code: "BROADCAST_FAILED", message: result.error || "Failed to broadcast message", }; } return result; } catch (error) { if (error.code) { throw error; } throw { code: "TRANSACTION_FAILED", message: "Failed to create message transaction", details: error, }; } }, onSuccess: (data) => { onSuccess?.(data); }, onError: (error) => { console.error("Send message failed:", error); onError?.(error); }, }); return { mutate: mutation.mutate, mutateAsync: mutation.mutateAsync, isLoading: mutation.isPending, isError: mutation.isError, isSuccess: mutation.isSuccess, error: mutation.error, data: mutation.data, reset: mutation.reset, }; }