feat: add Remember Me checkbox with 15-day auto-logout
This commit is contained in:
1 parent
52fd7e7c00
commit
a3bdb11ad7
2 files changed
+41
No files matched your search
@@ -8,6 +8,7 @@ export default function Login() {
|
||||
const [password, setPassword] = useState('');
|
||||
const [confirmPassword, setConfirmPassword] = useState('');
|
||||
const [isSignup, setIsSignup] = useState(false);
|
||||
const [rememberMe, setRememberMe] = useState(false);
|
||||
const [error, setError] = useState('');
|
||||
const [loading, setLoading] = useState(false);
|
||||
const { login, signup } = useAuth();
|
||||
@@ -31,6 +32,12 @@ export default function Login() {
|
||||
} else {
|
||||
try {
|
||||
await login(email, password);
|
||||
// Store remember me timestamp if checked
|
||||
if (rememberMe) {
|
||||
localStorage.setItem('rememberMeTimestamp', Date.now().toString());
|
||||
} else {
|
||||
localStorage.removeItem('rememberMeTimestamp');
|
||||
}
|
||||
} catch (err: unknown) {
|
||||
setError(err instanceof Error ? err.message : 'An error occurred');
|
||||
}
|
||||
@@ -90,6 +97,20 @@ export default function Login() {
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
{!isSignup && (
|
||||
<div className="flex items-center">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="rememberMe"
|
||||
checked={rememberMe}
|
||||
onChange={(e) => setRememberMe(e.target.checked)}
|
||||
className="w-4 h-4 rounded border-gray-600 bg-gray-700 text-blue-600 focus:ring-2 focus:ring-blue-500 cursor-pointer"
|
||||
/>
|
||||
<label htmlFor="rememberMe" className="ml-2 text-sm text-gray-300 cursor-pointer">
|
||||
Remember me for 15 days
|
||||
</label>
|
||||
</div>
|
||||
)}
|
||||
<button
|
||||
type="submit"
|
||||
disabled={loading}
|
||||
|
||||
@@ -26,6 +26,25 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
|
||||
const unsubscribe = onAuthStateChanged(auth, (user) => {
|
||||
if (mounted) {
|
||||
// Check if "Remember Me" has expired (15 days)
|
||||
if (user) {
|
||||
const rememberMeTimestamp = localStorage.getItem('rememberMeTimestamp');
|
||||
if (rememberMeTimestamp) {
|
||||
const fifteenDaysInMs = 15 * 24 * 60 * 60 * 1000;
|
||||
const now = Date.now();
|
||||
const loginTime = parseInt(rememberMeTimestamp, 10);
|
||||
|
||||
if (now - loginTime > fifteenDaysInMs) {
|
||||
// More than 15 days have passed, logout
|
||||
localStorage.removeItem('rememberMeTimestamp');
|
||||
signOut(auth);
|
||||
setUser(null);
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setUser(user);
|
||||
setLoading(false);
|
||||
}
|
||||
@@ -58,6 +77,7 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
};
|
||||
|
||||
const logout = async () => {
|
||||
localStorage.removeItem('rememberMeTimestamp');
|
||||
await signOut(auth);
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user