diff --git a/src/hooks/useAppVersion.ts b/src/hooks/useAppVersion.ts
new file mode 100644
index 0000000..0be17fe
--- /dev/null
+++ b/src/hooks/useAppVersion.ts
@@ -0,0 +1,9 @@
+import { useRequest } from "ahooks";
+
+export const useAppVersion = () => {
+ const versionRequest = useRequest(
+ () => fetch('/api/app-version').then(res => res.json()).then(json => json.version),
+ { debounceWait: 300 }
+ );
+ return versionRequest.data;
+}
\ No newline at end of file
diff --git a/src/index.tsx b/src/index.tsx
index 3882d23..adbf824 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -1,5 +1,5 @@
import { serve } from "bun";
-import { getMatchInfo, verifyLogtoToken, xcxApi } from "./utils/server";
+import { getGitHash, getMatchInfo, verifyLogtoToken, xcxApi } from "./utils/server";
import ics from 'ics';
import index from "./index.html";
import { getUidScore } from "./services/uidScoreStore";
@@ -13,12 +13,17 @@ import type { IEventInfo } from "./types";
dayjs.extend(utc);
dayjs.extend(timezone);
-
+console.debug('AppVersion: %s', await getGitHash(8));
const server = serve({
port: process.env.PORT || 3000,
routes: {
// Serve index.html for all unmatched routes.
"/*": index,
+ "/api/app-version": {
+ async GET() {
+ return Response.json({ version: await getGitHash(8) });
+ }
+ },
"/api/club/find": {
async GET(req) {
const searchParams = new URL(req.url).searchParams;
diff --git a/src/page/UserCenter.tsx b/src/page/UserCenter.tsx
index c67924e..624843d 100644
--- a/src/page/UserCenter.tsx
+++ b/src/page/UserCenter.tsx
@@ -6,6 +6,7 @@ import { useLocation, useNavigate } from "react-router";
import { AUTH_CALLBACK_URL, USER_CENTER_URL } from "../utils/front";
import useAutoLogin from "../hooks/useAutoLogin";
import { LOGTO_DOMAIN } from "../utils/common";
+import { useAppVersion } from "../hooks/useAppVersion";
enum modifyRoutes {
username = '/account/username',
@@ -18,6 +19,20 @@ enum modifyRoutes {
const redirect = encodeURIComponent(USER_CENTER_URL);
+function AppVersion({ version }: { version?: string }) {
+ if (!version) return null;
+ return (
+