You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

8.7 KiB

Electron Platform Cleanup Summary

Overview

This document summarizes the comprehensive cleanup and improvements made to the TimeSafari Electron implementation. The changes resolve platform detection issues, improve build consistency, and provide a clear architecture for desktop development.

Key Issues Resolved

1. Platform Detection Problems

  • Before: PlatformServiceFactory only supported "capacitor" and "web" platforms
  • After: Added proper "electron" platform support with dedicated ElectronPlatformService

2. Build Configuration Confusion

  • Before: Electron builds used VITE_PLATFORM=capacitor, causing confusion
  • After: Electron builds now properly use VITE_PLATFORM=electron

3. Missing Platform Service Methods

  • Before: Platform services lacked proper isElectron(), isCapacitor(), isWeb() methods
  • After: All platform services implement complete interface with proper detection

4. Inconsistent Build Scripts

  • Before: Mixed platform settings in build scripts
  • After: Clean, consistent electron-specific build process

Architecture Changes

Platform Service Factory Enhancement

// src/services/PlatformServiceFactory.ts
export class PlatformServiceFactory {
  public static getInstance(): PlatformService {
    const platform = process.env.VITE_PLATFORM || "web";
    
    switch (platform) {
      case "capacitor":
        return new CapacitorPlatformService();
      case "electron":
        return new ElectronPlatformService(); // NEW
      case "web":
      default:
        return new WebPlatformService();
    }
  }
}

New ElectronPlatformService

  • Extends CapacitorPlatformService for SQLite compatibility
  • Overrides capabilities for desktop-specific features
  • Provides proper platform detection methods
class ElectronPlatformService extends CapacitorPlatformService {
  getCapabilities() {
    return {
      hasFileSystem: true,
      hasCamera: false,           // Desktop typically doesn't have integrated cameras
      isMobile: false,           // Electron is desktop, not mobile
      isIOS: false,
      hasFileDownload: true,     // Desktop supports direct file downloads
      needsFileHandlingInstructions: false, // Desktop users familiar with file handling
      isNativeApp: true,
    };
  }
  
  isElectron(): boolean { return true; }
  isCapacitor(): boolean { return false; }
  isWeb(): boolean { return false; }
}

Enhanced Platform Service Interface

// src/services/PlatformService.ts
export interface PlatformService {
  // Platform detection methods
  isCapacitor(): boolean;
  isElectron(): boolean;
  isWeb(): boolean;
  
  // ... existing methods
}

Build System Improvements

New Electron Vite Configuration

  • Created vite.config.electron.mts for electron-specific builds
  • Proper platform environment variables
  • Desktop-optimized build settings
  • Electron-specific entry point handling
# Before
npm run build:capacitor  # Used for electron builds (confusing)

# After  
npm run build:electron   # Dedicated electron build

Updated Build Scripts

  • package.json: Updated electron scripts to use proper electron build
  • scripts/common.sh: Fixed electron environment setup
  • scripts/build-electron.sh: Updated to use electron build instead of capacitor
  • scripts/electron-dev.sh: Updated for proper electron development workflow

Electron-Specific Entry Point

  • Created src/main.electron.ts for electron-specific initialization
  • Automatic entry point replacement in vite builds
  • Electron-specific logging and error handling

Configuration Updates

Vite Configuration

// vite.config.electron.mts
export default defineConfig(async () => {
  const baseConfig = await createBuildConfig("electron");
  
  return {
    ...baseConfig,
    plugins: [
      // Plugin to replace main entry point for electron builds
      {
        name: 'electron-entry-point',
        transformIndexHtml(html) {
          return html.replace('/src/main.web.ts', '/src/main.electron.ts');
        }
      }
    ],
    define: {
      'process.env.VITE_PLATFORM': JSON.stringify('electron'),
      '__ELECTRON__': JSON.stringify(true),
      '__IS_DESKTOP__': JSON.stringify(true),
      // ... other electron-specific flags
    }
  };
});

Common Configuration Updates

// vite.config.common.mts
const isElectron = mode === "electron";
const isNative = isCapacitor || isElectron;

// Updated environment variables and build settings for electron support

Usage Guide

Development Workflow

# Setup electron environment (first time only)
npm run electron:setup

# Development build and run
npm run electron:dev

# Alternative development workflow
npm run electron:dev-full

Production Builds

# Build web assets for electron
npm run build:electron

# Build and package electron app
npm run electron:build

# Build specific package types
npm run electron:build:appimage
npm run electron:build:deb

# Using the comprehensive build script
npm run build:electron:all

Platform Detection in Code

import { PlatformServiceFactory } from '@/services/PlatformServiceFactory';

const platformService = PlatformServiceFactory.getInstance();

if (platformService.isElectron()) {
  // Desktop-specific logic
  console.log('Running on Electron desktop');
} else if (platformService.isCapacitor()) {
  // Mobile-specific logic
  console.log('Running on mobile device');
} else if (platformService.isWeb()) {
  // Web-specific logic
  console.log('Running in web browser');
}

// Or check capabilities
const capabilities = platformService.getCapabilities();
if (capabilities.hasFileDownload) {
  // Enable direct file downloads (available on desktop)
}

File Structure Changes

New Files

  • vite.config.electron.mts - Electron-specific Vite configuration
  • src/main.electron.ts - Electron main entry point
  • doc/electron-cleanup-summary.md - This documentation

Modified Files

  • src/services/PlatformServiceFactory.ts - Added electron platform support
  • src/services/PlatformService.ts - Added platform detection methods
  • src/services/platforms/CapacitorPlatformService.ts - Added missing interface methods
  • vite.config.common.mts - Enhanced electron support
  • package.json - Updated electron build scripts
  • scripts/common.sh - Fixed electron environment setup
  • scripts/build-electron.sh - Updated for electron builds
  • scripts/electron-dev.sh - Updated development workflow
  • experiment.sh - Updated for electron builds

Testing

Platform Detection Testing

# Test web platform
npm run dev

# Test electron platform
npm run electron:dev

# Verify platform detection in console logs

Build Testing

# Test electron build
npm run build:electron

# Test electron packaging
npm run electron:build:appimage

# Verify platform-specific features work correctly

Benefits

  1. Clear Platform Separation: Each platform has dedicated configuration and services
  2. Consistent Build Process: No more mixing capacitor/electron configurations
  3. Better Developer Experience: Clear commands and proper logging
  4. Type Safety: Complete interface implementation across all platforms
  5. Desktop Optimization: Electron builds optimized for desktop usage patterns
  6. Maintainability: Clean architecture makes future updates easier

Migration Guide

For developers working with the previous implementation:

  1. Update Build Commands:

    • Replace npm run build:capacitor with npm run build:electron for electron builds
    • Use npm run electron:dev for development
  2. Platform Detection:

    • Use platformService.isElectron() instead of checking environment variables
    • Leverage the getCapabilities() method for feature detection
  3. Configuration:

    • Electron-specific settings are now in vite.config.electron.mts
    • Environment variables are automatically set correctly

Security Considerations

  • Platform detection is based on build-time environment variables
  • No runtime platform detection that could be spoofed
  • Electron-specific security settings in vite configuration
  • Proper isolation between platform implementations

Performance Improvements

  • Electron builds exclude web-specific dependencies (PWA, service workers)
  • Desktop-optimized chunk sizes and module bundling
  • Faster build times due to reduced bundle size
  • Better runtime performance on desktop

Future Enhancements

  • Add Electron-specific IPC communication helpers
  • Implement desktop-specific UI components
  • Add Electron auto-updater integration
  • Create platform-specific testing utilities
  • Add desktop notification system integration