forked from trent_larson/crowd-funder-for-time-pwa
- Add platform-specific capability methods to PlatformService interface: - getExportInstructions() - getExportSuccessMessage() - needsSecondaryDownloadLink() - needsDownloadCleanup() - Update platform service implementations: - WebPlatformService: Implement web-specific export behavior - CapacitorPlatformService: Implement mobile-specific export behavior - ElectronPlatformService: Add placeholder for export functionality - PyWebViewPlatformService: Add placeholder for export functionality - Refactor DataExportSection component: - Remove direct platform checks (isWeb, isCapacitor, etc.) - Use platform service capabilities for UI behavior - Improve error handling and logging - Add proper cleanup for web platform downloads - Update PlatformServiceFactory: - Make getInstance() async to support dynamic imports - Improve platform service initialization - Fix code style and documentation: - Update JSDoc comments - Fix string quotes consistency - Add proper error handling - Improve logging messages - Update Vite config: - Add all Capacitor dependencies to external list - Ensure consistent handling across platforms
70 lines
2.1 KiB
TypeScript
70 lines
2.1 KiB
TypeScript
import { PlatformService } from "./PlatformService";
|
|
import { WebPlatformService } from "./platforms/WebPlatformService";
|
|
|
|
/**
|
|
* Factory class for creating platform-specific service implementations.
|
|
* Implements the Singleton pattern to ensure only one instance of PlatformService exists.
|
|
*
|
|
* The factory determines which platform implementation to use based on the VITE_PLATFORM
|
|
* environment variable. Supported platforms are:
|
|
* - capacitor: Mobile platform using Capacitor
|
|
* - electron: Desktop platform using Electron
|
|
* - pywebview: Python WebView implementation
|
|
* - web: Default web platform (fallback)
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* const platformService = PlatformServiceFactory.getInstance();
|
|
* await platformService.takePicture();
|
|
* ```
|
|
*/
|
|
export class PlatformServiceFactory {
|
|
private static instance: PlatformService | null = null;
|
|
|
|
/**
|
|
* Gets or creates the singleton instance of PlatformService.
|
|
* Creates the appropriate platform-specific implementation based on environment.
|
|
*
|
|
* @returns {PlatformService} The singleton instance of PlatformService
|
|
*/
|
|
public static async getInstance(): Promise<PlatformService> {
|
|
if (PlatformServiceFactory.instance) {
|
|
return PlatformServiceFactory.instance;
|
|
}
|
|
|
|
const platform = process.env.VITE_PLATFORM || "web";
|
|
let service: PlatformService;
|
|
|
|
switch (platform) {
|
|
case "capacitor": {
|
|
const { CapacitorPlatformService } = await import(
|
|
"./platforms/CapacitorPlatformService"
|
|
);
|
|
service = new CapacitorPlatformService();
|
|
break;
|
|
}
|
|
case "electron": {
|
|
const { ElectronPlatformService } = await import(
|
|
"./platforms/ElectronPlatformService"
|
|
);
|
|
service = new ElectronPlatformService();
|
|
break;
|
|
}
|
|
case "pywebview": {
|
|
const { PyWebViewPlatformService } = await import(
|
|
"./platforms/PyWebViewPlatformService"
|
|
);
|
|
service = new PyWebViewPlatformService();
|
|
break;
|
|
}
|
|
case "web":
|
|
default:
|
|
service = new WebPlatformService();
|
|
break;
|
|
}
|
|
|
|
PlatformServiceFactory.instance = service;
|
|
return service;
|
|
}
|
|
}
|