| import { t } from '@/services/i18n'; |
| import { getCanonicalApiOrigin } from '@/services/runtime'; |
|
|
| export type Platform = 'macos-arm64' | 'macos-x64' | 'macos' | 'windows' | 'linux' | 'linux-x64' | 'linux-arm64' | 'unknown'; |
|
|
| export function detectPlatform(): Platform { |
| const ua = navigator.userAgent; |
| if (/Windows/i.test(ua)) return 'windows'; |
| if (/Linux/i.test(ua) && !/Android/i.test(ua)) return 'linux'; |
| if (/Mac/i.test(ua)) { |
| try { |
| const c = document.createElement('canvas'); |
| const gl = c.getContext('webgl') as WebGLRenderingContext | null; |
| if (gl) { |
| const dbg = gl.getExtension('WEBGL_debug_renderer_info'); |
| if (dbg) { |
| const renderer = gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL); |
| if (/Apple M/i.test(renderer)) return 'macos-arm64'; |
| if (/Intel/i.test(renderer)) return 'macos-x64'; |
| } |
| } |
| } catch { } |
| return 'macos'; |
| } |
| return 'unknown'; |
| } |
|
|
| export interface DlButton { cls: string; href: string; label: string } |
|
|
| export function allButtons(): DlButton[] { |
| const apiOrigin = getCanonicalApiOrigin(); |
| return [ |
| { cls: 'mac', href: `${apiOrigin}/api/download?platform=macos-arm64`, label: `\uF8FF ${t('modals.downloadBanner.macSilicon')}` }, |
| { cls: 'mac', href: `${apiOrigin}/api/download?platform=macos-x64`, label: `\uF8FF ${t('modals.downloadBanner.macIntel')}` }, |
| { cls: 'win', href: `${apiOrigin}/api/download?platform=windows-msi`, label: `\u229E ${t('modals.downloadBanner.windows')}` }, |
| { cls: 'linux', href: `${apiOrigin}/api/download?platform=linux-appimage`, label: `\u{1F427} ${t('modals.downloadBanner.linux')} (x64)` }, |
| { cls: 'linux', href: `${apiOrigin}/api/download?platform=linux-appimage-arm64`, label: `\u{1F427} ${t('modals.downloadBanner.linux')} (ARM64)` }, |
| ]; |
| } |
|
|
| export function buttonsForPlatform(p: Platform): DlButton[] { |
| const buttons = allButtons(); |
| switch (p) { |
| case 'macos-arm64': return buttons.filter(b => b.href.includes('macos-arm64')); |
| case 'macos-x64': return buttons.filter(b => b.href.includes('macos-x64')); |
| case 'macos': return buttons.filter(b => b.cls === 'mac'); |
| case 'windows': return buttons.filter(b => b.cls === 'win'); |
| case 'linux': return buttons.filter(b => b.cls === 'linux'); |
| case 'linux-x64': return buttons.filter(b => b.href.includes('linux-appimage') && !b.href.includes('arm64')); |
| case 'linux-arm64': return buttons.filter(b => b.href.includes('linux-appimage-arm64')); |
| default: return buttons; |
| } |
| } |
|
|