import { Label, Text, Title } from "../../tremor/Text"; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; import React, { memo, useEffect, useMemo, useState } from "react"; import { useBackend } from "../../layouts/Wrapper"; import { Question } from "@onvo-ai/js"; import { useDashboard } from "../../layouts/Dashboard/useDashboard"; import { DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator } from "../../tremor/DropdownMenu"; dayjs.extend(relativeTime); function groupTextsByTime(entries: Pick[]) { const groups: Record[]> = {}; entries.forEach((entry) => { const groupKey = `${dayjs(entry.created_at).fromNow(true)}`; if (!groups[groupKey]) { groups[groupKey] = []; } groups[groupKey].push(entry); }); const sortedKeys = Object.keys(groups).sort( (a, b) => parseInt(a, 10) - parseInt(b, 10) ); return sortedKeys.reduce((acc, key) => { acc[key] = groups[key]; return acc; }, {} as Record[]>); } const QuestionHistoryRaw: React.FC<{ onSelect: (question: any | undefined) => void; variant: "list" | "dropdown"; limit?: number; selectedId?: string; }> = ({ onSelect, variant, limit }) => { const { backend } = useBackend(); const { dashboard } = useDashboard(); const [loading, setLoading] = useState(true); const [questions, setQuestions] = useState([]); const getQuestions = async () => { setLoading(true); if (!backend || !dashboard) return; let qs: any[] = await backend.questions.list({ dashboard: dashboard.id }); let sorted = qs.sort((a, b) => { return ( new Date(b.created_at).getTime() - new Date(a.created_at).getTime() ); }); setQuestions(sorted); setLoading(false); }; useEffect(() => { if (dashboard && dashboard.id) { getQuestions(); } }, [dashboard?.id]); const filtered = useMemo(() => { if (!limit) return questions; return questions.slice(0, limit); }, [questions, limit]); if (!loading && questions.length === 0) { return <>; } if (variant === "dropdown") { const grouped = groupTextsByTime(filtered); return ( <> {Object.entries(grouped).map(([key, value]) => { return ( <> {key} { value.map((a) => { let truncated = a.query.slice(0, 60) + "..."; return ( onSelect(a)}> {truncated} ) }) } ) })} ) } return (
History
{loading && [1, 2, 3, 4].map((a) => (
))} {filtered.map((a) => { let truncated = a.query.slice(0, 240) + "..."; return (
onSelect(a)}> {truncated}
); })}
); }; export const QuestionHistory = memo(QuestionHistoryRaw);