diff --git a/packages/pn-personafisica-login/src/models/PFLoginEventsType.ts b/packages/pn-personafisica-login/src/models/PFLoginEventsType.ts new file mode 100644 index 0000000000..bfac047fed --- /dev/null +++ b/packages/pn-personafisica-login/src/models/PFLoginEventsType.ts @@ -0,0 +1,6 @@ +export enum PFLoginEventsType { + SEND_LOGIN = 'SEND_LOGIN', + SEND_IDP_SELECTED = 'SEND_IDP_SELECTED', + SEND_LOGIN_FAILURE = 'SEND_LOGIN_FAILURE', + SEND_LOGIN_METHOD = 'SEND_LOGIN_METHOD', +} diff --git a/packages/pn-personafisica-login/src/pages/login/Login.tsx b/packages/pn-personafisica-login/src/pages/login/Login.tsx index bded2f807b..4bc7e321cf 100644 --- a/packages/pn-personafisica-login/src/pages/login/Login.tsx +++ b/packages/pn-personafisica-login/src/pages/login/Login.tsx @@ -10,9 +10,9 @@ import { styled } from '@mui/material/styles'; import { AppRouteParams, Layout, useIsMobile } from '@pagopa-pn/pn-commons'; import { CieIcon, SpidIcon } from '@pagopa/mui-italia/dist/icons'; +import { PFLoginEventsType } from '../../models/PFLoginEventsType'; import { getConfiguration } from '../../services/configuration.service'; -import { TrackEventType } from '../../utility/events'; -import { trackEventByType } from '../../utility/mixpanel'; +import PFLoginEventStrategyFactory from '../../utility/MixpanelUtils/PFLoginEventStrategyFactory'; import { storageAarOps } from '../../utility/storage'; import SpidSelect from './SpidSelect'; @@ -38,14 +38,15 @@ const Login = () => { } useEffect(() => { - trackEventByType(TrackEventType.SEND_LOGIN); + PFLoginEventStrategyFactory.triggerEvent(PFLoginEventsType.SEND_LOGIN); }, []); const goCIE = () => { window.location.assign( `${URL_API_LOGIN}/login?entityID=${SPID_CIE_ENTITY_ID}&authLevel=SpidL2&RelayState=send` ); - trackEventByType(TrackEventType.SEND_IDP_SELECTED, { + + PFLoginEventStrategyFactory.triggerEvent(PFLoginEventsType.SEND_IDP_SELECTED, { SPID_IDP_NAME: 'CIE', SPID_IDP_ID: SPID_CIE_ENTITY_ID, }); diff --git a/packages/pn-personafisica-login/src/pages/login/SpidSelect.tsx b/packages/pn-personafisica-login/src/pages/login/SpidSelect.tsx index 6fe8f6e5c1..7a27b8fc84 100644 --- a/packages/pn-personafisica-login/src/pages/login/SpidSelect.tsx +++ b/packages/pn-personafisica-login/src/pages/login/SpidSelect.tsx @@ -7,13 +7,12 @@ import Grid from '@mui/material/Grid'; import Icon from '@mui/material/Icon'; import Link from '@mui/material/Link'; import Typography from '@mui/material/Typography'; -import { ProfilePropertyType } from '@pagopa-pn/pn-commons'; import SpidBig from '../../assets/spid_big.svg'; +import { PFLoginEventsType } from '../../models/PFLoginEventsType'; import { getConfiguration } from '../../services/configuration.service'; import { IdentityProvider, getIDPS } from '../../utility/IDPS'; -import { TrackEventType } from '../../utility/events'; -import { setSuperOrProfilePropertyValues, trackEventByType } from '../../utility/mixpanel'; +import PFLoginEventStrategyFactory from '../../utility/MixpanelUtils/PFLoginEventStrategyFactory'; import { shuffleList } from '../../utility/utils'; const SpidSelect = ({ onBack }: { onBack: () => void }) => { @@ -25,16 +24,14 @@ const SpidSelect = ({ onBack }: { onBack: () => void }) => { const getSPID = (IDP: IdentityProvider) => { sessionStorage.setItem('IDP', IDP.entityId); - trackEventByType(TrackEventType.SEND_IDP_SELECTED, { + PFLoginEventStrategyFactory.triggerEvent(PFLoginEventsType.SEND_IDP_SELECTED, { SPID_IDP_NAME: IDP.name, SPID_IDP_ID: IDP.entityId, }); - setSuperOrProfilePropertyValues( - ProfilePropertyType.PROFILE, - 'SEND_LOGIN_METHOD', - IDP.entityId as any // FIX this any - ); + PFLoginEventStrategyFactory.triggerEvent(PFLoginEventsType.SEND_LOGIN_METHOD, { + entityID: IDP.entityId, + }); window.location.assign( `${URL_API_LOGIN}/login?entityID=${IDP.entityId}&authLevel=SpidL2&RelayState=send` diff --git a/packages/pn-personafisica-login/src/pages/loginError/LoginError.tsx b/packages/pn-personafisica-login/src/pages/loginError/LoginError.tsx index 8acb0037d2..afb5b7a917 100644 --- a/packages/pn-personafisica-login/src/pages/loginError/LoginError.tsx +++ b/packages/pn-personafisica-login/src/pages/loginError/LoginError.tsx @@ -6,14 +6,17 @@ import { Box, Button, Dialog, Typography } from '@mui/material'; import { getLocalizedOrDefaultLabel } from '@pagopa-pn/pn-commons/src/utility/localization.utility'; import { IllusError } from '@pagopa/mui-italia'; +import { PFLoginEventsType } from '../../models/PFLoginEventsType'; import { getConfiguration } from '../../services/configuration.service'; -import { TrackEventType } from '../../utility/events'; -import { trackEventByType } from '../../utility/mixpanel'; +import PFLoginEventStrategyFactory from '../../utility/MixpanelUtils/PFLoginEventStrategyFactory'; const handleError = (queryParams: string, errorMessage: string) => { if (process.env.NODE_ENV !== 'test') { const IDP = sessionStorage.getItem('IDP'); - trackEventByType(TrackEventType.SEND_LOGIN_FAILURE, { reason: errorMessage, IDP }); + PFLoginEventStrategyFactory.triggerEvent(PFLoginEventsType.SEND_LOGIN_FAILURE, { + reason: errorMessage, + IDP, + }); sessionStorage.removeItem('IDP'); console.error(`login unsuccessfull! query params obtained from idp: ${queryParams}`); } diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/PFLoginEventStrategyFactory.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/PFLoginEventStrategyFactory.ts new file mode 100644 index 0000000000..e888d87531 --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/PFLoginEventStrategyFactory.ts @@ -0,0 +1,26 @@ +import { EventStrategy, EventStrategyFactory } from '@pagopa-pn/pn-commons'; + +import { PFLoginEventsType } from '../../models/PFLoginEventsType'; +import { SendIDPSelectedStrategy } from './Strategies/SendIDPSelectedStrategy'; +import { SendLoginFailureStrategy } from './Strategies/SendLoginFailureStrategy'; +import { SendLoginMethodStrategy } from './Strategies/SendLoginMethodStrategy'; +import { UXScreenViewStrategy } from './Strategies/UXScreenViewStrategy'; + +class PFLoginEventStrategyFactory extends EventStrategyFactory { + getStrategy(eventType: PFLoginEventsType): EventStrategy | null { + switch (eventType) { + case PFLoginEventsType.SEND_LOGIN: + return new UXScreenViewStrategy(); + case PFLoginEventsType.SEND_IDP_SELECTED: + return new SendIDPSelectedStrategy(); + case PFLoginEventsType.SEND_LOGIN_FAILURE: + return new SendLoginFailureStrategy(); + case PFLoginEventsType.SEND_LOGIN_METHOD: + return new SendLoginMethodStrategy(); + default: + return null; + } + } +} + +export default new PFLoginEventStrategyFactory(); diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/SendIDPSelectedStrategy.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/SendIDPSelectedStrategy.ts new file mode 100644 index 0000000000..8c4c60b34d --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/SendIDPSelectedStrategy.ts @@ -0,0 +1,28 @@ +import { + EventAction, + EventCategory, + EventPropertyType, + EventStrategy, + TrackedEvent, +} from '@pagopa-pn/pn-commons'; + +type SendIDPSelected = { + SPID_IDP_NAME: string; + SPID_IDP_ID: string; +}; + +export class SendIDPSelectedStrategy implements EventStrategy { + performComputations({ + SPID_IDP_ID, + SPID_IDP_NAME, + }: SendIDPSelected): TrackedEvent { + return { + [EventPropertyType.TRACK]: { + event_category: EventCategory.UX, + event_type: EventAction.ACTION, + SPID_IDP_ID, + SPID_IDP_NAME, + }, + }; + } +} diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/SendLoginFailureStrategy.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/SendLoginFailureStrategy.ts new file mode 100644 index 0000000000..5fb66a2b22 --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/SendLoginFailureStrategy.ts @@ -0,0 +1,23 @@ +import { + EventCategory, + EventPropertyType, + EventStrategy, + TrackedEvent, +} from '@pagopa-pn/pn-commons'; + +type SendLoginFailure = { + reason: string; + IDP: string | null; +}; + +export class SendLoginFailureStrategy implements EventStrategy { + performComputations({ reason, IDP }: SendLoginFailure): TrackedEvent { + return { + [EventPropertyType.TRACK]: { + event_category: EventCategory.TECH, + reason, + IDP, + }, + }; + } +} diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/SendLoginMethodStrategy.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/SendLoginMethodStrategy.ts new file mode 100644 index 0000000000..424f14e029 --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/SendLoginMethodStrategy.ts @@ -0,0 +1,29 @@ +import { EventPropertyType, EventStrategy, TrackedEvent } from '@pagopa-pn/pn-commons'; + +type SendLoginMethod = { + entityID: + | 'cie' + | 'posteid' + | 'timid' + | 'spiditalia' + | 'sielteid' + | 'namirialid' + | 'lepidaid' + | 'instesaid' + | 'infocertid' + | 'arubaid'; +}; + +type SendLoginMethodReturn = { + SEND_LOGIN_METHOD: string; +}; + +export class SendLoginMethodStrategy implements EventStrategy { + performComputations({ entityID }: SendLoginMethod): TrackedEvent { + return { + [EventPropertyType.PROFILE]: { + SEND_LOGIN_METHOD: entityID, + }, + }; + } +} diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/UXScreenViewStrategy.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/UXScreenViewStrategy.ts new file mode 100644 index 0000000000..aa3a01ab40 --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/UXScreenViewStrategy.ts @@ -0,0 +1,18 @@ +import { + EventAction, + EventCategory, + EventPropertyType, + EventStrategy, + TrackedEvent, +} from '@pagopa-pn/pn-commons'; + +export class UXScreenViewStrategy implements EventStrategy { + performComputations(): TrackedEvent { + return { + [EventPropertyType.TRACK]: { + event_category: EventCategory.UX, + event_type: EventAction.SCREEN_VIEW, + }, + }; + } +} diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/SendIDPSelectedStrategy.test.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/SendIDPSelectedStrategy.test.ts new file mode 100644 index 0000000000..31fdf6c377 --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/SendIDPSelectedStrategy.test.ts @@ -0,0 +1,22 @@ +import { EventAction, EventCategory, EventPropertyType } from '@pagopa-pn/pn-commons'; + +import { SendIDPSelectedStrategy } from '../SendIDPSelectedStrategy'; + +describe('Mixpanel - Send IDP Selected Strategy', () => { + it('should return IDP selected event', () => { + const strategy = new SendIDPSelectedStrategy(); + const event = strategy.performComputations({ + SPID_IDP_ID: 'idp_id', + SPID_IDP_NAME: 'idp_name', + }); + + expect(event).toEqual({ + [EventPropertyType.TRACK]: { + event_category: EventCategory.UX, + event_type: EventAction.ACTION, + SPID_IDP_ID: 'idp_id', + SPID_IDP_NAME: 'idp_name', + }, + }); + }); +}); diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/SendLoginFailureStrategy.test.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/SendLoginFailureStrategy.test.ts new file mode 100644 index 0000000000..92f52977c0 --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/SendLoginFailureStrategy.test.ts @@ -0,0 +1,21 @@ +import { EventCategory, EventPropertyType } from '@pagopa-pn/pn-commons'; + +import { SendLoginFailureStrategy } from '../SendLoginFailureStrategy'; + +describe('Mixpanel - Send Login Failure Strategy', () => { + it('should return login failure event', () => { + const strategy = new SendLoginFailureStrategy(); + const event = strategy.performComputations({ + reason: 'error', + IDP: 'test', + }); + + expect(event).toEqual({ + [EventPropertyType.TRACK]: { + event_category: EventCategory.TECH, + reason: 'error', + IDP: 'test', + }, + }); + }); +}); diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/SendLoginMethodStrategy.test.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/SendLoginMethodStrategy.test.ts new file mode 100644 index 0000000000..5515a82815 --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/SendLoginMethodStrategy.test.ts @@ -0,0 +1,18 @@ +import { EventPropertyType } from '@pagopa-pn/pn-commons'; + +import { SendLoginMethodStrategy } from '../SendLoginMethodStrategy'; + +describe('Mixpanel - Send Login Method Strategy', () => { + it('should return login method event', () => { + const strategy = new SendLoginMethodStrategy(); + const event = strategy.performComputations({ + entityID: 'cie', + }); + + expect(event).toEqual({ + [EventPropertyType.PROFILE]: { + SEND_LOGIN_METHOD: 'cie', + }, + }); + }); +}); diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/UXScreenViewStrategy.test.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/UXScreenViewStrategy.test.ts new file mode 100644 index 0000000000..751108cba5 --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/Strategies/__test__/UXScreenViewStrategy.test.ts @@ -0,0 +1,17 @@ +import { EventAction, EventCategory, EventPropertyType } from '@pagopa-pn/pn-commons'; + +import { UXScreenViewStrategy } from '../UXScreenViewStrategy'; + +describe('Mixpanel - UX Screen View Strategy', () => { + it('should return UX screen view event', () => { + const strategy = new UXScreenViewStrategy(); + + const uxScreenViewEvent = strategy.performComputations(); + expect(uxScreenViewEvent).toEqual({ + [EventPropertyType.TRACK]: { + event_category: EventCategory.UX, + event_type: EventAction.SCREEN_VIEW, + }, + }); + }); +}); diff --git a/packages/pn-personafisica-login/src/utility/MixpanelUtils/__test__/PFLoginEventStrategyFactory.test.ts b/packages/pn-personafisica-login/src/utility/MixpanelUtils/__test__/PFLoginEventStrategyFactory.test.ts new file mode 100644 index 0000000000..73e5ea0b21 --- /dev/null +++ b/packages/pn-personafisica-login/src/utility/MixpanelUtils/__test__/PFLoginEventStrategyFactory.test.ts @@ -0,0 +1,36 @@ +import { PFLoginEventsType } from '../../../models/PFLoginEventsType'; +import PFLoginEventStrategyFactory from '../PFLoginEventStrategyFactory'; +import { SendIDPSelectedStrategy } from '../Strategies/SendIDPSelectedStrategy'; +import { SendLoginFailureStrategy } from '../Strategies/SendLoginFailureStrategy'; +import { SendLoginMethodStrategy } from '../Strategies/SendLoginMethodStrategy'; +import { UXScreenViewStrategy } from '../Strategies/UXScreenViewStrategy'; + +describe('Event Strategy Factory', () => { + const factory = PFLoginEventStrategyFactory; + + it('should return UXScreenViewStrategy for SEND_LOGIN event', () => { + expect(factory.getStrategy(PFLoginEventsType.SEND_LOGIN)).toBeInstanceOf(UXScreenViewStrategy); + }); + + it('should return SendIDPSelectedStrategy for SEND_IDP_SELECTED event', () => { + expect(factory.getStrategy(PFLoginEventsType.SEND_IDP_SELECTED)).toBeInstanceOf( + SendIDPSelectedStrategy + ); + }); + + it('should return SendLoginFailureStrategy for SEND_LOGIN_FAILURE event', () => { + expect(factory.getStrategy(PFLoginEventsType.SEND_LOGIN_FAILURE)).toBeInstanceOf( + SendLoginFailureStrategy + ); + }); + + it('should return SendLoginMethodStrategy for SEND_LOGIN_METHOD event', () => { + expect(factory.getStrategy(PFLoginEventsType.SEND_LOGIN_METHOD)).toBeInstanceOf( + SendLoginMethodStrategy + ); + }); + + it('should return null for unknown event type', () => { + expect(factory.getStrategy('UNKNOWN_EVENT' as PFLoginEventsType)).toBeNull(); + }); +}); diff --git a/packages/pn-personafisica-login/src/utility/events.ts b/packages/pn-personafisica-login/src/utility/events.ts deleted file mode 100644 index e40ae34dbf..0000000000 --- a/packages/pn-personafisica-login/src/utility/events.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { EventAction, EventCategory, EventsType } from '@pagopa-pn/pn-commons'; - -export enum TrackEventType { - SEND_LOGIN = 'SEND_LOGIN', - SEND_IDP_SELECTED = 'SEND_IDP_SELECTED', - SEND_LOGIN_FAILURE = 'SEND_LOGIN_FAILURE', -} - -export const events: EventsType = { - [TrackEventType.SEND_LOGIN]: { - event_category: EventCategory.UX, - event_type: EventAction.SCREEN_VIEW, - }, - [TrackEventType.SEND_IDP_SELECTED]: { - event_category: EventCategory.UX, - event_type: EventAction.ACTION, - }, - [TrackEventType.SEND_LOGIN_FAILURE]: { - event_category: EventCategory.TECH, - }, -}; diff --git a/packages/pn-personafisica-login/src/utility/mixpanel.ts b/packages/pn-personafisica-login/src/utility/mixpanel.ts deleted file mode 100644 index 33d4a75bdc..0000000000 --- a/packages/pn-personafisica-login/src/utility/mixpanel.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ProfilePropertyType, setSuperOrProfileProperty, trackEvent } from '@pagopa-pn/pn-commons'; - -import { TrackEventType, events } from './events'; -import { ProfilePropertyParams } from './profileProperties'; - -/** - * Function to track events outside redux - * @param trackEventType event name - * @param attributes event attributes - */ -export const trackEventByType = (trackEventType: TrackEventType, attributes?: object) => { - const eventParameters = attributes - ? { ...events[trackEventType], ...attributes } - : events[trackEventType]; - - trackEvent(trackEventType, process.env.NODE_ENV, eventParameters); -}; - -export function setSuperOrProfilePropertyValues( - type: ProfilePropertyType, - propertyName: TProperty, - attributes?: ProfilePropertyParams[TProperty] -) { - const property = attributes ? { [propertyName]: attributes } : propertyName; - - setSuperOrProfileProperty(type, property, process.env.NODE_ENV); -} diff --git a/packages/pn-personafisica-login/src/utility/profileProperties.ts b/packages/pn-personafisica-login/src/utility/profileProperties.ts deleted file mode 100644 index b7cbeb12b9..0000000000 --- a/packages/pn-personafisica-login/src/utility/profileProperties.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type ProfilePropertyParams = { - SEND_LOGIN_METHOD: - | 'cie' - | 'posteid' - | 'timid' - | 'spiditalia' - | 'sielteid' - | 'namirialid' - | 'lepidaid' - | 'instesaid' - | 'infocertid' - | 'arubaid'; -};