From 79a92d86d6600a91cf6d9e89de14153b6b736cb7 Mon Sep 17 00:00:00 2001 From: jake <77554505+brxken128@users.noreply.github.com> Date: Tue, 10 Oct 2023 20:49:46 +0100 Subject: [PATCH] [ENG-428] Embed app version and commit hash for telemetry (#1456) * embed build info into telemetry * fix mobile too * use actual data and not the bridge query :skull: --- apps/mobile/src/App.tsx | 5 +++- interface/app/$libraryId/Layout/index.tsx | 7 ++++-- packages/client/src/hooks/usePlausible.tsx | 24 ++++++++++++++----- .../client/src/hooks/useTelemetryState.tsx | 5 +++- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/apps/mobile/src/App.tsx b/apps/mobile/src/App.tsx index 2f09d358f..ef3395be6 100644 --- a/apps/mobile/src/App.tsx +++ b/apps/mobile/src/App.tsx @@ -23,6 +23,7 @@ import { NotificationContextProvider, P2PContextProvider, RspcProvider, + useBridgeQuery, useClientContext, useInvalidateQuery, usePlausibleEvent, @@ -42,7 +43,6 @@ dayjs.extend(advancedFormat); dayjs.extend(relativeTime); dayjs.extend(duration); -initPlausible({ platformType: 'mobile' }); // changeTwTheme(getThemeStore().theme); // TODO: Use above when light theme is ready changeTwTheme('dark'); @@ -50,6 +50,9 @@ changeTwTheme('dark'); function AppNavigation() { const { libraries, library } = useClientContext(); const plausibleEvent = usePlausibleEvent(); + const buildInfo = useBridgeQuery(['buildInfo']); + + initPlausible({ platformType: 'mobile', buildInfo: buildInfo?.data }); // TODO: Make sure library has actually been loaded by this point - precache with useCachedLibraries? // if (library === undefined) throw new Error("Tried to render AppNavigation before libraries fetched!") diff --git a/interface/app/$libraryId/Layout/index.tsx b/interface/app/$libraryId/Layout/index.tsx index 6d6a7c2fd..feadd2d37 100644 --- a/interface/app/$libraryId/Layout/index.tsx +++ b/interface/app/$libraryId/Layout/index.tsx @@ -1,10 +1,11 @@ import clsx from 'clsx'; -import { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { Suspense, useEffect, useMemo, useRef } from 'react'; import { Navigate, Outlet } from 'react-router-dom'; import { ClientContextProvider, initPlausible, LibraryContextProvider, + useBridgeQuery, useClientContext, usePlausibleEvent, usePlausiblePageViewMonitor, @@ -23,11 +24,13 @@ const Layout = () => { const { libraries, library } = useClientContext(); const os = useOperatingSystem(); const plausibleEvent = usePlausibleEvent(); + const buildInfo = useBridgeQuery(['buildInfo']); const layoutRef = useRef(null); initPlausible({ - platformType: usePlatform().platform === 'tauri' ? 'desktop' : 'web' + platformType: usePlatform().platform === 'tauri' ? 'desktop' : 'web', + buildInfo: buildInfo?.data }); const { rawPath } = useRootContext(); diff --git a/packages/client/src/hooks/usePlausible.tsx b/packages/client/src/hooks/usePlausible.tsx index 764e5180d..e9a0debf1 100644 --- a/packages/client/src/hooks/usePlausible.tsx +++ b/packages/client/src/hooks/usePlausible.tsx @@ -1,14 +1,14 @@ import Plausible, { PlausibleOptions as PlausibleTrackerOptions } from 'plausible-tracker'; import { useCallback, useEffect, useRef } from 'react'; +import { BuildInfo } from '../core'; import { useDebugState } from './useDebugState'; import { PlausiblePlatformType, telemetryStore, useTelemetryState } from './useTelemetryState'; /** * This should be in sync with the Core's version. */ -const CORE_VERSION = '0.1.0'; // This will need to be embedded accordingly -const APP_VERSION = '0.1.0'; // This is specific to desktop/web/mobile and will need to be embedded accordingly + const DOMAIN = 'app.spacedrive.com'; const MOBILE_DOMAIN = 'mobile.spacedrive.com'; @@ -117,7 +117,7 @@ interface PlausibleTrackerEvent { platform: PlausiblePlatformType; fullTelemetry: boolean; coreVersion: string; - appVersion: string; + commitHash: string; debug: boolean; }; options: PlausibleTrackerOptions; @@ -156,6 +156,10 @@ interface SubmitEventProps { shareFullTelemetry: boolean; telemetryLogging: boolean; }; + /** + * The app's build info + */ + buildInfo: BuildInfo | undefined; // TODO(brxken128): ensure this is populated *always* } /** @@ -195,8 +199,8 @@ const submitPlausibleEvent = async ({ event, debugState, ...props }: SubmitEvent props: { platform: props.platformType, fullTelemetry: props.shareFullTelemetry, - coreVersion: CORE_VERSION, - appVersion: APP_VERSION, + coreVersion: props.buildInfo?.version ?? '0.1.0', // TODO(brxken128): clean this up + commitHash: props.buildInfo?.commit ?? '0.1.0', debug: debugState.enabled }, options: { @@ -281,6 +285,7 @@ export const usePlausibleEvent = () => { debugState, shareFullTelemetry: telemetryState.shareFullTelemetry, platformType: telemetryState.platform, + buildInfo: telemetryState.buildInfo, ...props }); }, @@ -361,7 +366,14 @@ export const usePlausiblePingMonitor = ({ currentPath }: PlausibleMonitorProps) }, [currentPath, plausibleEvent]); }; -export const initPlausible = ({ platformType }: { platformType: PlausiblePlatformType }) => { +export const initPlausible = ({ + platformType, + buildInfo +}: { + platformType: PlausiblePlatformType; + buildInfo: BuildInfo | undefined; +}) => { telemetryStore.platform = platformType; + telemetryStore.buildInfo = buildInfo; return; }; diff --git a/packages/client/src/hooks/useTelemetryState.tsx b/packages/client/src/hooks/useTelemetryState.tsx index 56bf7b6ad..8503b66a0 100644 --- a/packages/client/src/hooks/useTelemetryState.tsx +++ b/packages/client/src/hooks/useTelemetryState.tsx @@ -1,5 +1,6 @@ import { useSnapshot } from 'valtio'; +import { BuildInfo } from '../core'; import { valtioPersist } from '../lib'; /** @@ -13,11 +14,13 @@ export type PlausiblePlatformType = 'web' | 'mobile' | 'desktop' | 'unknown'; type TelemetryState = { shareFullTelemetry: boolean; platform: PlausiblePlatformType; + buildInfo: BuildInfo | undefined; }; export const telemetryStore = valtioPersist('sd-telemetryStore', { shareFullTelemetry: false, // false by default - platform: 'unknown' + platform: 'unknown', + buildInfo: undefined }); export function useTelemetryState() {