mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-09-29 07:56:37 +08:00
111 lines
2.7 KiB
TypeScript
111 lines
2.7 KiB
TypeScript
import { useEffect, useState } from "react";
|
|
|
|
import { siteConfig } from "@/config/site";
|
|
import {
|
|
UPDATE_CHANNEL_CHANGED_EVENT,
|
|
type UpdateReleaseChannel,
|
|
getLatestVersionByChannel,
|
|
getUpdateReleaseChannel,
|
|
hasVersionUpdate,
|
|
} from "@/utils/version-update";
|
|
|
|
const FALLBACK_GITHUB_REPO = "https://github.com/Sagit-chu/flux-panel";
|
|
|
|
interface VersionFooterProps {
|
|
version: string;
|
|
containerClassName?: string;
|
|
versionClassName?: string;
|
|
poweredClassName?: string;
|
|
updateBadgeClassName?: string;
|
|
}
|
|
|
|
export function VersionFooter({
|
|
version,
|
|
containerClassName,
|
|
versionClassName,
|
|
poweredClassName,
|
|
updateBadgeClassName,
|
|
}: VersionFooterProps) {
|
|
const [channel, setChannel] = useState<UpdateReleaseChannel>(
|
|
getUpdateReleaseChannel(),
|
|
);
|
|
const [updateAvailable, setUpdateAvailable] = useState(false);
|
|
const [latestUpdateVersion, setLatestUpdateVersion] = useState<string | null>(
|
|
null,
|
|
);
|
|
|
|
useEffect(() => {
|
|
const handleChannelChange = () => {
|
|
setChannel(getUpdateReleaseChannel());
|
|
};
|
|
|
|
window.addEventListener(UPDATE_CHANNEL_CHANGED_EVENT, handleChannelChange);
|
|
window.addEventListener("storage", handleChannelChange);
|
|
|
|
return () => {
|
|
window.removeEventListener(
|
|
UPDATE_CHANNEL_CHANGED_EVENT,
|
|
handleChannelChange,
|
|
);
|
|
window.removeEventListener("storage", handleChannelChange);
|
|
};
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
let active = true;
|
|
|
|
const checkUpdate = async () => {
|
|
const latestVersion = await getLatestVersionByChannel(
|
|
channel,
|
|
siteConfig.github_repo || FALLBACK_GITHUB_REPO,
|
|
);
|
|
|
|
if (!active) {
|
|
return;
|
|
}
|
|
|
|
if (!latestVersion) {
|
|
setUpdateAvailable(false);
|
|
setLatestUpdateVersion(null);
|
|
|
|
return;
|
|
}
|
|
|
|
const hasUpdate = hasVersionUpdate(version, latestVersion);
|
|
|
|
setUpdateAvailable(hasUpdate);
|
|
setLatestUpdateVersion(hasUpdate ? latestVersion : null);
|
|
};
|
|
|
|
void checkUpdate();
|
|
|
|
return () => {
|
|
active = false;
|
|
};
|
|
}, [channel, version]);
|
|
|
|
return (
|
|
<div className={containerClassName}>
|
|
<p className={versionClassName}>
|
|
v{version}
|
|
{updateAvailable && latestUpdateVersion && (
|
|
<span className={updateBadgeClassName} role="status">
|
|
{latestUpdateVersion}
|
|
</span>
|
|
)}
|
|
</p>
|
|
<p className={poweredClassName}>
|
|
Powered by{" "}
|
|
<a
|
|
className="text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors"
|
|
href={siteConfig.github_repo}
|
|
rel="noopener noreferrer"
|
|
target="_blank"
|
|
>
|
|
FLVX
|
|
</a>
|
|
</p>
|
|
</div>
|
|
);
|
|
}
|