DataScope26/WEB
0
1import { useState, useEffect, useRef, useCallback } from 'react';2import { dashboardMetrics } from '../services/apiDashboard.js';3import { useAuth } from "../context/AuthContext.jsx"4 5const REFRESH_INTERVAL = 300000;6 7function getDateRangeForPeriod(period) {8 const endDate = new Date();9 const startDate = new Date();10 11 switch (period) {12 case 'dia':13 startDate.setDate(endDate.getDate() - 1);14 break;15 case 'semana':16 startDate.setDate(endDate.getDate() - 7);17 break;18 case 'mes':19 startDate.setMonth(endDate.getMonth() - 1);20 break;21 case 'cuatrimestre':22 startDate.setMonth(endDate.getMonth() - 4);23 break;24 case 'año':25 startDate.setFullYear(endDate.getFullYear() - 1);26 break;27 default:28 startDate.setDate(endDate.getDate() - 7); // fallback: semana29 }30 31 return {32 startDate: startDate.toISOString(),33 endDate: endDate.toISOString(),34 };35}36 37 38export const useDashboardMetrics = (area = 'general', companyOverride = null, period = 'semana') => {39 const [metrics, setMetrics] = useState(null);40 const [loading, setLoading] = useState(true); 41 const [isRefreshing, setIsRefreshing] = useState(false);42 const [error, setError] = useState(null);43 const { user, selectedCompany } = useAuth();44 45 const activeCompany = companyOverride ?? selectedCompany ?? (user?.companies?.[0] ?? null);46 const companyIdToUse = activeCompany && typeof activeCompany === 'object'47 ? (activeCompany.id ?? activeCompany.companyId ?? activeCompany.company_id)48 : activeCompany;49 const hasFetchedOnce = useRef(false);50 const requestIdRef = useRef(0);51 52 useEffect(() => {53 hasFetchedOnce.current = false;54 requestIdRef.current += 1;55 setMetrics(null);56 setError(null);57 setLoading(true);58 }, [companyIdToUse, area, period]); // NEW: reset when period changes too59 60 const fetchMetrics = useCallback(async () => {61 if (!user || !companyIdToUse) {62 setError(null);63 setMetrics({64 adoptionRate: [],65 estimatedUsageTime: { total_messages: 0, estimated_hours: 0 },66 platformUsage: [],67 promptQuality: { average_quality: null },68 mainTasks: [],69 availableAreas: [],70 });71 setLoading(false);72 setIsRefreshing(false);73 return;74 }75 76 const currentRequestId = ++requestIdRef.current;77 const isFirstFetch = !hasFetchedOnce.current;78 79 if (isFirstFetch) {80 setLoading(true);81 } else {82 setIsRefreshing(true);83 }84 85 const token = sessionStorage.getItem("token") || localStorage.getItem("token")86 try {87 setError(null);88 const { startDate, endDate } = getDateRangeForPeriod(period); // NEW89 const data = await dashboardMetrics(token, companyIdToUse, area, startDate, endDate); // NEW args90 91 if (currentRequestId !== requestIdRef.current) {92 return;93 }94 95 const normalizedMetrics = {96 adoptionRate: data?.adoptionRate ?? [],97 estimatedUsageTime: data?.estimatedUsageTime ?? { total_messages: 0, estimated_hours: 0 },98 platformUsage: data?.platformUsage ?? [],99 promptQuality: data?.promptQuality ?? { average_quality: null },100 mainTasks: data?.mainTasks ?? [],101 availableAreas: data?.availableAreas ?? [],102 };103 104 setMetrics(normalizedMetrics);105 hasFetchedOnce.current = true;106 } catch (err) {107 if (currentRequestId !== requestIdRef.current) {108 return;109 }110 111 if (isFirstFetch) {112 setError(err);113 setMetrics({114 adoptionRate: [],115 estimatedUsageTime: { total_messages: 0, estimated_hours: 0 },116 platformUsage: [],117 promptQuality: { average_quality: null },118 mainTasks: [],119 availableAreas: [],120 });121 } else {122 console.error('Error al refrescar métricas del dashboard:', err);123 }124 } finally {125 if (currentRequestId !== requestIdRef.current) {126 return;127 }128 129 if (isFirstFetch) {130 setLoading(false);131 } else {132 setIsRefreshing(false);133 }134 }135 }, [user, area, companyIdToUse, period]); // NEW: period as dep136 137 useEffect(() => {138 fetchMetrics();139 140 const intervalId = setInterval(() => {141 fetchMetrics();142 }, REFRESH_INTERVAL);143 144 return () => clearInterval(intervalId);145 }, [fetchMetrics]);146 147 return {148 metrics,149 loading,150 isRefreshing,151 error,152 };153};