added custom confirm dialog as js confirm in electron on windows causes all text fields to be disabled

This commit is contained in:
liamcottle
2025-07-27 21:45:27 +12:00
parent 0c0f059ec4
commit 094f6cb5ec
10 changed files with 56 additions and 19 deletions

View File

@@ -22,6 +22,27 @@ ipcMain.handle('alert', async(event, message) => {
});
});
// add support for showing a confirm window via ipc
ipcMain.handle('confirm', async(event, message) => {
// show confirm dialog
const result = await dialog.showMessageBox(mainWindow, {
type: "question",
title: "Confirm",
message: message,
cancelId: 0, // esc key should press cancel button
defaultId: 1, // enter key should press ok button
buttons: [
"Cancel", // 0
"OK", // 1
],
});
// check if user clicked OK
return result.response === 1;
});
// add support for showing a prompt window via ipc
ipcMain.handle('prompt', async(event, message) => {
return await electronPrompt({

View File

@@ -15,6 +15,11 @@ contextBridge.exposeInMainWorld('electron', {
return await ipcRenderer.invoke('alert', message);
},
// show a confirm dialog in electron browser window, this fixes a bug where confirm breaks input fields on windows
confirm: async function(message) {
return await ipcRenderer.invoke('confirm', message);
},
// add support for using "prompt" in electron browser window
prompt: async function(message) {
return await ipcRenderer.invoke('prompt', message);

View File

@@ -448,7 +448,7 @@ export default {
// ask to stop syncing if already syncing
if(this.isSyncingPropagationNode){
if(confirm("Are you sure you want to stop syncing?")){
if(await DialogUtils.confirm("Are you sure you want to stop syncing?")){
await this.stopSyncingPropagationNode();
}
return;
@@ -529,7 +529,7 @@ export default {
async hangupAllCalls() {
// confirm user wants to hang up calls
if(!confirm("Are you sure you want to hang up all incoming and outgoing calls?")){
if(!await DialogUtils.confirm("Are you sure you want to hang up all incoming and outgoing calls?")){
return;
}

View File

@@ -259,6 +259,7 @@
<script>
import protobuf from "protobufjs";
import DialogUtils from "../../js/DialogUtils";
export default {
name: 'CallPage',
data() {
@@ -488,7 +489,7 @@ export default {
async hangupCall(callHash) {
// confirm user wants to hang up call
if(!confirm("Are you sure you want to hang up this call?")){
if(!await DialogUtils.confirm("Are you sure you want to hang up this call?")){
return;
}
@@ -681,7 +682,7 @@ export default {
async deleteCall(callHash) {
// confirm user wants to delete call
if(!confirm("Are you sure you want to delete this call?")){
if(!await DialogUtils.confirm("Are you sure you want to delete this call?")){
return;
}
@@ -701,7 +702,7 @@ export default {
async clearCallHistory() {
// confirm user wants to clear call history
if(!confirm("Are you sure you want to clear your call history?")){
if(!await DialogUtils.confirm("Are you sure you want to clear your call history?")){
return;
}

View File

@@ -191,7 +191,7 @@ export default {
async deleteInterface(interfaceName) {
// ask user to confirm deleting conversation history
if(!confirm("Are you sure you want to delete this interface? This can not be undone!")){
if(!await DialogUtils.confirm("Are you sure you want to delete this interface? This can not be undone!")){
return;
}

View File

@@ -73,7 +73,7 @@ export default {
async onDeleteMessageHistory() {
// ask user to confirm deleting conversation history
if(!confirm("Are you sure you want to delete all messages in this conversation? This can not be undone!")){
if(!await DialogUtils.confirm("Are you sure you want to delete all messages in this conversation? This can not be undone!")){
return;
}

View File

@@ -997,7 +997,7 @@ export default {
try {
// ask user to confirm deleting message
if(shouldConfirm && !confirm("Are you sure you want to delete this message? This can not be undone!")){
if(shouldConfirm && !await DialogUtils.confirm("Are you sure you want to delete this message? This can not be undone!")){
return;
}
@@ -1078,7 +1078,7 @@ export default {
// ask user if they still want to send message if it may be rejected by sender
if(totalMessageSize > 1000 * 900){ // actual limit in LXMF Router is 1mb
if(!confirm(`Your message exceeds 900KB (It's ${this.formatBytes(totalMessageSize)}). It may be rejected by the recipient unless they have increased their delivery limit. Do you want to try sending anyway?`)){
if(!await DialogUtils.confirm(`Your message exceeds 900KB (It's ${this.formatBytes(totalMessageSize)}). It may be rejected by the recipient unless they have increased their delivery limit. Do you want to try sending anyway?`)){
return;
}
}
@@ -1209,10 +1209,10 @@ export default {
clearFileInput: function() {
this.$refs["file-input"].value = null;
},
removeImageAttachment: function() {
async removeImageAttachment() {
// ask user to confirm removing image attachment
if(!confirm("Are you sure you want to remove this image attachment?")){
if(!await DialogUtils.confirm("Are you sure you want to remove this image attachment?")){
return;
}
@@ -1244,7 +1244,7 @@ export default {
}
// ask user to confirm recording new audio attachment, if an existing audio attachment exists
if(this.newMessageAudio && !confirm("An audio recording is already attached. A new recording will replace it. Do you want to continue?")){
if(this.newMessageAudio && !await DialogUtils.confirm("An audio recording is already attached. A new recording will replace it. Do you want to continue?")){
return;
}
@@ -1386,10 +1386,10 @@ export default {
}
},
removeAudioAttachment: function() {
async removeAudioAttachment() {
// ask user to confirm removing audio attachment
if(!confirm("Are you sure you want to remove this audio attachment?")){
if(!await DialogUtils.confirm("Are you sure you want to remove this audio attachment?")){
return;
}

View File

@@ -862,10 +862,10 @@ export default {
}
},
onRemoveFavourite: function(favourite) {
async onRemoveFavourite(favourite) {
// ask user to confirm
if(!confirm("Are you sure you want to remove this favourite?")){
if(!await DialogUtils.confirm("Are you sure you want to remove this favourite?")){
return;
}
@@ -911,7 +911,7 @@ export default {
try {
// ask user to confirm
if(!confirm("Are you sure you want to identify yourself to this NomadNetwork Node? The page will reload after your identity has been sent.")){
if(!await DialogUtils.confirm("Are you sure you want to identify yourself to this NomadNetwork Node? The page will reload after your identity has been sent.")){
return;
}

View File

@@ -145,7 +145,7 @@ export default {
}
// confirm user wants to update their icon
if(!confirm("Are you sure you want to set this as your profile icon?")){
if(!await DialogUtils.confirm("Are you sure you want to set this as your profile icon?")){
return;
}
@@ -160,7 +160,7 @@ export default {
async removeProfileIcon() {
// confirm user wants to remove their icon
if(!confirm("Are you sure you want to remove your profile icon? Anyone that has already received it will continue to see it until you send them a new icon.")){
if(!await DialogUtils.confirm("Are you sure you want to remove your profile icon? Anyone that has already received it will continue to see it until you send them a new icon.")){
return;
}

View File

@@ -10,6 +10,16 @@ class DialogUtils {
}
}
static confirm(message) {
if(window.electron){
// running inside electron, use ipc confirm
return window.electron.confirm(message);
} else {
// running inside normal browser, use browser alert
return window.confirm(message);
}
}
static async prompt(message) {
if(window.electron){
// running inside electron, use ipc prompt