fix(ui): replace native confirm() dialogs with the global in-app modal
window.confirm blocks the JS event loop, which froze companion remote input while open — the remote user could raise the mesh "Clear" prompt (or reboot / backup-delete / uninstall confirms) and then never dismiss it, because the synthetic events that would dismiss it queue behind the dialog itself. New promise-based appConfirm() (useAppConfirm.ts) + one AppConfirmModal mounted globally in App.vue, built on BaseModal (Teleport-to-body, full-viewport backdrop, glass card — the canonical modal contract). All six native confirm() call sites migrated: mesh clear-all, mesh message delete, dashboard reboot, backup delete, backup USB copy, app uninstall. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
458444d700
commit
876ecc4bdf
@@ -13,6 +13,7 @@ import MeshDevicePanel from '@/views/mesh/MeshDevicePanel.vue'
|
||||
import MeshAssistantPanel from '@/views/mesh/MeshAssistantPanel.vue'
|
||||
import HopVizModal from '@/views/mesh/HopVizModal.vue'
|
||||
import { rpcClient } from '@/api/rpc-client'
|
||||
import { appConfirm } from '@/composables/useAppConfirm'
|
||||
import { wsClient } from '@/api/websocket'
|
||||
import { IMAGE_COMPRESSION_PRESETS, compressImage, makeThumbnail, type ImageCompressionPreset } from '@/utils/imageCompression'
|
||||
import MediaLightbox from '@/components/cloud/MediaLightbox.vue'
|
||||
@@ -281,7 +282,13 @@ async function refreshOutboxCount() {
|
||||
}
|
||||
|
||||
async function clearAllMesh() {
|
||||
if (!window.confirm('Clear all mesh peers, messages, and chat history? This cannot be undone.')) return
|
||||
const ok = await appConfirm({
|
||||
title: 'Clear mesh data',
|
||||
message: 'Clear all mesh peers, messages, and chat history? This cannot be undone.',
|
||||
confirmLabel: 'Clear everything',
|
||||
danger: true,
|
||||
})
|
||||
if (!ok) return
|
||||
try {
|
||||
await rpcClient.call({ method: 'mesh.clear-all' })
|
||||
await mesh.refreshAll()
|
||||
@@ -1419,7 +1426,13 @@ function clearPendingEdit() {
|
||||
}
|
||||
async function deleteOwnMessage(msg: MeshMessage) {
|
||||
if (msg.direction !== 'sent' || msg.sender_seq == null || !activeChatPeer.value) return
|
||||
if (!window.confirm('Delete this message? Peers already received it — this only marks it as deleted.')) return
|
||||
const ok = await appConfirm({
|
||||
title: 'Delete message',
|
||||
message: 'Delete this message? Peers already received it — this only marks it as deleted.',
|
||||
confirmLabel: 'Delete',
|
||||
danger: true,
|
||||
})
|
||||
if (!ok) return
|
||||
try {
|
||||
await mesh.deleteMessage(activeChatPeer.value.contact_id, msg.sender_seq)
|
||||
} catch (e) {
|
||||
|
||||
Reference in New Issue
Block a user