diff --git a/app/dashboard/settings/Settings.tsx b/app/dashboard/settings/Settings.tsx index 931e2fd..efaaf2a 100644 --- a/app/dashboard/settings/Settings.tsx +++ b/app/dashboard/settings/Settings.tsx @@ -1,33 +1,25 @@ -import { AppSidebar } from "@/components/app-sidebar"; +"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"; +} 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 { 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 } from "lucide-react"; +import { AlertCircle, Check, Palette, User, Bell, AtSign, Send, MessageSquare, Trash2 } from "lucide-react" import { AlertDialog, @@ -39,19 +31,19 @@ import { AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog" -import { Label } from "@/components/ui/label"; -import { Checkbox } from "@/components/ui/checkbox"; -import { Textarea } from "@/components/ui/textarea"; +import { Label } from "@/components/ui/label" +import { Checkbox } from "@/components/ui/checkbox" +import { Textarea } from "@/components/ui/textarea" interface NotificationsResponse { - notifications: any[]; + notifications: any[] } interface NotificationResponse { - notification_text?: string; + notification_text?: string } export default function Settings() { - const { theme, setTheme } = useTheme(); + const { theme, setTheme } = useTheme() const [email, setEmail] = useState("") const [password, setPassword] = useState("") @@ -83,89 +75,88 @@ export default function Settings() { const [notificationText, setNotificationText] = useState("") const changeEmail = async () => { - setEmailErrorVisible(false); - setEmailSuccess(false); - setEmailError(""); + setEmailErrorVisible(false) + setEmailSuccess(false) + setEmailError("") if (!email) { - setEmailError("Email is required"); - setEmailErrorVisible(true); + setEmailError("Email is required") + setEmailErrorVisible(true) setTimeout(() => { - setEmailErrorVisible(false); - setEmailError(""); - } - , 3000); - return; + setEmailErrorVisible(false) + setEmailError("") + }, 3000) + return } try { - await axios.post('/api/auth/edit_email', { + await axios.post("/api/auth/edit_email", { newEmail: email, - jwtToken: Cookies.get('token') - }); - setEmailSuccess(true); - setEmail(""); + jwtToken: Cookies.get("token"), + }) + setEmailSuccess(true) + setEmail("") setTimeout(() => { - setEmailSuccess(false); - }, 3000); + setEmailSuccess(false) + }, 3000) } catch (error: any) { - setEmailError(error.response.data.error); - setEmailErrorVisible(true); + setEmailError(error.response.data.error) + setEmailErrorVisible(true) setTimeout(() => { - setEmailErrorVisible(false); - setEmailError(""); - }, 3000); + setEmailErrorVisible(false) + setEmailError("") + }, 3000) } } const changePassword = async () => { try { if (password !== confirmPassword) { - setPasswordError("Passwords do not match"); - setPasswordErrorVisible(true); + setPasswordError("Passwords do not match") + setPasswordErrorVisible(true) setTimeout(() => { - setPasswordErrorVisible(false); - setPasswordError(""); - }, 3000); - return; + setPasswordErrorVisible(false) + setPasswordError("") + }, 3000) + return } if (!oldPassword || !password || !confirmPassword) { - setPasswordError("All fields are required"); - setPasswordErrorVisible(true); + setPasswordError("All fields are required") + setPasswordErrorVisible(true) setTimeout(() => { - setPasswordErrorVisible(false); - setPasswordError(""); - }, 3000); - return; + setPasswordErrorVisible(false) + setPasswordError("") + }, 3000) + return } - const response = await axios.post('/api/auth/edit_password', { + const response = await axios.post("/api/auth/edit_password", { oldPassword: oldPassword, newPassword: password, - jwtToken: Cookies.get('token') - }); - + jwtToken: Cookies.get("token"), + }) + if (response.status === 200) { - setPasswordSuccess(true); - setPassword(""); - setOldPassword(""); - setConfirmPassword(""); + setPasswordSuccess(true) + setPassword("") + setOldPassword("") + setConfirmPassword("") setTimeout(() => { - setPasswordSuccess(false); - }, 3000); + setPasswordSuccess(false) + }, 3000) } } catch (error: any) { - setPasswordErrorVisible(true); - setPasswordError(error.response.data.error); + setPasswordErrorVisible(true) + setPasswordError(error.response.data.error) setTimeout(() => { - setPasswordErrorVisible(false); - setPasswordError(""); - }, 3000); + setPasswordErrorVisible(false) + setPasswordError("") + }, 3000) } } const addNotification = async () => { try { - const response = await axios.post('/api/notifications/add', { + const response = await axios.post("/api/notifications/add", { type: notificationType, smtpHost: smtpHost, smtpPort: smtpPort, @@ -176,37 +167,35 @@ export default function Settings() { smtpTo: smtpTo, telegramToken: telegramToken, telegramChatId: telegramChatId, - discordWebhook: discordWebhook - }); - getNotifications(); - } - catch (error: any) { - alert(error.response.data.error); + discordWebhook: discordWebhook, + }) + 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 - }); + const response = await axios.post("/api/notifications/delete", { + id: id, + }) if (response.status === 200) { getNotifications() } } catch (error: any) { - alert(error.response.data.error); + alert(error.response.data.error) } } const getNotifications = async () => { try { - const response = await axios.post('/api/notifications/get', {}); + const response = await axios.post("/api/notifications/get", {}) if (response.status === 200 && response.data) { - setNotifications(response.data.notifications); + setNotifications(response.data.notifications) } - } - catch (error: any) { - alert(error.response.data.error); + } catch (error: any) { + alert(error.response.data.error) } } @@ -214,29 +203,28 @@ export default function Settings() { getNotifications() }, []) - const getNotificationText = async () => { try { - const response = await axios.post('/api/settings/get_notification_text', {}); + const response = await axios.post("/api/settings/get_notification_text", {}) if (response.status === 200) { if (response.data.notification_text) { - setNotificationText(response.data.notification_text); + setNotificationText(response.data.notification_text) } else { - setNotificationText("The application !name (!url) is now !status."); + setNotificationText("The application !name (!url) is now !status.") } } } catch (error: any) { - alert(error.response.data.error); + alert(error.response.data.error) } - }; + } const editNotificationText = async () => { try { - const response = await axios.post('/api/settings/notification_text', { - text: notificationText - }); + const response = await axios.post("/api/settings/notification_text", { + text: notificationText, + }) } catch (error: any) { - alert(error.response.data.error); + alert(error.response.data.error) } } @@ -403,209 +391,265 @@ export default function Settings() { - -
- +
+
+ +

Notifications

- +
- Set up Notifications to get notified when an application goes offline or online. + Set up notifications to get instantly alerted when an application changes status.
- - - - - - Add Notification - - setNotificationType(value)}> + + + + + SMTP + Telegram + Discord + - {notificationType === "smtp" && ( -
-
-
- - setSmtpHost(e.target.value)} - /> + {notificationType === "smtp" && ( +
+
+
+ + 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)} + /> +
+
+
-
- - setSmtpPort(Number(e.target.value))} - /> -
-
- -
- setSmtpSecure(checked)} - /> - -
- -
-
- - setSmtpUsername(e.target.value)} - /> -
- -
- - setSmtpPassword(e.target.value)} - /> -
- -
-
- + )} + + {notificationType === "telegram" && ( +
+
+ setSmtpFrom(e.target.value)} + type="text" + id="telegramToken" + placeholder="" + onChange={(e) => setTelegramToken(e.target.value)} />
- -
- +
+ setSmtpTo(e.target.value)} + type="text" + id="telegramChatId" + placeholder="" + onChange={(e) => setTelegramChatId(e.target.value)} />
-
-
- )} + )} - {notificationType === "telegram" && ( -
-
- - setTelegramToken(e.target.value)} /> + {notificationType === "discord" && ( +
+
+ + setDiscordWebhook(e.target.value)} + /> +
-
- - setTelegramChatId(e.target.value)} /> -
-
- )} + )} + + + + Cancel + Add + + + - {notificationType === "discord" && ( -
-
- - setDiscordWebhook(e.target.value)} /> -
-
- )} - - - - - Cancel - - Add - - - - - - - -
- -
-
- - Customize Notification Text - -
+ + + Customize Notification Text + +
-