diff --git a/client/src/templates/Challenges/exam-download/show.tsx b/client/src/templates/Challenges/exam-download/show.tsx index 6ae9b4a7302..558388e08ab 100644 --- a/client/src/templates/Challenges/exam-download/show.tsx +++ b/client/src/templates/Challenges/exam-download/show.tsx @@ -292,6 +292,14 @@ function ShowExamDownload({ .filter(link => !link.match(/\.sig|\.json/)) .map((link, index) => { const urlEnd = link.split('/').pop() ?? ''; + // App naming scheme is _?_(-setup)?(-debug)?. + const urlParts = urlEnd.split('_'); + const archAndExt = urlParts.at(urlParts.length - 1); + const arch = archAndExt?.split('-')?.at(0); + const ext = archAndExt?.slice(archAndExt?.indexOf('.')); + + const recommendedOs = + arch && ext ? getRecommendedOs({ arch, ext }) : ''; return ( - {urlEnd} + {urlEnd} {recommendedOs && `(${recommendedOs})`} ); })} @@ -318,6 +326,40 @@ function ShowExamDownload({ ); } +function getRecommendedOs({ + arch, + ext +}: { + arch: string; + ext: string; +}): string { + switch (arch) { + case 'x64': + switch (ext) { + case '.dmg': + return 'x64 MacOS'; + case '.AppImage': + case '.app.tar.gz': + return 'x64 Linux'; + default: + return 'x64 Windows'; + } + case 'aarch64': + switch (ext) { + case '.dmg': + return 'ARM MacOS'; + case '.app.tar.gz': + return 'ARM Linux'; + default: + return 'ARM Windows'; + } + case 'amd64': + return 'x64 Linux'; + default: + return ''; + } +} + function getLatest(releases: GitProps[]): GitProps { switch (deploymentEnv) { case 'staging':