import { Alert, AppShell, Box, Button, Container, Group, Stack, Text, Title, useMantineTheme, } from "@mantine/core"; import { useMediaQuery } from "@mantine/hooks"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { TbInfoCircle } from "react-icons/tb"; import { FormattedMessage } from "react-intl"; import Meta from "../../../components/Meta"; import AdminConfigInput from "../../../components/admin/configuration/AdminConfigInput"; import ConfigurationHeader from "../../../components/admin/configuration/ConfigurationHeader"; import ConfigurationNavBar from "../../../components/admin/configuration/ConfigurationNavBar"; import LogoConfigInput from "../../../components/admin/configuration/LogoConfigInput"; import TestEmailButton from "../../../components/admin/configuration/TestEmailButton"; import CenterLoader from "../../../components/core/CenterLoader"; import useConfig from "../../../hooks/config.hook"; import useTranslate from "../../../hooks/useTranslate.hook"; import configService from "../../../services/config.service"; import { AdminConfig, UpdateConfig } from "../../../types/config.type"; import { camelToKebab } from "../../../utils/string.util"; import toast from "../../../utils/toast.util"; export default function AppShellDemo() { const theme = useMantineTheme(); const router = useRouter(); const t = useTranslate(); const [isMobileNavBarOpened, setIsMobileNavBarOpened] = useState(false); const isMobile = useMediaQuery("(max-width: 560px)"); const config = useConfig(); const categoryId = (router.query.category as string | undefined) ?? "general"; const [configVariables, setConfigVariables] = useState(); const [updatedConfigVariables, setUpdatedConfigVariables] = useState< UpdateConfig[] >([]); const [logo, setLogo] = useState(null); const isEditingAllowed = (): boolean => { return !configVariables || configVariables[0].allowEdit; }; const saveConfigVariables = async () => { if (logo) { configService .changeLogo(logo) .then(() => { setLogo(null); toast.success(t("admin.config.notify.logo-success")); }) .catch(toast.axiosError); } if (updatedConfigVariables.length > 0) { await configService .updateMany(updatedConfigVariables) .then(() => { setUpdatedConfigVariables([]); toast.success(t("admin.config.notify.success")); }) .catch(toast.axiosError); void config.refresh(); } else { toast.success(t("admin.config.notify.no-changes")); } }; const updateConfigVariable = (configVariable: UpdateConfig) => { if (configVariable.key === "general.appUrl") { configVariable.value = sanitizeUrl(configVariable.value); } const index = updatedConfigVariables.findIndex( (item) => item.key === configVariable.key, ); if (index > -1) { updatedConfigVariables[index] = { ...updatedConfigVariables[index], ...configVariable, }; } else { setUpdatedConfigVariables([...updatedConfigVariables, configVariable]); } }; const sanitizeUrl = (url: string): string => { return url.endsWith("/") ? url.slice(0, -1) : url; }; useEffect(() => { configService.getByCategory(categoryId).then((configVariables) => { setConfigVariables(configVariables); }); }, [categoryId]); return ( <> } header={ } > {!configVariables ? ( ) : ( <> {!isEditingAllowed() && ( } > )} {t("admin.config.category." + categoryId)} {configVariables.map((configVariable) => ( <FormattedMessage id={`admin.config.${camelToKebab( configVariable.key, )}`} /> }} /> ))} {categoryId == "general" && ( )} {categoryId == "smtp" && ( )} )} ); }