bigblocks
Version:
Complete Bitcoin UI component library - authentication, social, wallet, market, inscriptions, and blockchain interactions for React
91 lines (90 loc) • 3.24 kB
JavaScript
// 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,
};
}