diff --git a/interface/app/$libraryId/settings/client/privacy.tsx b/interface/app/$libraryId/settings/client/privacy.tsx index bf4e9e54e680..f3757f3672cd 100644 --- a/interface/app/$libraryId/settings/client/privacy.tsx +++ b/interface/app/$libraryId/settings/client/privacy.tsx @@ -1,18 +1,19 @@ -import { telemetryState, useTelemetryState } from '@sd/client'; -import { Switch } from '@sd/ui'; +import { TELEMETRY_LEVEL_PREFERENCES, telemetryState, useTelemetryState } from '@sd/client'; +import { Select, SelectOption } from '@sd/ui'; import { useLocale } from '~/hooks'; import { Heading } from '../Layout'; import Setting from '../Setting'; export const Component = () => { - const fullTelemetry = useTelemetryState().shareFullTelemetry; - const { t } = useLocale(); + const { telemetryLevelPreference } = useTelemetryState(); + return ( <> + { title={t('telemetry_title')} description={t('telemetry_description')} > - (telemetryState.shareFullTelemetry = !fullTelemetry)} - size="md" - /> + ); diff --git a/packages/client/src/hooks/usePlausible.tsx b/packages/client/src/hooks/usePlausible.tsx index fedd72822ead..15483a46d798 100644 --- a/packages/client/src/hooks/usePlausible.tsx +++ b/packages/client/src/hooks/usePlausible.tsx @@ -12,10 +12,7 @@ import { PlausiblePlatformType, telemetryState, useTelemetryState } from '../sto const DOMAIN = 'app.spacedrive.com'; const MOBILE_DOMAIN = 'mobile.spacedrive.com'; -const PlausibleProvider = Plausible({ - trackLocalhost: true, - domain: DOMAIN -}); +let plausibleInstance: ReturnType; /** * This defines all possible options that may be provided by events upon submission. @@ -186,14 +183,22 @@ interface SubmitEventProps { */ const submitPlausibleEvent = async ({ event, debugState, ...props }: SubmitEventProps) => { if (props.platformType === 'unknown') return; - // if (debugState.enabled && debugState.shareFullTelemetry !== true) return; if ( 'plausibleOptions' in event && 'telemetryOverride' in event.plausibleOptions - ? event.plausibleOptions.telemetryOverride !== true + ? // if telemetry override is on, always send. we never use this and probably never should. + // this should be discussed soon (if I don't forgetâ„¢) and removed if we agree. ~ilynxcat + event.plausibleOptions.telemetryOverride !== true : props.shareFullTelemetry !== true && event.type !== 'ping' ) return; + // using a singleton this way instead of instantiating at file eval (first time it's imported) + // because a user having "none" teleemtry preference should mean plausible's code never ever runs + plausibleInstance ??= Plausible({ + trackLocalhost: true, + domain: DOMAIN + }); + const fullEvent: PlausibleTrackerEvent = { eventName: event.type, props: { @@ -217,7 +222,7 @@ const submitPlausibleEvent = async ({ event, debugState, ...props }: SubmitEvent : undefined }; - PlausibleProvider.trackEvent( + plausibleInstance.trackEvent( fullEvent.eventName, { props: fullEvent.props, @@ -271,9 +276,12 @@ interface EventSubmissionCallbackProps { * }); * ``` */ -export const usePlausibleEvent = () => { - const debugState = useDebugState(); +export const usePlausibleEvent = (): ((props: EventSubmissionCallbackProps) => Promise) => { const telemetryState = useTelemetryState(); + + if (telemetryState.telemetryLevelPreference === 'none') return async (...args: any[]) => {}; + + const debugState = useDebugState(); const previousEvent = useRef({} as BasePlausibleEvent); return useCallback( diff --git a/packages/client/src/stores/telemetryState.tsx b/packages/client/src/stores/telemetryState.tsx index 40db306c56d4..d30817f07ca5 100644 --- a/packages/client/src/stores/telemetryState.tsx +++ b/packages/client/src/stores/telemetryState.tsx @@ -12,15 +12,22 @@ import { createPersistedMutable, useSolidStore } from '../solid'; export type PlausiblePlatformType = 'web' | 'mobile' | 'desktop' | 'unknown'; type TelemetryState = { - shareFullTelemetry: boolean; + telemetryLevelPreference: TelemetryLevelPreference; platform: PlausiblePlatformType; buildInfo: BuildInfo | undefined; }; +export const TELEMETRY_LEVEL_PREFERENCES = [ + 'full', + 'minimal', + 'none' +] satisfies TelemetryLevelPreference[]; +export type TelemetryLevelPreference = 'full' | 'minimal' | 'none'; + export const telemetryState = createPersistedMutable( 'sd-explorer-layout', createMutable({ - shareFullTelemetry: false, // false by default + telemetryLevelPreference: 'none', // no telemetry by default platform: 'unknown', buildInfo: undefined })