import React, { useState, useEffect } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faChevronRight, faChevronDown, } from "@fortawesome/free-solid-svg-icons"; import { formatTime } from "../lib/time"; import ScrollToBottom from "./scrollToBottom"; import { Topic } from "./webSocketTypes"; type TopicListProps = { topics: Topic[]; useActiveTopic: [ Topic | null, React.Dispatch>, ]; }; export function TopicList({ topics, useActiveTopic }: TopicListProps) { const [activeTopic, setActiveTopic] = useActiveTopic; const [autoscrollEnabled, setAutoscrollEnabled] = useState(true); useEffect(() => { if (autoscrollEnabled) scrollToBottom(); }, [topics]); const scrollToBottom = () => { const topicsDiv = document.getElementById("topics-div"); if (!topicsDiv) console.error("Could not find topics div to scroll to bottom"); else topicsDiv.scrollTop = topicsDiv.scrollHeight; }; // scroll top is not rounded, heights are, so exact match won't work. // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#determine_if_an_element_has_been_totally_scrolled const toggleScroll = (element) => { const bottom = Math.abs( element.scrollHeight - element.clientHeight - element.scrollTop, ) < 2 || element.scrollHeight == element.clientHeight; if (!bottom && autoscrollEnabled) { setAutoscrollEnabled(false); } else if (bottom && !autoscrollEnabled) { setAutoscrollEnabled(true); } }; const handleScroll = (e) => { toggleScroll(e.target); }; useEffect(() => { const topicsDiv = document.getElementById("topics-div"); topicsDiv && toggleScroll(topicsDiv); }, [activeTopic]); return (
{topics.length > 0 ? ( <>
{topics.map((topic, index) => ( ))}
) : (
Discussion topics will appear here after you start recording. It may take up to 5 minutes of conversation for the first topic to appear.
)}
); }