mirror of
https://github.com/umami-software/umami.git
synced 2026-02-04 04:37:11 +01:00
feat : Add version settings and API endpoint to display application version
This commit is contained in:
parent
860e6390f1
commit
612b00179b
4 changed files with 72 additions and 0 deletions
|
|
@ -4,6 +4,7 @@ import { DateRangeSetting } from './DateRangeSetting';
|
||||||
import { LanguageSetting } from './LanguageSetting';
|
import { LanguageSetting } from './LanguageSetting';
|
||||||
import { ThemeSetting } from './ThemeSetting';
|
import { ThemeSetting } from './ThemeSetting';
|
||||||
import { TimezoneSetting } from './TimezoneSetting';
|
import { TimezoneSetting } from './TimezoneSetting';
|
||||||
|
import { VersionSetting } from './VersionSetting';
|
||||||
|
|
||||||
export function PreferenceSettings() {
|
export function PreferenceSettings() {
|
||||||
const { user } = useLoginQuery();
|
const { user } = useLoginQuery();
|
||||||
|
|
@ -31,6 +32,10 @@ export function PreferenceSettings() {
|
||||||
<Label>{formatMessage(labels.theme)}</Label>
|
<Label>{formatMessage(labels.theme)}</Label>
|
||||||
<ThemeSetting />
|
<ThemeSetting />
|
||||||
</Column>
|
</Column>
|
||||||
|
<Column>
|
||||||
|
<Label>{formatMessage(labels.version)}</Label>
|
||||||
|
<VersionSetting />
|
||||||
|
</Column>
|
||||||
</Column>
|
</Column>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
31
src/app/(main)/settings/preferences/VersionSetting.tsx
Normal file
31
src/app/(main)/settings/preferences/VersionSetting.tsx
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
'use client';
|
||||||
|
|
||||||
|
import { Text } from '@umami/react-zen';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
export function VersionSetting() {
|
||||||
|
const [version, setVersion] = useState<string>('');
|
||||||
|
const [loading, setLoading] = useState(true);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchVersion = async () => {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/version');
|
||||||
|
const data = await response.json();
|
||||||
|
setVersion(data.version || 'unknown');
|
||||||
|
} catch (error) {
|
||||||
|
setVersion('unknown');
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fetchVersion();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
if (loading) {
|
||||||
|
return <Text>Loading...</Text>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <Text>{version}</Text>;
|
||||||
|
}
|
||||||
35
src/app/api/version/route.ts
Normal file
35
src/app/api/version/route.ts
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
import { readFile } from 'fs/promises';
|
||||||
|
import { join } from 'path';
|
||||||
|
import { parseRequest } from '@/lib/request';
|
||||||
|
import { json } from '@/lib/response';
|
||||||
|
|
||||||
|
let cachedVersion: string | null = null;
|
||||||
|
|
||||||
|
async function getVersion(): Promise<string> {
|
||||||
|
if (cachedVersion) {
|
||||||
|
return cachedVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const packageJsonPath = join(process.cwd(), 'package.json');
|
||||||
|
const data = await readFile(packageJsonPath, 'utf-8');
|
||||||
|
const packageJson = JSON.parse(data);
|
||||||
|
cachedVersion = packageJson.version || 'unknown';
|
||||||
|
} catch (error) {
|
||||||
|
cachedVersion = 'unknown';
|
||||||
|
}
|
||||||
|
|
||||||
|
return cachedVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
const { error } = await parseRequest(request, null, { skipAuth: true });
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return error();
|
||||||
|
}
|
||||||
|
|
||||||
|
const version = await getVersion();
|
||||||
|
|
||||||
|
return json({ version });
|
||||||
|
}
|
||||||
|
|
@ -351,6 +351,7 @@ export const labels = defineMessages({
|
||||||
growth: { id: 'label.growth', defaultMessage: 'Growth' },
|
growth: { id: 'label.growth', defaultMessage: 'Growth' },
|
||||||
account: { id: 'label.account', defaultMessage: 'Account' },
|
account: { id: 'label.account', defaultMessage: 'Account' },
|
||||||
application: { id: 'label.application', defaultMessage: 'Application' },
|
application: { id: 'label.application', defaultMessage: 'Application' },
|
||||||
|
version: { id: 'label.version', defaultMessage: 'Version' },
|
||||||
saveSegment: { id: 'label.save-segment', defaultMessage: 'Save as segment' },
|
saveSegment: { id: 'label.save-segment', defaultMessage: 'Save as segment' },
|
||||||
saveCohort: { id: 'label.save-cohort', defaultMessage: 'Save as cohort' },
|
saveCohort: { id: 'label.save-cohort', defaultMessage: 'Save as cohort' },
|
||||||
analysis: { id: 'label.analysis', defaultMessage: 'Analysis' },
|
analysis: { id: 'label.analysis', defaultMessage: 'Analysis' },
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue