Skip to content

Commit

Permalink
Corrigiendo el bug que impedía cerrar la ventana en la versión offiline.
Browse files Browse the repository at this point in the history
  • Loading branch information
hugoruscitti committed Aug 5, 2023
1 parent a6c8ba3 commit 1ba075c
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 6 deletions.
22 changes: 16 additions & 6 deletions app/routes/editor.js
Expand Up @@ -12,12 +12,22 @@ export default Route.extend({
},

conectar_manejador_para_evitar_cierres_accidentales() {
// Evita que el usuario cierre accidentalmente la ventana.
window.onbeforeunload = () => {
if (ENV.environment !== "test" && this.serviceProyecto.hay_cambios_por_guardar) {
return 'Hay cambios sin guardar, ¿Quieres salir?';
}
};
// Evita que el usuario cierre accidentalmente la ventana cuando
// no se usa electron.
//
// Se evita usar este código en electron porque hay varios problemas
// en utilizar "onbeforeunload" en electron. Para evitar que el usuario
// cierre la ventana y pierda cambios se usa otra estrategia, ver el archivo
// electron.js o prod-electron.js.
if (!window.enElectron) {
window.onbeforeunload = () => {

if (ENV.environment !== "test" && this.serviceProyecto.hay_cambios_por_guardar) {
return 'Hay cambios sin guardar, ¿Quieres salir?';
}

};
}
},

actions: {
Expand Down
24 changes: 24 additions & 0 deletions app/services/proyecto.js
Expand Up @@ -37,10 +37,34 @@ export default Service.extend({

cuando_guarda() {
this.set("hay_cambios_por_guardar", false);
this.avisar_a_electron_si_hay_cambios_por_guardar();
},

cuando_realiza_un_cambio() {
this.set("hay_cambios_por_guardar", true);
this.avisar_a_electron_si_hay_cambios_por_guardar();

},

avisar_a_electron_si_hay_cambios_por_guardar() {
// Electron necesita poder controlar si la ventana
// de la aplicación se puede cerrar o no, para esto
// ember tiene que avisarle al proceso principal de
// electron si el usuario tiene cambios por guardar
// o no. Este código hace exactamente eso, le envía
// al proceso principal de electron si el usuario
// tiene cambios por guardar o no. Vea el archivo
// electron.js o prod-electron.js para ver cómo gestiona
// electron este cambio del lado del proceso principal.
//
// Este código solo funciona cuando la aplicación
// está funcionando dentro de electron

if (window.enElectron) {
const { ipcRenderer } = requireNode('electron');
let cambios = this.get("hay_cambios_por_guardar");
ipcRenderer.send("cambia-estado-guardado", cambios);
}
},

eliminar_proyectos_guardados() {
Expand Down
41 changes: 41 additions & 0 deletions electron.js
Expand Up @@ -11,13 +11,15 @@ const emberAppLocation = `file://${dirname}/dist/index.html`;
const fs = require("fs");

let mainWindow = null;
let necesita_confirmar_para_cerrar_la_ventana = false;

global.sharedObj = { desarrollo: true };

app.on("window-all-closed", function onWindowAllClosed() {
app.quit();
});


app.on("ready", function onReady() {
mainWindow = new BrowserWindow({
width: 800,
Expand All @@ -33,6 +35,19 @@ app.on("ready", function onReady() {
var rutas = [`${dirname}/dist/index.html`, `${dirname}/dist/pilas-engine.js`, `${dirname}/dist/assets/pilas-engine.js`, `${dirname}/dist/assets/vendor.js`, `${dirname}/dist/assets/pilas-engine.css`];
let ultima_actualizacion = new Date();


// Este evento "cambia-estado-guardado" sirve para que electron
// sepa si tiene que pedirle al usuario configuración para cerrar
// la ventana o no. Hay un service de lado de ember llamado Proyecto
// que se encarga de mantener informado a este proceso principal
// el estado de guardado.
ipcMain.on('cambia-estado-guardado', (event, estado) => {
// esta variable se usa nuevamente en el handler para cerrar
// la ventana, buscar "close" en este mismo archivo para más
// detalles.
necesita_confirmar_para_cerrar_la_ventana = estado;
});

rutas.map(function(ruta) {
fs.watch(ruta, function() {
let ahora = new Date();
Expand All @@ -58,6 +73,32 @@ app.on("ready", function onReady() {
mainWindow = null;
});

var close = false;

mainWindow.on("close", (event) => {
if (necesita_confirmar_para_cerrar_la_ventana && close === false) {
event.preventDefault();

electron.dialog.showMessageBox({
type: 'warning',
buttons: ['No', 'Sí, quiero salir'],
title: '¿Realmente quieres salir?',
message: '¿Realmente quieres salir?, se pueden perder los cambios sin guardar',
cancelId: 1,
defaultId: 1,
noLink: true
}).then((val) => {

if (val.response === 0) {
// Cancel the close process
} else if (mainWindow) {
close = true
mainWindow.close()
}
});
}
});

process.on("uncaughtException", err => {
console.log("An exception in the main thread was not handled.");
console.log("This is a serious issue that needs to be handled and/or debugged.");
Expand Down
42 changes: 42 additions & 0 deletions prod-electron.js
Expand Up @@ -4,11 +4,13 @@
const electron = require("electron");
const path = require("path");
const app = electron.app;
const ipcMain = electron.ipcMain;
const BrowserWindow = electron.BrowserWindow;
const dirname = __dirname || path.resolve(path.dirname());
const emberAppLocation = `file://${dirname}/index.html`;

let mainWindow = null;
let necesita_confirmar_para_cerrar_la_ventana = false;

global.sharedObj = { desarrollo: false };

Expand All @@ -27,6 +29,19 @@ app.on("ready", function onReady() {
}
});

// Este evento "cambia-estado-guardado" sirve para que electron
// sepa si tiene que pedirle al usuario configuración para cerrar
// la ventana o no. Hay un service de lado de ember llamado Proyecto
// que se encarga de mantener informado a este proceso principal
// el estado de guardado.
ipcMain.on('cambia-estado-guardado', (event, estado) => {
// esta variable se usa nuevamente en el handler para cerrar
// la ventana, buscar "close" en este mismo archivo para más
// detalles.
necesita_confirmar_para_cerrar_la_ventana = estado;
});


delete mainWindow.module;

mainWindow.loadURL(emberAppLocation);
Expand All @@ -39,6 +54,33 @@ app.on("ready", function onReady() {
mainWindow = null;
});

var close = false;

mainWindow.on("close", (event) => {
if (necesita_confirmar_para_cerrar_la_ventana && close === false) {
event.preventDefault();

electron.dialog.showMessageBox({
type: 'warning',
buttons: ['No', 'Sí, quiero salir'],
title: '¿Realmente quieres salir?',
message: '¿Realmente quieres salir?, se pueden perder los cambios sin guardar',
cancelId: 1,
defaultId: 1,
noLink: true
}).then((val) => {

if (val.response === 0) {
// Cancel the close process
} else if (mainWindow) {
close = true
mainWindow.close()
}
});
}
});


process.on("uncaughtException", err => {
console.log("An exception in the main thread was not handled.");
console.log("This is a serious issue that needs to be handled and/or debugged.");
Expand Down

0 comments on commit 1ba075c

Please sign in to comment.