UNPKG

enclave-wallet-sdk

Version:

A simple enclave wallet SDK for React applications

260 lines (259 loc) 14 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (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()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "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 }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var lucide_react_1 = require("lucide-react"); var react_1 = __importStar(require("react")); var CryptoBalanceContext_1 = require("../../context/CryptoBalanceContext"); var utils_1 = require("../utils"); var addressValidation_1 = require("../../services/addressValidation"); var Spinner_1 = __importDefault(require("../Spinner")); function RecipientSearch(_a) { var _this = this; var _b; var recipient = _a.recipient, setRecipient = _a.setRecipient, handleBackFromRecipient = _a.handleBackFromRecipient, setStep = _a.setStep, sendToUser = _a.sendToUser, setSendToUser = _a.setSendToUser, setAddressToSend = _a.setAddressToSend, walletSdkKey = _a.walletSdkKey; var refreshBalance = (0, CryptoBalanceContext_1.useCryptoBalance)().refreshBalance; var _c = (0, react_1.useState)(false), usernamecheckLoading = _c[0], setUsernamecheckLoading = _c[1]; var handleUsernameCheck = (0, react_1.useCallback)(function (value) { return __awaiter(_this, void 0, void 0, function () { var res; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!(value && value.length > 0)) return [3 /*break*/, 2]; setUsernamecheckLoading(true); console.log("Validating input:", value); return [4 /*yield*/, (0, addressValidation_1.lookupUser)(value, walletSdkKey)]; case 1: res = _a.sent(); console.log("Lookup result:", res); if ((res === null || res === void 0 ? void 0 : res.status) === 1) { console.log("Setting valid user data:", res); setSendToUser({ status: true, username: res.username, walletAddress: res.walletAddress, solanaWalletAddress: res.solanaWalletAddress, ensName: res.ens, sns: res.sns, }); setAddressToSend(res.walletAddress || res.solanaWalletAddress || value); } else { console.log("No valid user data found"); setSendToUser({ status: false, username: undefined, walletAddress: undefined, solanaWalletAddress: undefined, ensName: undefined, sns: undefined, }); setAddressToSend(value); } setUsernamecheckLoading(false); _a.label = 2; case 2: return [2 /*return*/]; } }); }); }, [walletSdkKey]); // Create memoized debounced function var debouncedUsernameCheck = (0, react_1.useMemo)(function () { return (0, utils_1.debounce)(handleUsernameCheck, 500); }, [handleUsernameCheck]); return (react_1.default.createElement("div", { style: { width: "100%", minWidth: 430, background: "#fff", borderRadius: 20, fontFamily: "Inter, sans-serif", display: "flex", flexDirection: "column", height: "550px", } }, react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", marginBottom: 18, position: "relative", } }, react_1.default.createElement("button", { onClick: handleBackFromRecipient, style: { background: "none", border: "none", fontSize: 22, color: "#222", cursor: "pointer", position: "absolute", left: 0, fontFamily: "Inter, sans-serif", } }, react_1.default.createElement(lucide_react_1.ArrowLeft, { style: { width: 24, height: 24, color: "#717680" } })), react_1.default.createElement("span", { style: { fontWeight: 600, fontSize: 20, width: "100%", textAlign: "center", } }, "Sending token to")), react_1.default.createElement("div", { style: { marginBottom: 24 } }, react_1.default.createElement("div", { style: { fontWeight: 600, fontSize: 14, marginBottom: 8 } }, "Enter recipient details"), react_1.default.createElement("div", { style: { position: "relative", display: "flex", alignItems: "center", gap: 0, marginBottom: 8, } }, react_1.default.createElement("input", { type: "text", placeholder: "Enter public address / ENS / username", value: recipient, onChange: function (e) { setRecipient(e.target.value); refreshBalance(); debouncedUsernameCheck(e.target.value); }, style: { flex: 1, width: "100%", padding: recipient ? "10px 48px 10px 14px" : "10px 14px", borderRadius: 10, border: "1px solid #E0E0E0", fontSize: 16, color: "#222", outline: "none", } }), recipient && sendToUser.status && !usernamecheckLoading && (react_1.default.createElement("button", { style: { position: "absolute", right: 8, top: "50%", transform: "translateY(-50%)", background: "#4F46E5", border: "none", borderRadius: "50%", width: 36, height: 36, display: "flex", alignItems: "center", justifyContent: "center", cursor: "pointer", padding: 0, }, onClick: function () { return setStep("amount"); } }, react_1.default.createElement(lucide_react_1.ArrowRight, { style: { width: 18, height: 18, color: "#fff" } }))), usernamecheckLoading && (react_1.default.createElement("div", { style: { position: "absolute", right: 8, top: "50%", transform: "translateY(-50%)", width: 36, height: 36, display: "flex", alignItems: "center", justifyContent: "center", } }, react_1.default.createElement(Spinner_1.default, null))))), sendToUser.status && (react_1.default.createElement("div", { style: { marginBottom: 24 } }, react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", padding: "14px 0", borderBottom: "1px solid #E9EAEB", cursor: "pointer", transition: "background 0.1s", }, onClick: function () { return setStep("amount"); } }, react_1.default.createElement("div", { style: { width: 36, height: 36, borderRadius: 18, background: "#E9EAEB", display: "flex", alignItems: "center", justifyContent: "center", fontWeight: 600, fontSize: 16, color: "#717680", marginRight: 12, } }, ((_b = sendToUser.username) === null || _b === void 0 ? void 0 : _b.split(" ").map(function (n) { return n[0]; }).join("")) || "?"), react_1.default.createElement("div", { style: { flexGrow: 1 } }, react_1.default.createElement("div", { style: { fontWeight: 600 } }, sendToUser.username), react_1.default.createElement("div", { style: { color: "#535862", fontSize: 12 } }, sendToUser.walletAddress && (react_1.default.createElement("div", null, "Ethereum Wallet Address:", " ", sendToUser.walletAddress.slice(0, 6), "...", sendToUser.walletAddress.slice(-4))), sendToUser.solanaWalletAddress && (react_1.default.createElement("div", null, "Solana Wallet Address:", " ", sendToUser.solanaWalletAddress.slice(0, 6), "...", sendToUser.solanaWalletAddress.slice(-4))), !sendToUser.walletAddress && !sendToUser.solanaWalletAddress && (react_1.default.createElement("div", null, recipient.toLowerCase().endsWith(".eth") ? "ENS Name" : recipient.startsWith("0x") ? "Ethereum Wallet Address" : "Solana Wallet Address"))))))), react_1.default.createElement("div", { style: { flex: 1, overflowY: "auto", maxHeight: "400px", paddingRight: 8, msOverflowStyle: "none" /* IE and Edge */, scrollbarWidth: "none" /* Firefox */, WebkitOverflowScrolling: "touch", }, className: "hide-scrollbar" }))); } exports.default = RecipientSearch;