diff --git a/src/main/ipc/apps.js b/src/main/ipc/apps.js
index aed16d4..4ce654f 100644
--- a/src/main/ipc/apps.js
+++ b/src/main/ipc/apps.js
@@ -1,7 +1,5 @@
const { ipcMain } = require('electron');
const { spawn } = require('child_process');
-const fsPromises = require('fs').promises;
-const path = require('path');
const {
getAllApps,
@@ -12,7 +10,6 @@ const {
restoreApp,
deleteAppAndSessions,
addToBlacklist,
- moveAppToCategory
} = require('../services/data-access');
const { formatTime, formatLastUsed } = require('../utils/utils');
diff --git a/src/main/services/app-tracking.js b/src/main/services/app-tracking.js
index 7bcc8e8..91f3d11 100644
--- a/src/main/services/app-tracking.js
+++ b/src/main/services/app-tracking.js
@@ -1,5 +1,4 @@
const activeWin = require('active-win');
-const path = require('path');
const fs = require('fs');
const { getDb } = require('./database');
diff --git a/src/main/services/data-storage.js b/src/main/services/data-storage.js
index 832022a..fb1b79b 100644
--- a/src/main/services/data-storage.js
+++ b/src/main/services/data-storage.js
@@ -189,11 +189,10 @@ module.exports = {
saveBlacklistedApps,
loadBlacklistedApps,
removeAppSessions,
- saveSessionsData,
get appData() { return appData; },
get sessionsData() { return sessionsData; },
set appData(value) { appData = value; },
set sessionsData(value) { sessionsData = value; },
get categoriesData() { return categoriesData; },
-}
\ No newline at end of file
+};
\ No newline at end of file
diff --git a/src/main/services/database.js b/src/main/services/database.js
index 4b45aa4..74efec0 100644
--- a/src/main/services/database.js
+++ b/src/main/services/database.js
@@ -13,21 +13,14 @@ async function initDatabase() {
: path.join(app.getPath('userData'), 'data');
const dbPath = path.join(dataDir, 'tracker.db');
- console.log('Data directory path:', dataDir);
- console.log('Database path:', dbPath);
-
// Create data directory if it doesn't exist
try {
if (!fs.existsSync(dataDir)) {
- console.log('Data directory does not exist, creating...');
fs.mkdirSync(dataDir, { recursive: true });
- console.log('Data directory created successfully');
} else {
- console.log('Data directory exists, checking if it is a directory...');
// Check if it's actually a directory and not a file
const stats = fs.statSync(dataDir);
if (!stats.isDirectory()) {
- console.log('Data path is a file, not a directory. Removing and creating directory...');
// If it's a file, remove it and create directory
fs.unlinkSync(dataDir);
fs.mkdirSync(dataDir, { recursive: true });
@@ -41,9 +34,7 @@ async function initDatabase() {
throw new Error(`Failed to create data directory: ${err.message}`);
}
- console.log('Creating database at:', dbPath);
db = new Database(dbPath);
- console.log('Database created successfully');
// Enable foreign keys
db.exec('PRAGMA foreign_keys = ON');
@@ -108,212 +99,10 @@ async function initDatabase() {
CREATE INDEX IF NOT EXISTS idx_apps_hidden ON apps(hidden);
`);
- // Run migrations for productivity levels
- migrateProductivityLevels();
-
console.log('Database initialized successfully');
return db;
}
-function migrateFromJSON() {
- console.log('Starting migration from JSON to SQLite...');
-
- const isDev = !app.isPackaged;
- const dataDir = isDev
- ? path.join(__dirname, '../../../data')
- : path.join(app.getPath('userData'), 'data');
- const appsFile = path.join(dataDir, 'apps.json');
- const sessionsFile = path.join(dataDir, 'sessions.json');
- const categoriesFile = path.join(dataDir, 'categories.json');
- const favoritesFile = path.join(dataDir, 'favorites.json');
- const blacklistFile = path.join(dataDir, 'blacklist.json');
-
- db.exec('BEGIN TRANSACTION');
-
- try {
- // Migrate categories first
- if (fs.existsSync(categoriesFile)) {
- const categories = JSON.parse(fs.readFileSync(categoriesFile, 'utf8'));
- const stmt = db.prepare(`
- INSERT OR IGNORE INTO categories (id, name, color, icon, is_default, created_at)
- VALUES (?, ?, ?, ?, ?, ?)
- `);
-
- for (const cat of categories) {
- stmt.run(
- cat.id,
- cat.name,
- cat.color || '#092442',
- cat.icon || '📁',
- cat.isDefault ? 1 : 0,
- cat.createdAt ? new Date(cat.createdAt).getTime() : Date.now()
- );
- }
- console.log(`Migrated ${categories.length} categories`);
- }
-
- // Migrate apps
- if (fs.existsSync(appsFile)) {
- const apps = JSON.parse(fs.readFileSync(appsFile, 'utf8'));
- const stmt = db.prepare(`
- INSERT OR REPLACE INTO apps
- (id, name, path, executable, category, icon_path, hidden, first_used, last_used, total_time, launch_count)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
- `);
-
- let appCount = 0;
- for (const [id, app] of Object.entries(apps)) {
- stmt.run(
- id,
- app.name,
- app.path || null,
- app.executable || null,
- app.category || 'Uncategorized',
- app.iconPath || null,
- app.hidden ? 1 : 0,
- app.firstUsed ? new Date(app.firstUsed).getTime() : null,
- app.lastUsed ? new Date(app.lastUsed).getTime() : null,
- app.totalTime || 0,
- app.launchCount || 0
- );
- appCount++;
- }
- console.log(`Migrated ${appCount} apps`);
- }
-
- // Migrate sessions
- if (fs.existsSync(sessionsFile)) {
- const sessions = JSON.parse(fs.readFileSync(sessionsFile, 'utf8'));
- const stmt = db.prepare(`
- INSERT OR IGNORE INTO sessions (id, app_id, start_time, end_time, duration)
- VALUES (?, ?, ?, ?, ?)
- `);
-
- let sessionCount = 0;
- for (const session of sessions) {
- const startTime = typeof session.startTime === 'string'
- ? new Date(session.startTime).getTime()
- : session.startTime;
-
- const endTime = session.endTime
- ? (typeof session.endTime === 'string'
- ? new Date(session.endTime).getTime()
- : session.endTime)
- : null;
-
- stmt.run(
- session.id,
- session.appId,
- startTime,
- endTime,
- session.duration || 0
- );
- sessionCount++;
- }
- console.log(`Migrated ${sessionCount} sessions`);
- }
-
- // Migrate favorites
- if (fs.existsSync(favoritesFile)) {
- const favorites = JSON.parse(fs.readFileSync(favoritesFile, 'utf8'));
- const stmt = db.prepare(`
- INSERT OR IGNORE INTO favorites (app_id) VALUES (?)
- `);
-
- for (const appId of favorites) {
- stmt.run(appId);
- }
- console.log(`Migrated ${favorites.length} favorites`);
- }
-
- // Migrate blacklist
- if (fs.existsSync(blacklistFile)) {
- const blacklist = JSON.parse(fs.readFileSync(blacklistFile, 'utf8'));
- const stmt = db.prepare(`
- INSERT OR IGNORE INTO blacklist (id, name, path, executable, blacklisted_at, reason)
- VALUES (?, ?, ?, ?, ?, ?)
- `);
-
- for (const item of blacklist) {
- stmt.run(
- item.id || `blacklist_${Date.now()}`,
- item.name,
- item.path,
- item.executable,
- item.blacklistedAt ? new Date(item.blacklistedAt).getTime() : Date.now(),
- item.reason || 'user_removed_permanently'
- );
- }
- console.log(`Migrated ${blacklist.length} blacklisted items`);
- }
-
- db.exec('COMMIT');
- console.log('Migration completed successfully!');
-
- // Backup JSON files
- const backupDir = path.join(dataDir, 'json_backup_' + Date.now());
- fs.mkdirSync(backupDir, { recursive: true });
-
- if (fs.existsSync(appsFile)) fs.renameSync(appsFile, path.join(backupDir, 'apps.json'));
- if (fs.existsSync(sessionsFile)) fs.renameSync(sessionsFile, path.join(backupDir, 'sessions.json'));
- if (fs.existsSync(categoriesFile)) fs.renameSync(categoriesFile, path.join(backupDir, 'categories.json'));
- if (fs.existsSync(favoritesFile)) fs.renameSync(favoritesFile, path.join(backupDir, 'favorites.json'));
- if (fs.existsSync(blacklistFile)) fs.renameSync(blacklistFile, path.join(backupDir, 'blacklist.json'));
-
- console.log(`JSON files backed up to: ${backupDir}`);
-
- } catch (error) {
- db.exec('ROLLBACK');
- console.error('Migration failed:', error);
- throw error;
- }
-}
-
-// Check if migration is needed
-function checkMigration() {
- const isDev = !app.isPackaged;
- const dataDir = isDev
- ? path.join(__dirname, '../../../data')
- : path.join(app.getPath('userData'), 'data');
- const appsFile = path.join(dataDir, 'apps.json');
- const dbFile = path.join(dataDir, 'tracker.db');
-
- // If database doesn't exist but JSON files do, run migration
- if (!fs.existsSync(dbFile) && fs.existsSync(appsFile)) {
- migrateFromJSON();
- }
-}
-
-// Migration for adding productivity level columns
-function migrateProductivityLevels() {
- try {
- // Check if columns already exist
- const categoriesInfo = db.pragma('table_info(categories)');
- const appsInfo = db.pragma('table_info(apps)');
-
- const hasProductivityInCategories = categoriesInfo.some(col => col.name === 'productivity_level');
- const hasProductivityInApps = appsInfo.some(col => col.name === 'productivity_level_override');
-
- // Add productivity_level to categories if it doesn't exist
- if (!hasProductivityInCategories) {
- db.exec(`
- ALTER TABLE categories ADD COLUMN productivity_level TEXT DEFAULT 'neutral';
- `);
- console.log('Added productivity_level column to categories table');
- }
-
- // Add productivity_level_override to apps if it doesn't exist
- if (!hasProductivityInApps) {
- db.exec(`
- ALTER TABLE apps ADD COLUMN productivity_level_override TEXT;
- `);
- console.log('Added productivity_level_override column to apps table');
- }
- } catch (error) {
- console.error('Error migrating productivity levels:', error);
- }
-}
-
function getDb() {
if (!db) {
throw new Error('Database not initialized. Call initDatabase() first.');
@@ -323,7 +112,5 @@ function getDb() {
module.exports = {
initDatabase,
- migrateFromJSON,
- checkMigration,
getDb
};
diff --git a/src/preload/preload.js b/src/preload/preload.js
index e033d42..5ef2d5b 100644
--- a/src/preload/preload.js
+++ b/src/preload/preload.js
@@ -1,4 +1,4 @@
-const { contextBridge, ipcRenderer, createCollection } = require('electron');
+const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('electronAPI', {
// Window controls
diff --git a/src/renderer/js/analytics/analytics.js b/src/renderer/js/analytics/analytics.js
index a979762..f1cb529 100644
--- a/src/renderer/js/analytics/analytics.js
+++ b/src/renderer/js/analytics/analytics.js
@@ -79,9 +79,12 @@ function updateCustomDatesForPeriod(period, dateInputs) {
// Listen for data from parent window
window.addEventListener('message', (event) => {
+ // Verify message comes from parent window
+ if (event.source !== window.parent) {
+ return;
+ }
if (event.data.type === 'ANALYTICS_DATA_RESPONSE') {
// Received analytics data from parent window
- console.log('Received analytics data:', event.data.data);
updateAnalyticsUI(event.data.data);
// Load heatmap data after main UI renders
@@ -90,22 +93,19 @@ window.addEventListener('message', (event) => {
}, 50);
} else if (event.data.type === 'HEATMAP_DATA_RESPONSE') {
// Received heatmap data
- console.log('Received heatmap data');
if (currentAnalyticsData) {
updateHourlyHeatmap(event.data.data, currentAnalyticsData.topApps);
}
} else if (event.data.type === 'CATEGORIES_RESPONSE') {
- // Received categories from parent window
- console.log('Received categories:', event.data.categories);
// Store categories in cache
event.data.categories.forEach(cat => {
- categoriesCache[cat.name] = cat.color || '#092442';
+ categoriesCache.set(cat.name, cat.color || '#092442');
});
}
});
let currentPeriod = 'today';
-let categoriesCache = {}; // Cache for category colors
+let categoriesCache = new Map(); // Cache for category colors
let heatmapAppCount = 5; // Default to top 5 apps
let currentAnalyticsData = null; // Cache analytics data for heatmap updates
@@ -134,7 +134,7 @@ function calculateDateRange(period) {
endDate = today;
break;
case 'alltime':
- startDate = new Date(2020, 0, 1); // Jan 1, 2020
+ startDate = new Date(2025, 7, 1);
endDate = today;
break;
}
@@ -224,7 +224,6 @@ function updateStatsCards(data) {
}
function updateTopAppsList(topApps) {
- console.log(topApps)
const top_apps_list = document.querySelector('.top-apps-list');
if (!top_apps_list) return;
@@ -255,7 +254,6 @@ function updateTopAppsList(topApps) {
}
function updateAllApplications(allApps){
- console.log(allApps)
const top_apps_list = document.querySelector('.apps-used-grid');
if (!top_apps_list) return;
@@ -291,7 +289,7 @@ function updateAllApplications(allApps){
top_apps_list.innerHTML += `
-
+
${iconHtml}
@@ -304,8 +302,6 @@ function updateAllApplications(allApps){
}
function updateCategoryBreakdown(categoryBreakdown) {
- console.log('Category breakdown:', categoryBreakdown);
-
const category_grid = document.querySelector('.category-grid');
if (!category_grid) return;
@@ -345,7 +341,7 @@ function updateCategoryBreakdown(categoryBreakdown) {
const percentage = Math.round((category.total_time / totalTime) * 100);
category_grid.innerHTML += `
-
+
${escapeHtml(category.category)}
${formatTime(category.total_time)}
${percentage}% of total time
diff --git a/src/renderer/js/analytics/daily-usage-chart.js b/src/renderer/js/analytics/daily-usage-chart.js
index aa1cb75..a0f465b 100644
--- a/src/renderer/js/analytics/daily-usage-chart.js
+++ b/src/renderer/js/analytics/daily-usage-chart.js
@@ -68,7 +68,6 @@ function renderSingleDayCanvasChart(ctx, canvas, dayData) {
}
function updateDailyUsageChart(dailyBreakdown) {
- console.log('Daily breakdown:', dailyBreakdown);
const canvas = document.getElementById('daily-usage-canvas');
if (!canvas) return;
diff --git a/src/renderer/js/analytics/heatmap.js b/src/renderer/js/analytics/heatmap.js
index 20baeac..c84c141 100644
--- a/src/renderer/js/analytics/heatmap.js
+++ b/src/renderer/js/analytics/heatmap.js
@@ -51,30 +51,30 @@ function updateHourlyHeatmap(hourlyAppBreakdown, topApps) {
: topApps ? topApps.slice(0, heatmapAppCount) : [];
// Group hourly data by app
- const appHourlyData = {};
+ const appHourlyData = new Map();
hourlyAppBreakdown.forEach(item => {
- if (!appHourlyData[item.name]) {
- appHourlyData[item.name] = {
+ if (!appHourlyData.has(item.name)) {
+ appHourlyData.set(item.name, {
name: item.name,
category: item.category,
- hours: {}
- };
+ hours: new Map()
+ });
}
- appHourlyData[item.name].hours[item.hour] = item.total_time;
+ appHourlyData.get(item.name).hours.set(item.hour, item.total_time);
});
// Get category colors from cache for each app
const getAppColor = (category) => {
- return categoriesCache[category] || '#66c0f4';
+ return categoriesCache.get(category) || '#66c0f4';
};
// Render each top app's hourly data
topAppsToShow.forEach(app => {
- const appData = appHourlyData[app.name];
+ const appData = appHourlyData.get(app.name);
if (!appData) return;
// Find max time for this app to normalize opacity
- const maxTime = Math.max(...Object.values(appData.hours));
+ const maxTime = Math.max(...appData.hours.values());
// Add app label
heatmapGrid.innerHTML += `
${escapeHtml(app.name)}
`;
@@ -91,7 +91,7 @@ function updateHourlyHeatmap(hourlyAppBreakdown, topApps) {
// Add hourly cells
for (let hour = 0; hour < 24; hour++) {
- const timeInHour = appData.hours[hour] || 0;
+ const timeInHour = appData.hours.get(hour) || 0;
const opacity = timeInHour > 0 ? Math.max(0.1, (timeInHour / maxTime)) : 0.05;
const tooltip = timeInHour > 0 ?
diff --git a/src/renderer/js/analytics/insights.js b/src/renderer/js/analytics/insights.js
index 8b59da1..fb41d29 100644
--- a/src/renderer/js/analytics/insights.js
+++ b/src/renderer/js/analytics/insights.js
@@ -14,14 +14,13 @@ function updateInsights(data) {
🎯
Focus Time
-
Longest session: ${focusTime} on ${escapeHtml(data.longestSession.app_name)} (${sessionDate}).
+
Longest session: ${escapeHtml(focusTime)} on ${escapeHtml(data.longestSession.app_name)} (${sessionDate}).
`;
}
// 3. Variety Score (App Diversity)
- const varietyPercentage = Math.round((data.overallStats.uniqueApps / (data.topApps.length || 1)) * 100);
let varietyMessage = '';
if (data.overallStats.uniqueApps === 1) {
varietyMessage = 'Highly focused - using only 1 app.';
@@ -38,7 +37,7 @@ function updateInsights(data) {
🎨
Variety Score
-
${varietyMessage}
+
${escapeHtml(varietyMessage)}
`;
@@ -81,7 +80,7 @@ function updateInsights(data) {
⏰
Peak Activity Hours
-
Most active around ${peakTimeText} (${formatTime(maxTime)} total).
+
Most active around ${escapeHtml(peakTimeText)} (${escapeHtml(formatTime(maxTime))} total).
`;
@@ -108,7 +107,7 @@ function updateInsights(data) {
🔄
App Switching Rate
-
${switchingMessage}
+
${escapeHtml(switchingMessage)}
`;
diff --git a/src/renderer/js/app-details/app-details.js b/src/renderer/js/app-details/app-details.js
index ef2cc1d..b1281e5 100644
--- a/src/renderer/js/app-details/app-details.js
+++ b/src/renderer/js/app-details/app-details.js
@@ -27,15 +27,12 @@ async function loadAppDetails() {
const hero = document.querySelector('.app-hero');
if (hero) {
const categoryColor = details.categoryColor || '#092442';
- console.log('Category color from parent:', categoryColor);
// Convert hex to RGB for gradient
const rgb = hexToRgb(categoryColor);
- console.log('RGB values:', rgb);
if (rgb) {
const gradient = `linear-gradient(135deg, rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.8) 0%, rgba(${Math.floor(rgb.r * 0.7)}, ${Math.floor(rgb.g * 0.7)}, ${Math.floor(rgb.b * 0.7)}, 0.9) 100%)`;
- console.log('Setting gradient:', gradient);
hero.style.background = gradient;
}
}
@@ -234,9 +231,6 @@ function updateMonthlyCalendar(details) {
}
const monthlyData = details.monthlyUsage || [];
- console.log('Monthly data:', monthlyData);
- console.log('Monthly data type:', typeof monthlyData);
- console.log('Is array:', Array.isArray(monthlyData));
if (!monthlyData || monthlyData.length === 0) {
calendar.innerHTML = '
No data available for the last 30 days
';
@@ -319,8 +313,6 @@ function updateDropdownButton(level, categoryDefault = null) {
const productivityText = document.getElementById('productivity-text');
if (productivityIcon) productivityIcon.textContent = config.icon;
if (productivityText) productivityText.textContent = config.text;
-
- console.log('Updated dropdown button to:', displayLevel, config);
}
// Update the productivity stat card
@@ -374,28 +366,18 @@ function updateProductivityStatCard(level, isInherited = false) {
// Add the appropriate class
statCard.classList.add(config.class);
-
- console.log('Updated productivity stat card to:', level, isInherited ? '(inherited)' : '(custom)');
}
async function initializeProductivitySelector() {
if (!appDetails) return;
const appId = appDetails.app.id;
- const category = appDetails.app.category;
try {
- console.log('Initializing productivity selector for app:', appId);
- console.log('Full app details:', appDetails);
- console.log('App object:', appDetails.app);
- console.log('App productivity_level_override:', appDetails.app.productivity_level_override);
-
// Get the app's override value
const hasOverride = appDetails.app.productivity_level_override != null;
const overrideLevel = appDetails.app.productivity_level_override;
- console.log('hasOverride:', hasOverride, 'overrideLevel:', overrideLevel);
-
// Request categories from parent to get category default
window.parent.postMessage({
type: 'GET_CATEGORIES'
@@ -425,8 +407,6 @@ async function initializeProductivitySelector() {
async function setProductivityLevel(level, appId) {
try {
- console.log('Setting productivity level:', { level, appId });
-
// Since we're in an iframe, send message to parent window to handle IPC
window.parent.postMessage({
type: 'SET_PRODUCTIVITY_LEVEL',
@@ -450,7 +430,6 @@ async function setProductivityLevel(level, appId) {
}
currentProductivityLevel = level === 'inherit' ? currentCategoryProductivityLevel : level;
- console.log('Productivity level update request sent to parent');
} catch (error) {
console.error('Error setting productivity level:', error);
console.error('Error stack:', error.stack);
@@ -482,7 +461,6 @@ function hideInheritedInfo() {
// Element doesn't exist in the new dropdown design, so just skip if not found
if (!inheritedInfo) {
- console.log('Inherited info element not found (expected for dropdown design)');
return;
}
diff --git a/src/renderer/js/app-details/day-of-week-chart.js b/src/renderer/js/app-details/day-of-week-chart.js
index dc2d24e..e5f4f60 100644
--- a/src/renderer/js/app-details/day-of-week-chart.js
+++ b/src/renderer/js/app-details/day-of-week-chart.js
@@ -5,7 +5,6 @@ function updateDayOfWeekChart(details) {
const dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
const dayData = details.dayOfWeekUsage || [];
- console.log('Day of week data:', dayData);
if (!dayData || dayData.length === 0) {
chart.innerHTML = '
No data available
';
diff --git a/src/renderer/js/app-details/heatmap.js b/src/renderer/js/app-details/heatmap.js
index 86f3ed2..0204d83 100644
--- a/src/renderer/js/app-details/heatmap.js
+++ b/src/renderer/js/app-details/heatmap.js
@@ -4,8 +4,6 @@ function updateHeatmap(details) {
if (!container) return;
const heatmapData = details.heatmapData || [];
- console.log('Heatmap data:', heatmapData);
- console.log('Heatmap data length:', heatmapData.length);
if (!heatmapData || heatmapData.length === 0) {
container.innerHTML = '
No heatmap data available
';
diff --git a/src/renderer/js/app-details/listeners.js b/src/renderer/js/app-details/listeners.js
index 37d14f3..57160c7 100644
--- a/src/renderer/js/app-details/listeners.js
+++ b/src/renderer/js/app-details/listeners.js
@@ -1,5 +1,10 @@
// Listen for data from parent window
window.addEventListener('message', (event) => {
+ // Verify message comes from parent window
+ if (event.source !== window.parent) {
+ return;
+ }
+
if (event.data.type === 'APP_DETAILS') {
appDetails = event.data.data;
loadAppDetails().then(() => {
@@ -19,14 +24,11 @@ window.addEventListener('message', (event) => {
}
} else if (event.data.type === 'CATEGORIES_DATA') {
// Received categories from parent
- console.log('Received categories:', event.data.categories);
if (appDetails) {
const category = appDetails.app.category;
const categoryData = event.data.categories.find(cat => cat.name === category);
const categoryProductivityLevel = categoryData?.productivity_level || 'neutral';
- console.log('Category productivity level:', categoryProductivityLevel);
-
// Update the dropdown if app has no override (is using inherit)
if (appDetails.app.productivity_level_override == null) {
// Update the button to show it's using category default
diff --git a/src/renderer/js/app-details/session-duration-chart.js b/src/renderer/js/app-details/session-duration-chart.js
index ede9e86..5b43ad9 100644
--- a/src/renderer/js/app-details/session-duration-chart.js
+++ b/src/renderer/js/app-details/session-duration-chart.js
@@ -4,8 +4,6 @@ function updateSessionDurationChart(details) {
if (!chart) return;
const durations = details.sessionDurations || [];
- console.log('Session durations:', durations);
- console.log('Session durations length:', durations.length);
if (!durations || durations.length === 0) {
chart.innerHTML = '
No session data available
';
diff --git a/src/renderer/js/index-page/collections-view.js b/src/renderer/js/index-page/collections-view.js
index 0698ace..ece4bf2 100644
--- a/src/renderer/js/index-page/collections-view.js
+++ b/src/renderer/js/index-page/collections-view.js
@@ -19,9 +19,7 @@ function toggleView(viewType) {
appsGrid.classList.remove('list-view');
}
}
-
- console.log(`Switched to ${viewType} view`);
-}
+ }
async function showCategoryOverview() {
diff --git a/src/renderer/js/index-page/collections.js b/src/renderer/js/index-page/collections.js
index 694bc2d..2f60f14 100644
--- a/src/renderer/js/index-page/collections.js
+++ b/src/renderer/js/index-page/collections.js
@@ -117,7 +117,7 @@ function showCreateCollectionModal() {
if (result.success) {
modal.remove();
showCategoryOverview();
- showDragFeedback("Collection created successfully!", true)
+ showDragFeedback("Collection created successfully!", true);
} else {
showDragFeedback(result.error || 'Failed to create collection, please try again', false);
}
diff --git a/src/renderer/js/index-page/context-menu.js b/src/renderer/js/index-page/context-menu.js
index 37446f1..79207b1 100644
--- a/src/renderer/js/index-page/context-menu.js
+++ b/src/renderer/js/index-page/context-menu.js
@@ -410,7 +410,6 @@ class ContextMenu {
try {
const result = await window.electronAPI.launchApp(appId);
if (result.success) {
- console.log('App launched successfully');
} else {
console.error('Failed to launch app:', result.error);
}
diff --git a/src/renderer/js/index-page/data-manager.js b/src/renderer/js/index-page/data-manager.js
index 78f3003..a3b4c7f 100644
--- a/src/renderer/js/index-page/data-manager.js
+++ b/src/renderer/js/index-page/data-manager.js
@@ -1,19 +1,14 @@
async function loadAppData() {
- try {
- console.log('Loading app data...');
-
+ try {
// Load favorites first
favoritesCache = await window.electronAPI.getFavorites();
- console.log('Favorites loaded:', favoritesCache);
// Load recent apps
const recentApps = await window.electronAPI.getRecentApps();
- console.log('Recent apps loaded:', recentApps.length, 'apps');
await displayRecentApps(recentApps);
// Load all apps
const allApps = await window.electronAPI.getAllApps();
- console.log('All apps loaded:', allApps.length, 'apps');
// Cache all apps for filtering
allAppsCache = allApps;
@@ -22,8 +17,6 @@ async function loadAppData() {
// Create navigation based on categories
await createCategoryNavigation(allApps);
-
- console.log('App data loaded successfully');
} catch (error) {
console.error('Error loading app data:', error);
}
@@ -106,18 +99,9 @@ async function loadFavoriteApps() {
}
async function loadHiddenApps(params) {
- try {
- console.log('Loading hidden apps');
-
+ try {
// Get current favorites
const hiddenIds = await window.electronAPI.getHiddenApps();
- console.log('Hidden IDs:', hiddenIds);
-
- // Filter from cached apps to get favorite apps
- const hiddenApps = allAppsCache.filter(app => hiddenIds.includes(app.id));
-
- console.log('Filtered favorite apps:', hiddenApps.length);
- console.log('Favorite apps:', hiddenApps.map(app => app.name));
await displayAllApps(hiddenIds);
@@ -140,7 +124,6 @@ async function loadRecentApps() {
async function groupAppsByCategory(apps) {
try {
const categories = await window.electronAPI.getCategories();
- console.log('Categories received in renderer:', categories);
if (!categories || !Array.isArray(categories)) {
console.error('Categories data is invalid:', categories);
diff --git a/src/renderer/js/index-page/details.js b/src/renderer/js/index-page/details.js
index 1e8b3a6..dbf50ed 100644
--- a/src/renderer/js/index-page/details.js
+++ b/src/renderer/js/index-page/details.js
@@ -1,5 +1,4 @@
async function showAppDetails(appName) {
- console.log(`Opening details for: ${appName}`);
// Get the app ID from the clicked element or find it
const appData = allAppsCache.find(app => app.name === appName);
@@ -14,7 +13,6 @@ async function showAppDetails(appName) {
// Get category color
const categoryColor = await getCategoryColor(details.app.category);
details.categoryColor = categoryColor;
- console.log(`Category: ${details.app.category}, Color: ${categoryColor}`);
// Hide current content
const recentSection = document.querySelector('.recent-section');
@@ -95,6 +93,11 @@ async function showAppDetails(appName) {
// Listen for messages from app-details iframe
window.addEventListener('message', async (event) => {
+ const appDetailsIframe = document.querySelector('.app-details-iframe-wrapper iframe');
+ if (!appDetailsIframe || event.source !== appDetailsIframe.contentWindow) {
+ return;
+ }
+
if (event.data.type === 'LAUNCH_APP') {
try {
const result = await window.electronAPI.launchApp(event.data.appId);
@@ -144,12 +147,10 @@ window.addEventListener('message', async (event) => {
} else if (event.data.type === 'SET_PRODUCTIVITY_LEVEL') {
// Handle productivity level update from iframe
try {
- console.log('Parent: Received SET_PRODUCTIVITY_LEVEL:', event.data);
const result = await window.electronAPI.setAppProductivityOverride(
event.data.appId,
event.data.level === 'inherit' ? null : event.data.level
);
- console.log('Parent: Productivity level updated:', result);
} catch (error) {
console.error('Parent: Error setting productivity level:', error);
}
diff --git a/src/renderer/js/index-page/display.js b/src/renderer/js/index-page/display.js
index 8416171..eaa97ff 100644
--- a/src/renderer/js/index-page/display.js
+++ b/src/renderer/js/index-page/display.js
@@ -1,6 +1,5 @@
// Display all apps
async function displayAllApps(apps) {
- console.log('Displaying all apps:', apps);
const appsContainer = document.querySelector('.apps-grid');
const sectionHeader = document.querySelector('.all-apps-section .section-header');
const allAppsSection = document.querySelector('.all-apps-section');
@@ -38,8 +37,6 @@ async function displayAllApps(apps) {
appsContainer.classList.add('categorized-view');
const appsByCategory = await groupAppsByCategory(apps);
-
- console.log("Apps by category: ", appsByCategory);
// Display each category with its apps
Object.keys(appsByCategory).forEach(categoryName => {
@@ -98,7 +95,6 @@ async function displayAllApps(apps) {
// Display recent apps
async function displayRecentApps(apps) {
- console.log('Displaying recent apps:', apps);
const recentContainer = document.querySelector('.recent-games');
if (!recentContainer) {
console.error('Recent container not found!');
diff --git a/src/renderer/js/index-page/navigation.js b/src/renderer/js/index-page/navigation.js
index a225ccc..75c4fa4 100644
--- a/src/renderer/js/index-page/navigation.js
+++ b/src/renderer/js/index-page/navigation.js
@@ -1,8 +1,6 @@
// Create navigation sections based on app categories
-async function createCategoryNavigation(apps) {
- console.log('Creating category navigation for apps:', apps);
-
+async function createCategoryNavigation(apps) {
const libraryNav = document.querySelector('.library-nav');
if (!libraryNav) {
console.error('Library nav container not found!');
@@ -23,7 +21,6 @@ async function createCategoryNavigation(apps) {
// Group apps by category using helper function
const appsByCategory = await groupAppsByCategory(apps);
- console.log('Apps grouped by category:', appsByCategory);
// Create nav sections for each category
Object.keys(appsByCategory).sort().forEach(categoryName => {
@@ -61,7 +58,6 @@ function filterNavigation(searchTerm) {
// Don't auto-expand when clearing search - keep original collapsed state
// Just ensure subitems container is properly sized
const subitems = section.querySelector('.nav-subitems');
- const toggleButton = section.querySelector('.category-toggle');
if (section.classList.contains('collapsed')) {
// Keep it collapsed
diff --git a/src/renderer/js/index-page/stats.js b/src/renderer/js/index-page/stats.js
index 3f5dc45..0e9e9e7 100644
--- a/src/renderer/js/index-page/stats.js
+++ b/src/renderer/js/index-page/stats.js
@@ -1,10 +1,7 @@
// Update today's stats display
async function updateTodayStats() {
- console.log('updateTodayStats called');
try {
- console.log('Calling getTodayStats...');
const stats = await window.electronAPI.getTodayStats();
- console.log('Stats received:', stats);
const timeElement = document.getElementById('todayTotalTime');
const countElement = document.getElementById('todayAppCount');
diff --git a/src/renderer/js/index-page/ui-components.js b/src/renderer/js/index-page/ui-components.js
index f27e73a..cb8decd 100644
--- a/src/renderer/js/index-page/ui-components.js
+++ b/src/renderer/js/index-page/ui-components.js
@@ -79,8 +79,6 @@ function createNavSection(categoryName, apps, isFavorites = false) {
subitemsContainer.className = 'nav-subitems';
subitemsContainer.dataset.category = categoryName;
- console.log("Creating nav section: ", apps)
-
// Add each app as a nav item
apps.forEach(app => {
const navItem = document.createElement('div');
@@ -210,9 +208,6 @@ function createCategoryCard(categoryName, apps, color = '#4a90e2') {
}
function showHomeView() {
- // Reset main-content
- const mainContent = document.querySelector('.main-content');
-
// Show home content
const recentSection = document.querySelector('.recent-section');
const allAppsSection = document.querySelector('.all-apps-section');
diff --git a/src/renderer/js/utils.js b/src/renderer/js/utils.js
index 1544f96..2f7948a 100644
--- a/src/renderer/js/utils.js
+++ b/src/renderer/js/utils.js
@@ -169,7 +169,7 @@ function hexToRgb(hex) {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
- } : null;
+ } : { r: 102, g: 192, b: 244 };
}
function formatDateForInput(date) {
diff --git a/src/renderer/renderer.js b/src/renderer/renderer.js
index 6a62dfb..2189108 100644
--- a/src/renderer/renderer.js
+++ b/src/renderer/renderer.js
@@ -52,7 +52,6 @@ document.addEventListener('DOMContentLoaded', () => {
e.stopPropagation();
const toggleButton = e.target.closest('.category-toggle');
- const categoryName = toggleButton.dataset.category;
const navSection = toggleButton.closest('.nav-section');
const subitemsContainer = navSection.querySelector('.nav-subitems');
@@ -156,11 +155,11 @@ document.addEventListener('DOMContentLoaded', () => {
}
});
- const homeButton = document.getElementById("home")
+ const homeButton = document.getElementById("home");
homeButton.addEventListener('click', (e) => {
showHomeView();
- })
+ });
// Handle Library tab click to show home view
const libraryTab = document.querySelector('.nav-tab.library-tab');
@@ -228,6 +227,12 @@ document.addEventListener('DOMContentLoaded', () => {
// Handle analytics data requests from iframe
window.addEventListener('message', async (event) => {
+ // Verify message comes from our analytics iframe
+ const analyticsIframe = document.querySelector('.analytics-iframe-wrapper iframe');
+ if (!analyticsIframe || event.source !== analyticsIframe.contentWindow) {
+ return;
+ }
+
if (event.data.type === 'REQUEST_ANALYTICS_DATA') {
const { startDate, endDate } = event.data;