import React, { useRef, useState, useEffect } from 'react';
import styles from './Dashboard.module.css';
import { useNavigate } from 'react-router-dom';
import Modal from './Modal';
import Conversations from './Conversations';
import DiscussedTopics from './DiscussedTopics';
import Chart from 'chart.js/auto';
import NotificationPrompt from './NotificationPrompt';
const Dashboard = () => {
const [isMenuOpen, setIsMenuOpen] = useState(false);
const chartRef = useRef(null);
const chartInstanceRef = useRef(null);
const [conversations, setConversations] = useState([]);
const [discussedTopics, setDiscussedTopics] = useState([]);
const [modalContent, setModalContent] = useState(null);
const [rawData, setRawData] = useState([]);
const [loading, setLoading] = useState(true); // ⬅️ Tambahkan state loading
const [checkOnce, setCheckOnce] = useState(false); // ⬅️ Tambahkan state loading
const [stats, setStats] = useState({
totalChats: 0,
userMessages: 0,
botMessages: 0,
});
const [isDragging, setIsDragging] = useState(false);
const [selectedFile, setSelectedFile] = useState(null);
const [isLoggedIn, setIsLoggedIn] = useState(false);
const navigate = useNavigate();
const handleFile = (file) => {
if (file) {
setSelectedFile(file);
}
};
useEffect(() => {
const token = localStorage.getItem('token');
setIsLoggedIn(!!token);
}, []);
const handleLogout = () => {
localStorage.removeItem('token');
localStorage.removeItem('user');
navigator.serviceWorker.ready.then(function (registration) {
registration.pushManager.getSubscription().then(function (subscription) {
if (subscription) {
subscription.unsubscribe().then(function (successful) {
console.log('Push subscription unsubscribed on logout:', successful);
// Optional: also notify backend to clear the token
fetch('/api/clear-subscription', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ endpoint: subscription.endpoint }),
});
});
}
});
});
window.location.reload();
};
const menuRef = useRef(null);
// Close dropdown if click outside
useEffect(() => {
const handleClickOutside = (event) => {
if (menuRef.current && !menuRef.current.contains(event.target)) {
setIsMenuOpen(false);
}
};
document.addEventListener('mousedown', handleClickOutside);
return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, []);
useEffect(() => {
const fetchData = async () => {
const token = localStorage.getItem('token');
try {
const response = await fetch('https://bot.kediritechnopark.com/webhook/profile', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`,
},
});
if (response.status === 401 || response.status === 403) {
handleLogout();
return;
}
if (!response.ok) {
throw new Error('Fetch gagal dengan status: ' + response.status);
}
const data = await response.json();
console.log(data);
setDiscussedTopics(data?.result?.topics)
const graphObj = data.result.graph;
const rawDataArray = Object.entries(graphObj).map(([hour, sesi]) => ({
hour,
sesi,
}));
setRawData(rawDataArray);
let totalSessions = new Set();
let userMessages = 0;
let botMessages = 0;
rawDataArray.forEach(({ sesi }) => {
Object.values(sesi).forEach(messages => {
messages.forEach(msg => {
totalSessions.add(msg.session_id);
if (msg.message.type === 'human') userMessages++;
if (msg.message.type === 'ai') botMessages++;
});
});
});
setStats({
totalChats: totalSessions.size,
userMessages,
botMessages,
});
setLoading(false); // ⬅️ Setelah berhasil, hilangkan loading
} catch (error) {
console.error('Error:', error);
navigate('/login');
}
};
if (!checkOnce && 'serviceWorker' in navigator) {
navigator.serviceWorker.ready.then(function (registration) {
registration.pushManager.getSubscription().then(function (subscription) {
setCheckOnce(false);
if (subscription === null) {
// Not subscribed yet — show modal asking user to subscribe
setModalContent(
Total Percakapan selama 24 jam
Pesan dari Pengguna
Respons Bot
Paling sering ditanyakan
Seret file ke sini, atau Klik untuk unggah
Klik untuk unggah
{selectedFile && ( <>