@@ -30,10 +30,6 @@ import Layout from '../layouts/Layout.astro';
3030
3131 <div class =" divider" ></div >
3232
33- <label class =" select-label" data-i18n =" label.version" >Firmware Version</label >
34- <select id =" version-select" class =" select-input" >
35- <option disabled selected >Loading versions...</option >
36- </select >
3733 <p id =" version-info" class =" select-description" ></p >
3834
3935 <div class =" divider" ></div >
@@ -408,7 +404,7 @@ import Layout from '../layouts/Layout.astro';
408404 let selectedVersion = 'latest';
409405
410406 async function init() {
411- await Promise.all([loadBoards(), loadReleases ()]);
407+ await Promise.all([loadBoards(), loadLatestRelease ()]);
412408 setupEventListeners();
413409 updateManifest();
414410 }
@@ -439,40 +435,16 @@ import Layout from '../layouts/Layout.astro';
439435 }
440436 }
441437
442- async function loadReleases () {
438+ async function loadLatestRelease () {
443439 try {
444- const response = await fetch(`https://api.github.com/repos/${REPO}/releases`);
445- if (!response.ok) throw new Error('Failed to fetch releases');
446-
447- releases = await response.json();
440+ const response = await fetch(`https://api.github.com/repos/${REPO}/releases/latest`);
441+ if (!response.ok) throw new Error('Failed to fetch latest release');
448442
449- const versionSelect = document.getElementById('version-select');
450- if (versionSelect && releases.length > 0) {
451- const latestRelease = releases[0];
452- const options = [
453- `<option value="latest">Latest (${latestRelease.tag_name})</option>`
454- ];
455-
456- releases.forEach(release => {
457- const date = new Date(release.published_at);
458- const formattedDate = date.toLocaleDateString('en-US', {
459- day: 'numeric',
460- month: 'short',
461- year: 'numeric'
462- });
463- const label = `${release.tag_name} · ${formattedDate}${release.name ? ' · ' + release.name : ''}`;
464- options.push(`<option value="${release.tag_name}">${label}</option>`);
465- });
466-
467- versionSelect.innerHTML = options.join('');
468- updateVersionInfo();
469- }
443+ const release = await response.json();
444+ releases = [release];
445+ updateVersionInfo();
470446 } catch (err) {
471- console.error('Failed to load releases:', err);
472- const versionSelect = document.getElementById('version-select');
473- if (versionSelect) {
474- versionSelect.innerHTML = '<option disabled>Failed to load versions</option>';
475- }
447+ console.error('Failed to load latest release:', err);
476448 }
477449 }
478450
@@ -487,50 +459,40 @@ import Layout from '../layouts/Layout.astro';
487459 const versionInfo = document.getElementById('version-info');
488460 if (!versionInfo || releases.length === 0) return;
489461
490- const release = selectedVersion === 'latest'
491- ? releases[0]
492- : releases.find(r => r.tag_name === selectedVersion);
462+ const release = releases[0];
493463
494464 if (release) {
495465 const date = new Date(release.published_at);
496- const formattedDate = date.toLocaleDateString('en-US', {
497- day: 'numeric',
498- month: 'short',
499- year: 'numeric'
466+ const formattedDate = date.toLocaleDateString('en-US', {
467+ day: 'numeric',
468+ month: 'short',
469+ year: 'numeric'
500470 });
501471
502- versionInfo.innerHTML = `
503- Released ${formattedDate} ·
504- <a href="https://github.com/${REPO}/releases/tag/${release.tag_name}" target="_blank" rel="noopener noreferrer">
505- Release notes →
506- </a>
507- `;
472+ versionInfo.innerHTML = `${release.tag_name} · Released ${formattedDate} · <a href="https://github.com/${REPO}/releases/tag/${release.tag_name}" target="_blank" rel="noopener noreferrer">Release notes →</a>`;
508473 }
509474 }
510475
476+ // 🔧 RELEASE CHECKLIST: When releasing a new version, manifest.json
477+ // is updated automatically by the GitHub Actions workflow.
478+ // The cache-bust version below is set dynamically from the latest release tag.
511479 function updateManifest() {
512480 const flashButton = document.getElementById('flash-button');
513481 if (flashButton) {
514- flashButton.setAttribute('manifest', '/SecureGen/firmware/manifest.json');
482+ const tag = releases[0]?.tag_name || 'latest';
483+ flashButton.setAttribute('manifest', `/SecureGen/firmware/manifest.json?v=${tag}`);
515484 }
516485 }
517486
518487 function setupEventListeners() {
519488 const boardSelect = document.getElementById('board-select');
520- const versionSelect = document.getElementById('version-select');
521489
522490 boardSelect?.addEventListener('change', (e) => {
523491 const boardId = (e.target as HTMLSelectElement).value;
524492 selectedBoard = boards.find(b => b.id === boardId) || null;
525493 updateBoardDescription();
526494 updateManifest();
527495 });
528-
529- versionSelect?.addEventListener('change', (e) => {
530- selectedVersion = (e.target as HTMLSelectElement).value;
531- updateVersionInfo();
532- updateManifest();
533- });
534496
535497 // Setup copy buttons
536498 document.querySelectorAll('.btn-copy').forEach(btn => {
0 commit comments