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
+3 -13
View File
@@ -1,15 +1,5 @@
import { createStore } from 'jotai';
import { getDefaultStore } from 'jotai';
// global store
let rootStore = createStore();
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;
export function getCurrentStore() {
return getDefaultStore();
}
+17 -9
View File
@@ -22,15 +22,23 @@ export const windowFrameStyleOptions: AppSetting['windowFrameStyle'][] = [
'NativeTitleBar',
];
const appSettingBaseAtom = atomWithStorage<AppSetting>('affine-settings', {
clientBorder: BUILD_CONFIG.isElectron && !environment.isWindows,
windowFrameStyle: 'frameless',
enableBlurBackground: true,
enableNoisyBackground: true,
autoCheckUpdate: true,
autoDownloadUpdate: true,
enableTelemetry: true,
});
export const APP_SETTINGS_STORAGE_KEY = 'affine-settings';
const appSettingBaseAtom = atomWithStorage<AppSetting>(
APP_SETTINGS_STORAGE_KEY,
{
clientBorder: BUILD_CONFIG.isElectron && !environment.isWindows,
windowFrameStyle: 'frameless',
enableBlurBackground: true,
enableNoisyBackground: true,
autoCheckUpdate: true,
autoDownloadUpdate: true,
enableTelemetry: true,
},
undefined,
{
getOnInit: true,
}
);
type SetStateAction<Value> = Value | ((prev: Value) => Value);
@@ -1,4 +1,20 @@
import { mixpanel, sentry } from '@affine/track';
import { APP_SETTINGS_STORAGE_KEY } from '@toeverything/infra';
mixpanel.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();
}
}
@@ -1,11 +1,12 @@
import { enableAutoTrack, mixpanel, sentry } from '@affine/track';
import { appSettingAtom } from '@toeverything/infra';
import { useAtomValue } from 'jotai/react';
import { useLayoutEffect } from 'react';
import { useEffect } from 'react';
export function Telemetry() {
const settings = useAtomValue(appSettingAtom);
useLayoutEffect(() => {
useEffect(() => {
if (settings.enableTelemetry === false) {
sentry.disable();
mixpanel.opt_out_tracking();
@@ -16,5 +17,6 @@ export function Telemetry() {
return enableAutoTrack(document.body, mixpanel.track);
}
}, [settings.enableTelemetry]);
return null;
}
+30 -27
View File
@@ -8,39 +8,42 @@ import {
} from 'react-router-dom';
function createSentry() {
let enabled = true;
let client: Sentry.BrowserClient | undefined;
const wrapped = {
init() {
// https://docs.sentry.io/platforms/javascript/guides/react/#configure
Sentry.init({
enabled: enabled,
dsn: process.env.SENTRY_DSN,
debug: BUILD_CONFIG.debug ?? false,
environment: process.env.BUILD_TYPE ?? 'development',
integrations: [
Sentry.reactRouterV6BrowserTracingIntegration({
useEffect,
useLocation,
useNavigationType,
createRoutesFromChildren,
matchRoutes,
}),
],
beforeSend(event) {
return enabled ? event : null;
},
});
Sentry.setTags({
distribution: BUILD_CONFIG.distribution,
appVersion: BUILD_CONFIG.appVersion,
editorVersion: BUILD_CONFIG.editorVersion,
});
if (!globalThis.SENTRY_RELEASE) {
// https://docs.sentry.io/platforms/javascript/guides/react/#configure
client = Sentry.init({
dsn: process.env.SENTRY_DSN,
debug: BUILD_CONFIG.debug ?? false,
environment: process.env.BUILD_TYPE ?? 'development',
integrations: [
Sentry.reactRouterV6BrowserTracingIntegration({
useEffect,
useLocation,
useNavigationType,
createRoutesFromChildren,
matchRoutes,
}),
],
}) as Sentry.BrowserClient;
Sentry.setTags({
distribution: BUILD_CONFIG.distribution,
appVersion: BUILD_CONFIG.appVersion,
editorVersion: BUILD_CONFIG.editorVersion,
});
}
},
enable() {
enabled = true;
if (client) {
client.getOptions().enabled = true;
}
},
disable() {
enabled = false;
if (client) {
client.getOptions().enabled = false;
}
},
};