UNPKG

@enclavemoney/enclave-wallet-sdk

Version:

A simple enclave wallet SDK for React applications

325 lines (324 loc) 18.4 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 utils_1 = require("../utils"); var addressValidation_1 = require("../../services/addressValidation"); var Spinner_1 = __importDefault(require("../ui/Spinner")); function RecipientSearch(_a) { var _this = this; var _b, _c, _d, _e, _f, _g, _h; 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, selectedToken = _a.selectedToken; var _j = (0, react_1.useState)(false), usernamecheckLoading = _j[0], setUsernamecheckLoading = _j[1]; var isValidUser = sendToUser.status && ((_b = selectedToken.chainIds) === null || _b === void 0 ? void 0 : _b.some(function (chain) { // Check for Solana if (chain.chainId === utils_1.NETWORK_NAME_TO_CHAIN_ID.Solana && sendToUser.solanaWalletAddress) { return true; } // Check for Bitcoin if (chain.chainId === utils_1.NETWORK_NAME_TO_CHAIN_ID.Bitcoin && sendToUser.bitcoinWalletAddress) { return true; } // Check for Ethereum and other EVM chains if (chain.chainId !== utils_1.NETWORK_NAME_TO_CHAIN_ID.Solana && chain.chainId !== utils_1.NETWORK_NAME_TO_CHAIN_ID.Bitcoin && sendToUser.walletAddress) { return true; } return false; })); var handleUsernameCheck = (0, react_1.useCallback)(function (value) { return __awaiter(_this, void 0, void 0, function () { var res; var _a, _b; return __generator(this, function (_c) { switch (_c.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 = _c.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, bitcoinWalletAddress: res.bitcoinWalletAddress, }); setAddressToSend(((_a = selectedToken === null || selectedToken === void 0 ? void 0 : selectedToken.chainIds) === null || _a === void 0 ? void 0 : _a.find(function (chain) { return chain.chainId === utils_1.NETWORK_NAME_TO_CHAIN_ID.Bitcoin; })) ? res.bitcoinWalletAddress : ((_b = selectedToken === null || selectedToken === void 0 ? void 0 : selectedToken.chainIds) === null || _b === void 0 ? void 0 : _b.find(function (chain) { return chain.chainId === utils_1.NETWORK_NAME_TO_CHAIN_ID.Solana; })) ? res.solanaWalletAddress : res.walletAddress); } else { console.log("No valid user data found"); setSendToUser({ status: false, username: undefined, walletAddress: undefined, solanaWalletAddress: undefined, ensName: undefined, sns: undefined, bitcoinWalletAddress: undefined, }); setAddressToSend(value); } setUsernamecheckLoading(false); _c.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%", 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); debouncedUsernameCheck(e.target.value); }, style: { flex: 1, width: "100%", padding: recipient ? "10px 48px 10px 14px" : "10px 14px", borderRadius: 10, border: "1px solid #E0E0E0", backgroundColor: "white", fontSize: 16, color: "#222", outline: "none", } }), recipient && isValidUser && !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: isValidUser ? "pointer" : "default", transition: "background 0.1s", }, onClick: function () { if (isValidUser) { setStep("amount"); } } }, react_1.default.createElement("div", { style: { width: 52, height: 52, borderRadius: 26, background: "#E9EAEB", display: "flex", alignItems: "center", justifyContent: "center", fontWeight: 600, fontSize: 22, color: "#717680", marginRight: 12, } }, ((_c = sendToUser.username) === null || _c === void 0 ? void 0 : _c.split(" ").map(function (n) { return n[0]; }).join("")) || ((_d = sendToUser.ensName) === null || _d === void 0 ? void 0 : _d.split(".")[0].slice(0, 1)) || ((_e = sendToUser.sns) === null || _e === void 0 ? void 0 : _e.split(".")[0].slice(0, 1)) || "?"), react_1.default.createElement("div", { style: { flexGrow: 1 } }, react_1.default.createElement("div", { style: { fontWeight: 600 } }, (function () { var displayName = sendToUser.username || sendToUser.ensName || sendToUser.sns || ""; return displayName.length > 10 ? displayName.slice(0, 10) + "..." : displayName; })()), react_1.default.createElement("div", { style: { color: "#535862", fontSize: 14 } }, sendToUser.walletAddress && ((_f = selectedToken.chainIds) === null || _f === void 0 ? void 0 : _f.find(function (chain) { return chain.chainId !== utils_1.NETWORK_NAME_TO_CHAIN_ID.Solana && chain.chainId !== utils_1.NETWORK_NAME_TO_CHAIN_ID.Bitcoin; })) && (react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 4, marginTop: 4, } }, react_1.default.createElement("img", { src: utils_1.NETWORK_LOGO_URLS[utils_1.NETWORK_NAME_TO_CHAIN_ID.Ethereum], alt: "logo", style: { width: 16, height: 16 } }), sendToUser.walletAddress.slice(0, 18), "...", sendToUser.walletAddress.slice(-4))), sendToUser.solanaWalletAddress && ((_g = selectedToken.chainIds) === null || _g === void 0 ? void 0 : _g.find(function (chain) { return chain.chainId === utils_1.NETWORK_NAME_TO_CHAIN_ID.Solana; })) && (react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 4, marginTop: 4, } }, react_1.default.createElement("img", { src: utils_1.NETWORK_LOGO_URLS[utils_1.NETWORK_NAME_TO_CHAIN_ID.Solana], alt: "logo", style: { width: 16, height: 16 } }), sendToUser.solanaWalletAddress.slice(0, 18), "...", sendToUser.solanaWalletAddress.slice(-4))), sendToUser.bitcoinWalletAddress && ((_h = selectedToken.chainIds) === null || _h === void 0 ? void 0 : _h.find(function (chain) { return chain.chainId === utils_1.NETWORK_NAME_TO_CHAIN_ID.Bitcoin; })) && (react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 4, marginTop: 4, } }, react_1.default.createElement("img", { src: utils_1.NETWORK_LOGO_URLS[utils_1.NETWORK_NAME_TO_CHAIN_ID.Bitcoin], alt: "logo", style: { width: 16, height: 16 } }), sendToUser.bitcoinWalletAddress.slice(0, 18), "...", sendToUser.bitcoinWalletAddress.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;