import axios from "axios"; import { NextPage } from "next"; import { FC, useState } from "react"; import { useQuery } from "react-query"; 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 Typography from "@mui/material/Typography"; import { blue, red, green, cyan, purple, yellow, orange } 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 { toCamelCase } from "@src/utils"; import { ServerInstance, ServerInstanceType, Stats } from "@interfaces/api/instances"; import { useSettings } from "@utils/hooks"; import Layout from "@components/Layout"; const Settings: NextPage = () => { const [settings, setSettings] = useSettings(); const setSetting = (key: string, value?: string): void => { setSettings({ ...settings, [key]: value }); }; const [modalIsOpen, setModalState] = useState(false); const theme = useTheme(); const instances = useQuery<[string, ServerInstance][]>( "invidiousInstances", () => axios .get("https://api.invidious.io/instances.json") .then((res) => res.data), { retry: false } ); const invidiousServerResponse = useQuery("invidiousInstance", () => axios .get(`https://${settings.invidiousServer}/api/v1/stats`) .then((res) => res.data) ); const ColorSetting: FC<{ type: string }> = ({ type }) => { const camelCase = toCamelCase(type) as "primaryColor" | "accentColor"; return ( {type} {[ blue[800], red[800], green[800], cyan[800], purple[800], yellow[800], orange[800] ].map((color) => ( setSetting(camelCase, color)} key={color} component="span" sx={{ width: 24, height: 24, backgroundColor: color, borderRadius: "50%", border: color == settings[camelCase] ? { borderColor: theme.palette.text.primary, borderWidth: 1, borderStyle: "solid" } : null, cursor: "pointer", ml: 1.5 }} /> ))} ); }; const InfoModal: FC = () => { const data = invidiousServerResponse.data!; const lastUpdated = new Date(data.metadata.updatedAt * 1000); return ( setModalState(false)} aria-labelledby="modal-modal-title" aria-describedby="modal-modal-description" > 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()}
); }; return ( Settings Theme General theme Player Miscellaneous Invidious Server {invidiousServerResponse.data && !invidiousServerResponse.isLoading && ( <> setModalState(true)} sx={{ color: green[800], cursor: "pointer" }} /> )} {invidiousServerResponse.error && ( )} {invidiousServerResponse.isLoading && } Server ); }; export default Settings;