385 lines
12 KiB
JavaScript
385 lines
12 KiB
JavaScript
async function loadTauriStatus() {
|
|
const invoke = window.__TAURI__?.core?.invoke;
|
|
if (!invoke) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const status = await invoke("get_app_status");
|
|
if (bridgeStatus) {
|
|
setBridgeStatus(`${status.network === "mainnet" ? "Mainnet" : "Testnet"} disconnected`, "error");
|
|
}
|
|
} catch (error) {
|
|
setBridgeStatus(`${activeNetwork === "mainnet" ? "Mainnet" : "Testnet"} unavailable`, "error");
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
loadTauriStatus();
|
|
|
|
networkButtons.forEach((button) => {
|
|
button.addEventListener("click", () => {
|
|
setActiveNetwork(button.dataset.networkToggle);
|
|
if (!loadWalletForm?.classList.contains("hidden")) {
|
|
refreshWalletList();
|
|
}
|
|
});
|
|
});
|
|
|
|
document.querySelectorAll("[data-start-mode]").forEach((button) => {
|
|
button.addEventListener("click", () => {
|
|
const mode = button.dataset.startMode;
|
|
setActiveStartMode(mode);
|
|
if (mode === "load") {
|
|
createWalletForm?.classList.add("hidden");
|
|
importKeyForm?.classList.add("hidden");
|
|
importImageForm?.classList.add("hidden");
|
|
loadWalletForm?.classList.remove("hidden");
|
|
setStartupMessage("");
|
|
setImportMessage("");
|
|
setImportImageMessage("");
|
|
loadWalletKeyInput?.focus();
|
|
refreshWalletList();
|
|
return;
|
|
}
|
|
|
|
if (mode === "import-key") {
|
|
createWalletForm?.classList.add("hidden");
|
|
loadWalletForm?.classList.add("hidden");
|
|
importImageForm?.classList.add("hidden");
|
|
importKeyForm?.classList.remove("hidden");
|
|
setStartupMessage("");
|
|
setLoadMessage("");
|
|
setImportImageMessage("");
|
|
setImportMessage("Paste the private key and choose a new encrypted wallet file name.");
|
|
importWalletNameInput?.focus();
|
|
return;
|
|
}
|
|
|
|
if (mode === "import-image") {
|
|
createWalletForm?.classList.add("hidden");
|
|
loadWalletForm?.classList.add("hidden");
|
|
importKeyForm?.classList.add("hidden");
|
|
importImageForm?.classList.remove("hidden");
|
|
setStartupMessage("");
|
|
setLoadMessage("");
|
|
setImportMessage("");
|
|
setImportImageMessage("Select the private key PNG image and choose a new encrypted wallet file name.");
|
|
importImageWalletNameInput?.focus();
|
|
return;
|
|
}
|
|
|
|
if (mode !== "create") {
|
|
createWalletForm?.classList.add("hidden");
|
|
loadWalletForm?.classList.add("hidden");
|
|
importKeyForm?.classList.add("hidden");
|
|
importImageForm?.classList.add("hidden");
|
|
setStartupMessage("This wallet action is not wired yet.", "error");
|
|
return;
|
|
}
|
|
|
|
loadWalletForm?.classList.add("hidden");
|
|
importKeyForm?.classList.add("hidden");
|
|
importImageForm?.classList.add("hidden");
|
|
createWalletForm?.classList.remove("hidden");
|
|
walletNameInput?.focus();
|
|
setLoadMessage("");
|
|
setImportMessage("");
|
|
setImportImageMessage("");
|
|
setStartupMessage("Name this wallet and choose the key that will encrypt it.");
|
|
});
|
|
});
|
|
|
|
document.querySelectorAll("[data-cancel-startup-form]").forEach((button) => {
|
|
button.addEventListener("click", () => {
|
|
createWalletForm?.classList.add("hidden");
|
|
loadWalletForm?.classList.add("hidden");
|
|
importKeyForm?.classList.add("hidden");
|
|
importImageForm?.classList.add("hidden");
|
|
setStartupMessage("");
|
|
setLoadMessage("");
|
|
setImportMessage("");
|
|
setImportImageMessage("");
|
|
});
|
|
});
|
|
|
|
createWalletForm?.addEventListener("submit", async (event) => {
|
|
event.preventDefault();
|
|
|
|
const walletName = walletNameInput?.value || "";
|
|
const walletKey = walletKeyInput?.value || "";
|
|
const walletKeyConfirm = walletKeyConfirmInput?.value || "";
|
|
if (!walletName.trim()) {
|
|
setStartupMessage("Wallet name cannot be empty.", "error");
|
|
walletNameInput?.focus();
|
|
return;
|
|
}
|
|
if (!walletKey.trim()) {
|
|
setStartupMessage("Wallet key cannot be empty.", "error");
|
|
walletKeyInput?.focus();
|
|
return;
|
|
}
|
|
if (walletKey !== walletKeyConfirm) {
|
|
setStartupMessage("Wallet keys do not match.", "error");
|
|
walletKeyConfirmInput?.focus();
|
|
return;
|
|
}
|
|
|
|
const invoke = window.__TAURI__?.core?.invoke;
|
|
if (!invoke) {
|
|
setStartupMessage("Wallet creation requires the desktop app build.", "error");
|
|
return;
|
|
}
|
|
|
|
if (createWalletSubmit) {
|
|
createWalletSubmit.disabled = true;
|
|
}
|
|
setStartupMessage("Creating encrypted wallet...");
|
|
|
|
try {
|
|
const wallet = await invoke("create_wallet", {
|
|
network: activeNetwork,
|
|
walletName,
|
|
walletKey
|
|
});
|
|
updateActiveWallet(wallet);
|
|
walletNameInput.value = "";
|
|
walletKeyInput.value = "";
|
|
walletKeyConfirmInput.value = "";
|
|
setStartupMessage(`Wallet saved to ${wallet.wallet_path}`, "success");
|
|
document.body.classList.add("wallet-open");
|
|
} catch (error) {
|
|
setStartupMessage(String(error), "error");
|
|
} finally {
|
|
if (createWalletSubmit) {
|
|
createWalletSubmit.disabled = false;
|
|
}
|
|
}
|
|
});
|
|
|
|
document.querySelector("[data-refresh-wallet-list]")?.addEventListener("click", () => {
|
|
if (loadWalletKeyInput) {
|
|
loadWalletKeyInput.value = "";
|
|
}
|
|
refreshWalletList();
|
|
});
|
|
|
|
browseWalletButton?.addEventListener("click", async () => {
|
|
const invoke = window.__TAURI__?.core?.invoke;
|
|
if (!invoke) {
|
|
setLoadMessage("Wallet browsing requires the desktop app build.", "error");
|
|
return;
|
|
}
|
|
|
|
setLoadMessage("Opening wallet file picker...");
|
|
try {
|
|
const wallet = await invoke("select_wallet_file", { network: activeNetwork });
|
|
if (!wallet) {
|
|
setLoadMessage("Wallet selection cancelled.");
|
|
return;
|
|
}
|
|
|
|
selectWalletOption(wallet);
|
|
setLoadMessage(`Selected ${wallet.wallet_name}.`);
|
|
loadWalletKeyInput?.focus();
|
|
} catch (error) {
|
|
setLoadMessage(String(error), "error");
|
|
}
|
|
});
|
|
|
|
browsePrivateKeyImageButton?.addEventListener("click", async () => {
|
|
const invoke = window.__TAURI__?.core?.invoke;
|
|
if (!invoke) {
|
|
setImportImageMessage("Private key image browsing requires the desktop app build.", "error");
|
|
return;
|
|
}
|
|
|
|
setImportImageMessage("Opening private key image picker...");
|
|
try {
|
|
const selected = await invoke("select_private_key_image", { network: activeNetwork });
|
|
if (!selected) {
|
|
setImportImageMessage("Private key image selection cancelled.");
|
|
return;
|
|
}
|
|
|
|
importImagePathInput.value = selected.file_path;
|
|
setImportImageMessage(`Selected ${selected.file_name}.`);
|
|
importImageWalletKeyInput?.focus();
|
|
} catch (error) {
|
|
setImportImageMessage(String(error), "error");
|
|
}
|
|
});
|
|
|
|
loadWalletForm?.addEventListener("submit", async (event) => {
|
|
event.preventDefault();
|
|
|
|
const walletPath = walletListSelect?.value || "";
|
|
const walletKey = loadWalletKeyInput?.value || "";
|
|
if (!walletPath.trim()) {
|
|
setLoadMessage("Choose a saved wallet or browse for a wallet file.", "error");
|
|
walletListSelect?.focus();
|
|
return;
|
|
}
|
|
if (!walletKey.trim()) {
|
|
setLoadMessage("Wallet key cannot be empty.", "error");
|
|
loadWalletKeyInput?.focus();
|
|
return;
|
|
}
|
|
|
|
if (loadWalletSubmit) {
|
|
loadWalletSubmit.disabled = true;
|
|
}
|
|
setLoadMessage("Loading wallet...");
|
|
|
|
try {
|
|
const wallet = await loadWalletByPath(walletPath, walletKey);
|
|
updateActiveWallet(wallet);
|
|
loadWalletKeyInput.value = "";
|
|
setLoadMessage(`Wallet loaded from ${wallet.wallet_path}`, "success");
|
|
document.body.classList.add("wallet-open");
|
|
} catch (error) {
|
|
setLoadMessage(String(error), "error");
|
|
} finally {
|
|
if (loadWalletSubmit) {
|
|
loadWalletSubmit.disabled = false;
|
|
}
|
|
}
|
|
});
|
|
|
|
importKeyForm?.addEventListener("submit", async (event) => {
|
|
event.preventDefault();
|
|
|
|
const walletName = importWalletNameInput?.value || "";
|
|
const privateKey = importPrivateKeyInput?.value || "";
|
|
const walletKey = importWalletKeyInput?.value || "";
|
|
const walletKeyConfirm = importWalletKeyConfirmInput?.value || "";
|
|
|
|
if (!walletName.trim()) {
|
|
setImportMessage("Wallet name cannot be empty.", "error");
|
|
importWalletNameInput?.focus();
|
|
return;
|
|
}
|
|
if (!privateKey.trim()) {
|
|
setImportMessage("Private key cannot be empty.", "error");
|
|
importPrivateKeyInput?.focus();
|
|
return;
|
|
}
|
|
if (!walletKey.trim()) {
|
|
setImportMessage("Wallet key cannot be empty.", "error");
|
|
importWalletKeyInput?.focus();
|
|
return;
|
|
}
|
|
if (walletKey !== walletKeyConfirm) {
|
|
setImportMessage("Wallet keys do not match.", "error");
|
|
importWalletKeyConfirmInput?.focus();
|
|
return;
|
|
}
|
|
|
|
const invoke = window.__TAURI__?.core?.invoke;
|
|
if (!invoke) {
|
|
setImportMessage("Private key import requires the desktop app build.", "error");
|
|
return;
|
|
}
|
|
|
|
if (importKeySubmit) {
|
|
importKeySubmit.disabled = true;
|
|
}
|
|
setImportMessage("Importing encrypted wallet...");
|
|
|
|
try {
|
|
const wallet = await invoke("import_private_key_wallet", {
|
|
network: activeNetwork,
|
|
walletName,
|
|
walletKey,
|
|
privateKey
|
|
});
|
|
updateActiveWallet(wallet);
|
|
importWalletNameInput.value = "";
|
|
importPrivateKeyInput.value = "";
|
|
importWalletKeyInput.value = "";
|
|
importWalletKeyConfirmInput.value = "";
|
|
setImportMessage(`Wallet saved to ${wallet.wallet_path}`, "success");
|
|
document.body.classList.add("wallet-open");
|
|
} catch (error) {
|
|
setImportMessage(String(error), "error");
|
|
} finally {
|
|
if (importKeySubmit) {
|
|
importKeySubmit.disabled = false;
|
|
}
|
|
}
|
|
});
|
|
|
|
importImageForm?.addEventListener("submit", async (event) => {
|
|
event.preventDefault();
|
|
|
|
const walletName = importImageWalletNameInput?.value || "";
|
|
const imagePath = importImagePathInput?.value || "";
|
|
const walletKey = importImageWalletKeyInput?.value || "";
|
|
const walletKeyConfirm = importImageWalletKeyConfirmInput?.value || "";
|
|
|
|
if (!walletName.trim()) {
|
|
setImportImageMessage("Wallet name cannot be empty.", "error");
|
|
importImageWalletNameInput?.focus();
|
|
return;
|
|
}
|
|
if (!imagePath.trim()) {
|
|
setImportImageMessage("Select a private key PNG image.", "error");
|
|
browsePrivateKeyImageButton?.focus();
|
|
return;
|
|
}
|
|
if (!walletKey.trim()) {
|
|
setImportImageMessage("Wallet key cannot be empty.", "error");
|
|
importImageWalletKeyInput?.focus();
|
|
return;
|
|
}
|
|
if (walletKey !== walletKeyConfirm) {
|
|
setImportImageMessage("Wallet keys do not match.", "error");
|
|
importImageWalletKeyConfirmInput?.focus();
|
|
return;
|
|
}
|
|
|
|
const invoke = window.__TAURI__?.core?.invoke;
|
|
if (!invoke) {
|
|
setImportImageMessage("Private key image import requires the desktop app build.", "error");
|
|
return;
|
|
}
|
|
|
|
if (importImageSubmit) {
|
|
importImageSubmit.disabled = true;
|
|
}
|
|
setImportImageMessage("Importing encrypted wallet from image...");
|
|
|
|
try {
|
|
const wallet = await invoke("import_private_key_image_wallet", {
|
|
network: activeNetwork,
|
|
walletName,
|
|
walletKey,
|
|
imagePath
|
|
});
|
|
updateActiveWallet(wallet);
|
|
importImageWalletNameInput.value = "";
|
|
importImagePathInput.value = "";
|
|
importImageWalletKeyInput.value = "";
|
|
importImageWalletKeyConfirmInput.value = "";
|
|
setImportImageMessage(`Wallet saved to ${wallet.wallet_path}`, "success");
|
|
document.body.classList.add("wallet-open");
|
|
} catch (error) {
|
|
setImportImageMessage(String(error), "error");
|
|
} finally {
|
|
if (importImageSubmit) {
|
|
importImageSubmit.disabled = false;
|
|
}
|
|
}
|
|
});
|
|
|
|
lockWalletButton?.addEventListener("click", async () => {
|
|
const invoke = window.__TAURI__?.core?.invoke;
|
|
try {
|
|
await invoke?.("lock_wallet");
|
|
} finally {
|
|
lockWalletSession();
|
|
}
|
|
});
|
|
|
|
registrationAction?.addEventListener("click", registerActiveWallet);
|