290 lines
9.1 KiB
TypeScript
290 lines
9.1 KiB
TypeScript
import Clarity from "@microsoft/clarity";
|
|
import { useExperiments } from "yandex-metrica-ab-react";
|
|
|
|
export enum EGoals {
|
|
// ENTERED_EMAIL = "EnteredEmail",
|
|
// LEAD = "Lead",
|
|
// PURCHASE = "Purchase",
|
|
// PAYMENT_SUCCESS = "PaymentSuccess",
|
|
// ROSE_VIDEO_CREATION_START = 'RoseVideoCreationStart',
|
|
// ROSE_LOADING_START = "RoseLoadingStart",
|
|
// ROSE_VIDEO_CREATED = "RoseVideoCreated",
|
|
// ROSE_LOADING_END = "RoseLoadingEnd",
|
|
// ROSE_VIDEO_PLAY_START = "RoseVideoPlayStart",
|
|
// ROSE_VIDEO_PLAY_END = "RoseVideoPlayEnd",
|
|
// ROSE_VIDEO_PLAY_USER_STOP = "RoseVideoPlayUserStop",
|
|
// ROSE_VIDEO_PLAY_USER_PLAY = "RoseVideoPlayUserPlay",
|
|
// AURA_PAYMENT_METHODS_OPENED = "AuraPaymentMethodsOpened",
|
|
// AURA_SELECT_TRIAL = "AuraSelectTrial",
|
|
// AURA_TRIAL_CHOICE_PAGE_VISIT = "AuraTrialChoicePageVisit",
|
|
// AURA_TRIAL_PAYMENT_PAGE_VISIT = "AuraTrialPaymentPageVisit",
|
|
PAYMENT_SUCCESS_PALMISTRY = "PaymentSuccessPalmistry",
|
|
ENTERED_EMAIL_PALMISTRY = "EnteredEmailPalmistry",
|
|
|
|
// new
|
|
CAMERA_OPEN = "CameraOpen",
|
|
CAMERA_ERROR = "CameraError",
|
|
CAMERA_SUCCESS = "CameraSuccess",
|
|
ENTERED_EMAIL = "EnteredEmail",
|
|
TRIAL_CHOICE_PAGE_VISIT = "TrialChoicePageVisit",
|
|
SELECT_TRIAL = "SelectTrial",
|
|
TRIAL_PAYMENT_PAGE_VISIT = "TrialPaymentPageVisit",
|
|
PAYMENT_METHODS_OPENED = "PaymentMethodsOpened",
|
|
PAYMENT_SUCCESS = "PaymentSuccess",
|
|
PAYMENT_ERROR = "PaymentError",
|
|
SKIP_TRIAL_SELECT = "SkipTrialSelect",
|
|
SKIP_TRIAL_NOT_SELECT = "SkipTrialNotSelect",
|
|
SKIP_TRIAL_SUCCESS = "SkipTrialSuccess",
|
|
SKIP_TRIAL_ERROR = "SkipTrialError",
|
|
PDF_COMP_OPEN = "PDFCompOpen",
|
|
PDF_PALM_OPEN = "PDFPalmOpen",
|
|
DISCOUNT_PAGE_VISIT = "DiscountPageVisit",
|
|
|
|
AURA_SELECT_TRIAL = "AuraSelectTrial",
|
|
AURA_PAYMENT_METHODS_OPENED = "AuraPaymentMethodsOpened",
|
|
AURA_TRIAL_CHOICE_PAGE_VISIT = "AuraTrialChoicePageVisit",
|
|
AURA_TRIAL_PAYMENT_PAGE_VISIT = "AuraTrialPaymentPageVisit",
|
|
ROSE_VIDEO_CREATION_START = 'RoseVideoCreationStart',
|
|
ROSE_LOADING_START = "RoseLoadingStart",
|
|
ROSE_VIDEO_CREATED = "RoseVideoCreated",
|
|
ROSE_LOADING_END = "RoseLoadingEnd",
|
|
ROSE_VIDEO_PLAY_START = "RoseVideoPlayStart",
|
|
ROSE_VIDEO_PLAY_END = "RoseVideoPlayEnd",
|
|
ROSE_VIDEO_PLAY_USER_STOP = "RoseVideoPlayUserStop",
|
|
ROSE_VIDEO_PLAY_USER_PLAY = "RoseVideoPlayUserPlay",
|
|
|
|
DOWNLOAD_APP = "DownloadApp",
|
|
|
|
// FB
|
|
LEAD = "Lead",
|
|
PURCHASE = "Purchase",
|
|
|
|
// Split
|
|
SPLIT_CHOOSE_GENDER = "SplitChooseGender",
|
|
|
|
// Unleash
|
|
UNLEASH_CHOOSE_GENDER = "UnleashChooseGender",
|
|
}
|
|
|
|
export enum EFlags {
|
|
isNextPageMentioned = 'Go to page mentionedIn',
|
|
aboutUsAnswers = 'Key for aboutUsAnswers'
|
|
}
|
|
|
|
export enum EMetrics {
|
|
YANDEX = "Yandex",
|
|
KLAVIYO = "Klaviyo",
|
|
FACEBOOK = "Facebook",
|
|
GOOGLE_ANALYTICS = "GoogleAnalytics"
|
|
}
|
|
|
|
interface IUserParams {
|
|
UserID: number | string;
|
|
sessionId: string;
|
|
genderFrom: string;
|
|
email: string;
|
|
hasPersonalVideo: boolean;
|
|
gender: string;
|
|
age: number;
|
|
}
|
|
|
|
const environments = import.meta.env
|
|
const metricCounterNumber = Number(environments.AURA_YANDEX_COUNTER_NUMBER)
|
|
const gaMeasurementId = environments.AURA_GA_MEASUREMENT_ID
|
|
const checkIsAvailableYandexMetric = () => {
|
|
const isProduction = environments.MODE === "production";
|
|
if (!isProduction) {
|
|
console.log("ANALYTIC IS NOT WORKING: Not production")
|
|
return false;
|
|
};
|
|
if (typeof window.ym !== "function") {
|
|
console.error("Yandex.Metric not found")
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
const checkIsAvailableYandexMetricAB = () => {
|
|
const isProduction = environments.MODE === "production";
|
|
if (!isProduction) {
|
|
console.log("ANALYTIC IS NOT WORKING: Not production")
|
|
return false;
|
|
};
|
|
if (typeof window.ymab !== "function") {
|
|
console.error("Yandex.Metric not found")
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
const checkIsAvailableGoogleAnalytics = () => {
|
|
// const isProduction = environments.MODE === "production";
|
|
// if (!isProduction) {
|
|
// console.log("ANALYTIC IS NOT WORKING: Not production")
|
|
// return false;
|
|
// };
|
|
if (typeof window.gtag !== "function") {
|
|
console.error("Google Analytics not found")
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
const setUserID = (userId: string) => {
|
|
if (checkIsAvailableYandexMetric()) {
|
|
window.ym(metricCounterNumber, "setUserID", userId)
|
|
Clarity.identify(userId);
|
|
}
|
|
|
|
// Google Analytics
|
|
if (checkIsAvailableGoogleAnalytics()) {
|
|
// window.gtag('set', 'user_properties', {
|
|
// user_id: userId
|
|
// });
|
|
window.gtag('config', gaMeasurementId, {
|
|
user_id: userId
|
|
});
|
|
}
|
|
|
|
if (!window.klaviyo) return console.error("Klaviyo.Metric not found");
|
|
window.klaviyo.push(['identify', userId]);
|
|
}
|
|
|
|
const userParams = (parameters: Partial<IUserParams>) => {
|
|
if (checkIsAvailableYandexMetric()) {
|
|
window.ym(metricCounterNumber, "userParams", parameters)
|
|
}
|
|
|
|
Object.entries(parameters).forEach(([key, value]) => {
|
|
Clarity.setTag(key, String(value));
|
|
});
|
|
|
|
// Google Analytics
|
|
if (checkIsAvailableGoogleAnalytics()) {
|
|
// const gaUserProperties = Object.entries(parameters).reduce((acc, [key, value]) => ({
|
|
// ...acc,
|
|
// [key.toLowerCase()]: value
|
|
// }), {});
|
|
|
|
// window.gtag('set', 'user_properties', gaUserProperties);
|
|
window.gtag('config', gaMeasurementId, {
|
|
send_page_view: false,
|
|
...parameters
|
|
});
|
|
}
|
|
|
|
if (!window.klaviyo) return console.error("Klaviyo.Metric not found");
|
|
window.klaviyo.push(['identify', parameters]);
|
|
}
|
|
|
|
const reachGoal = (goal: EGoals, usingMetrics: EMetrics[], options?: unknown) => {
|
|
console.log("goal: ", goal);
|
|
const isProduction = environments.MODE === "production";
|
|
// if (!isProduction) return console.log("ANALYTIC IS NOT WORKING: Not production");
|
|
|
|
if (usingMetrics.includes(EMetrics.YANDEX)) {
|
|
if (typeof window.ym !== "function") {
|
|
console.error("Yandex.Metric not found")
|
|
} else if (isProduction) {
|
|
window.ym(metricCounterNumber, "reachGoal", goal)
|
|
Clarity.event(goal);
|
|
console.log("goalYM&Clarity: ", goal);
|
|
}
|
|
if (!checkIsAvailableGoogleAnalytics()) {
|
|
console.error("Google Analytics not found")
|
|
} else {
|
|
const eventName = goal === EGoals.PAYMENT_SUCCESS ? "purchase" : goal;
|
|
window.gtag('event', eventName, options);
|
|
console.log("goalGA: ", goal);
|
|
}
|
|
}
|
|
if (!isProduction) return console.log("ANALYTIC IS NOT WORKING: Not production");
|
|
|
|
// if (usingMetrics.includes(EMetrics.GOOGLE_ANALYTICS)) {
|
|
// if (typeof window.gtag !== "function") {
|
|
// console.error("Google Analytics not found")
|
|
// } else {
|
|
// window.gtag('event', goal, options);
|
|
// console.log("goalGA: ", goal);
|
|
// }
|
|
// }
|
|
|
|
if (usingMetrics.includes(EMetrics.KLAVIYO)) {
|
|
if (!window.klaviyo) {
|
|
console.error("Klaviyo.Metric not found")
|
|
} else {
|
|
window.klaviyo.push(['track', goal]);
|
|
console.log("goalKLAVIYO: ", goal);
|
|
}
|
|
}
|
|
|
|
if (usingMetrics.includes(EMetrics.FACEBOOK)) {
|
|
if (typeof window.fbq !== "function") {
|
|
console.error("Facebook.Metric not found")
|
|
} else {
|
|
window.fbq('track', goal === EGoals.ENTERED_EMAIL ? EGoals.LEAD : goal, options)
|
|
console.log("goalFB: ", goal);
|
|
}
|
|
}
|
|
}
|
|
|
|
type THitOptions = {
|
|
callback: () => void;
|
|
ctx: object;
|
|
params: {
|
|
order_price: number;
|
|
currency: string;
|
|
},
|
|
referer: string;
|
|
title: string;
|
|
}
|
|
|
|
const hit = (url?: string, options?: THitOptions) => {
|
|
if (!checkIsAvailableYandexMetric()) return;
|
|
window.ym(metricCounterNumber, "hit", url, options);
|
|
}
|
|
|
|
const initMetric = () => {
|
|
if (!checkIsAvailableYandexMetric()) return;
|
|
|
|
window.ym(metricCounterNumber, "init", {
|
|
clickmap: true,
|
|
trackLinks: true,
|
|
accurateTrackBounce: true,
|
|
webvisor: true,
|
|
});
|
|
console.log("Metric initialized");
|
|
}
|
|
|
|
const initMetricAB = () => {
|
|
if (!checkIsAvailableYandexMetricAB()) return;
|
|
|
|
|
|
window.ymab(`metrika.${metricCounterNumber}`, 'setConfig', { enableJS: true, enableWatch: true });
|
|
window.ymab(`metrika.${metricCounterNumber}`, 'init'/*, {clientFeatures}, {callback}*/);
|
|
console.log("Metric initialized");
|
|
}
|
|
|
|
type TABFlags = {
|
|
showTimerTrial: "show" | "hide";
|
|
text: "1" | "2" | "3";
|
|
auraVideoTrial: "on";
|
|
auraPalmistry: "on";
|
|
esFlag: "hiCopy" | "standard";
|
|
palmOnPayment: "graphical" | "real";
|
|
genderPageType: "v0" | "v1" | "v2";
|
|
trialChoicePageType: "v1" | "v2";
|
|
welcomePageImage: "v1" | "v2";
|
|
cameraRequestModal: "with" | "without";
|
|
yourReading: "v1" | "v2";
|
|
genderButtonIcon: "show" | "hide";
|
|
tryApp: "v0" | "v1";
|
|
}
|
|
|
|
export const useMetricABFlags = () => {
|
|
return useExperiments<typeof EFlags & TABFlags>({
|
|
clientId: `metrika.${metricCounterNumber}`
|
|
})
|
|
}
|
|
|
|
export default { setUserID, userParams, reachGoal, hit, initMetric, initMetricAB } |