feat(dashboard): make release redirect base URL configurable (#5330)

* feat(dashboard): make desktop release base URL configurable

* refactor(dashboard): use generic release base URL env with upstream default

* fix(dashboard): guard release base URL normalization when env is unset

* refactor(dashboard): use generic release URL helpers and avoid latest suffix duplication
This commit is contained in:
エイカク
2026-02-22 20:23:32 +09:00
committed by GitHub
parent aff92a48bf
commit 94736ff199
3 changed files with 36 additions and 10 deletions
+7
View File
@@ -1,3 +1,10 @@
# AstrBot 管理面板 # AstrBot 管理面板
基于 CodedThemes/Berry 模板开发。 基于 CodedThemes/Berry 模板开发。
## 环境变量
- `VITE_ASTRBOT_RELEASE_BASE_URL`(可选)
- 默认值:`https://github.com/AstrBotDevs/AstrBot/releases`
- 用途:管理面板内“更新到最新版本”外部跳转所使用的 release 基地址。集成方可按需覆盖(例如 Desktop 指向其自身发布页)。
- 建议传入仓库的 `.../releases` 基地址(不带 `/latest`)。
+8
View File
@@ -1 +1,9 @@
/// <reference types="vite/client" /> /// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_ASTRBOT_RELEASE_BASE_URL?: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}
@@ -53,8 +53,22 @@ const isDesktopReleaseMode = ref(
const redirectConfirmDialog = ref(false); const redirectConfirmDialog = ref(false);
const pendingRedirectUrl = ref(''); const pendingRedirectUrl = ref('');
const resolvingReleaseTarget = ref(false); const resolvingReleaseTarget = ref(false);
const desktopReleaseBaseUrl = 'https://github.com/AstrBotDevs/AstrBot-desktop/releases'; const DEFAULT_ASTRBOT_RELEASE_BASE_URL = 'https://github.com/AstrBotDevs/AstrBot/releases';
const fallbackReleaseUrl = desktopReleaseBaseUrl; const resolveReleaseBaseUrl = () => {
const raw = import.meta.env.VITE_ASTRBOT_RELEASE_BASE_URL;
// Keep upstream default on AstrBot releases; desktop distributors can override via env injection.
const normalized = raw?.trim()?.replace(/\/+$/, '') || '';
const withoutLatestSuffix = normalized.replace(/\/latest$/i, '');
return withoutLatestSuffix || DEFAULT_ASTRBOT_RELEASE_BASE_URL;
};
const releaseBaseUrl = resolveReleaseBaseUrl();
const getReleaseUrlByTag = (tag: string | null | undefined) => {
const normalizedTag = (tag || '').trim();
if (!normalizedTag || normalizedTag.toLowerCase() === 'latest') {
return `${releaseBaseUrl}/latest`;
}
return `${releaseBaseUrl}/tag/${normalizedTag}`;
};
const getSelectedGitHubProxy = () => { const getSelectedGitHubProxy = () => {
if (typeof window === "undefined" || !window.localStorage) return ""; if (typeof window === "undefined" || !window.localStorage) return "";
@@ -137,14 +151,11 @@ function confirmExternalRedirect() {
const getReleaseUrlForDesktop = () => { const getReleaseUrlForDesktop = () => {
const firstRelease = (releases.value as any[])?.[0]; const firstRelease = (releases.value as any[])?.[0];
if (firstRelease?.tag_name) { if (firstRelease?.tag_name) {
const tag = firstRelease.tag_name as string; return getReleaseUrlByTag(firstRelease.tag_name as string);
return `${desktopReleaseBaseUrl}/tag/${tag}`;
} }
if (hasNewVersion.value) return fallbackReleaseUrl; if (hasNewVersion.value) return getReleaseUrlByTag('latest');
const tag = botCurrVersion.value?.startsWith('v') ? botCurrVersion.value : 'latest'; const tag = botCurrVersion.value?.startsWith('v') ? botCurrVersion.value : 'latest';
return tag === 'latest' return getReleaseUrlByTag(tag);
? fallbackReleaseUrl
: `${desktopReleaseBaseUrl}/tag/${tag}`;
}; };
function handleUpdateClick() { function handleUpdateClick() {
@@ -153,7 +164,7 @@ function handleUpdateClick() {
resolvingReleaseTarget.value = true; resolvingReleaseTarget.value = true;
checkUpdate(); checkUpdate();
void getReleases().finally(() => { void getReleases().finally(() => {
pendingRedirectUrl.value = getReleaseUrlForDesktop() || fallbackReleaseUrl; pendingRedirectUrl.value = getReleaseUrlForDesktop() || getReleaseUrlByTag('latest');
resolvingReleaseTarget.value = false; resolvingReleaseTarget.value = false;
}); });
return; return;