"use client" import { AppSidebar } from "@/components/app-sidebar" import { Breadcrumb, BreadcrumbItem, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb" import { Separator } from "@/components/ui/separator" import { SidebarInset, SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar" import { Card, CardContent, CardHeader } from "@/components/ui/card" import { useTheme } from "next-themes" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Input } from "@/components/ui/input" import { useEffect, useState } from "react" import axios from "axios" import Cookies from "js-cookie" import { Button } from "@/components/ui/button" import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" import { AlertCircle, Check, Palette, User, Bell, AtSign, Send, MessageSquare, Trash2, Play, Languages } from "lucide-react" import { Toaster } from "@/components/ui/sonner" import { toast } from "sonner" import { Textarea } from "@/components/ui/textarea" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog" import { Label } from "@/components/ui/label" import { Checkbox } from "@/components/ui/checkbox" import { useTranslations } from "next-intl" interface NotificationsResponse { notifications: any[] } interface NotificationResponse { notification_text_application?: string notification_text_server?: string } export default function Settings() { const t = useTranslations() const { theme, setTheme } = useTheme() const [email, setEmail] = useState("") const [password, setPassword] = useState("") const [confirmPassword, setConfirmPassword] = useState("") const [oldPassword, setOldPassword] = useState("") const [emailError, setEmailError] = useState("") const [passwordError, setPasswordError] = useState("") const [emailErrorVisible, setEmailErrorVisible] = useState(false) const [passwordErrorVisible, setPasswordErrorVisible] = useState(false) const [passwordSuccess, setPasswordSuccess] = useState(false) const [emailSuccess, setEmailSuccess] = useState(false) const [notificationType, setNotificationType] = useState("") const [notificationName, setNotificationName] = useState("") const [smtpHost, setSmtpHost] = useState("") const [smtpPort, setSmtpPort] = useState(0) const [smtpSecure, setSmtpSecure] = useState(false) const [smtpUsername, setSmtpUsername] = useState("") const [smtpPassword, setSmtpPassword] = useState("") const [smtpFrom, setSmtpFrom] = useState("") const [smtpTo, setSmtpTo] = useState("") const [telegramToken, setTelegramToken] = useState("") const [telegramChatId, setTelegramChatId] = useState("") const [discordWebhook, setDiscordWebhook] = useState("") const [gotifyUrl, setGotifyUrl] = useState("") const [gotifyToken, setGotifyToken] = useState("") const [ntfyUrl, setNtfyUrl] = useState("") const [ntfyToken, setNtfyToken] = useState("") const [pushoverUrl, setPushoverUrl] = useState("") const [pushoverToken, setPushoverToken] = useState("") const [pushoverUser, setPushoverUser] = useState("") const [echobellURL, setEchobellURL] = useState("") const [language, setLanguage] = useState("english") const [notifications, setNotifications] = useState([]) const [notificationTextApplication, setNotificationTextApplication] = useState("") const [notificationTextServer, setNotificationTextServer] = useState("") const changeEmail = async () => { setEmailErrorVisible(false) setEmailSuccess(false) setEmailError("") if (!email) { setEmailError(t('Settings.UserSettings.ChangeEmail.EmailRequired')) setEmailErrorVisible(true) setTimeout(() => { setEmailErrorVisible(false) setEmailError("") }, 3000) return } try { await axios.post("/api/auth/edit_email", { newEmail: email, jwtToken: Cookies.get("token"), }) setEmailSuccess(true) setEmail("") setTimeout(() => { setEmailSuccess(false) }, 3000) } catch (error: any) { setEmailError(error.response.data.error) setEmailErrorVisible(true) setTimeout(() => { setEmailErrorVisible(false) setEmailError("") }, 3000) } } const changePassword = async () => { try { if (password !== confirmPassword) { setPasswordError(t('Settings.UserSettings.ChangePassword.PasswordsDontMatch')) setPasswordErrorVisible(true) setTimeout(() => { setPasswordErrorVisible(false) setPasswordError("") }, 3000) return } if (!oldPassword || !password || !confirmPassword) { setPasswordError(t('Settings.UserSettings.ChangePassword.AllFieldsRequired')) setPasswordErrorVisible(true) setTimeout(() => { setPasswordErrorVisible(false) setPasswordError("") }, 3000) return } const response = await axios.post("/api/auth/edit_password", { oldPassword: oldPassword, newPassword: password, jwtToken: Cookies.get("token"), }) if (response.status === 200) { setPasswordSuccess(true) setPassword("") setOldPassword("") setConfirmPassword("") setTimeout(() => { setPasswordSuccess(false) }, 3000) } } catch (error: any) { setPasswordErrorVisible(true) setPasswordError(error.response.data.error) setTimeout(() => { setPasswordErrorVisible(false) setPasswordError("") }, 3000) } } const addNotification = async () => { try { const response = await axios.post("/api/notifications/add", { name: notificationName, type: notificationType, smtpHost: smtpHost, smtpPort: smtpPort, smtpSecure: smtpSecure, smtpUsername: smtpUsername, smtpPassword: smtpPassword, smtpFrom: smtpFrom, smtpTo: smtpTo, telegramToken: telegramToken, telegramChatId: telegramChatId, discordWebhook: discordWebhook, gotifyUrl: gotifyUrl, gotifyToken: gotifyToken, ntfyUrl: ntfyUrl, ntfyToken: ntfyToken, pushoverUrl: pushoverUrl, pushoverToken: pushoverToken, pushoverUser: pushoverUser, echobellURL: echobellURL, }) getNotifications() } catch (error: any) { alert(error.response.data.error) } } const deleteNotification = async (id: number) => { try { const response = await axios.post("/api/notifications/delete", { id: id, }) if (response.status === 200) { getNotifications() } } catch (error: any) { alert(error.response.data.error) } } const getNotifications = async () => { try { const response = await axios.post("/api/notifications/get", {}) if (response.status === 200 && response.data) { setNotifications(response.data.notifications) } } catch (error: any) { alert(error.response.data.error) } } useEffect(() => { getNotifications() }, []) const getNotificationText = async () => { try { const response = await axios.post("/api/settings/get_notification_text", {}) if (response.status === 200) { if (response.data.notification_text_application) { setNotificationTextApplication(response.data.notification_text_application) } else { setNotificationTextApplication("The application !name (!url) is now !status.") } if (response.data.notification_text_server) { setNotificationTextServer(response.data.notification_text_server) } else { setNotificationTextServer("The server !name is now !status.") } } } catch (error: any) { alert(error.response.data.error) } } const editNotificationText = async () => { try { const response = await axios.post("/api/settings/notification_text", { text_application: notificationTextApplication, text_server: notificationTextServer, }) } catch (error: any) { alert(error.response.data.error) } } useEffect(() => { getNotificationText() }, []) const testNotification = async (id: number) => { try { const response = await axios.post("/api/notifications/test", { notificationId: id, }) toast.success(t('Settings.Notifications.TestSuccess')) } catch (error: any) { toast.error(error.response.data.error) } } useEffect(() => { const language = Cookies.get("language") if (language === "en") { setLanguage("english") } else if (language === "de") { setLanguage("german") } }, []) const setLanguageFunc = (value: string) => { setLanguage(value) if (value === "english") { Cookies.set("language", "en") } else if (value === "german") { Cookies.set("language", "de") } // Reload the page window.location.reload() } return (
{t('Settings.Breadcrumb.Dashboard')} {t('Settings.Breadcrumb.Settings')}
{t('Settings.Title')}

{t('Settings.UserSettings.Title')}

{t('Settings.UserSettings.Description')}

{t('Settings.UserSettings.ChangeEmail.Title')}

{emailErrorVisible && ( {t('Common.Error')} {emailError} )} {emailSuccess && ( {t('Settings.UserSettings.ChangeEmail.Success')} )}
setEmail(e.target.value)} className="h-11" />

{t('Settings.UserSettings.ChangePassword.Title')}

{passwordErrorVisible && ( {t('Common.Error')} {passwordError} )} {passwordSuccess && ( {t('Settings.UserSettings.ChangePassword.Success')} )}
setOldPassword(e.target.value)} className="h-11" /> setPassword(e.target.value)} className="h-11" /> setConfirmPassword(e.target.value)} className="h-11" />

{t('Settings.ThemeSettings.Title')}

{t('Settings.ThemeSettings.Description')}

{t('Settings.LanguageSettings.Title')}

{t('Settings.LanguageSettings.Description')}

{t('Settings.Notifications.Title')}

{t('Settings.Notifications.Description')}
{t('Settings.Notifications.AddNotification.Title')}
setNotificationName(e.target.value)} /> setSmtpHost(e.target.value)} />
setSmtpPort(Number(e.target.value))} />
setSmtpSecure(checked)} />
setSmtpUsername(e.target.value)} />
setSmtpPassword(e.target.value)} />
setSmtpFrom(e.target.value)} />
setSmtpTo(e.target.value)} />
)} {notificationType === "telegram" && (
setTelegramToken(e.target.value)} />
setTelegramChatId(e.target.value)} />
)} {notificationType === "discord" && (
setDiscordWebhook(e.target.value)} />
)} {notificationType === "gotify" && (
setGotifyUrl(e.target.value)} />
setGotifyToken(e.target.value)} />
)} {notificationType === "ntfy" && (
setNtfyUrl(e.target.value)} />
setNtfyToken(e.target.value)} />
)} {notificationType === "pushover" && (
setPushoverUrl(e.target.value)} />
setPushoverToken(e.target.value)} />
setPushoverUser(e.target.value)} />
)} {notificationType === "echobell" && (
setEchobellURL(e.target.value)} />
{t('Settings.Notifications.AddNotification.Echobell.AddMessage')}
)}
{t('Common.cancel')} {t('Common.add')} {t('Settings.Notifications.CustomizeText.Title')}