import React, {useEffect, useRef, useState} from "react"; import {LogEndpoint} from "Frontend/generated/endpoints"; import withConfigPage from "Frontend/components/administration/withConfigPage"; import * as Yup from 'yup'; import ConfigFormField from "Frontend/components/administration/ConfigFormField"; import {addToast, Button, Code, Divider, Tooltip} from "@heroui/react"; import {ArrowUDownLeft, SortAscending} from "@phosphor-icons/react"; function LogManagementLayout({getConfig, formik}: any) { const [logEntries, setLogEntries] = useState([]); const [autoScroll, setAutoScroll] = useState(true); const [softWrap, setSoftWrap] = useState(false); const logEndRef = useRef(null); useEffect(() => { const sub = LogEndpoint.getApplicationLogs().onNext((newEntry: string | undefined) => setLogEntries((currentEntries) => [...currentEntries, newEntry as string]) ); return () => sub.cancel(); }, []); useEffect(() => { if (formik.isSubmitting == false && formik.submitCount > 0) { LogEndpoint.reloadLogConfig() .catch(() => addToast({ title: "Error", description: "Failed to apply log configuration", color: "danger" })); } }, [formik.isSubmitting]); useEffect(() => { if (autoScroll) { scrollToBottom(); } }, [logEntries, autoScroll, softWrap]); function scrollToBottom() { logEndRef.current?.scrollIntoView(); } return (

Application logs

{logEntries.map((entry, index) =>

{entry}

)}
); } const validationSchema = Yup.object({ logs: Yup.object({ folder: Yup.string().required("Required"), "max-history-days": Yup.number().required("Required"), level: Yup.object({ gameyfin: Yup.string().required("Required"), root: Yup.string().required("Required") }) }) }); export const LogManagement = withConfigPage(LogManagementLayout, "Logging", validationSchema);