import { NextPage } from "next"; import { NextSeo } from "next-seo"; import { FC, useState } from "react"; import { useMutation, useQuery } from "react-query"; import axios from "axios"; import Box from "@mui/material/Box"; import Button from "@mui/material/Button"; import ButtonGroup from "@mui/material/ButtonGroup"; import CircularProgress from "@mui/material/CircularProgress"; import Container from "@mui/material/Container"; import Divider from "@mui/material/Divider"; import FormControl from "@mui/material/FormControl"; import InputLabel from "@mui/material/InputLabel"; import MenuItem from "@mui/material/MenuItem"; import Modal from "@mui/material/Modal"; import Select from "@mui/material/Select"; import TextField from "@mui/material/TextField"; import Typography from "@mui/material/Typography"; import { red, green } from "@mui/material/colors/"; import { useTheme } from "@mui/material/styles/"; import Done from "@mui/icons-material/Done"; import Error from "@mui/icons-material/Error"; import Refresh from "@mui/icons-material/Refresh"; import { ServerInstance, ServerInstanceType, Stats } from "@interfaces/api/instances"; import { StorageType } from "@interfaces/settings"; import useSettings from "@utils/hooks/useSettings"; import Layout from "@components/Layout"; import MaterialColorPicker from "@components/MaterialColorPicker"; import ColorBox from "@components/MaterialColorPicker/ColorBox"; import ModalBox from "@components/ModalBox"; const InfoModal: FC<{ modalIsOpen: boolean; setModalState: (isOpen: boolean) => void; data: Stats; }> = ({ modalIsOpen, setModalState, data }) => { const [settings] = useSettings(); const lastUpdated = new Date(data.metadata.updatedAt * 1000); return ( setModalState(false)} aria-labelledby="stats-modal" aria-describedby="Shows server stats" > Stats for {settings.invidiousServer} Version: {data.version}

Software name: {data.software.name}
Software version: {data.software.version}
Software branch: {data.software.branch}

Is accepting registrations: {data.openRegistrations ? "Yes" : "No"}

Total users: {data.usage.users.total}
Active in the past half year: {data.usage.users.activeHalfyear}
Active in the past month: {data.usage.users.activeMonth}

Stats updated at: {lastUpdated.toLocaleDateString()} -{" "} {lastUpdated.toLocaleTimeString()}
); }; const Setting: FC<{ title: string; description?: string }> = ({ title, children, description }) => { const theme = useTheme(); return ( {title} {description && ( {description} )} {children} ); }; const Settings: NextPage = () => { const [settings, setSettings] = useSettings(); const setSetting = (key: string, value?: string): void => setSettings({ ...settings, [key]: value }); const theme = useTheme(); const [primaryColorModalIsOpen, setPrimaryColorModal] = useState(false); const [accentColorModalIsOpen, setAccentColorModal] = useState(false); const [modalIsOpen, setModalState] = useState(false); const instances = useQuery<[string, ServerInstance][]>( "invidiousInstances", () => axios .get("https://api.invidious.io/instances.json") .then((res) => res.data), { retry: false } ); const invidiousServerResponse = useMutation( "invidiousInstance", (server) => axios.get(`https://${server}/api/v1/stats`).then((res) => res.data) ); const allowsRegistrations = invidiousServerResponse.data?.openRegistrations; return ( <> Settings Theme setSetting("primaryColor", color)} selectedColor={settings.primaryColor} /> setSetting("accentColor", color)} selectedColor={settings.accentColor} /> Player Data {!invidiousServerResponse.data && !invidiousServerResponse.error && !invidiousServerResponse.isLoading && ( invidiousServerResponse.mutate(settings.invidiousServer) } /> )} {invidiousServerResponse.data && !invidiousServerResponse.isLoading && ( <> setModalState(true)} sx={{ color: green[800], cursor: "pointer" }} /> )} {invidiousServerResponse.error && ( )} {invidiousServerResponse.isLoading && } Server Location {settings.storageType != StorageType.Local && ( <> {settings.storageType == "invidious" && allowsRegistrations && ( )} {settings.storageType == StorageType.RemoteServer && ( )} )} ); }; export default Settings;