| @@ -0,0 +1,3 @@ | |||||
| node_modules | |||||
| dist | |||||
| package-lock.json | |||||
| @@ -0,0 +1,143 @@ | |||||
| <!DOCTYPE html> | |||||
| <html lang="en"> | |||||
| <head> | |||||
| <meta charset="UTF-8" /> | |||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||||
| <title>Monitoring Tool</title> | |||||
| <style> | |||||
| body { | |||||
| font-family: Arial, sans-serif; | |||||
| margin: 20px; | |||||
| } | |||||
| table { | |||||
| width: 100%; | |||||
| max-width: 600px; | |||||
| margin: 20px auto; | |||||
| border-collapse: collapse; | |||||
| } | |||||
| td { | |||||
| padding: 10px; | |||||
| } | |||||
| label { | |||||
| font-weight: bold; | |||||
| } | |||||
| button { | |||||
| display: block; | |||||
| margin: 20px auto; | |||||
| padding: 10px 20px; | |||||
| font-size: 16px; | |||||
| cursor: pointer; | |||||
| background-color: #007bff; | |||||
| color: white; | |||||
| border: none; | |||||
| border-radius: 5px; | |||||
| } | |||||
| button:hover { | |||||
| background-color: #0056b3; | |||||
| } | |||||
| textarea { | |||||
| width: 100%; | |||||
| min-height: 60px; | |||||
| } | |||||
| input, select { | |||||
| width: 100%; | |||||
| } | |||||
| h1 { | |||||
| text-align: center; | |||||
| color: #333; | |||||
| } | |||||
| .section { | |||||
| margin: 40px 0; | |||||
| } | |||||
| </style> | |||||
| </head> | |||||
| <body> | |||||
| <!-- Token Saving Section --> | |||||
| <div class="section"> | |||||
| <h1>Save Token</h1> | |||||
| <form id="tokenForm"> | |||||
| <table> | |||||
| <tr> | |||||
| <td> | |||||
| <label for="token">Token:</label> | |||||
| </td> | |||||
| <td> | |||||
| <input type="text" id="token" placeholder="Enter your token" required /> | |||||
| </td> | |||||
| </tr> | |||||
| </table> | |||||
| <button type="submit">Save Token</button> | |||||
| </form> | |||||
| </div> | |||||
| <!-- Check-Out Form Section --> | |||||
| <div class="section"> | |||||
| <h1>Check Out Form</h1> | |||||
| <form id="taskForm"> | |||||
| <table> | |||||
| <tr> | |||||
| <td> | |||||
| <label for="tasks">Tasks:</label> | |||||
| </td> | |||||
| <td> | |||||
| <textarea id="tasks" placeholder="Describe your tasks..." required></textarea> | |||||
| </td> | |||||
| </tr> | |||||
| </table> | |||||
| <button type="submit">Submit Check-Out</button> | |||||
| </form> | |||||
| </div> | |||||
| <script> | |||||
| // Handle token saving | |||||
| const tokenForm = document.getElementById('tokenForm'); | |||||
| const tokenInput = document.getElementById('token'); | |||||
| if (localStorage.token) { | |||||
| tokenInput.value = localStorage.token; | |||||
| } | |||||
| tokenForm.addEventListener('submit', (e) => { | |||||
| e.preventDefault(); | |||||
| const token = tokenInput.value.trim(); | |||||
| if (token) { | |||||
| localStorage.token = token; | |||||
| alert('Token saved successfully!'); | |||||
| } else { | |||||
| alert('Please enter a valid token.'); | |||||
| } | |||||
| }); | |||||
| // Handle check-out form submission | |||||
| const taskForm = document.getElementById('taskForm'); | |||||
| taskForm.addEventListener('submit', (e) => { | |||||
| e.preventDefault(); | |||||
| const project = document.getElementById('project').value; | |||||
| const tasks = document.getElementById('tasks').value; | |||||
| const token = localStorage.token || ''; | |||||
| if (!token) { | |||||
| alert('Please save your token first.'); | |||||
| return; | |||||
| } | |||||
| // Send data to Electron main process | |||||
| window.electronAPI.submitCheckout({ project, tasks, token }); | |||||
| // Display success message | |||||
| alert('Check-Out submitted successfully!'); | |||||
| }); | |||||
| </script> | |||||
| </body> | |||||
| </html> | |||||
| @@ -0,0 +1,105 @@ | |||||
| const { app, BrowserWindow, ipcMain, powerMonitor } = require('electron'); | |||||
| const path = require('path'); | |||||
| let mainWindow; | |||||
| app.on('ready', () => { | |||||
| createMainWindow(); | |||||
| // Automatically check in on app startup | |||||
| const token = getToken(); | |||||
| if (token) { | |||||
| console.log('Automatically checking in...'); | |||||
| sendAPIRequest('https://workx.webtrigon.com/api/v1/slack/check-in/', { token }); | |||||
| } else { | |||||
| console.warn('No token found for automatic check-in.'); | |||||
| } | |||||
| // Handle sleep or lid close event | |||||
| powerMonitor.on('suspend', () => { | |||||
| console.log('System is going to sleep.'); | |||||
| const token = getToken(); | |||||
| if (token) { | |||||
| sendAPIRequest('http://workx.webtrigon.com/api/v1/slack/check-out/', { token }); | |||||
| } else { | |||||
| console.warn('No token found for check-out.'); | |||||
| } | |||||
| }); | |||||
| powerMonitor.on('resume', () => { | |||||
| console.log('System is resuming.'); | |||||
| const token = getToken(); | |||||
| if (token) { | |||||
| sendAPIRequest('https://workx.webtrigon.com/api/v1/slack/check-in/', { token }); | |||||
| } else { | |||||
| console.warn('No token found for check-in.'); | |||||
| } | |||||
| createMainWindow(); // Reopen the window on resume | |||||
| }); | |||||
| }); | |||||
| function createMainWindow() { | |||||
| mainWindow = new BrowserWindow({ | |||||
| width: 800, | |||||
| height: 600, | |||||
| webPreferences: { | |||||
| preload: path.join(__dirname, 'preload.js'), | |||||
| nodeIntegration: false, | |||||
| contextIsolation: true, | |||||
| }, | |||||
| }); | |||||
| mainWindow.loadFile('index.html'); | |||||
| } | |||||
| // Handle manual check-out | |||||
| ipcMain.on('submit-checkout', (event, taskData) => { | |||||
| const { token, project, tasks } = taskData; | |||||
| if (!token) { | |||||
| console.error('Token is missing for check-out.'); | |||||
| return; | |||||
| } | |||||
| sendAPIRequest('http://workx.webtrigon.com/api/v1/slack/check-out/', { project, tasks, token }); | |||||
| }); | |||||
| // API request function | |||||
| async function sendAPIRequest(endpoint, data = {}) { | |||||
| const token = data.token || getToken(); // Retrieve token | |||||
| if (!token) { | |||||
| console.error('Token is required for API calls.'); | |||||
| return; | |||||
| } | |||||
| try { | |||||
| const response = await fetch(endpoint, { | |||||
| method: 'POST', // Assuming POST; modify if needed | |||||
| headers: { | |||||
| 'Content-Type': 'application/json', | |||||
| Authorization: `Bearer ${token}`, | |||||
| }, | |||||
| body: JSON.stringify(data), | |||||
| }); | |||||
| if (!response.ok) { | |||||
| console.error(`API call failed with status: ${response.status}`); | |||||
| } else { | |||||
| const result = await response.json(); | |||||
| console.log('API call succeeded:', result); | |||||
| } | |||||
| } catch (error) { | |||||
| console.error('Error during API call:', error); | |||||
| } | |||||
| } | |||||
| // Helper function to get token from local storage | |||||
| function getToken() { | |||||
| // Assuming `localStorage` is used to persist token via preload script | |||||
| try { | |||||
| const token = require('electron').ipcRenderer.sendSync('get-token'); | |||||
| return token || null; | |||||
| } catch (error) { | |||||
| // console.error('Error retrieving token:', error); | |||||
| return '2c920ac10c960614a6c73ed15d11c79529910d24'; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,14 @@ | |||||
| { | |||||
| "name": "checkin-bot", | |||||
| "version": "1.0.0", | |||||
| "description": "A cross-platform monitoring tool", | |||||
| "main": "main.js", | |||||
| "scripts": { | |||||
| "start": "electron .", | |||||
| "build": "electron-builder" | |||||
| }, | |||||
| "devDependencies": { | |||||
| "electron": "^25.0.0", | |||||
| "electron-builder": "^25.1.8" | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| const { contextBridge, ipcRenderer } = require('electron'); | |||||
| contextBridge.exposeInMainWorld('electronAPI', { | |||||
| submitCheckout: (taskData) => ipcRenderer.send('submit-checkout', taskData), | |||||
| getToken: () => localStorage.token || '2c920ac10c960614a6c73ed15d11c79529910d24', // Fetch token securely | |||||
| }); | |||||