UNPKG

ao-message-signer

Version:

A React component for signing messages with AO Protocol

199 lines (188 loc) 9.05 kB
import React, { useState, useEffect } from 'react'; import { createDataItemSigner, message } from '@permaweb/aoconnect'; /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; var AOMessageSigner = function (_a) { var processId = _a.processId, _b = _a.className, className = _b === void 0 ? "" : _b, _c = _a.style, style = _c === void 0 ? {} : _c, _d = _a.theme, theme = _d === void 0 ? 'light' : _d; var _e = useState(""), messageContent = _e[0], setMessageContent = _e[1]; var _f = useState(null), responseText = _f[0], setResponseText = _f[1]; var _g = useState(false), loading = _g[0], setLoading = _g[1]; var _h = useState(null), error = _h[0], setError = _h[1]; useEffect(function () { if (!window.arweaveWallet) { setError("ArConnect wallet not detected. Please install ArConnect to use this feature."); } }, []); var sendMessageToAO = function () { return __awaiter(void 0, void 0, void 0, function () { var signer, result, err_1; return __generator(this, function (_a) { switch (_a.label) { case 0: setLoading(true); setResponseText(null); setError(null); _a.label = 1; case 1: _a.trys.push([1, 3, 4, 5]); signer = createDataItemSigner(window.arweaveWallet); return [4 /*yield*/, message({ process: processId, tags: [{ name: "Action", value: "Sign" }], signer: signer, data: messageContent || "Random generated message" })]; case 2: result = _a.sent(); setResponseText(JSON.stringify(result, null, 2)); return [3 /*break*/, 5]; case 3: err_1 = _a.sent(); console.error("Error sending message:", err_1); setError("Failed to send message. Please check your wallet connection and try again."); return [3 /*break*/, 5]; case 4: setLoading(false); return [7 /*endfinally*/]; case 5: return [2 /*return*/]; } }); }); }; var baseClasses = { container: "max-w-md mx-auto rounded-lg shadow-lg transition-all duration-200 ".concat(theme === 'dark' ? 'bg-gray-800 text-white' : 'bg-white text-gray-800'), header: "text-xl font-bold mb-4 pb-2 ".concat(theme === 'dark' ? 'border-b border-gray-700' : 'border-b border-gray-200'), input: "w-full px-4 py-2 mb-4 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 ".concat(theme === 'dark' ? 'bg-gray-700 border-gray-600 focus:ring-blue-500 text-white' : 'bg-gray-50 border border-gray-300 focus:ring-blue-500'), button: "w-full px-4 py-2 rounded-md font-medium transition-all duration-200 ".concat(loading ? 'bg-gray-500 cursor-not-allowed' : theme === 'dark' ? 'bg-blue-600 hover:bg-blue-700 text-white' : 'bg-blue-500 hover:bg-blue-600 text-white'), response: "mt-4 p-4 rounded-md overflow-auto ".concat(theme === 'dark' ? 'bg-gray-700' : 'bg-gray-50'), error: "mt-4 p-4 rounded-md bg-red-100 text-red-700 ".concat(theme === 'dark' ? 'bg-red-900 text-red-100' : 'bg-red-100 text-red-700') }; return React.createElement("div", { className: "".concat(baseClasses.container, " ").concat(className), style: __assign({ padding: '1.5rem' }, style) }, React.createElement("h2", { className: baseClasses.header }, "AO Message Signer"), error && React.createElement("div", { className: baseClasses.error }, error), React.createElement("input", { className: baseClasses.input, type: "text", value: messageContent, placeholder: "Enter message to sign", onChange: function (e) { return setMessageContent(e.target.value); }, disabled: loading }), React.createElement("button", { className: baseClasses.button, onClick: sendMessageToAO, disabled: loading || !messageContent.trim() }, loading ? React.createElement("div", { className: "flex items-center justify-center" }, React.createElement("svg", { className: "animate-spin -ml-1 mr-3 h-5 w-5 text-white", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, React.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), React.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })), "Signing...") : "Send to AO"), responseText && React.createElement("div", { className: baseClasses.response }, React.createElement("div", { className: "font-semibold mb-2" }, "Response:"), React.createElement("pre", { className: "whitespace-pre-wrap break-words text-sm" }, responseText))); }; export { AOMessageSigner }; //# sourceMappingURL=index.esm.js.map