import React, { useState, useEffect, useRef, useCallback } from 'react'; import userService from '../api/services/userService'; import ChevronRight from '../assets/chevron-right.svg'; import Dropdown from '../components/Dropdown'; import SkeletonLoader from '../components/SkeletonLoader'; import { APIKeyData, LogData } from './types'; import CoppyButton from '../components/CopyButton'; export default function Logs() { const [chatbots, setChatbots] = useState([]); const [selectedChatbot, setSelectedChatbot] = useState(); const [logs, setLogs] = useState([]); const [page, setPage] = useState(1); const [hasMore, setHasMore] = useState(true); const [loadingChatbots, setLoadingChatbots] = useState(true); const [loadingLogs, setLoadingLogs] = useState(true); const fetchChatbots = async () => { setLoadingChatbots(true); try { const response = await userService.getAPIKeys(); if (!response.ok) { throw new Error('Failed to fetch Chatbots'); } const chatbots = await response.json(); setChatbots(chatbots); } catch (error) { console.error(error); } finally { setLoadingChatbots(false); } }; const fetchLogs = async () => { setLoadingLogs(true); try { const response = await userService.getLogs({ page: page, api_key_id: selectedChatbot?.id, page_size: 10, }); if (!response.ok) { throw new Error('Failed to fetch logs'); } const olderLogs = await response.json(); setLogs((prevLogs) => [...prevLogs, ...olderLogs.logs]); setHasMore(olderLogs.has_more); } catch (error) { console.error(error); } finally { setLoadingLogs(false); } }; useEffect(() => { fetchChatbots(); }, []); useEffect(() => { if (hasMore) fetchLogs(); }, [page, selectedChatbot]); return (

Filter by chatbot

{loadingChatbots ? ( ) : ( ({ label: chatbot.name, value: chatbot.id, })), { label: 'None', value: '' }, ]} placeholder="Select chatbot" onSelect={(chatbot: { label: string; value: string }) => { setSelectedChatbot( chatbots.find((item) => item.id === chatbot.value), ); setLogs([]); setPage(1); setHasMore(true); }} selectedValue={ (selectedChatbot && { label: selectedChatbot.name, value: selectedChatbot.id, }) || null } rounded="3xl" border="border" /> )}
{loadingLogs ? ( ) : ( )}
); } type LogsTableProps = { logs: LogData[]; setPage: React.Dispatch>; }; function LogsTable({ logs, setPage }: LogsTableProps) { const observerRef = useRef(); const firstObserver = useCallback((node: HTMLDivElement) => { if (observerRef.current) { observerRef.current = new IntersectionObserver((entries) => { if (entries[0].isIntersecting) setPage((prev) => prev + 1); }); } if (node && observerRef.current) observerRef.current.observe(node); }, []); return (

API generated / chatbot conversations

{logs.map((log, index) => { if (index === logs.length - 1) { return (
); } else return ; })}
); } function Log({ log }: { log: LogData }) { const logLevelColor = { info: 'text-green-500', error: 'text-red-500', warning: 'text-yellow-500', }; const { id, action, timestamp, ...filteredLog } = log; return (
chevron-right

{`${log.timestamp}`}

{`[${log.action}]`}

{`${log.question}`}

{JSON.stringify(filteredLog, null, 2)}

); }