3453e4d02417

vault list: long-press now enters multi-select with the held row selected, and the synthesised mobile contextmenu event is suppressed so it doesn't reopen the menu and undo the gesture (v4.3.6)

time
2026-07-27 23:22 UTC · 3 months ago
machine
koh2
agent
claude-MiniMax-M3
session
sync false-failure and bug trio
parent
88f4c97bcaab
4 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/popup/views/Vault.tsx+17 −2
manifest.firefox.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach Password Manager",4-  "version": "4.3.5",4+  "version": "4.3.6",55   "description": "Zero-knowledge password manager",66   "browser_specific_settings": {77     "gecko": {

view file

manifest.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach Password Manager",4-  "version": "4.3.5",4+  "version": "4.3.6",55   "description": "Zero-knowledge password manager",66   "action": {77     "default_popup": "src/popup/index.html",

view file

package.json+1 −1
@@ -1,6 +1,6 @@11 {22   "name": "peach",3-  "version": "4.3.5",3+  "version": "4.3.6",44   "description": "Zero-knowledge password manager",55   "license": "GPL-3.0-only",66   "type": "module",

view file

src/popup/views/Vault.tsx+17 −2
@@ -141,8 +141,14 @@141141     clearLongPressTimer();142142     longPressTimer = window.setTimeout(() => {143143       suppressNextClick = true;144+      // Touch-and-hold = multi-select. Pre-select the row so the action bar145+      // lights up immediately. The context menu still opens on desktop146+      // right-click (and on mobile if the browser synthesises its own long-147+      // press contextmenu event — that path is filtered by `touchStart` so148+      // both don't fire on a single gesture).149+      enterSelectMode();150+      setSelectedIds(new Set([entry.id]));144151       vibrate(20);145-      setContextEntry(entry);146152       longPressTimer = null;147153     }, 500);148154   }@@ -532,7 +538,16 @@532538                   onTouchMove={handleRowTouchMove}533539                   onTouchEnd={(e) => void handleRowTouchEnd(entry, e)}534540                   onTouchCancel={() => { clearLongPressTimer(); touchStart = null; }}535-                  onContextMenu={(e) => { e.preventDefault(); if (!selecting()) setContextEntry(entry); }}541+                  onContextMenu={(e) => {542+                    e.preventDefault();543+                    // A real touch long-press already entered multi-select544+                    // via the 500ms timer; the browser's synthesised545+                    // contextmenu event would otherwise reopen the menu and546+                    // undo the gesture. Desktop right-click has no `touchStart`547+                    // to consume, so it still opens the menu.548+                    if (touchStart !== null) { touchStart = null; return; }549+                    if (!selecting()) setContextEntry(entry);550+                  }}536551                   onClick={() => {537552                     if (suppressNextClick) { suppressNextClick = false; return; }538553                     if (selecting()) {

view file