import { useEffect, useRef, useState } from "react"; import axios from "axios"; import AcUnitIcon from "@mui/icons-material/AcUnit"; import LocalFireDepartmentIcon from "@mui/icons-material/LocalFireDepartment"; import CheckIcon from "@mui/icons-material/Check"; import ClearIcon from "@mui/icons-material/Clear"; import CodeIcon from "@mui/icons-material/Code"; import CodeOffIcon from "@mui/icons-material/CodeOff"; import EditIcon from "@mui/icons-material/Edit"; import VisibilityIcon from "@mui/icons-material/Visibility"; import DeleteForeverIcon from "@mui/icons-material/DeleteForever"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import PlayArrowIcon from "@mui/icons-material/PlayArrow"; import ReplayIcon from "@mui/icons-material/Replay"; import MoneyIcon from "@mui/icons-material/Money"; import TollIcon from "@mui/icons-material/Toll"; import TextField from "@mui/material/TextField"; import Box from "@mui/material/Box"; import Stack from "@mui/material/Stack"; import Accordion from "@mui/material/Accordion"; import Typography from "@mui/material/Typography"; import AccordionSummary from "@mui/material/AccordionSummary"; import AccordionDetails from "@mui/material/AccordionDetails"; import Paper from "@mui/material/Paper"; import IconButton from "@mui/material/IconButton"; import List from "@mui/material/List"; import ListItem from "@mui/material/ListItem"; import { nanoid } from "nanoid"; import AppBar from "@mui/material/AppBar"; import Toolbar from "@mui/material/Toolbar"; import ListItemIcon from "@mui/material/ListItemIcon"; import ListItemButton from "@mui/material/ListItemButton"; import ListItemText from "@mui/material/ListItemText"; import { useHost } from "esdeka/react"; import CircularProgress from "@mui/material/CircularProgress"; import CssBaseline from "@mui/material/CssBaseline"; import Slider from "@mui/material/Slider"; import { useAtom } from "jotai"; import Button from "@mui/material/Button"; import dynamic from "next/dynamic"; import FormControl from "@mui/material/FormControl"; import InputLabel from "@mui/material/InputLabel"; import Select from "@mui/material/Select"; import MenuItem from "@mui/material/MenuItem"; import { fontMono } from "@/lib/theme"; import { useColorScheme } from "@mui/material/styles"; import { getTheme, prettify } from "@/utils"; import { answersAtom, showCodeAtom } from "@/store/atoms"; import { base } from "@/constants"; import { EditTitle } from "@/components/EditTitle"; const MonacoEditor = dynamic(import("@monaco-editor/react"), { ssr: false }); export default function Home() { const ref = useRef(null); const [template, setTemplate] = useState(prettify(base.default)); const [runningId, setRunningId] = useState("1"); const [activeId, setActiveId] = useState("1"); const [editingId, setEditingId] = useState(null); const [answers, setAnswers] = useAtom(answersAtom); const [showCode, setShowCode] = useAtom(showCodeAtom); const [loading, setLoading] = useState(false); const [loadingLive, setLoadingLive] = useState(true); const { mode, systemMode } = useColorScheme(); const { call, subscribe } = useHost(ref, "fail4"); const connection = useRef(false); const [tries, setTries] = useState(1); // Send a connection request useEffect(() => { const current = answers.find(({ id }) => id === runningId); if (connection.current || tries <= 0) { return () => { /* Consistency */ }; } const timeout = setTimeout(() => { if (current) { call({ template: current.content }); } setTries(tries - 1); }, 1_000); return () => { clearTimeout(timeout); }; }, [call, tries, answers, runningId]); useEffect(() => { if (!connection.current && loadingLive) { const unsubscribe = subscribe(event => { const { action } = event.data; switch (action.type) { case "answer": connection.current = true; setLoadingLive(false); console.log("connected"); break; default: break; } }); return () => { unsubscribe(); }; } return () => { /* Consistency */ }; }, [subscribe, loadingLive]); const current = answers.find(({ id }) => id === activeId); function reload() { connection.current = false; if (ref.current) { ref.current.src = `/live?${nanoid()}`; setLoadingLive(true); setTries(1); } } return ( <> {current?.id === editingId ? ( { setEditingId(null); setAnswers(previousAnswers => previousAnswers.map(answer_ => current.id === answer_.id ? { ...answer_, task: value, } : answer_ ) ); }} /> ) : ( <> {current?.task} { if (current) { setEditingId(current.id); } }} > )} { setShowCode(previousState => !previousState); }} > {showCode ? : } { setActiveId("1"); setRunningId("1"); setTemplate(prettify(base.default)); reload(); }} > {showCode && ( { if (event.key === "s" && event.metaKey) { event.preventDefault(); setAnswers(previousAnswers => previousAnswers.map(previousAnswer => { console.log(previousAnswer.id, activeId); return previousAnswer.id === activeId ? { ...previousAnswer, content: template } : previousAnswer; }) ); reload(); } }} > { console.log(value); setTemplate(value ?? ""); }} /> )} { event.preventDefault(); const formData = new FormData(event.target as HTMLFormElement); const formObject = Object.fromEntries(formData); try { setLoading(true); const { data } = await axios.post("/api/gpt", formObject); const answer = data; setAnswers(previousAnswers => [answer, ...previousAnswers]); setRunningId(answer.id); setActiveId(answer.id); setTemplate(prettify(answer.content)); reload(); } catch (error) { console.error(error); } finally { setLoading(false); } }} > } aria-controls="gtp-options-content" id="gtp-options-header" sx={{ bgcolor: "background.paper", color: "text.primary", }} > Options Model { setTemplate(event.target.value); }} /> {answers.map((answer, index) => { return ( {answer.id === "1" ? undefined : ( { setAnswers(previousAnswers => previousAnswers.filter( ({ id }) => id !== answer.id ) ); if (runningId === answer.id) { const previous = answers[index + 1]; if (previous) { setActiveId(previous.id); setRunningId(previous.id); setTemplate( prettify(previous.task) ); reload(); } } }} > )} } disablePadding > { setActiveId(answer.id); setRunningId(answer.id); setTemplate(prettify(answer.content)); reload(); }} > {runningId === answer.id ? ( ) : ( )} ); })} { reload(); }} > {loadingLive && ( )} ); }