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
})