From a828ec28d2b3904ae6bfeb336cbc58435f90f63a Mon Sep 17 00:00:00 2001 From: Jason Dicker <110084728+jasondicker@users.noreply.github.com> Date: Thu, 8 Feb 2024 12:43:13 +0200 Subject: [PATCH] Features/google analytics (#471) * added google analystics tracks user events across the site (organisation registed, user logged in etc) * implementation of GA, app icons for PWA --- src/web/.env.example | 3 + src/web/Dockerfile | 1 + src/web/package.json | 1 + src/web/public/icon-192x192.png | Bin 2217 -> 0 bytes src/web/public/icon-256x256.png | Bin 2160 -> 0 bytes src/web/public/icon-384x384.png | Bin 5187 -> 0 bytes src/web/public/icon-512x512.png | Bin 3734 -> 0 bytes src/web/public/manifest.json | 8 +- src/web/public/scripts/lang-config.js | 11 ++ src/web/public/yoma-icon-192.png | Bin 0 -> 10388 bytes src/web/public/yoma-icon-256.png | Bin 0 -> 15021 bytes src/web/public/yoma-icon-384.png | Bin 0 -> 24735 bytes src/web/public/yoma-icon-512.png | Bin 0 -> 35215 bytes src/web/src/components/Global.tsx | 66 +++++++---- src/web/src/components/GoogleAnalytics.tsx | 19 ++++ .../components/NavBar/LanguageSwitcher.tsx | 8 ++ .../src/components/NavBar/SignInButton.tsx | 9 ++ src/web/src/components/NavBar/UserMenu.tsx | 23 +++- src/web/src/env.mjs | 2 + src/web/src/lib/constants.ts | 105 ++++++++++++++++++ src/web/src/lib/google-analytics.ts | 27 +++++ src/web/src/lib/store.tsx | 7 +- src/web/src/pages/_app.tsx | 2 + .../src/pages/admin/schemas/[id]/index.tsx | 14 ++- .../marketplace/[category]/[store]/index.tsx | 20 +++- .../opportunities/[opportunityId]/index.tsx | 35 +++++- src/web/src/pages/organisations/[id]/edit.tsx | 10 ++ .../opportunities/[opportunityId]/index.tsx | 19 ++++ .../opportunities/[opportunityId]/info.tsx | 10 ++ .../[id]/verifications/[[...query]]/index.tsx | 19 ++++ .../src/pages/organisations/[id]/verify.tsx | 10 ++ .../pages/organisations/register/index.tsx | 17 ++- src/web/src/pages/user/profile.tsx | 1 + src/web/src/pages/user/settings.tsx | 20 +++- src/web/src/pages/yoid/settings/index.tsx | 19 +++- src/web/yarn.lock | 5 + 36 files changed, 443 insertions(+), 48 deletions(-) delete mode 100644 src/web/public/icon-192x192.png delete mode 100644 src/web/public/icon-256x256.png delete mode 100644 src/web/public/icon-384x384.png delete mode 100644 src/web/public/icon-512x512.png create mode 100644 src/web/public/yoma-icon-192.png create mode 100644 src/web/public/yoma-icon-256.png create mode 100644 src/web/public/yoma-icon-384.png create mode 100644 src/web/public/yoma-icon-512.png create mode 100644 src/web/src/components/GoogleAnalytics.tsx create mode 100644 src/web/src/lib/google-analytics.ts diff --git a/src/web/.env.example b/src/web/.env.example index f1af00e70..b44a637af 100644 --- a/src/web/.env.example +++ b/src/web/.env.example @@ -28,3 +28,6 @@ NEXT_PUBLIC_API_BASE_URL=http://localhost:5000/api/v3 NEXT_PUBLIC_ENVIRONMENT=local NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=secret NEXT_PUBLIC_COOKIE_DOMAIN=localhost + +# Google Analytics +NEXT_PUBLIC_GA_MEASUREMENT_ID= diff --git a/src/web/Dockerfile b/src/web/Dockerfile index 3336fab78..c85dc3a02 100644 --- a/src/web/Dockerfile +++ b/src/web/Dockerfile @@ -29,6 +29,7 @@ ARG NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ENV NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=${NEXT_PUBLIC_GOOGLE_MAPS_API_KEY} ARG NEXT_PUBLIC_COOKIE_DOMAIN ENV NEXT_PUBLIC_COOKIE_DOMAIN=${NEXT_PUBLIC_COOKIE_DOMAIN} +ARG NEXT_PUBLIC_GA_MEASUREMENT_ID=${NEXT_PUBLIC_GA_MEASUREMENT_ID} ARG SENTRY_AUTH_TOKEN ENV SENTRY_AUTH_TOKEN=${SENTRY_AUTH_TOKEN} diff --git a/src/web/package.json b/src/web/package.json index 36dd6eee9..6b7b61e6f 100644 --- a/src/web/package.json +++ b/src/web/package.json @@ -29,6 +29,7 @@ "react": "^18.2.0", "react-datepicker": "^4.23.0", "react-dom": "^18.2.0", + "react-ga4": "^2.1.0", "react-hook-form": "^7.48.2", "react-icons": "^4.12.0", "react-modal": "^3.16.1", diff --git a/src/web/public/icon-192x192.png b/src/web/public/icon-192x192.png deleted file mode 100644 index f770dfb63443c58219201a9a0a7aa7b8ee56f5a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2217 zcmcgtdpOkD8~VC`@*r6r>L|p z^>;Efr#)+9Lo`UX-={w}yWg=45z{GnSkq%!C~~~gj6B!03?m!OdQ`uU#>ri4NX0?k znV!pC7}wPcWV^ z)I`A+%00L>IXml^hwC05rm44ux`*#<;rUIJLXzLx?qXhgMn>1jNZyhehfMXAk(KRQ zUe*hD$U(s!na!iOnM|fvY_q2c(Co>bot@1jn_<+T55^;w&WCS&P*GFMu`lwz&o^pZ zQ053amzK)2a&qXoQWpd)Z@phw)zx-IjtI%&m0TW=cQWg8kMmU`G1}=iulKe}e(#h% zB?#}dK3ZO`Ym!K3u?$V)k+(=yZEe=f>S||;QDv`o2iovxO3Fdd_dN-RPwAr`j6>s^ zD=RBsCM7}f=~pdgcDHUDDE0mEShflTU9?cGx}pZ?oXpHKXf(RO5s?*_YI8y`$1~E` z)wSeFbv~m|0&!}1hN-3kp?cRD# z?kiNI?R`66SOGqIM@$kgqAR2V>(g!WJ2P|$?TQVUAPN;;bL`g*#8Q75!48r30*i+j zB~qzJOJBc!RafWA3drCg{eg~(i1oqw`M^E2u<&uBkMxJb6$7uwCnj{B2?%~(Q=@*)bM>tq+a>BX4|<%9~m=2rXjE?c23-cCoIKiVDa!oUbojm7_#! zj2+Y=mCw{_yeL$!(2g6#VleH_!J4W->?9u2pHNhEYAo0U342!K_ zcJ^1`jCirTZDH@2UMnp#zXwApYiKY}!4#S(!~<0WtIx8sxZ9g+KD=MoJKYkPlsCsi z7KY5bIy-Sz9BrI1zxS8Z+SWeRj?NlCH zHRBM8#7q~hmh$V;j;aGhr}g_g??f~F;zg6ejFAhm=;PkPcbRY^Th`76>>@s%EOUQ$vLtT2|pKzjZ;GCEo; zc5*G-;I$g8CixqIgl+BEUBAU9VF~0P|_xL zg!K}O;k%u}7;LV^6qk-RH8uU}Q6W*2&0?{FlfvGN;n#ebls}Ga)fYM1l$4YVp0)uP zfkfhE#td~}p-kAg>m#}-;7r#tT3T9+X^`P%j3V2p{n>8)DJXIUGTbixD9Ww>D)`tg z?jCJiD5lyg(!c~be|$n6Ern7_i||) zo;{mSG~DD>BZAbyNPa$&6`*+_MkAx+iWOz3Eov33tg3o;ukHA``T1-v_e$bf#di^X zLqm*#0errF(YRU15xOHHAM{wrEYWR04-Z-aa=uSao(oU0mN9mq@fF!&)c#5bnthQK z)ZBqac&;5R3tmH(sCBYud1fHLu@saM;p(d43bL$&A*K%2mjSycy2uxsjDoX`rqd^` zvQW|Rk9$P;OP(#M^IufW)Eq@^)*)!*Q(qqv8vaRa*f_CgD&*$)&iTiYunoBdQE_Z= z*&3qE#`)=^h9?%O$1mW%4fXXMn${;Q%Jg2>ej)1v1hb!k0?-jRbOsX{#W(pR^?ocE za_q|KMP~ROCt?B33qb@bPcI$;Vhd+(n7;*Mv)>t=)&Xk8eP}v)`-wqN6XVzZe-A z*@MQ@i3NN3?;uykACU8WiM;fI2^pAfOU_ z5U-cdS;xo6PlD9fipqhFaW(E(T;o1fJOAzOQ4zpJ>|gs%|NsA5I2lCpE=oh==x+dU NSR*l3jQ@B<{SCP|;Z6Vm diff --git a/src/web/public/icon-256x256.png b/src/web/public/icon-256x256.png deleted file mode 100644 index 8cc46d1cbba76daf9d46c5a8b5fc3ac2d6d7d162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2160 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 rreHt!4}Rt}|8