Compare commits

..

4 Commits

Author SHA1 Message Date
107c243f65 fix: use consistent [x] delete buttons, add inline rename
All checks were successful
check / check (push) Successful in 8s
- Delete buttons now use [x] with border, matching token and site
  removal patterns in settings
- Wallet names are click-to-rename (inline input), matching the
  home view rename UX
2026-02-27 12:53:46 -08:00
655b90c7df feat: add wallet deletion from settings (closes #13)
- Per-wallet [delete] links in settings wallet list
- Monochrome styling throughout, no red/danger colors
- Password confirmation modal with warning text
- Cleans up site permissions for deleted addresses
- Switches to first remaining wallet or shows welcome if none left
2026-02-27 12:53:46 -08:00
34cd72be88 fix: rework wallet deletion per review feedback
- Remove all red/danger styling, use standard monochrome colors
- Add wallet picker dropdown instead of relying on selectedWallet
- Fix encryptedSecret field name (was wallet.encrypted)
- Populate dropdown when settings view opens
- Confirmation modal uses standard border styling
2026-02-27 12:53:46 -08:00
user
689bcbf171 feat: add wallet deletion from settings (closes #13) 2026-02-27 12:53:46 -08:00

View File

@@ -78,11 +78,8 @@ function renderWalletListSettings() {
state.wallets.forEach((wallet, idx) => { state.wallets.forEach((wallet, idx) => {
const name = escapeHtml(wallet.name || "Wallet " + (idx + 1)); const name = escapeHtml(wallet.name || "Wallet " + (idx + 1));
html += `<div class="flex justify-between items-center text-xs py-1 border-b border-border-light">`; html += `<div class="flex justify-between items-center text-xs py-1 border-b border-border-light">`;
html += `<span class="wallet-name-label">${name}</span>`; html += `<span class="settings-wallet-name cursor-pointer underline decoration-dashed" data-idx="${idx}">${name}</span>`;
html += `<span class="flex gap-1">`;
html += `<button class="btn-rename-wallet border border-border px-1 hover:bg-fg hover:text-bg cursor-pointer" data-idx="${idx}">[rename]</button>`;
html += `<button class="btn-delete-wallet border border-border px-1 hover:bg-fg hover:text-bg cursor-pointer" data-idx="${idx}">[x]</button>`; html += `<button class="btn-delete-wallet border border-border px-1 hover:bg-fg hover:text-bg cursor-pointer" data-idx="${idx}">[x]</button>`;
html += `</span>`;
html += `</div>`; html += `</div>`;
}); });
container.innerHTML = html; container.innerHTML = html;
@@ -97,42 +94,35 @@ function renderWalletListSettings() {
$("delete-wallet-confirm").classList.remove("hidden"); $("delete-wallet-confirm").classList.remove("hidden");
}); });
}); });
container.querySelectorAll(".btn-rename-wallet").forEach((btn) => {
btn.addEventListener("click", () => { // Inline rename on click
const idx = parseInt(btn.dataset.idx, 10); container.querySelectorAll(".settings-wallet-name").forEach((span) => {
span.addEventListener("click", () => {
const idx = parseInt(span.dataset.idx, 10);
const wallet = state.wallets[idx]; const wallet = state.wallets[idx];
const currentName = wallet.name || "Wallet " + (idx + 1); const input = document.createElement("input");
const row = btn.closest(".flex.justify-between"); input.type = "text";
const nameSpan = row.querySelector(".wallet-name-label"); input.className =
const buttonsSpan = row.querySelector("span.flex.gap-1"); "border border-border p-0 text-xs bg-bg text-fg w-full";
input.value = wallet.name || "Wallet " + (idx + 1);
nameSpan.innerHTML = `<input type="text" class="rename-wallet-input border border-border px-1 text-xs bg-bg text-fg" value="${escapeHtml(currentName)}" />`; span.replaceWith(input);
buttonsSpan.innerHTML =
`<button class="btn-rename-save border border-border px-1 hover:bg-fg hover:text-bg cursor-pointer">[save]</button>` +
`<button class="btn-rename-cancel border border-border px-1 hover:bg-fg hover:text-bg cursor-pointer">[cancel]</button>`;
const input = nameSpan.querySelector("input");
input.focus(); input.focus();
input.select(); input.select();
const finish = async () => {
const save = async () => { const val = input.value.trim();
const newName = input.value.trim(); if (val && val !== wallet.name) {
if (newName) { wallet.name = val;
wallet.name = newName;
await saveState(); await saveState();
} }
renderWalletListSettings(); renderWalletListSettings();
}; };
input.addEventListener("blur", finish);
buttonsSpan
.querySelector(".btn-rename-save")
.addEventListener("click", save);
buttonsSpan
.querySelector(".btn-rename-cancel")
.addEventListener("click", () => renderWalletListSettings());
input.addEventListener("keydown", (e) => { input.addEventListener("keydown", (e) => {
if (e.key === "Enter") save(); if (e.key === "Enter") input.blur();
if (e.key === "Escape") renderWalletListSettings(); if (e.key === "Escape") {
input.value = wallet.name || "Wallet " + (idx + 1);
input.blur();
}
}); });
}); });
}); });