File size: 4,903 Bytes
d1c7d23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/* script.js */

// Variabel global untuk sistem antrian pesan dan pengelolaan sesi
let messageQueue = [];
let processing = false;
let id_user;
let inactivityTimeout;
const INACTIVITY_LIMIT = 30 * 60 * 1000; // 30 menit

document.addEventListener("DOMContentLoaded", () => {
    initializeSession();
    setupEventListeners();
    resetInactivityTimer();
});

// --- SISTEM SESI & USER ID UNIK --- //
function initializeSession() {
    // Jika belum ada sessionID di sessionStorage, buat ID baru
    if (!sessionStorage.getItem("sessionID")) {
        const sessionID = generateSessionID();
        sessionStorage.setItem("sessionID", sessionID);
        id_user = sessionID;
        console.log("Session ID dibuat:", sessionID);
    } else {
        const sesi_id = sessionStorage.getItem("sessionID");
        id_user = sesi_id;
        console.log("Session ID yang ada:", sesi_id);
    }
    // Reset session ID saat user meninggalkan halaman
    window.addEventListener("beforeunload", () => {
        sessionStorage.removeItem("sessionID");
    });
}

function generateSessionID() {
    // Pembuatan ID sederhana (bisa disesuaikan)
    return "user-" + Math.random().toString(36).substr(2, 9) + "-" + Date.now();
}

// Reset timer inaktivitas
function resetInactivityTimer() {
    clearTimeout(inactivityTimeout);
    inactivityTimeout = setTimeout(() => {
        // Hapus sessionID setelah 30 menit tidak aktif
        sessionStorage.removeItem("sessionID");
        console.log("Session ID dihapus karena inaktivitas.");
    }, INACTIVITY_LIMIT);
}

// --- EVENT LISTENERS --- //
function setupEventListeners() {
    const chatForm = document.getElementById("chat-form");
    const chatInput = document.getElementById("chat-input");

    // Penanganan pengiriman pesan
    chatForm.addEventListener("submit", e => {
        e.preventDefault();
        const message = chatInput.value.trim();
        if (message === "") return;
        addUserMessage(message);
        chatInput.value = "";
        // Reset timer inaktivitas saat ada aktivitas user
        resetInactivityTimer();
    });

    // Penanganan event keyboard: Enter untuk kirim, Shift+Enter untuk newline
    chatInput.addEventListener("keydown", e => {
        if (e.key === "Enter" && !e.shiftKey) {
            e.preventDefault();
            chatForm.dispatchEvent(new Event("submit"));
        }
    });
}

// --- MENANGANI PESAN --- //
// Tambah pesan user ke tampilan chat
function addUserMessage(text) {
    addMessageToChat(text, "user");
    // Masukkan respon bot ke dalam antrian
    enqueueBotResponse(text);
}

// Fungsi untuk menambahkan pesan ke container chat
function addMessageToChat(text, sender) {
    const chatContainer = document.getElementById("chat-container");
    const messageElement = document.createElement("div");
    messageElement.classList.add("message", sender);
    // Menggunakan textContent untuk menjaga format string dan mencegah injeksi HTML
    messageElement.textContent = text;
    chatContainer.appendChild(messageElement);
    // Auto-scroll ke pesan terbaru
    messageElement.scrollIntoView({ behavior: "smooth" });
}

// Menambahkan pesan ke antrian dan memulai pemrosesan
function enqueueBotResponse(userMessage) {
    messageQueue.push(userMessage);
    processQueue();
}

// Memproses antrian pesan satu per satu
function processQueue() {
    if (processing || messageQueue.length === 0) return;

    processing = true;
    blockUserInput(true);
    showTypingIndicator(true);

    // Simulasikan delay mengetik bot (misal: 2 detik)

    const userMessage = messageQueue.shift();
    generateBotResponse(userMessage, id_user).then(botResponse => {
        addMessageToChat(botResponse, "bot");
        showTypingIndicator(false);
        blockUserInput(false);
        processing = false;
    });
}

// Generator respon bot sederhana (misalnya, echo pesan user)
async function generateBotResponse(userMessage, user_ID) {
    const url = "/chat"; // Ganti dengan URL API Anda

    const data = {
        message: userMessage,
        user_id: user_ID
    };

    const options = {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(data)
    };

    const res = await (await fetch(url, options)).json();

    return res.reply;
}

// Memblokir atau membuka input user saat bot sedang merespons
function blockUserInput(block) {
    const chatInput = document.getElementById("chat-input");
    const sendButton = document.getElementById("send-button");
    chatInput.disabled = block;
    sendButton.disabled = block;
}

// Menampilkan atau menyembunyikan typing indicator
function showTypingIndicator(show) {
    const indicator = document.getElementById("typing-indicator");
    if (show) {
        indicator.classList.remove("hidden");
    } else {
        indicator.classList.add("hidden");
    }
}