From e4c4019e253cb45d95e9c40f089768a2fed871ae Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 15 Jul 2022 23:53:31 -0700 Subject: [PATCH] Allow custom release URL. --- .eslintrc.json | 3 ++- components/common/UpdateNotice.js | 6 +++--- components/layout/Footer.js | 7 +++++-- lib/constants.js | 3 ++- lib/db.js | 20 ++++++++++---------- next.config.js | 1 + store/version.js | 8 ++++---- 7 files changed, 27 insertions(+), 21 deletions(-) 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; }),