mirror of
https://github.com/crocofied/CoreControl.git
synced 2025-12-20 17:07:19 +00:00
Last Login saved & Success Messages
This commit is contained in:
parent
7551b0b494
commit
db7af1eba3
@ -39,6 +39,17 @@ export async function POST(request: NextRequest) {
|
||||
|
||||
const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: body.remember ? "7d" : "1h" });
|
||||
|
||||
const lastLogin = new Date();
|
||||
|
||||
await prisma.user.update({
|
||||
where: {
|
||||
id: user.id,
|
||||
},
|
||||
data: {
|
||||
lastLogin,
|
||||
},
|
||||
});
|
||||
|
||||
return NextResponse.json({ message: "Login successful", token }, { status: 200 });
|
||||
|
||||
} catch (error: any) {
|
||||
|
||||
46
components/Success.tsx
Normal file
46
components/Success.tsx
Normal file
@ -0,0 +1,46 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect } from "react";
|
||||
|
||||
type SuccessToastProps = {
|
||||
message: string;
|
||||
show: boolean;
|
||||
onClose: () => void;
|
||||
};
|
||||
|
||||
export default function SuccessToast({ message, show, onClose }: SuccessToastProps) {
|
||||
useEffect(() => {
|
||||
if (show) {
|
||||
const timer = setTimeout(() => {
|
||||
onClose();
|
||||
}, 5000);
|
||||
return () => clearTimeout(timer);
|
||||
}
|
||||
}, [show, onClose]);
|
||||
|
||||
if (!show) return null;
|
||||
|
||||
return (
|
||||
<div className="toast toast-end">
|
||||
<div className="alert alert-success alert-soft">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className="h-6 w-6 shrink-0 stroke-current"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
strokeWidth="2"
|
||||
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"
|
||||
/>
|
||||
</svg>
|
||||
<div>
|
||||
<span className="font-bold">SUCCESS: </span>
|
||||
<span>{message}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -3,11 +3,13 @@
|
||||
import { useState } from 'react';
|
||||
import axios from 'axios';
|
||||
import Cookies from 'js-cookie';
|
||||
import SuccessToast from '../Success';
|
||||
|
||||
export const PasswordSettings = ({ onError }: { onError: (message: string) => void }) => {
|
||||
const [oldPassword, setOldPassword] = useState('');
|
||||
const [password, setPassword] = useState('');
|
||||
const [passwordConfirm, setPasswordConfirm] = useState('');
|
||||
const [success, setSuccess] = useState('');
|
||||
|
||||
const handleSave = async () => {
|
||||
if (password !== passwordConfirm) return onError('Passwords do not match');
|
||||
@ -23,12 +25,17 @@ export const PasswordSettings = ({ onError }: { onError: (message: string) => vo
|
||||
if (response.data.message !== 'Password updated successfully') {
|
||||
onError('Failed to update password');
|
||||
}
|
||||
setSuccess('Password updated successfully');
|
||||
setOldPassword('');
|
||||
setPassword('');
|
||||
setPasswordConfirm('');
|
||||
} catch (error: any) {
|
||||
onError(error.response?.data?.error || 'An error occurred');
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className="w-full bg-base-200 p-4 rounded-2xl border border-stone-800">
|
||||
<h2 className="text-lg font-bold">Password Settings</h2>
|
||||
<p className="text-sm opacity-70">Manage your password</p>
|
||||
@ -70,5 +77,7 @@ export const PasswordSettings = ({ onError }: { onError: (message: string) => vo
|
||||
Save Changes
|
||||
</button>
|
||||
</div>
|
||||
<SuccessToast message={success} show={success !== ''} onClose={() => setSuccess('')} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user