@@ -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 | |||
}); |