CoolFace
Apppublic

DataScope26/WEB

sourceHugging Faceupdated 7d agoView on Hugging Face
0likes
useDashboardMetrics.jsx153 linesDownload Raw Back to hooks
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};