'use client'; import { Download } from 'lucide-react'; import Link from 'next/link'; import * as React from 'react'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { type ParsedRelease, type Quality } from '@/lib/types'; type ArchitectureSelectorProperties = { platform: 'windows' | 'macos' | 'linux'; quality: Quality; releaseData: ParsedRelease; }; export function ArchitectureSelector({ platform, quality, releaseData }: ArchitectureSelectorProperties) { const [architecture, setArchitecture] = React.useState( platform === 'windows' ? 'x64' : (platform === 'macos' ? 'x64' : 'x64'), ); const [installerType, setInstallerType] = React.useState( platform === 'windows' ? 'UserInstaller' : (platform === 'macos' ? 'dmg' : 'deb'), ); // Reset installer type when architecture changes (for Linux special cases) React.useEffect(() => { if(platform === 'linux') { if(['ppc64', 'riscv64', 'loong64'].includes(architecture)) { setInstallerType('tar.gz'); } else if(installerType === 'deb') { // Default to deb for common architectures if coming from a restricted one setInstallerType('deb'); } else { // Keep tar.gz if it was already selected } } }, [architecture, platform, installerType]); // Get available architectures for the current platform const getAvailableArchitectures = () => { const platformData = releaseData.platforms[platform]; return Object.keys(platformData).filter((arch) => { const archData = platformData[arch as keyof typeof platformData]; return Object.keys(archData).length > 0; }); }; // Get available installer types for the current platform and architecture const getAvailableInstallerTypes = () => { const platformData = releaseData.platforms[platform]; const archData = platformData[architecture as keyof typeof platformData]; return Object.keys(archData || {}); }; const availableArchitectures = getAvailableArchitectures(); const availableInstallerTypes = getAvailableInstallerTypes(); // Set default architecture and installer type based on availability React.useEffect(() => { if(availableArchitectures.length > 0 && !availableArchitectures.includes(architecture)) { setArchitecture(availableArchitectures[0]); } if(availableInstallerTypes.length > 0 && !availableInstallerTypes.includes(installerType)) { setInstallerType(availableInstallerTypes[0]); } }, [availableArchitectures, availableInstallerTypes, architecture, installerType]); const getDownloadFileName = () => { const url = getDownloadUrl(); return url.replace(/^.*\//, ''); }; // Get the download URL from the release data const getDownloadUrl = () => { try { const platformData = releaseData.platforms[platform]; const archData = platformData[architecture as keyof typeof platformData]; return archData[installerType] || `https://github.com/VSCodium/vscodium/releases/tag/${releaseData.version}`; } catch { return `https://github.com/VSCodium/vscodium/releases/tag/${releaseData.version}`; } }; return (

1. Select Architecture

{platform === 'windows' ? ( <> {availableArchitectures.includes('x64') && (
)} {availableArchitectures.includes('arm64') && (
)} ) : (platform === 'macos' ? ( <> {availableArchitectures.includes('x64') && (
)} {availableArchitectures.includes('arm64') && (
)} ) : ( // Linux architectures <> {availableArchitectures.includes('x64') && (
)} {availableArchitectures.includes('arm64') && (
)} {availableArchitectures.includes('arm32') && (
)} {availableArchitectures.includes('ppc64') && (
)} {availableArchitectures.includes('riscv64') && (
)} {availableArchitectures.includes('loong64') && (
)} {availableArchitectures.includes('s390x') && (
)} ))}

2. Select Installer Type

{platform === 'windows' ? ( <> {availableInstallerTypes.includes('UserInstaller') && (
)} {availableInstallerTypes.includes('SystemInstaller') && (
)} {availableInstallerTypes.includes('zip') && (
)} {availableInstallerTypes.includes('msi') && (
)} {availableInstallerTypes.includes('cli') && (
)} ) : (platform === 'macos' ? ( <> {availableInstallerTypes.includes('dmg') && (
)} {availableInstallerTypes.includes('zip') && (
)} {availableInstallerTypes.includes('cli') && (
)} ) : ( // Linux installer types <> {availableInstallerTypes.includes('deb') && (
)} {availableInstallerTypes.includes('rpm') && (
)} {availableInstallerTypes.includes('tar.gz') && (
)} {availableInstallerTypes.includes('AppImage') && (
)} {availableInstallerTypes.includes('cli') && (
)} ))}
); }