fix(core): runtime control of telemetry (#10663)

This commit is contained in:
forehalo
2025-03-06 09:56:13 +00:00
parent 93920f9895
commit 56b842f2e1
5 changed files with 70 additions and 51 deletions

View File

@@ -1,15 +1,5 @@
import { createStore } from 'jotai'; import { getDefaultStore } from 'jotai';
// global store export function getCurrentStore() {
let rootStore = createStore(); return getDefaultStore();
export function getCurrentStore(): ReturnType<typeof createStore> {
return rootStore;
}
/**
* @internal do not use this function unless you know what you are doing
*/
export function _setCurrentStore(store: ReturnType<typeof createStore>) {
rootStore = store;
} }

View File

@@ -22,15 +22,23 @@ export const windowFrameStyleOptions: AppSetting['windowFrameStyle'][] = [
'NativeTitleBar', 'NativeTitleBar',
]; ];
const appSettingBaseAtom = atomWithStorage<AppSetting>('affine-settings', { export const APP_SETTINGS_STORAGE_KEY = 'affine-settings';
clientBorder: BUILD_CONFIG.isElectron && !environment.isWindows, const appSettingBaseAtom = atomWithStorage<AppSetting>(
windowFrameStyle: 'frameless', APP_SETTINGS_STORAGE_KEY,
enableBlurBackground: true, {
enableNoisyBackground: true, clientBorder: BUILD_CONFIG.isElectron && !environment.isWindows,
autoCheckUpdate: true, windowFrameStyle: 'frameless',
autoDownloadUpdate: true, enableBlurBackground: true,
enableTelemetry: true, enableNoisyBackground: true,
}); autoCheckUpdate: true,
autoDownloadUpdate: true,
enableTelemetry: true,
},
undefined,
{
getOnInit: true,
}
);
type SetStateAction<Value> = Value | ((prev: Value) => Value); type SetStateAction<Value> = Value | ((prev: Value) => Value);

View File

@@ -1,4 +1,20 @@
import { mixpanel, sentry } from '@affine/track'; import { mixpanel, sentry } from '@affine/track';
import { APP_SETTINGS_STORAGE_KEY } from '@toeverything/infra';
mixpanel.init(); mixpanel.init();
sentry.init(); sentry.init();
if (typeof localStorage !== 'undefined') {
let enabled = true;
const settingsStr = localStorage.getItem(APP_SETTINGS_STORAGE_KEY);
if (settingsStr) {
const parsed = JSON.parse(settingsStr);
enabled = parsed.enableTelemetry;
}
if (!enabled) {
mixpanel.opt_out_tracking();
sentry.disable();
}
}

View File

@@ -1,11 +1,12 @@
import { enableAutoTrack, mixpanel, sentry } from '@affine/track'; import { enableAutoTrack, mixpanel, sentry } from '@affine/track';
import { appSettingAtom } from '@toeverything/infra'; import { appSettingAtom } from '@toeverything/infra';
import { useAtomValue } from 'jotai/react'; import { useAtomValue } from 'jotai/react';
import { useLayoutEffect } from 'react'; import { useEffect } from 'react';
export function Telemetry() { export function Telemetry() {
const settings = useAtomValue(appSettingAtom); const settings = useAtomValue(appSettingAtom);
useLayoutEffect(() => {
useEffect(() => {
if (settings.enableTelemetry === false) { if (settings.enableTelemetry === false) {
sentry.disable(); sentry.disable();
mixpanel.opt_out_tracking(); mixpanel.opt_out_tracking();
@@ -16,5 +17,6 @@ export function Telemetry() {
return enableAutoTrack(document.body, mixpanel.track); return enableAutoTrack(document.body, mixpanel.track);
} }
}, [settings.enableTelemetry]); }, [settings.enableTelemetry]);
return null; return null;
} }

View File

@@ -8,39 +8,42 @@ import {
} from 'react-router-dom'; } from 'react-router-dom';
function createSentry() { function createSentry() {
let enabled = true; let client: Sentry.BrowserClient | undefined;
const wrapped = { const wrapped = {
init() { init() {
// https://docs.sentry.io/platforms/javascript/guides/react/#configure if (!globalThis.SENTRY_RELEASE) {
Sentry.init({ // https://docs.sentry.io/platforms/javascript/guides/react/#configure
enabled: enabled, client = Sentry.init({
dsn: process.env.SENTRY_DSN, dsn: process.env.SENTRY_DSN,
debug: BUILD_CONFIG.debug ?? false, debug: BUILD_CONFIG.debug ?? false,
environment: process.env.BUILD_TYPE ?? 'development', environment: process.env.BUILD_TYPE ?? 'development',
integrations: [ integrations: [
Sentry.reactRouterV6BrowserTracingIntegration({ Sentry.reactRouterV6BrowserTracingIntegration({
useEffect, useEffect,
useLocation, useLocation,
useNavigationType, useNavigationType,
createRoutesFromChildren, createRoutesFromChildren,
matchRoutes, matchRoutes,
}), }),
], ],
beforeSend(event) { }) as Sentry.BrowserClient;
return enabled ? event : null;
}, Sentry.setTags({
}); distribution: BUILD_CONFIG.distribution,
Sentry.setTags({ appVersion: BUILD_CONFIG.appVersion,
distribution: BUILD_CONFIG.distribution, editorVersion: BUILD_CONFIG.editorVersion,
appVersion: BUILD_CONFIG.appVersion, });
editorVersion: BUILD_CONFIG.editorVersion, }
});
}, },
enable() { enable() {
enabled = true; if (client) {
client.getOptions().enabled = true;
}
}, },
disable() { disable() {
enabled = false; if (client) {
client.getOptions().enabled = false;
}
}, },
}; };