Skip to content

Commit 44107ff

Browse files
authored
Merge pull request #22 from chechojgb/responsive
Responsive
2 parents 34dfed1 + 56df9ed commit 44107ff

File tree

5 files changed

+97
-23
lines changed

5 files changed

+97
-23
lines changed

resources/js/components/welcome/agentRankingWidget.jsx

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@ export default function AgentRankingWidget() {
2222
const [agentes, setAgentes] = useState([]);
2323
const [loading, setLoading] = useState(true);
2424
const { allLoaded, markLoaded } = useLoadStatus();
25+
const [error, setError] = useState(false);
2526

2627
useEffect(() => {
2728
const fetchRanking = async () => {
2829
try {
29-
const res = await axios.get('/getAgentRanking');
30+
const res = await axios.get('/getAgentRanking', {timeout: 5000});
3031

3132
if (Array.isArray(res.data.data)) {
3233
const ordenados = res.data.data
@@ -41,6 +42,7 @@ export default function AgentRankingWidget() {
4142
}
4243
} catch (error) {
4344
console.error("Error al obtener ranking de agentes", error);
45+
setError(true);
4446
} finally {
4547
setLoading(false);
4648
markLoaded();
@@ -54,7 +56,22 @@ export default function AgentRankingWidget() {
5456
<div className="p-0 sm:p-6 flex flex-col justify-between">
5557
{loading || !allLoaded ? ( // ⛳ doble condición: hasta que TODOS estén listos
5658
<DiscordLoader />
57-
) : (
59+
) : error ? (
60+
<>
61+
<div className="flex justify-between items-center mb-4">
62+
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">Ranking de Agentes</h3>
63+
<span className="text-sm text-gray-500">
64+
<Link className={`${theme.text}`} href={route('showAgentRankingState')}>Hoy</Link>
65+
</span>
66+
67+
</div>
68+
<div>
69+
<div className={`${theme.text} text-center mt-10`}>
70+
😓 Ups, no pudimos obtener datos del servidor.
71+
</div>
72+
</div>
73+
</>
74+
): (
5875
<>
5976
<div className="flex justify-between items-center mb-4">
6077
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">Ranking de Agentes</h3>

resources/js/components/welcome/agentStatusDount.jsx

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState, useEffect } from 'react';
1+
import { useState, useEffect,useRef } from 'react';
22
import { Doughnut } from 'react-chartjs-2';
33
import { Link,usePage} from "@inertiajs/react";
44
import axios from "axios";
@@ -31,9 +31,7 @@ export default function AgentStatusDonut() {
3131
const { props } = usePage();
3232
const proyecto = props?.auth?.user?.proyecto || 'AZZU';
3333
const theme = themeByProject[proyecto];
34-
35-
console.log(theme);
36-
34+
const [error, setError] = useState(false);
3735
const [loading, setLoading] = useState(true);
3836
const [callData, setCallData] = useState({
3937
atendidas: 0,
@@ -43,10 +41,13 @@ export default function AgentStatusDonut() {
4341
const [selectedOperation, setSelectedOperation] = useState('');
4442
const { allLoaded, markLoaded } = useLoadStatus();
4543

44+
console.log(theme);
45+
46+
4647
useEffect(() => {
4748
const fetchData = async () => {
4849
try {
49-
const res = await axios.get('/getDonutCalls');
50+
const res = await axios.get('/getDonutCalls', {timeout: 5000});
5051
const responseData = res.data;
5152

5253
setCallData({
@@ -58,6 +59,7 @@ export default function AgentStatusDonut() {
5859
setSelectedOperation(responseData.selectedOperation || '');
5960
} catch (err) {
6061
console.error('Error al obtener overview:', err);
62+
setError(true);
6163
} finally {
6264
setLoading(false);
6365
markLoaded(); // 🎯 indicamos que este componente terminó
@@ -97,6 +99,15 @@ export default function AgentStatusDonut() {
9799
<span className="text-sm text-gray-500">
98100
<Link className={`${theme.text}`} href={route('showCallState')}>Hoy</Link>
99101
</span>
102+
103+
104+
</div>
105+
<div>
106+
{error && (
107+
<div className={`${theme.text} text-center mt-4`}>
108+
😓 Ups, no pudimos obtener datos del servidor.
109+
</div>
110+
)}
100111
</div>
101112

102113
{/* Donut Chart con espacio controlado */}

resources/js/components/welcome/callPerOperationChart.jsx

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
Legend
1010
} from 'chart.js';
1111
import { Bar } from 'react-chartjs-2';
12-
import { useEffect, useState } from 'react';
12+
import { useEffect, useState, useRef } from 'react';
1313
import DiscordLoader from '@/components/discordloader';
1414
import axios from "axios";
1515
import { useLoadStatus } from "../context/loadContext";
@@ -64,7 +64,9 @@ export default function CallsPerOperationChart() {
6464
const [loading, setLoading] = useState(true);
6565
const { allLoaded, markLoaded } = useLoadStatus();
6666
const chartColors = getChartColors(proyecto);
67-
67+
const [error, setError] = useState(false);
68+
const intervalRef = useRef(null);
69+
6870
const [callData, setCallData] = useState({
6971
Soporte: 0,
7072
Tramites: 0,
@@ -76,7 +78,7 @@ export default function CallsPerOperationChart() {
7678
useEffect(() => {
7779
const fetchData = async () => {
7880
try {
79-
const res = await axios.get('/api/getCallsPerOperation');
81+
const res = await axios.get('/api/getCallsPerOperation', { timeout: 5000 });
8082
const result = res.data;
8183

8284
setCallData({
@@ -86,17 +88,28 @@ export default function CallsPerOperationChart() {
8688
Movil: result.Movil || 0,
8789
Pruebas: result.Pruebas || 0
8890
});
91+
92+
setError(false); // ✅ Limpia el error si todo salió bien
8993
} catch (err) {
9094
console.error('Error al obtener llamadas por operación:', err);
95+
setError(true); // ✅ Marca que hay error
96+
if (intervalRef.current) {
97+
clearInterval(intervalRef.current); // 🔥 Detiene el polling
98+
}
9199
} finally {
92100
setLoading(false);
93101
markLoaded();
94102
}
95103
};
104+
96105
fetchData();
106+
intervalRef.current = setInterval(fetchData, 8000);
97107

98-
const interval = setInterval(fetchData, 8000);
99-
return () => clearInterval(interval);
108+
return () => {
109+
if (intervalRef.current) {
110+
clearInterval(intervalRef.current); // 🧹 Limpieza segura
111+
}
112+
};
100113
}, []);
101114

102115
console.log(callData);
@@ -133,6 +146,15 @@ export default function CallsPerOperationChart() {
133146
<Link className={`${theme.text}`} href={route('showOperationState')}>Hoy</Link>
134147
</span>
135148
</div>
149+
<div>
150+
<div>
151+
{error && (
152+
<div className={`${theme.text} text-center mt-4`}>
153+
😓 Ups, no pudimos obtener datos del servidor.
154+
</div>
155+
)}
156+
</div>
157+
</div>
136158
<Bar options={options} data={chartData} className="h-full w-full" />
137159
</>
138160
)}

resources/js/components/welcome/prevTable.jsx

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Link, usePage } from "@inertiajs/react";
22
import ButtonLarge from "@/components/button";
3-
import { useState, useEffect } from "react";
3+
import { useState, useEffect, useRef } from "react";
44
import axios from "axios";
55
import ButtonPurple from "@/components/buttonPurple";
66
import DiscordLoader from '@/components/discordloader';
@@ -14,29 +14,52 @@ function PrevTable() {
1414
const [data, setData] = useState([]);
1515
const [loading, setLoading] = useState(true);
1616
const { allLoaded, markLoaded } = useLoadStatus();
17-
17+
const [error, setError] = useState(false);
18+
const intervalRef = useRef(null);
1819

1920
useEffect(() => {
2021
const fetchData = () => {
21-
axios.get('/getOverview')
22-
.then(res=> {setData(res.data); setLoading(false); markLoaded(); setLoading(false); markLoaded();})
23-
.catch(err =>{console.error('Error al obtener overview:', err)});
24-
}
22+
axios.get('/getOverview', { timeout: 5000 })
23+
.then(res => {
24+
setData(res.data);
25+
setLoading(false);
26+
setError(false);
27+
markLoaded();
28+
})
29+
.catch(err => {
30+
console.error('Error al obtener overview:', err);
31+
setError(true);
32+
setLoading(false);
33+
markLoaded();
34+
35+
// 🛑 Detiene el intervalo si hay error
36+
if (intervalRef.current) {
37+
clearInterval(intervalRef.current);
38+
}
39+
});
40+
};
2541

2642
fetchData();
43+
intervalRef.current = setInterval(fetchData, 8000);
2744

28-
const interval = setInterval(fetchData, 8000);
29-
30-
return () => clearInterval(interval);
31-
45+
return () => {
46+
if (intervalRef.current) {
47+
clearInterval(intervalRef.current);
48+
}
49+
};
3250
}, []);
3351
// console.log(data);
3452

3553
return (
3654
<div className="absolute inset-0 p-6 flex flex-col justify-between">
3755
{loading || !allLoaded ? (
3856
<DiscordLoader />
39-
) : (
57+
) : error ? (
58+
<div className={`${theme.text} text-center mt-10`}>
59+
😓 Ups, no pudimos obtener datos del servidor.
60+
</div>
61+
)
62+
:(
4063
<>
4164
<div className="flex flex-col">
4265
<div className="flex justify-between items-center mb-4">

routes/web.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,4 @@
102102
Route::get('/mi-ip', function () {
103103
return request()->ip(); // o $_SERVER['REMOTE_ADDR']
104104
});
105+

0 commit comments

Comments
 (0)