@roochnetwork/rooch-sdk-kit
Version:
Rooch SDK Kit
778 lines (743 loc) • 40.6 kB
JavaScript
// src/components/local-wallet-modal/views/ManagerView.css.ts
var accountActions = "ManagerView_accountActions__1ou9szh4";
var accountHeader = "ManagerView_accountHeader__1ou9szh3";
var accountName = "ManagerView_accountName__1ou9szh7";
var accountSection = "ManagerView_accountSection__1ou9szh2";
var actionButton = "ManagerView_actionButton__1ou9szhi";
var actions = "ManagerView_actions__1ou9szhd";
var addressActions = "ManagerView_addressActions__1ou9szhh";
var addressContent = "ManagerView_addressContent__1ou9szha";
var addressItem = "ManagerView_addressItem__1ou9szh9";
var addressList = "ManagerView_addressList__1ou9szh8";
var addressText = "ManagerView_addressText__1ou9szhc";
var container = "ManagerView_container__1ou9szh0";
var copyFeedback = "ManagerView_copyFeedback__1ou9szhb";
var copyNotification = "ManagerView_copyNotification__1ou9szhj";
var icon = "ManagerView_icon__1ou9szh6";
var iconButton = "ManagerView_iconButton__1ou9szh5";
var importActions = "ManagerView_importActions__1ou9szhg";
var importForm = "ManagerView_importForm__1ou9szhe";
var importInput = "ManagerView_importInput__1ou9szhf";
var title = "ManagerView_title__1ou9szh1";
// src/components/ui/Button.tsx
import { Slot } from "@radix-ui/react-slot";
import clsx from "clsx";
import { forwardRef } from "react";
// src/components/ui/Button.css.ts
import { createRuntimeFn as _7a468 } from "@vanilla-extract/recipes/createRuntimeFn";
var buttonVariants = _7a468({ defaultClassName: "Button_buttonVariants__1vdhm2g0", variantClassNames: { variant: { primary: "Button_buttonVariants_variant_primary__1vdhm2g1", outline: "Button_buttonVariants_variant_outline__1vdhm2g2" }, size: { md: "Button_buttonVariants_size_md__1vdhm2g3", lg: "Button_buttonVariants_size_lg__1vdhm2g4" } }, defaultVariants: { variant: "primary", size: "md" }, compoundVariants: [] });
// src/components/ui/Button.tsx
import { jsx } from "react/jsx-runtime";
var Button = forwardRef(
({ className, variant, size, asChild = false, ...props }, forwardedRef) => {
const Comp = asChild ? Slot : "button";
return /* @__PURE__ */ jsx(
Comp,
{
...props,
className: clsx(buttonVariants({ variant, size }), className),
ref: forwardedRef
}
);
}
);
Button.displayName = "Button";
// src/components/ui/Heading.tsx
import { Slot as Slot2 } from "@radix-ui/react-slot";
import clsx2 from "clsx";
import { forwardRef as forwardRef2 } from "react";
// src/components/ui/Heading.css.ts
import { createRuntimeFn as _7a4682 } from "@vanilla-extract/recipes/createRuntimeFn";
var headingVariants = _7a4682({ defaultClassName: "Heading__1v58k1t0", variantClassNames: { size: { sm: "Heading_headingVariants_size_sm__1v58k1t1", md: "Heading_headingVariants_size_md__1v58k1t2", lg: "Heading_headingVariants_size_lg__1v58k1t3", xl: "Heading_headingVariants_size_xl__1v58k1t4" }, weight: { normal: "Heading_headingVariants_weight_normal__1v58k1t5", bold: "Heading_headingVariants_weight_bold__1v58k1t6" }, truncate: { true: "Heading_headingVariants_truncate_true__1v58k1t7" } }, defaultVariants: { size: "lg", weight: "bold" }, compoundVariants: [] });
// src/components/ui/Heading.tsx
import { jsx as jsx2 } from "react/jsx-runtime";
var Heading = forwardRef2(
({
children,
className,
asChild = false,
as: Tag = "h1",
size,
weight,
truncate,
...headingProps
}, forwardedRef) => {
return /* @__PURE__ */ jsx2(
Slot2,
{
...headingProps,
ref: forwardedRef,
className: clsx2(headingVariants({ size, weight, truncate }), className),
children: asChild ? children : /* @__PURE__ */ jsx2(Tag, { children })
}
);
}
);
Heading.displayName = "Heading";
// src/components/local-wallet-modal/views/ManagerView.tsx
import { useEffect as useEffect2, useMemo as useMemo2, useState as useState2 } from "react";
// src/wallet/local.ts
import {
BitcoinNetowkType,
Secp256k1Keypair
} from "@roochnetwork/rooch-sdk";
// src/wallet/wallet.ts
import { Signer } from "@roochnetwork/rooch-sdk";
var Wallet = class extends Signer {
/**
* Checks if the wallet is installed.
* @returns A promise that resolves to true if the wallet is installed, otherwise false.
*/
async checkInstalled() {
for (let i = 1; i < 10 && !this.getTarget(); i += 1) {
await new Promise((resolve) => setTimeout(resolve, 100 * i));
}
return Promise.resolve(this.getTarget() !== void 0);
}
};
// src/wallet/bitcoin.ts
import {
Authenticator,
BitcoinSignMessage,
Secp256k1PublicKey,
fromHEX
} from "@roochnetwork/rooch-sdk";
var BitcoinWallet = class extends Wallet {
async signTransaction(input) {
const message = new BitcoinSignMessage(input.hashData(), input.getInfo() || "");
return Authenticator.bitcoin(message, this, "raw");
}
getPublicKey() {
if (!this.publicKey) {
throw Error("Please connect your wallet first");
}
return new Secp256k1PublicKey(fromHEX(this.publicKey));
}
getRoochAddress() {
if (!this.currentAddress) {
throw Error("Please connect your wallet first");
}
return this.currentAddress.genRoochAddress();
}
getBitcoinAddress() {
if (!this.currentAddress) {
throw Error("Please connect your wallet first");
}
return this.currentAddress;
}
getKeyScheme() {
return "Secp256k1";
}
normalize_recovery_id(v) {
let normalizeV = v - 27 - 4;
if (normalizeV < 0) {
normalizeV = normalizeV + 4;
}
return normalizeV;
}
switchAccount() {
throw new Error("Method not implemented.");
}
getChain() {
return "bitcoin";
}
};
// src/wallet/local.ts
var LocalKey = "local-wallet-key";
var LocalActiveAddress = "local-wallet-active-address";
var LocalWallet = class extends BitcoinWallet {
static getAccounts() {
const keyString = window.localStorage.getItem(LocalKey);
let accounts = /* @__PURE__ */ new Map();
if (keyString) {
try {
const parsed = JSON.parse(keyString);
accounts = new Map(parsed.map(([k, v]) => [k, v]));
} catch (e) {
console.error("Failed to parse accounts from localStorage:", e);
window.localStorage.removeItem(LocalKey);
}
}
return accounts;
}
static removeAddress(accountName2, key) {
let accounts = LocalWallet.getAccounts();
if (accounts.has(accountName2)) {
const account = accounts.get(accountName2);
if (account) {
account.keys = account.keys.filter((a) => a !== key);
}
}
window.localStorage.setItem(LocalKey, JSON.stringify(Array.from(accounts.entries())));
return accounts;
}
static removeAccount(accountName2) {
let accounts = LocalWallet.getAccounts();
accounts.delete(accountName2);
window.localStorage.setItem(LocalKey, JSON.stringify(Array.from(accounts.entries())));
return accounts;
}
static createAddress(accountName2) {
const accounts = LocalWallet.getAccounts();
const account = accounts.get(accountName2);
if (account) {
const kp = Secp256k1Keypair.deriveKeypair(
account.mnemonic,
`m/86'/0'/0'/0/${account.keys.length + 1}`
);
account.keys.push(kp.getSecretKey());
}
window.localStorage.setItem(LocalKey, JSON.stringify(Array.from(accounts.entries())));
return accounts;
}
static createAccount() {
const { mnemonic, keypair } = Secp256k1Keypair.generateWithMnemonic();
let accounts = LocalWallet.getAccounts();
accounts.set(`Account${accounts.size + 1}`, {
mnemonic,
keys: [keypair.getSecretKey()]
});
window.localStorage.setItem(LocalKey, JSON.stringify(Array.from(accounts.entries())));
return accounts;
}
static importAccount(mnemonic) {
const accounts = LocalWallet.getAccounts();
const newAccount = Secp256k1Keypair.deriveKeypair(mnemonic);
accounts.set(`Account${accounts.size + 1}`, {
mnemonic,
keys: [newAccount.getSecretKey()]
});
window.localStorage.setItem(LocalKey, JSON.stringify(Array.from(accounts.entries())));
return accounts;
}
getName() {
return "Local";
}
getIcon(_) {
return "data:image/png;base64,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";
}
getDescription() {
return "Local Wallet";
}
getInstallUrl() {
return "";
}
async signTransaction(input) {
return this.keypair.signTransaction(input);
}
async sign(msg) {
return this.keypair.sign(msg);
}
getTarget() {
return this;
}
async connect() {
const accounts = LocalWallet.getAccounts();
const activeAddress = window.localStorage.getItem(LocalActiveAddress);
const network = await this.getNetwork();
for (const account of accounts.entries()) {
for (const key of account[1].keys) {
if (activeAddress === key) {
this.keypair = Secp256k1Keypair.fromSecretKey(key);
break;
}
}
}
this.currentAddress = this.keypair.getBitcoinAddressWith(this.formatNetwork(network));
this.publicKey = this.keypair.getSchnorrPublicKey().toString();
this.address = [this.currentAddress];
return this.address;
}
switchNetwork(network) {
window.localStorage.setItem("local-wallet-net", network);
if (this.onNetworkChange) {
this.onNetworkChange(network);
}
if (this.onAccountsChange) {
this.onAccountsChange([
this.keypair.getBitcoinAddressWith(this.formatNetwork(network)).toStr()
]);
}
return Promise.resolve();
}
getNetwork() {
return Promise.resolve(
window.localStorage.getItem("local-wallet-net") || "testnet"
);
}
getSupportNetworks() {
return ["livenet", "testnet"];
}
onAccountsChanged(callback) {
this.onAccountsChange = callback;
}
removeAccountsChanged(_) {
this.onAccountsChange = void 0;
}
// TODO: support listener?
onNetworkChanged(callback) {
this.onNetworkChange = callback;
}
removeNetworkChanged(_) {
this.onNetworkChange = void 0;
}
sendBtc(_) {
throw Error("local not support sendBtc!");
}
getBalance() {
throw Error("local not support getBalance!");
}
formatNetwork(network) {
switch (network) {
case "livenet":
return BitcoinNetowkType.Bitcoin;
default:
return BitcoinNetowkType.Testnet;
}
}
};
// src/components/local-wallet-modal/views/ManagerView.tsx
import { BitcoinNetowkType as BitcoinNetowkType2, Secp256k1Keypair as Secp256k1Keypair2, toShortStr } from "@roochnetwork/rooch-sdk";
// src/components/icons/PlusIcon.tsx
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
function PlusIcon({ className }) {
return /* @__PURE__ */ jsxs(
"svg",
{
className,
width: "16",
height: "16",
viewBox: "0 0 16 16",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
children: [
/* @__PURE__ */ jsx3(
"path",
{
d: "M8 3.33334V12.6667",
stroke: "currentColor",
strokeWidth: "1.5",
strokeLinecap: "round",
strokeLinejoin: "round"
}
),
/* @__PURE__ */ jsx3(
"path",
{
d: "M3.33334 8H12.6667",
stroke: "currentColor",
strokeWidth: "1.5",
strokeLinecap: "round",
strokeLinejoin: "round"
}
)
]
}
);
}
// src/components/icons/TrashIcon.tsx
import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
function TrashIcon({ className }) {
return /* @__PURE__ */ jsxs2(
"svg",
{
className,
width: "16",
height: "16",
viewBox: "0 0 16 16",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
children: [
/* @__PURE__ */ jsx4(
"path",
{
d: "M2 4H3.33333H14",
stroke: "currentColor",
strokeWidth: "1.5",
strokeLinecap: "round",
strokeLinejoin: "round"
}
),
/* @__PURE__ */ jsx4(
"path",
{
d: "M5.33334 4V2.66667C5.33334 2.31305 5.47382 1.97391 5.72387 1.72386C5.97392 1.47381 6.31306 1.33334 6.66668 1.33334H9.33334C9.68697 1.33334 10.0261 1.47381 10.2761 1.72386C10.5262 1.97391 10.6667 2.31305 10.6667 2.66667V4M12.6667 4V13.3333C12.6667 13.687 12.5262 14.0261 12.2761 14.2761C12.0261 14.5262 11.687 14.6667 11.3333 14.6667H4.66668C4.31306 14.6667 3.97392 14.5262 3.72387 14.2761C3.47382 14.0261 3.33334 13.687 3.33334 13.3333V4H12.6667Z",
stroke: "currentColor",
strokeWidth: "1.5",
strokeLinecap: "round",
strokeLinejoin: "round"
}
)
]
}
);
}
// src/components/icons/KeyIcon.tsx
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
function KeyIcon({ className }) {
return /* @__PURE__ */ jsxs3(
"svg",
{
className,
width: "16",
height: "16",
viewBox: "0 0 16 16",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
children: [
/* @__PURE__ */ jsx5(
"path",
{
d: "M10.6667 5.33334C10.6667 6.80609 9.47343 8 8.00067 8C6.52792 8 5.33334 6.80609 5.33334 5.33334C5.33334 3.86059 6.52792 2.66667 8.00067 2.66667C9.47343 2.66667 10.6667 3.86059 10.6667 5.33334Z",
stroke: "currentColor",
strokeWidth: "1.5",
strokeLinecap: "round",
strokeLinejoin: "round"
}
),
/* @__PURE__ */ jsx5(
"path",
{
d: "M8 8V14.6667",
stroke: "currentColor",
strokeWidth: "1.5",
strokeLinecap: "round",
strokeLinejoin: "round"
}
),
/* @__PURE__ */ jsx5(
"path",
{
d: "M6 12H10",
stroke: "currentColor",
strokeWidth: "1.5",
strokeLinecap: "round",
strokeLinejoin: "round"
}
)
]
}
);
}
// src/hooks/client/useCurrentNetwork.ts
function useCurrentNetwork() {
return useRoochContext().network;
}
// src/hooks/client/useRoochContext.ts
import { useContext as useContext4 } from "react";
// src/provider/clientProvider.tsx
import { createContext as createContext4, useMemo, useState } from "react";
import {
getRoochNodeUrl,
RoochClient
} from "@roochnetwork/rooch-sdk";
// src/hooks/useSessionsStore.ts
import { useContext as useContext3 } from "react";
import { useStore as useStore2 } from "zustand";
// src/provider/roochProvider.tsx
import { createContext as createContext2, useRef } from "react";
// src/provider/globalProvider.tsx
import { createContext, useContext } from "react";
import { jsx as jsx6 } from "react/jsx-runtime";
var GlobalContext = createContext(null);
var useTriggerError = () => {
const ctx = useContext(GlobalContext);
if (!ctx) {
throw new Error("useTriggerError must be used within a GlobalProvider");
}
return ctx.triggerError;
};
// src/provider/roochProvider.tsx
import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
var RoochContext = createContext2(null);
// src/provider/walletProvider.tsx
import { useCallback, createContext as createContext3, useEffect, useRef as useRef2 } from "react";
import { BitcoinAddress as BitcoinAddress2 } from "@roochnetwork/rooch-sdk";
// src/hooks/wallet/useWalletStore.ts
import { useContext as useContext2 } from "react";
import { useStore } from "zustand";
function useWalletStore(selector) {
const store = useContext2(WalletContext);
if (!store) {
throw new Error("Could not find WalletContext. Ensure that you have set up the WalletProvider.");
}
return useStore(store, selector);
}
// src/provider/walletProvider.tsx
import { jsx as jsx8 } from "react/jsx-runtime";
var WalletContext = createContext3(null);
// src/hooks/useSessionsStore.ts
function useSessionStore(selector) {
const store = useContext3(RoochContext);
if (!store) {
throw new Error(
"Could not find RoochSessionContext. Ensure that you have set up the RoochClientProvider."
);
}
return useStore2(store, selector);
}
// src/provider/clientProvider.tsx
import { jsx as jsx9 } from "react/jsx-runtime";
var ClientContext = createContext4(null);
var DEFAULT_NETWORKS = {
localnet: { url: getRoochNodeUrl("localnet") }
};
// src/hooks/client/useRoochContext.ts
function useRoochContext() {
const context = useContext4(ClientContext);
if (!context) {
throw new Error(
"Could not find RoochClientContext. Ensure that you have set up the RoochClientProvider."
);
}
return context;
}
// src/constants/walletMutationKeys.ts
function formMutationKeyFn(baseEntity) {
return function mutationKeyFn(additionalKeys = []) {
return [{ ...walletMutationKeys.all, baseEntity }, ...additionalKeys];
};
}
var walletMutationKeys = {
all: { baseScope: "wallet" },
connectWallet: formMutationKeyFn("connect-wallet"),
autoConnectWallet: formMutationKeyFn("auto-connect-wallet"),
switchAccount: formMutationKeyFn("switch-account"),
createSessionKey: formMutationKeyFn("create-session-key")
};
// src/hooks/wallet/useConnectWallet.ts
import { useMutation } from "@tanstack/react-query";
// src/hooks/useSessions.ts
function useSessions() {
return useSessionStore(
(state) => state.sessions.sort((a, b) => b.getCreateTime() - a.getCreateTime())
);
}
// src/hooks/wallet/useConnectWallet.ts
function useConnectWallet({
mutationKey,
...mutationOptions
} = {}) {
const sessions = useSessions();
const setCurrentSession = useSessionStore((state) => state.setCurrentSession);
const setWalletConnected = useWalletStore((state) => state.setWalletConnected);
const setWalletDisconnected = useWalletStore((state) => state.setWalletDisconnected);
const setConnectionStatus = useWalletStore((state) => state.setConnectionStatus);
const triggerError = useTriggerError();
return useMutation({
mutationKey: walletMutationKeys.connectWallet(mutationKey),
mutationFn: async ({ wallet }) => {
try {
setConnectionStatus("connecting");
const connectAddress = await wallet.connect();
const selectedAddress = connectAddress[0];
setWalletConnected(wallet, connectAddress, selectedAddress);
const cur = sessions.find(
(item) => item.getRoochAddress().toStr() === selectedAddress?.genRoochAddress().toStr()
);
setCurrentSession(cur);
return connectAddress;
} catch (error) {
setWalletDisconnected();
if ("code" in error && "message" in error) {
triggerError(error);
}
throw error;
}
},
...mutationOptions
});
}
// src/hooks/wallet/useCurrentAddress.ts
function useCurrentAddress() {
return useWalletStore((state) => state.currentAddress);
}
// src/components/local-wallet-modal/views/ManagerView.tsx
import { Fragment, jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
function LocalWalletManagerView() {
const [accounts, setAccounts] = useState2(/* @__PURE__ */ new Map());
const [showImportForm, setShowImportForm] = useState2(false);
const [importValue, setImportValue] = useState2("");
const [copiedAddress, setCopiedAddress] = useState2(null);
const [showCopyNotification, setShowCopyNotification] = useState2(false);
const { mutateAsync } = useConnectWallet();
const network = useCurrentNetwork();
const currentAddress = useCurrentAddress();
useEffect2(() => {
const accounts2 = LocalWallet.getAccounts();
setAccounts(accounts2);
}, []);
const addresss = useMemo2(() => {
const addresses = /* @__PURE__ */ new Map();
for (const account of accounts.entries()) {
const addressList2 = [];
for (const key of account[1].keys) {
const address = Secp256k1Keypair2.fromSecretKey(key).getBitcoinAddressWith(
network === "mainnet" ? BitcoinNetowkType2.Bitcoin : BitcoinNetowkType2.Testnet
).toStr();
addressList2.push({
address,
key
});
}
addresses.set(account[0], {
address: addressList2,
mnemonic: account[1].mnemonic
});
}
return addresses;
}, [accounts, network]);
const handleCreateAccount = async () => {
const accounts2 = LocalWallet.createAccount();
setAccounts(accounts2);
};
const handleCreateAddress = async (accountName2) => {
const accounts2 = LocalWallet.createAddress(accountName2);
setAccounts(accounts2);
};
const handleImport = async () => {
const accounts2 = LocalWallet.importAccount(importValue);
setAccounts(accounts2);
setShowImportForm(false);
};
const handleDeleteAddress = (accountName2, address) => {
const accounts2 = LocalWallet.removeAddress(accountName2, address);
setAccounts(accounts2);
};
const handleDeleteAccount = (accountName2) => {
const accounts2 = LocalWallet.removeAccount(accountName2);
setAccounts(accounts2);
};
const handleConnect = (key) => {
window.localStorage.setItem(LocalActiveAddress, key);
mutateAsync({ wallet: new LocalWallet() });
};
const handleCopy = async (address) => {
try {
await navigator.clipboard.writeText(address);
setCopiedAddress(address);
setTimeout(() => setCopiedAddress(null), 2e3);
} catch (err) {
console.error("Failed to copy address:", err);
}
};
const handleCopyKey = async (input) => {
try {
await navigator.clipboard.writeText(input);
setShowCopyNotification(true);
setTimeout(() => setShowCopyNotification(false), 1e3);
} catch (err) {
console.error("Failed to copy:", err);
}
};
return /* @__PURE__ */ jsxs5("div", { className: container, children: [
/* @__PURE__ */ jsx10(Heading, { size: "lg", className: title, children: "Local Wallet" }),
showCopyNotification && /* @__PURE__ */ jsx10("div", { className: copyNotification, children: "copied to clipboard" }),
!showImportForm && /* @__PURE__ */ jsxs5(Fragment, { children: [
/* @__PURE__ */ jsx10("div", { className: addressList, children: Array.from(addresss.entries()).map(([accountName2, account]) => /* @__PURE__ */ jsxs5("div", { className: accountSection, children: [
/* @__PURE__ */ jsxs5("div", { className: accountHeader, children: [
/* @__PURE__ */ jsx10("span", { className: accountName, children: accountName2 }),
/* @__PURE__ */ jsxs5("div", { className: accountActions, children: [
/* @__PURE__ */ jsx10(
Button,
{
variant: "outline",
className: iconButton,
onClick: () => handleCreateAddress(accountName2),
title: "Derive New Address",
children: /* @__PURE__ */ jsx10(PlusIcon, { className: icon })
}
),
/* @__PURE__ */ jsx10(
Button,
{
variant: "outline",
className: iconButton,
onClick: () => handleCopyKey(account.mnemonic),
title: "Export Mnemonic",
children: /* @__PURE__ */ jsx10(KeyIcon, { className: icon })
}
),
/* @__PURE__ */ jsx10(
Button,
{
variant: "outline",
className: iconButton,
onClick: () => handleDeleteAccount(accountName2),
title: "Delete Account",
children: /* @__PURE__ */ jsx10(TrashIcon, { className: icon })
}
)
] })
] }),
/* @__PURE__ */ jsx10("div", { className: addressList, children: account.address.map((addr) => /* @__PURE__ */ jsxs5("div", { className: addressItem, children: [
/* @__PURE__ */ jsxs5("div", { className: addressContent, children: [
/* @__PURE__ */ jsx10(
"span",
{
className: addressText,
onClick: () => handleCopy(addr.address),
style: { cursor: "pointer" },
children: toShortStr(addr.address, { start: 16, end: 6 })
}
),
copiedAddress === addr.address && /* @__PURE__ */ jsx10("span", { className: copyFeedback, children: "Copied!" })
] }),
/* @__PURE__ */ jsxs5("div", { className: addressActions, children: [
/* @__PURE__ */ jsx10(
Button,
{
variant: "outline",
disabled: currentAddress?.toStr() === addr.address,
className: actionButton,
onClick: () => handleConnect(addr.key),
children: "Switch"
}
),
/* @__PURE__ */ jsx10(
Button,
{
variant: "outline",
className: actionButton,
onClick: () => handleCopyKey(addr.key),
children: "Copy Key"
}
),
/* @__PURE__ */ jsx10(
Button,
{
variant: "outline",
className: actionButton,
onClick: () => handleDeleteAddress(accountName2, addr.key),
children: "Delete"
}
)
] })
] }, addr.address)) })
] }, accountName2)) }),
/* @__PURE__ */ jsxs5("div", { className: actions, children: [
/* @__PURE__ */ jsx10(Button, { variant: "outline", onClick: handleCreateAccount, children: "Create" }),
/* @__PURE__ */ jsx10(Button, { variant: "outline", onClick: () => setShowImportForm(true), children: "Import" })
] })
] }),
showImportForm && /* @__PURE__ */ jsxs5("div", { className: importForm, children: [
/* @__PURE__ */ jsx10(
"textarea",
{
className: importInput,
value: importValue,
onChange: (e) => setImportValue(e.target.value),
placeholder: `Enter your mnemonic`
}
),
/* @__PURE__ */ jsxs5("div", { className: importActions, children: [
/* @__PURE__ */ jsx10(Button, { variant: "outline", onClick: () => setShowImportForm(false), children: "Cancel" }),
/* @__PURE__ */ jsx10(Button, { variant: "outline", onClick: handleImport, children: "Import" })
] })
] })
] });
}
export {
LocalWalletManagerView
};
//# sourceMappingURL=ManagerView.js.map