Skip to content

Commit 17fa9fe

Browse files
authored
♻️ Refactor and improve download buttons (RubberDuckCrew#303)
2 parents 45ead5e + eb21c84 commit 17fa9fe

4 files changed

Lines changed: 105 additions & 81 deletions

File tree

docs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"scripts": {
1717
"dev": "vitepress dev",
1818
"build": "vitepress build",
19-
"preview": "vitepress preview"
19+
"preview": "npm run build && vitepress preview"
2020
},
2121
"devDependencies": {
2222
"vitepress": "1.6.4"

docs/src/download/DownloadRelease.vue

Lines changed: 18 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -5,110 +5,52 @@
55
<template v-else-if="status === 'success'">
66
<p>
77
<VPButton
8+
v-if="releaseInfo"
89
:text="`Download latest stable release (${releaseInfo.name})`"
910
theme="brand"
10-
v-if="releaseInfo"
1111
:href="releaseInfo.url" />
1212
<VPButton
13+
v-else
1314
text="No stable release available"
1415
theme="alt"
15-
disabled
16-
v-else />
16+
disabled />
1717
</p>
1818
<p>
1919
<VPButton
20+
v-if="preReleaseInfo"
2021
:text="`Download latest pre-release (${preReleaseInfo.name})`"
2122
theme="brand"
22-
v-if="
23-
preReleaseInfo && preReleaseInfo.name !== releaseInfo?.name
24-
"
2523
:href="preReleaseInfo.url" />
2624
<VPButton
25+
v-else
2726
text="No pre-release available"
2827
theme="alt"
29-
disabled
30-
v-else />
28+
disabled />
29+
</p>
30+
<p>
31+
You can also find all releases on the
32+
<a
33+
href="https://github.com/RubberDuckCrew/gitdone/releases"
34+
target="_blank">
35+
GitHub releases page</a
36+
>.
3137
</p>
3238
</template>
3339
<template v-else>
3440
<p>
3541
Please download latest release manually from the
3642
<a
3743
href="https://github.com/RubberDuckCrew/gitdone/releases"
38-
target="_blank"
39-
>GitHub releases page</a
44+
target="_blank">
45+
GitHub releases page</a
4046
>.
4147
</p>
4248
</template>
4349
</template>
4450

4551
<script setup lang="ts">
46-
import { ref, onMounted } from "vue";
4752
import VPButton from "vitepress/dist/client/theme-default/components/VPButton.vue";
53+
import { useDownloadRelease } from "./downloadRelease.ts";
4854
49-
const status = ref<DownloadStatus>("loading");
50-
const preReleaseInfo = ref<ReleaseInfo | null>(null);
51-
const releaseInfo = ref<ReleaseInfo | null>(null);
52-
53-
type DownloadStatus = "loading" | "success" | "error";
54-
type Release = {
55-
tag_name: string;
56-
prerelease: boolean;
57-
assets: Asset[];
58-
published_at: string;
59-
};
60-
type Asset = {
61-
name: string;
62-
browser_download_url: string;
63-
};
64-
type ReleaseInfo = {
65-
name: string;
66-
url: string;
67-
};
68-
69-
onMounted(() => {
70-
fetch("https://api.github.com/repos/RubberDuckCrew/gitdone/releases")
71-
.then((res) => res.json())
72-
.then((data) => {
73-
data.sort(
74-
(a: Release, b: Release) =>
75-
new Date(b.published_at).getTime() -
76-
new Date(a.published_at).getTime()
77-
);
78-
const latestRelease = data.find(
79-
(release: Release) => !release.prerelease
80-
);
81-
const latestPreRelease = data.find(
82-
(release: Release) =>
83-
release.prerelease &&
84-
new Date(release.published_at) >
85-
new Date(latestRelease?.published_at ?? 0)
86-
);
87-
preReleaseInfo.value = extractReleaseInfo(latestPreRelease);
88-
releaseInfo.value = extractReleaseInfo(latestRelease);
89-
status.value =
90-
preReleaseInfo.value || releaseInfo.value ? "success" : "error";
91-
if (status.value !== "success") {
92-
status.value = "error";
93-
}
94-
})
95-
.catch((e) => {
96-
status.value = "error";
97-
});
98-
});
99-
100-
function extractReleaseInfo(release: Release | undefined): ReleaseInfo | null {
101-
if (release && release.assets && release.assets.length > 0) {
102-
const apk = release.assets.find((asset: Asset) =>
103-
asset.name.endsWith(".apk")
104-
);
105-
if (apk) {
106-
return {
107-
name: release.tag_name,
108-
url: apk.browser_download_url,
109-
};
110-
}
111-
}
112-
return null;
113-
}
55+
const { status, preReleaseInfo, releaseInfo } = useDownloadRelease();
11456
</script>
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { ref, onMounted, readonly } from "vue";
2+
3+
type DownloadStatus = "loading" | "success" | "errorFetchingReleases";
4+
type Release = {
5+
tag_name: string;
6+
prerelease: boolean;
7+
assets: Asset[];
8+
published_at: string;
9+
};
10+
type Asset = {
11+
name: string;
12+
browser_download_url: string;
13+
};
14+
type ReleaseInfo = {
15+
name: string;
16+
url: string;
17+
};
18+
19+
export function useDownloadRelease() {
20+
const status = ref<DownloadStatus>("loading");
21+
const preReleaseInfo = ref<ReleaseInfo>();
22+
const releaseInfo = ref<ReleaseInfo>();
23+
24+
onMounted(() => {
25+
fetchReleases();
26+
});
27+
28+
function fetchReleases() {
29+
fetch("https://api.github.com/repos/RubberDuckCrew/gitdone/releases")
30+
.then((res) => res.json())
31+
.then((releases: Release[]) => {
32+
processReleases(releases);
33+
status.value = "success";
34+
})
35+
.catch((e) => {
36+
console.error("Error fetching releases:", e);
37+
status.value = "errorFetchingReleases";
38+
});
39+
}
40+
41+
function processReleases(releases: Release[]) {
42+
releases.sort(
43+
(a: Release, b: Release) =>
44+
new Date(b.published_at).getTime() -
45+
new Date(a.published_at).getTime()
46+
);
47+
const latestRelease = releases.find(
48+
(release: Release) => !release.prerelease
49+
);
50+
const latestPreRelease = releases.find(
51+
(release: Release) =>
52+
release.prerelease &&
53+
new Date(release.published_at) >
54+
new Date(latestRelease?.published_at ?? 0)
55+
);
56+
preReleaseInfo.value = extractReleaseInfo(latestPreRelease);
57+
releaseInfo.value = extractReleaseInfo(latestRelease);
58+
}
59+
60+
function extractReleaseInfo(
61+
release: Release | undefined
62+
): ReleaseInfo | undefined {
63+
if (release?.assets && release.assets.length > 0) {
64+
const apk = release.assets.find((asset: Asset) =>
65+
asset.name.endsWith(".apk")
66+
);
67+
if (apk) {
68+
return {
69+
name: release.tag_name,
70+
url: apk.browser_download_url,
71+
};
72+
}
73+
}
74+
return undefined;
75+
}
76+
77+
return {
78+
status: readonly(status),
79+
preReleaseInfo: readonly(preReleaseInfo),
80+
releaseInfo: readonly(releaseInfo),
81+
};
82+
}

docs/src/download/index.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
<script setup>
2-
import DownloadRelease from "./DownloadRelease.vue";
3-
</script>
4-
51
# Download
62

73
You can download the latest release of GitDone from the links below.
84

5+
<script setup>
6+
import DownloadRelease from "./DownloadRelease.vue";
7+
</script>
8+
99
<DownloadRelease />
1010

1111
Check out the [Verifying the Downloaded APK](./verify) guide to ensure the authenticity of the APK.

0 commit comments

Comments
 (0)