From 2735a7970a812675c52d27af80c56ebfd0e071d6 Mon Sep 17 00:00:00 2001 From: Sever Date: Sat, 4 Oct 2025 01:26:23 +0300 Subject: [PATCH] Fix secutiry problems and warnings --- src/main/ipc/apps.js | 3 - src/main/services/app-tracking.js | 1 - src/main/services/data-storage.js | 3 +- src/main/services/database.js | 213 ------------------ src/preload/preload.js | 2 +- src/renderer/js/analytics/analytics.js | 22 +- .../js/analytics/daily-usage-chart.js | 1 - src/renderer/js/analytics/heatmap.js | 20 +- src/renderer/js/analytics/insights.js | 9 +- src/renderer/js/app-details/app-details.js | 22 -- .../js/app-details/day-of-week-chart.js | 1 - src/renderer/js/app-details/heatmap.js | 2 - src/renderer/js/app-details/listeners.js | 8 +- .../js/app-details/session-duration-chart.js | 2 - .../js/index-page/collections-view.js | 4 +- src/renderer/js/index-page/collections.js | 2 +- src/renderer/js/index-page/context-menu.js | 1 - src/renderer/js/index-page/data-manager.js | 21 +- src/renderer/js/index-page/details.js | 9 +- src/renderer/js/index-page/display.js | 4 - src/renderer/js/index-page/navigation.js | 6 +- src/renderer/js/index-page/stats.js | 3 - src/renderer/js/index-page/ui-components.js | 5 - src/renderer/js/utils.js | 2 +- src/renderer/renderer.js | 11 +- 25 files changed, 49 insertions(+), 328 deletions(-) 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;