diff --git a/app/dashboard/settings/Settings.tsx b/app/dashboard/settings/Settings.tsx index 665c7c3..7c7a7c7 100644 --- a/app/dashboard/settings/Settings.tsx +++ b/app/dashboard/settings/Settings.tsx @@ -27,10 +27,110 @@ import { AccordionItem, AccordionTrigger, } from "@/components/ui/accordion" +import { Input } from "@/components/ui/input" +import { 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 } from "lucide-react"; export default function Settings() { 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 changeEmail = async () => { + setEmailErrorVisible(false); + setEmailSuccess(false); + setEmailError(""); + + if (!email) { + setEmailError("Email is required"); + 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("Passwords do not match"); + setPasswordErrorVisible(true); + setTimeout(() => { + setPasswordErrorVisible(false); + setPasswordError(""); + }, 3000); + return; + } + if (!oldPassword || !password || !confirmPassword) { + setPasswordError("All fields are required"); + 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); + } + } return ( @@ -63,6 +163,104 @@ export default function Settings() { + User + +
Manage your user settings here. You can change your email, password, and other account settings.
+
+
+
Change Email
+ { emailErrorVisible && +
+ + + Error + + {emailError} + + +
+ } + { emailSuccess && +
+ + + Success + + Email changed successfully. + + +
+ } + setEmail(e.target.value)} + className="mb-2" + /> + +
+
+
Change Password
+ { passwordErrorVisible && +
+ + + Error + + {passwordError} + + +
+ } + { passwordSuccess && +
+ + + Success + + Password changed successfully. + + +
+ } + setOldPassword(e.target.value)} + className="mb-2" + /> + setPassword(e.target.value)} + className="mb-2" + /> + setConfirmPassword(e.target.value)} + className="mb-2" + /> + +
+
+
+
+ Theme
Select a theme for the application. You can choose between light, dark, or system theme.
diff --git a/package-lock.json b/package-lock.json index f295e81..b4859da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4545,6 +4545,21 @@ "optional": true } } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.0.tgz", + "integrity": "sha512-vHUQS4YVGJPmpjn7r5lEZuMhK5UQBNBRSB+iGDvJjaNk649pTIcRluDWNb9siunyLLiu/LDPHfvxBtNamyuLTw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } } }