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
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 buildscripts/common.sh
: Fixed electron environment setupscripts/build-electron.sh
: Updated to use electron build instead of capacitorscripts/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 configurationsrc/main.electron.ts
- Electron main entry pointdoc/electron-cleanup-summary.md
- This documentation
Modified Files
src/services/PlatformServiceFactory.ts
- Added electron platform supportsrc/services/PlatformService.ts
- Added platform detection methodssrc/services/platforms/CapacitorPlatformService.ts
- Added missing interface methodsvite.config.common.mts
- Enhanced electron supportpackage.json
- Updated electron build scriptsscripts/common.sh
- Fixed electron environment setupscripts/build-electron.sh
- Updated for electron buildsscripts/electron-dev.sh
- Updated development workflowexperiment.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
- Clear Platform Separation: Each platform has dedicated configuration and services
- Consistent Build Process: No more mixing capacitor/electron configurations
- Better Developer Experience: Clear commands and proper logging
- Type Safety: Complete interface implementation across all platforms
- Desktop Optimization: Electron builds optimized for desktop usage patterns
- Maintainability: Clean architecture makes future updates easier
Migration Guide
For developers working with the previous implementation:
-
Update Build Commands:
- Replace
npm run build:capacitor
withnpm run build:electron
for electron builds - Use
npm run electron:dev
for development
- Replace
-
Platform Detection:
- Use
platformService.isElectron()
instead of checking environment variables - Leverage the
getCapabilities()
method for feature detection
- Use
-
Configuration:
- Electron-specific settings are now in
vite.config.electron.mts
- Environment variables are automatically set correctly
- Electron-specific settings are now in
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