forked from trent_larson/crowd-funder-for-time-pwa
- Update BUILDING.md with current build system information - Modernize various README files across the project - Update CHANGELOG.md with recent changes - Improve documentation consistency and formatting - Update platform-specific documentation (iOS, Electron, Docker) - Enhance test documentation and build guides
311 lines
8.7 KiB
Markdown
311 lines
8.7 KiB
Markdown
# 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
|
|
|
|
```typescript
|
|
// 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
|
|
|
|
```typescript
|
|
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
|
|
|
|
```typescript
|
|
// 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```typescript
|
|
// 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
|
|
|
|
```typescript
|
|
// 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```typescript
|
|
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
|
|
|
|
```bash
|
|
# Test web platform
|
|
npm run dev
|
|
|
|
# Test electron platform
|
|
npm run electron:dev
|
|
|
|
# Verify platform detection in console logs
|
|
```
|
|
|
|
### Build Testing
|
|
|
|
```bash
|
|
# 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
|