Skip to content

Commit 33b5aca

Browse files
committed
Add version checker component to display latest version updates
1 parent 8455097 commit 33b5aca

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

src/lib/shared/version.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const VERSION = "v0.1.0";

src/routes/+page.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import GenerateButton from "./GenerateButton.svelte";
1212
import ProfileManager from "./ProfileManager.svelte";
1313
import ExecutionPlacePicker from "./ExecutionPlacePicker.svelte";
14+
import VersionChecker from "./VersionChecker.svelte";
1415
import { profile } from "./store.svelte";
1516
import { generate } from "./generate";
1617
@@ -39,6 +40,8 @@
3940
</script>
4041

4142
<div class="space-y-4">
43+
<VersionChecker />
44+
4245
<h2 class="text-xl font-bold">Input</h2>
4346

4447
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">

src/routes/VersionChecker.svelte

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<script lang="ts">
2+
import { onMount } from "svelte";
3+
import { browser } from "$app/environment";
4+
import { ExternalLink, TriangleAlert } from "lucide-svelte";
5+
import { VERSION } from "$lib/shared/version";
6+
7+
let latestVersion = $state("");
8+
let hasNewerVersion = $state(false);
9+
let loading = $state(true);
10+
11+
// Cache configuration
12+
const CACHE_KEY = "kokoro-latest-version";
13+
const CACHE_EXPIRY_KEY = "kokoro-latest-version-expiry";
14+
const CACHE_DURATION = 5 * 60 * 1000; // 5 minutes in milliseconds
15+
16+
onMount(async () => {
17+
if (browser) {
18+
await checkVersion();
19+
}
20+
});
21+
22+
async function checkVersion() {
23+
// Check for cached version first
24+
const cachedVersion = localStorage.getItem(CACHE_KEY);
25+
const cacheExpiry = localStorage.getItem(CACHE_EXPIRY_KEY);
26+
27+
if (cachedVersion && cacheExpiry && parseInt(cacheExpiry) > Date.now()) {
28+
latestVersion = cachedVersion;
29+
compareVersions();
30+
loading = false;
31+
return;
32+
}
33+
34+
try {
35+
// Fetch latest release from GitHub API
36+
const response = await fetch(
37+
"https://api.github.com/repos/eduardolat/kokoro-web/releases/latest",
38+
);
39+
40+
if (!response.ok) {
41+
throw new Error("Failed to fetch latest version");
42+
}
43+
44+
const data = await response.json();
45+
latestVersion = data.tag_name;
46+
47+
// Cache the result
48+
localStorage.setItem(CACHE_KEY, latestVersion);
49+
localStorage.setItem(
50+
CACHE_EXPIRY_KEY,
51+
(Date.now() + CACHE_DURATION).toString(),
52+
);
53+
54+
compareVersions();
55+
} catch (error) {
56+
console.error("Error checking for newer version:", error);
57+
} finally {
58+
loading = false;
59+
}
60+
}
61+
62+
function compareVersions() {
63+
// Remove 'v' prefix if present for comparison
64+
const currentClean = VERSION.replace(/^v/, "");
65+
const latestClean = latestVersion.replace(/^v/, "");
66+
67+
// Compare versions (basic semver comparison)
68+
hasNewerVersion = latestClean > currentClean;
69+
}
70+
</script>
71+
72+
{#if hasNewerVersion && !loading}
73+
<div role="alert" class="alert alert-warning mb-4">
74+
<TriangleAlert />
75+
<span>
76+
A new version ({latestVersion}) is available! Your current version is {VERSION}.
77+
</span>
78+
<a
79+
href="https://github.com/eduardolat/kokoro-web/releases"
80+
target="_blank"
81+
class="btn btn-sm"
82+
>
83+
View releases
84+
<ExternalLink class="ml-1 size-4" />
85+
</a>
86+
</div>
87+
{/if}

0 commit comments

Comments
 (0)