Files
decoda/app/src/services/analytics/useLetramentoTracking.js
2026-06-05 00:11:45 -03:00

69 lines
2.1 KiB
JavaScript

import { useEffect, useRef } from 'react';
import { getAnalytics } from './AnalyticsManager';
/**
* Hook para rastrear uso de atividades de letramento
* @param {string} activityId - ID único da atividade de letramento (ex: 'mouse-basico')
* @param {string} categoryName - Nome da categoria (ex: 'Mouse', 'Teclado')
*/
export function useLetramentoTracking(activityId, categoryName) {
const analyticsRef = useRef(getAnalytics());
const sessionStartRef = useRef(Date.now());
const completionTrackedRef = useRef(false);
// Track activity start
useEffect(() => {
if (!activityId) return;
sessionStartRef.current = Date.now();
analyticsRef.current.trackEvent('letramento_atividade_iniciada', {
atividade_id: activityId,
categoria: categoryName || 'letramento',
});
return () => {
// Track abandonment on unmount if not completed
if (!completionTrackedRef.current) {
analyticsRef.current.trackEvent('letramento_atividade_abandonada', {
atividade_id: activityId,
categoria: categoryName || 'letramento',
tempo_sessao_segundos: Math.round((Date.now() - sessionStartRef.current) / 1000),
});
}
};
}, [activityId, categoryName]);
// Track activity completion
const trackCompletion = (success = true) => {
if (!activityId || completionTrackedRef.current) return;
completionTrackedRef.current = true;
const sessionDuration = Math.round((Date.now() - sessionStartRef.current) / 1000);
analyticsRef.current.trackEvent(
success ? 'letramento_atividade_completada' : 'letramento_atividade_falhou',
{
atividade_id: activityId,
categoria: categoryName || 'letramento',
tempo_sessao_segundos: sessionDuration,
}
);
};
// Track custom letramento event
const trackEvent = (eventName, eventData = {}) => {
if (!activityId) return;
analyticsRef.current.trackEvent(eventName, {
atividade_id: activityId,
categoria: categoryName || 'letramento',
...eventData,
});
};
return {
trackCompletion,
trackEvent,
};
}