From f7cf334c8011790ff1cfb39cd97369fdb14a0c73 Mon Sep 17 00:00:00 2001 From: Jaanus Sellin Date: Fri, 17 Feb 2023 16:02:07 +0200 Subject: [PATCH] feat: export/import plausible tracking (#3145) --- .../Import/validate/ValidationStage.tsx | 21 ++++++++++++++++++- .../api/actions/useExportApi/useExportApi.ts | 8 ++++++- .../api/actions/useImportApi/useImportApi.ts | 8 ++++++- frontend/src/hooks/usePlausibleTracker.ts | 3 ++- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/frontend/src/component/project/Project/Import/validate/ValidationStage.tsx b/frontend/src/component/project/Project/Import/validate/ValidationStage.tsx index 687808983a..02a50d03ed 100644 --- a/frontend/src/component/project/Project/Import/validate/ValidationStage.tsx +++ b/frontend/src/component/project/Project/Import/validate/ValidationStage.tsx @@ -12,6 +12,7 @@ import { ActionsContainer } from '../ActionsContainer'; import { IMPORT_CONFIGURATION_BUTTON } from 'utils/testIds'; import PermissionButton from 'component/common/PermissionButton/PermissionButton'; import { CREATE_FEATURE } from 'component/providers/AccessProvider/permissions'; +import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; const ImportInfoContainer = styled(Box)(({ theme }) => ({ backgroundColor: theme.palette.secondaryContainer, @@ -93,14 +94,32 @@ export const ValidationStage: FC<{ }> = ({ environment, project, payload, onClose, onBack, onSubmit }) => { const { validateImport } = useValidateImportApi(); const { setToastData } = useToast(); + const { trackEvent } = usePlausibleTracker(); const [validationResult, setValidationResult] = useState( { errors: [], warnings: [], permissions: [] } ); const [validJSON, setValidJSON] = useState(true); + const trackValidation = (result: IValidationSchema) => { + if (result.errors.length > 0 || result.permissions.length > 0) { + trackEvent('export_import', { + props: { + eventType: `validation fail`, + }, + }); + } else { + trackEvent('export_import', { + props: { + eventType: `validation success`, + }, + }); + } + setValidationResult(result); + }; + useEffect(() => { validateImport({ environment, project, data: JSON.parse(payload) }) - .then(setValidationResult) + .then(trackValidation) .catch(error => { setValidJSON(false); setToastData({ diff --git a/frontend/src/hooks/api/actions/useExportApi/useExportApi.ts b/frontend/src/hooks/api/actions/useExportApi/useExportApi.ts index 5749ec3aba..0a7a5fdbe4 100644 --- a/frontend/src/hooks/api/actions/useExportApi/useExportApi.ts +++ b/frontend/src/hooks/api/actions/useExportApi/useExportApi.ts @@ -1,10 +1,12 @@ import { ExportQuerySchema } from 'openapi'; import useAPI from '../useApi/useApi'; +import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; export const useExportApi = () => { const { makeRequest, createRequest, errors, loading } = useAPI({ propagateErrors: true, }); + const { trackEvent } = usePlausibleTracker(); const createExport = async (payload: ExportQuerySchema) => { const path = `api/admin/features-batch/export`; @@ -15,7 +17,11 @@ export const useExportApi = () => { try { const res = await makeRequest(req.caller, req.id); - + trackEvent('export_import', { + props: { + eventType: `features exported`, + }, + }); return res; } catch (e) { throw e; diff --git a/frontend/src/hooks/api/actions/useImportApi/useImportApi.ts b/frontend/src/hooks/api/actions/useImportApi/useImportApi.ts index 858daf7aeb..ab76db05a8 100644 --- a/frontend/src/hooks/api/actions/useImportApi/useImportApi.ts +++ b/frontend/src/hooks/api/actions/useImportApi/useImportApi.ts @@ -1,4 +1,5 @@ import useAPI from '../useApi/useApi'; +import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; export interface ImportQuerySchema { project: string; @@ -10,6 +11,7 @@ export const useImportApi = () => { const { makeRequest, createRequest, errors, loading } = useAPI({ propagateErrors: true, }); + const { trackEvent } = usePlausibleTracker(); const createImport = async (payload: ImportQuerySchema) => { const path = `api/admin/features-batch/full-import`; @@ -20,7 +22,11 @@ export const useImportApi = () => { try { const res = await makeRequest(req.caller, req.id); - + trackEvent('export_import', { + props: { + eventType: `features imported`, + }, + }); return res; } catch (e) { throw e; diff --git a/frontend/src/hooks/usePlausibleTracker.ts b/frontend/src/hooks/usePlausibleTracker.ts index 847e24621b..563f2d0aea 100644 --- a/frontend/src/hooks/usePlausibleTracker.ts +++ b/frontend/src/hooks/usePlausibleTracker.ts @@ -18,7 +18,8 @@ type CustomEvents = | 'hidden_environment' | 'project_overview' | 'suggest_tags' - | 'unknown_ui_error'; + | 'unknown_ui_error' + | 'export_import'; export const usePlausibleTracker = () => { const plausible = useContext(PlausibleContext);