From 58828b26dcc804b4ee6fc8d5b1b42b23094b9015 Mon Sep 17 00:00:00 2001
From: guanzi008 <245205080@qq.com>
Date: Tue, 5 Nov 2024 01:12:56 +0800
Subject: [PATCH] Update main.js (#29)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Electron 串口选择实现
---
 main.js | 74 ++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 44 insertions(+), 30 deletions(-)

diff --git a/main.js b/main.js
index ad06535..2bd1fb9 100644
--- a/main.js
+++ b/main.js
@@ -1,64 +1,78 @@
-const { app, BrowserWindow } = require('electron/main')
+const { app, BrowserWindow, dialog } = require('electron/main');
 
-function createWindow () {
+function createWindow() {
   const mainWindow = new BrowserWindow({
     width: 1280,
     height: 760,
     autoHideMenuBar: true
-  })
+  });
 
-  mainWindow.webContents.session.on('select-serial-port', (event, portList, webContents, callback) => {
-    // Add listeners to handle ports being added or removed before the callback for `select-serial-port`
-    // is called.
+  mainWindow.webContents.session.on('select-serial-port', async (event, portList, webContents, callback) => {
+    // Add listeners to handle ports being added or removed before the callback for `select-serial-port` is called.
     mainWindow.webContents.session.on('serial-port-added', (event, port) => {
-      console.log('serial-port-added FIRED WITH', port)
+      console.log('serial-port-added FIRED WITH', port);
       // Optionally update portList to add the new port
-    })
+    });
 
     mainWindow.webContents.session.on('serial-port-removed', (event, port) => {
-      console.log('serial-port-removed FIRED WITH', port)
+      console.log('serial-port-removed FIRED WITH', port);
       // Optionally update portList to remove the port
-    })
+    });
+
+    event.preventDefault();
 
-    event.preventDefault()
     if (portList && portList.length > 0) {
-      console.log(portList[portList.length - 1])
-      callback(portList[portList.length - 1].portId)
+      // Only keep the last 5 ports
+      const lastFivePorts = portList.slice(-5);
+
+      // Prepare options for dialog box
+      const options = {
+        type: 'question',
+        buttons: lastFivePorts.map(port => port.portName), // Display port names as choices
+        title: 'Select Serial Port',
+        message: 'Please select a serial port to use:'
+      };
+
+      const result = await dialog.showMessageBox(mainWindow, options);
+      if (result.response >= 0) {
+        callback(lastFivePorts[result.response].portId); // Callback with the selected port ID
+      } else {
+        callback(''); // No port selected
+      }
     } else {
-      // eslint-disable-next-line n/no-callback-literal
-      callback('') // Could not find any matching devices
+      callback(''); // No ports available
     }
-  })
+  });
 
   mainWindow.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
     if (permission === 'serial' && details.securityOrigin === 'file:///') {
-      return true
+      return true;
     }
 
-    return false
-  })
+    return false;
+  });
 
   mainWindow.webContents.session.setDevicePermissionHandler((details) => {
     if (details.deviceType === 'serial' && details.origin === 'file://') {
-      return true
+      return true;
     }
 
-    return false
-  })
+    return false;
+  });
 
-  mainWindow.loadFile('./dist/index.html')
+  mainWindow.loadFile('./dist/index.html');
 
-  // mainWindow.webContents.openDevTools()
+  // mainWindow.webContents.openDevTools();
 }
 
 app.whenReady().then(() => {
-  createWindow()
+  createWindow();
 
   app.on('activate', function () {
-    if (BrowserWindow.getAllWindows().length === 0) createWindow()
-  })
-})
+    if (BrowserWindow.getAllWindows().length === 0) createWindow();
+  });
+});
 
 app.on('window-all-closed', function () {
-  if (process.platform !== 'darwin') app.quit()
-})
\ No newline at end of file
+  if (process.platform !== 'darwin') app.quit();
+});