This commit is contained in:
everythingonblack
2025-06-12 20:52:46 +07:00
parent 0c065f7be5
commit d9cdbbcde6
2 changed files with 124 additions and 124 deletions

View File

@@ -19,7 +19,6 @@ const Dashboard = () => {
totalChats: 0, totalChats: 0,
userMessages: 0, userMessages: 0,
botMessages: 0, botMessages: 0,
mostDiscussedTopics: '-',
}); });
@@ -38,17 +37,22 @@ const Dashboard = () => {
try { try {
const response = await fetch('https://bot.kediritechnopark.com/webhook/master-agent/dashboard'); const response = await fetch('https://bot.kediritechnopark.com/webhook/master-agent/dashboard');
const data = await response.json(); const data = await response.json();
setDiscussedTopics(data[0].result.topics)
console.log(data[0].result.topics[0].topic)
setRawData(data); const graphObj = data[0].result.graph;
const rawDataArray = Object.entries(graphObj).map(([hour, sesi]) => ({
// Hitung statistik hour,
let totalSessions = new Set(); // unik session_id sesi,
}));
setRawData(rawDataArray);
let totalSessions = new Set();
let userMessages = 0; let userMessages = 0;
let botMessages = 0; let botMessages = 0;
data.forEach(({ sesi }) => { rawDataArray.forEach(({ sesi }) => {
Object.entries(sesi).forEach(([channel, messages]) => { Object.values(sesi).forEach(messages => {
messages.forEach((msg) => { messages.forEach(msg => {
totalSessions.add(msg.session_id); totalSessions.add(msg.session_id);
if (msg.message.type === 'human') userMessages++; if (msg.message.type === 'human') userMessages++;
if (msg.message.type === 'ai') botMessages++; if (msg.message.type === 'ai') botMessages++;
@@ -56,11 +60,11 @@ const Dashboard = () => {
}); });
}); });
setStats({ setStats({
totalChats: totalSessions.size, totalChats: totalSessions.size,
userMessages, userMessages,
botMessages, botMessages,
mostDiscussedTopics: '-', // placeholder, bisa ditambah nanti
}); });
} catch (error) { } catch (error) {
@@ -103,19 +107,14 @@ useEffect(() => {
}; };
const prefixes = Object.keys(prefixLabelMap); const prefixes = Object.keys(prefixLabelMap);
const hours = rawData.map(d => d.hour).sort((a, b) => parseFloat(a) - parseFloat(b));
// Ambil semua grub (jam)
const hours = rawData.map(d => d.grub).sort((a, b) => parseFloat(a) - parseFloat(b));
// Inisialisasi data per platform
const counts = {}; const counts = {};
prefixes.forEach(prefix => { prefixes.forEach(prefix => {
counts[prefix] = hours.map(() => 0); counts[prefix] = hours.map(() => 0);
}); });
// Hitung jumlah pesan berdasarkan panjang array per grub & prefix rawData.forEach(({ sesi }, index) => {
rawData.forEach((entry, index) => {
const sesi = entry.sesi || {};
prefixes.forEach(prefix => { prefixes.forEach(prefix => {
if (Array.isArray(sesi[prefix])) { if (Array.isArray(sesi[prefix])) {
counts[prefix][index] = sesi[prefix].length; counts[prefix][index] = sesi[prefix].length;
@@ -123,6 +122,7 @@ useEffect(() => {
}); });
}); });
const datasets = prefixes.map(prefix => ({ const datasets = prefixes.map(prefix => ({
label: prefixLabelMap[prefix], label: prefixLabelMap[prefix],
data: counts[prefix], data: counts[prefix],
@@ -189,7 +189,7 @@ useEffect(() => {
<p>Respons Bot</p> <p>Respons Bot</p>
</div> </div>
<div className={styles.statCard} onClick={openTopicsModal}> <div className={styles.statCard} onClick={openTopicsModal}>
<h2 style={{ fontSize: '17px' }}>{stats.mostDiscussedTopics}</h2> <h2 style={{ fontSize: '17px' }}>{discussedTopics[0]?.topic}</h2>
<p>Paling sering ditanyakan</p> <p>Paling sering ditanyakan</p>
</div> </div>
</div> </div>

View File

@@ -8,7 +8,7 @@ const DiscussedTopics = ({ topics }) => {
<h2>Topik yang Sering Ditanyakan</h2> <h2>Topik yang Sering Ditanyakan</h2>
<ul> <ul>
{topics.map((topic, idx) => ( {topics.map((topic, idx) => (
<li key={idx}><strong>{topic.topic}</strong> - {topic.question_count} pertanyaan</li> <li key={idx}><strong>{topic.topic}</strong> - {topic.count} kali</li>
))} ))}
</ul> </ul>
</div> </div>