AeThex-OS/shell/aethex-shell/src-webos/lib/platform.ts

102 lines
2.6 KiB
TypeScript

export type PlatformType = 'web' | 'desktop' | 'mobile';
declare global {
interface Window {
__TAURI__?: unknown;
flutter_inappwebview?: unknown;
Capacitor?: unknown;
}
}
interface PlatformConfig {
platform: PlatformType;
apiBaseUrl: string;
isSecureContext: boolean;
supportsNotifications: boolean;
supportsFileSystem: boolean;
}
let cachedPlatform: PlatformType | null = null;
function detectPlatform(): PlatformType {
if (cachedPlatform !== null) return cachedPlatform;
if (typeof window === 'undefined') {
console.log('[Platform] Detected: web (no window)');
cachedPlatform = 'web';
return cachedPlatform;
}
console.log('[Platform] Checking window.Capacitor:', window.Capacitor);
console.log('[Platform] Checking window.__TAURI__:', window.__TAURI__);
if (window.__TAURI__ !== undefined) {
console.log('[Platform] Detected: desktop (Tauri)');
cachedPlatform = 'desktop';
return cachedPlatform;
}
if (window.flutter_inappwebview !== undefined || window.Capacitor !== undefined) {
console.log('[Platform] Detected: mobile (Capacitor or Flutter)');
cachedPlatform = 'mobile';
return cachedPlatform;
}
const userAgent = navigator.userAgent.toLowerCase();
console.log('[Platform] User agent:', userAgent);
if (userAgent.includes('electron')) {
console.log('[Platform] Detected: desktop (Electron)');
cachedPlatform = 'desktop';
return cachedPlatform;
}
if (userAgent.includes('cordova')) {
console.log('[Platform] Detected: mobile (Cordova)');
cachedPlatform = 'mobile';
return cachedPlatform;
}
console.log('[Platform] Detected: web (default)');
cachedPlatform = 'web';
return cachedPlatform;
}
function getApiBaseUrl(): string {
const platform = detectPlatform();
if (platform === 'web') {
return '';
}
const envUrl = import.meta.env.VITE_API_BASE_URL;
if (envUrl) return envUrl;
return 'https://aethex.network';
}
export function getPlatformConfig(): PlatformConfig {
const platform = detectPlatform();
return {
platform,
apiBaseUrl: getApiBaseUrl(),
isSecureContext: typeof window !== 'undefined' && window.isSecureContext,
supportsNotifications: typeof Notification !== 'undefined',
supportsFileSystem: typeof window !== 'undefined' && 'showOpenFilePicker' in window,
};
}
export function isDesktop(): boolean {
return detectPlatform() === 'desktop';
}
export function isMobile(): boolean {
return detectPlatform() === 'mobile';
}
export function isWeb(): boolean {
return detectPlatform() === 'web';
}
export const platformConfig = getPlatformConfig();