memoize metrics hooks & fix hook dependencies
This commit is contained in:
parent
430d4f1a4b
commit
3eb3966fca
@ -1,4 +1,5 @@
|
|||||||
import type { MetricsMessengers } from "@model/metrics";
|
import type { MetricsMessengers } from "@model/metrics";
|
||||||
|
import { useMemo } from "react";
|
||||||
|
|
||||||
type MetricsGoal = {
|
type MetricsGoal = {
|
||||||
type: "reachGoal";
|
type: "reachGoal";
|
||||||
@ -19,28 +20,31 @@ const sendMetrics = (vkPixelId: number | undefined, goal: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const useVkMetricsGoals = (vkId: number | undefined) => {
|
export const useVkMetricsGoals = (vkId: number | undefined) => {
|
||||||
return {
|
return useMemo(
|
||||||
// Посетитель открыл квиз
|
() => ({
|
||||||
quizOpened: () => sendMetrics(vkId, "penaquiz-start"),
|
// Посетитель открыл квиз
|
||||||
// Посетитель нажал на кнопку стартовой страницы
|
quizOpened: () => sendMetrics(vkId, "penaquiz-start"),
|
||||||
firstPageOpened: () => sendMetrics(vkId, "penaquiz-startquiz"),
|
// Посетитель нажал на кнопку стартовой страницы
|
||||||
// Посетитель кликнул по номеру телефона на стартовой странице
|
firstPageOpened: () => sendMetrics(vkId, "penaquiz-startquiz"),
|
||||||
phoneNumberOpened: () => sendMetrics(vkId, "penaquiz-phone"),
|
// Посетитель кликнул по номеру телефона на стартовой странице
|
||||||
// Посетитель кликнул по email на стартовой странице
|
phoneNumberOpened: () => sendMetrics(vkId, "penaquiz-phone"),
|
||||||
emailOpened: () => sendMetrics(vkId, "penaquiz-email"),
|
// Посетитель кликнул по email на стартовой странице
|
||||||
// Посетитель увидел определенный результат (id - айдишник вопроса с типом result)
|
emailOpened: () => sendMetrics(vkId, "penaquiz-email"),
|
||||||
resultIdShown: (resultId: string) => sendMetrics(vkId, `penaquiz-result-${resultId}`),
|
// Посетитель увидел определенный результат (id - айдишник вопроса с типом result)
|
||||||
// Посетитель нажал на ссылку в результате
|
resultIdShown: (resultId: string) => sendMetrics(vkId, `penaquiz-result-${resultId}`),
|
||||||
resultLink: () => sendMetrics(vkId, `penaquiz-resultlink`),
|
// Посетитель нажал на ссылку в результате
|
||||||
// Посетитель дошёл до формы контактов
|
resultLink: () => sendMetrics(vkId, `penaquiz-resultlink`),
|
||||||
contactsFormOpened: () => sendMetrics(vkId, "penaquiz-form"),
|
// Посетитель дошёл до формы контактов
|
||||||
// Посетитель заполнил форму контактов
|
contactsFormOpened: () => sendMetrics(vkId, "penaquiz-form"),
|
||||||
contactsFormFilled: () => sendMetrics(vkId, "penaquiz-contacts"),
|
// Посетитель заполнил форму контактов
|
||||||
// Посетитель заполнил поле формы контактов
|
contactsFormFilled: () => sendMetrics(vkId, "penaquiz-contacts"),
|
||||||
contactsFormField: (field: string) => sendMetrics(vkId, `penaquiz-formfield-${field}`),
|
// Посетитель заполнил поле формы контактов
|
||||||
// Посетитель отправил заявку с мессенджером
|
contactsFormField: (field: string) => sendMetrics(vkId, `penaquiz-formfield-${field}`),
|
||||||
messengerRequestSended: (messenger: MetricsMessengers) => sendMetrics(vkId, `penaquiz-messengers-${messenger}`),
|
// Посетитель отправил заявку с мессенджером
|
||||||
// Посетитель прошёл вопрос
|
messengerRequestSended: (messenger: MetricsMessengers) => sendMetrics(vkId, `penaquiz-messengers-${messenger}`),
|
||||||
questionPassed: (questionId: string) => sendMetrics(vkId, `penaquiz-step${questionId}`),
|
// Посетитель прошёл вопрос
|
||||||
};
|
questionPassed: (questionId: string) => sendMetrics(vkId, `penaquiz-step${questionId}`),
|
||||||
|
}),
|
||||||
|
[vkId]
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import type { MetricsMessengers } from "@model/metrics";
|
import type { MetricsMessengers } from "@model/metrics";
|
||||||
|
import { useMemo } from "react";
|
||||||
|
|
||||||
type ExtendedWindow = Window & {
|
type ExtendedWindow = Window & {
|
||||||
ym?: (id: number, type: string, goal: string) => void;
|
ym?: (id: number, type: string, goal: string) => void;
|
||||||
@ -11,28 +12,31 @@ const sendMetrics = (yandexMetricsId: number | undefined, goal: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const useYandexMetricsGoals = (id: number | undefined) => {
|
export const useYandexMetricsGoals = (id: number | undefined) => {
|
||||||
return {
|
return useMemo(
|
||||||
// Посетитель открыл квиз
|
() => ({
|
||||||
quizOpened: () => sendMetrics(id, "penaquiz-start"),
|
// Посетитель открыл квиз
|
||||||
// Посетитель нажал на кнопку стартовой страницы
|
quizOpened: () => sendMetrics(id, "penaquiz-start"),
|
||||||
firstPageOpened: () => sendMetrics(id, "penaquiz-startquiz"),
|
// Посетитель нажал на кнопку стартовой страницы
|
||||||
// Посетитель кликнул по номеру телефона на стартовой странице
|
firstPageOpened: () => sendMetrics(id, "penaquiz-startquiz"),
|
||||||
phoneNumberOpened: () => sendMetrics(id, "penaquiz-phone"),
|
// Посетитель кликнул по номеру телефона на стартовой странице
|
||||||
// Посетитель кликнул по email на стартовой странице
|
phoneNumberOpened: () => sendMetrics(id, "penaquiz-phone"),
|
||||||
emailOpened: () => sendMetrics(id, "penaquiz-email"),
|
// Посетитель кликнул по email на стартовой странице
|
||||||
// Посетитель увидел определенный результат (id - айдишник вопроса с типом result)
|
emailOpened: () => sendMetrics(id, "penaquiz-email"),
|
||||||
resultIdShown: (resultId: string) => sendMetrics(id, `penaquiz-result-${resultId}`),
|
// Посетитель увидел определенный результат (id - айдишник вопроса с типом result)
|
||||||
// Посетитель нажал на ссылку в результате
|
resultIdShown: (resultId: string) => sendMetrics(id, `penaquiz-result-${resultId}`),
|
||||||
resultLink: () => sendMetrics(id, `penaquiz-resultlink`),
|
// Посетитель нажал на ссылку в результате
|
||||||
// Посетитель дошёл до формы контактов
|
resultLink: () => sendMetrics(id, `penaquiz-resultlink`),
|
||||||
contactsFormOpened: () => sendMetrics(id, "penaquiz-form"),
|
// Посетитель дошёл до формы контактов
|
||||||
// Посетитель заполнил форму контактов
|
contactsFormOpened: () => sendMetrics(id, "penaquiz-form"),
|
||||||
contactsFormFilled: () => sendMetrics(id, "penaquiz-contacts"),
|
// Посетитель заполнил форму контактов
|
||||||
// Посетитель заполнил поле формы контактов
|
contactsFormFilled: () => sendMetrics(id, "penaquiz-contacts"),
|
||||||
contactsFormField: (field: string) => sendMetrics(id, `penaquiz-formfield-${field}`),
|
// Посетитель заполнил поле формы контактов
|
||||||
// Посетитель отправил заявку с мессенджером
|
contactsFormField: (field: string) => sendMetrics(id, `penaquiz-formfield-${field}`),
|
||||||
messengerRequestSended: (messenger: MetricsMessengers) => sendMetrics(id, `penaquiz-messengers-${messenger}`),
|
// Посетитель отправил заявку с мессенджером
|
||||||
// Посетитель прошёл вопрос
|
messengerRequestSended: (messenger: MetricsMessengers) => sendMetrics(id, `penaquiz-messengers-${messenger}`),
|
||||||
questionPassed: (questionId: string) => sendMetrics(id, `penaquiz-step${questionId}`),
|
// Посетитель прошёл вопрос
|
||||||
};
|
questionPassed: (questionId: string) => sendMetrics(id, `penaquiz-step${questionId}`),
|
||||||
|
}),
|
||||||
|
[id]
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
@ -23,7 +23,6 @@ export function useQuestionFlowControl() {
|
|||||||
const yandexMetrics = useYandexMetricsGoals(settings.cfg.yandexMetricsNumber);
|
const yandexMetrics = useYandexMetricsGoals(settings.cfg.yandexMetricsNumber);
|
||||||
|
|
||||||
const currentQuestion = sortedQuestions.find((question) => question.id === currentQuestionId) ?? sortedQuestions[0];
|
const currentQuestion = sortedQuestions.find((question) => question.id === currentQuestionId) ?? sortedQuestions[0];
|
||||||
console.log("currentQuestion", currentQuestion);
|
|
||||||
|
|
||||||
const linearQuestionIndex =
|
const linearQuestionIndex =
|
||||||
currentQuestion && sortedQuestions.every(({ content }) => content.rule.parentId !== "root") // null when branching enabled
|
currentQuestion && sortedQuestions.every(({ content }) => content.rule.parentId !== "root") // null when branching enabled
|
||||||
@ -161,7 +160,7 @@ export function useQuestionFlowControl() {
|
|||||||
if (nextQuestion.type === "result") return showResult();
|
if (nextQuestion.type === "result") return showResult();
|
||||||
|
|
||||||
setCurrentQuestionId(nextQuestion.id);
|
setCurrentQuestionId(nextQuestion.id);
|
||||||
}, [currentQuestion, nextQuestion, showResult]);
|
}, [currentQuestion.id, nextQuestion, showResult, vkMetrics, yandexMetrics]);
|
||||||
|
|
||||||
const setQuestion = useCallback(
|
const setQuestion = useCallback(
|
||||||
(questionId: string) => {
|
(questionId: string) => {
|
||||||
|
Loading…
Reference in New Issue
Block a user