diff --git a/.eslintrc.json b/.eslintrc.json
index 28e542bd..215d6491 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -16,7 +16,8 @@
"react/display-name": "off",
"react/react-in-jsx-scope": "off",
"react/prop-types": "off",
- "import/no-anonymous-default-export": "off"
+ "import/no-anonymous-default-export": "off",
+ "@next/next/no-img-element": "off"
},
"globals": {
"React": "writable"
diff --git a/components/common/UpdateNotice.js b/components/common/UpdateNotice.js
index a2963995..a5036808 100644
--- a/components/common/UpdateNotice.js
+++ b/components/common/UpdateNotice.js
@@ -3,12 +3,12 @@ import { FormattedMessage } from 'react-intl';
import ButtonLayout from 'components/layout/ButtonLayout';
import useStore, { checkVersion } from 'store/version';
import { setItem } from 'lib/web';
-import { VERSION_CHECK, VERSION_URL } from 'lib/constants';
+import { REPO_URL, VERSION_CHECK } from 'lib/constants';
import Button from './Button';
import styles from './UpdateNotice.module.css';
export default function UpdateNotice() {
- const { latest, checked, hasUpdate } = useStore();
+ const { latest, checked, hasUpdate, releaseUrl } = useStore();
const [dismissed, setDismissed] = useState(false);
const updateCheck = useCallback(() => {
@@ -18,7 +18,7 @@ export default function UpdateNotice() {
function handleViewClick() {
updateCheck();
setDismissed(true);
- location.href = VERSION_URL;
+ location.href = releaseUrl || REPO_URL;
}
function handleDismissClick() {
diff --git a/components/layout/Footer.js b/components/layout/Footer.js
index 21ce0573..ff7db96c 100644
--- a/components/layout/Footer.js
+++ b/components/layout/Footer.js
@@ -4,7 +4,7 @@ import { FormattedMessage } from 'react-intl';
import Link from 'components/common/Link';
import styles from './Footer.module.css';
import useStore from 'store/version';
-import { HOMEPAGE_URL, VERSION_URL } from 'lib/constants';
+import { HOMEPAGE_URL, REPO_URL } from 'lib/constants';
export default function Footer() {
const { current } = useStore();
@@ -26,8 +26,11 @@ export default function Footer() {
/>
- {`v${current}`}
+ {`v${current}`}
+ {!process.env.telemetryDisabled && (
+
+ )}
);
}
diff --git a/lib/constants.js b/lib/constants.js
index 13af1f32..2b332b21 100644
--- a/lib/constants.js
+++ b/lib/constants.js
@@ -7,7 +7,8 @@ export const DASHBOARD_CONFIG = 'umami.dashboard';
export const VERSION_CHECK = 'umami.version-check';
export const SHARE_TOKEN_HEADER = 'x-umami-share-token';
export const HOMEPAGE_URL = 'https://umami.is';
-export const VERSION_URL = 'https://github.com/mikecao/umami/releases';
+export const REPO_URL = 'https://github.com/umami-software/umami';
+export const UPDATES_URL = 'https://api.umami.is/v1/updates';
export const DEFAULT_LOCALE = 'en-US';
export const DEFAULT_THEME = 'light';
diff --git a/lib/db.js b/lib/db.js
index 12bfd6d3..b44b4d3e 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -2,7 +2,7 @@ import { PrismaClient } from '@prisma/client';
import chalk from 'chalk';
BigInt.prototype.toJSON = function () {
- return this.toString();
+ return Number(this);
};
const options = {
@@ -18,20 +18,20 @@ function logQuery(e) {
console.log(chalk.yellow(e.params), '->', e.query, chalk.greenBright(`${e.duration}ms`));
}
-let prisma;
+function getClient(options) {
+ const prisma = new PrismaClient(options);
-if (process.env.NODE_ENV === 'production') {
- prisma = new PrismaClient(options);
-} else {
- if (!global.prisma) {
- global.prisma = new PrismaClient(options);
+ if (process.env.LOG_QUERY) {
+ prisma.$on('query', logQuery);
}
- prisma = global.prisma;
+ return prisma;
}
-if (process.env.LOG_QUERY) {
- prisma.$on('query', logQuery);
+const prisma = global.prisma || getClient(options);
+
+if (process.env.NODE_ENV !== 'production') {
+ global.prisma = prisma;
}
export default prisma;
diff --git a/next.config.js b/next.config.js
index f8186f3a..10624451 100644
--- a/next.config.js
+++ b/next.config.js
@@ -6,6 +6,7 @@ module.exports = {
currentVersion: pkg.version,
loginDisabled: process.env.DISABLE_LOGIN,
updatesDisabled: process.env.DISABLE_UPDATES,
+ telemetryDisabled: process.env.DISABLE_TELEMETRY,
},
basePath: process.env.BASE_PATH,
output: 'standalone',
diff --git a/store/version.js b/store/version.js
index 00f4f433..c809aa88 100644
--- a/store/version.js
+++ b/store/version.js
@@ -1,16 +1,15 @@
import create from 'zustand';
import produce from 'immer';
import semver from 'semver';
-import { VERSION_CHECK } from 'lib/constants';
+import { VERSION_CHECK, UPDATES_URL } from 'lib/constants';
import { getItem } from 'lib/web';
-const UPDATES_URL = 'https://api.umami.is/v1/updates';
-
const initialState = {
current: process.env.currentVersion,
latest: null,
hasUpdate: false,
checked: false,
+ releaseUrl: null,
};
const store = create(() => ({ ...initialState }));
@@ -37,7 +36,7 @@ export async function checkVersion() {
store.setState(
produce(state => {
- const { latest } = data;
+ const { latest, url } = data;
const lastCheck = getItem(VERSION_CHECK);
const hasUpdate = !!(latest && lastCheck?.version !== latest && semver.gt(latest, current));
@@ -46,6 +45,7 @@ export async function checkVersion() {
state.latest = latest;
state.hasUpdate = hasUpdate;
state.checked = true;
+ state.releaseUrl = url;
return state;
}),