From 10eb50036094a9ab8c2545ef503ebf8907901186 Mon Sep 17 00:00:00 2001 From: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com> Date: Mon, 10 Oct 2022 14:06:44 +0200 Subject: [PATCH] Custom event tracking (#2151) * add plausible custom event tracking * refactor: better comments for analytics tracking --- frontend/src/component/App.tsx | 73 ++++++++++--------- .../admin/users/InviteLink/InviteLink.tsx | 11 ++- .../users/InviteLinkBar/InviteLinkBar.tsx | 18 ++++- .../PlausibleProvider/PlausibleProvider.tsx | 42 +++++++++++ .../src/component/user/NewUser/NewUser.tsx | 7 ++ frontend/src/contexts/PlausibleContext.ts | 6 ++ .../src/hooks/usePlausibleTracker.test.ts | 17 ----- frontend/src/hooks/usePlausibleTracker.ts | 57 +++++++-------- 8 files changed, 145 insertions(+), 86 deletions(-) create mode 100644 frontend/src/component/providers/PlausibleProvider/PlausibleProvider.tsx create mode 100644 frontend/src/contexts/PlausibleContext.ts delete mode 100644 frontend/src/hooks/usePlausibleTracker.test.ts diff --git a/frontend/src/component/App.tsx b/frontend/src/component/App.tsx index c4c037fe65..8c7776bc10 100644 --- a/frontend/src/component/App.tsx +++ b/frontend/src/component/App.tsx @@ -9,13 +9,13 @@ import Loader from 'component/common/Loader/Loader'; import NotFound from 'component/common/NotFound/NotFound'; import { ProtectedRoute } from 'component/common/ProtectedRoute/ProtectedRoute'; import { SWRProvider } from 'component/providers/SWRProvider/SWRProvider'; +import { PlausibleProvider } from 'component/providers/PlausibleProvider/PlausibleProvider'; import ToastRenderer from 'component/common/ToastRenderer/ToastRenderer'; import { routes } from 'component/menu/routes'; import { useAuthDetails } from 'hooks/api/getters/useAuth/useAuthDetails'; import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser'; import { SplashPageRedirect } from 'component/splash/SplashPageRedirect/SplashPageRedirect'; import { useStyles } from './App.styles'; -import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; export const App = () => { @@ -24,7 +24,6 @@ export const App = () => { const { user } = useAuthUser(); const { isOss } = useUiConfig(); const hasFetchedAuth = Boolean(authDetails || user); - usePlausibleTracker(); const availableRoutes = isOss() ? routes.filter(route => !route.enterprise) @@ -34,45 +33,47 @@ export const App = () => { }> - } - elseShow={ -
- - - - {availableRoutes.map(route => ( + + } + elseShow={ +
+ + + + {availableRoutes.map(route => ( + + } + /> + ))} } /> - ))} - - } - /> - } - /> - - - - -
- } - /> + } + /> +
+ + +
+
+ } + /> +
diff --git a/frontend/src/component/admin/users/InviteLink/InviteLink.tsx b/frontend/src/component/admin/users/InviteLink/InviteLink.tsx index d7937a93b0..b12638425b 100644 --- a/frontend/src/component/admin/users/InviteLink/InviteLink.tsx +++ b/frontend/src/component/admin/users/InviteLink/InviteLink.tsx @@ -17,6 +17,7 @@ import { useInviteTokenApi } from 'hooks/api/actions/useInviteTokenApi/useInvite import { useInviteTokens } from 'hooks/api/getters/useInviteTokens/useInviteTokens'; import { LinkField } from '../LinkField/LinkField'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; +import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; interface ICreateInviteLinkProps {} @@ -64,12 +65,12 @@ export const InviteLink: VFC = () => { const { data, loading } = useInviteTokens(); const [inviteLink, setInviteLink] = useState(''); const { mutate } = useSWRConfig(); + const { trackEvent } = usePlausibleTracker(); const [expiry, setExpiry] = useState(expiryOptions[0].key); const [showDisableDialog, setDisableDialogue] = useState(false); const defaultToken = data?.tokens?.find(token => token.name === 'default'); const isUpdating = Boolean(defaultToken); const formatApiCode = useFormatApiCode(isUpdating, expiry); - const [isSending, setIsSending] = useState(false); const { setToastApiError } = useToast(); const { createToken, updateToken } = useInviteTokenApi(); @@ -78,6 +79,14 @@ export const InviteLink: VFC = () => { e.preventDefault(); setIsSending(true); + trackEvent('invite', { + props: { + eventType: isUpdating + ? 'link update submitted' + : 'link created', + }, + }); + try { if (isUpdating) { await updateToken(defaultToken!.secret, { diff --git a/frontend/src/component/admin/users/InviteLinkBar/InviteLinkBar.tsx b/frontend/src/component/admin/users/InviteLinkBar/InviteLinkBar.tsx index 25ff0122f6..1733b68059 100644 --- a/frontend/src/component/admin/users/InviteLinkBar/InviteLinkBar.tsx +++ b/frontend/src/component/admin/users/InviteLinkBar/InviteLinkBar.tsx @@ -1,4 +1,4 @@ -import { VFC } from 'react'; +import { useEffect, VFC } from 'react'; import { useNavigate } from 'react-router-dom'; import { Box, Button, Typography } from '@mui/material'; import useLoading from 'hooks/useLoading'; @@ -8,11 +8,13 @@ import { LinkField } from '../LinkField/LinkField'; import { add, formatDistanceToNowStrict, isAfter, parseISO } from 'date-fns'; import { formatDateYMD } from 'utils/formatDate'; import { useLocationSettings } from 'hooks/useLocationSettings'; +import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; export const InviteLinkBar: VFC = () => { const navigate = useNavigate(); const { data, loading } = useInviteTokens(); const ref = useLoading(loading); + const { trackEvent } = usePlausibleTracker(); const inviteToken = data?.tokens?.find(token => token.name === 'default') ?? null; const inviteLink = inviteToken?.url; @@ -40,6 +42,18 @@ export const InviteLinkBar: VFC = () => { ); + const onInviteLinkActionClick = () => { + trackEvent('invite', { + props: { + eventType: Boolean(inviteLink) + ? 'link bar action: edit' + : 'link bar action: create', + }, + }); + + navigate('/admin/invite-link'); + }; + return ( { >