diff --git a/LocalMind-Frontend/src/shared/component/v1/LoginPage.tsx b/LocalMind-Frontend/src/shared/component/v1/LoginPage.tsx index bad77e1..d3189a7 100644 --- a/LocalMind-Frontend/src/shared/component/v1/LoginPage.tsx +++ b/LocalMind-Frontend/src/shared/component/v1/LoginPage.tsx @@ -1,266 +1,83 @@ import React, { useState } from 'react' -import { Link, useNavigate } from 'react-router-dom' -import robotImg from '../../../assets/login.png' -import React, { useState, useEffect } from 'react' -import { Link, useNavigate } from 'react-router-dom' -import robotImg from '../../../assets/robot.png' -import aiImg from '../../../assets/Artificial intelligence.png' -import apiService from '../../../core/api.service' +import { useNavigate } from 'react-router-dom' -const LoginPage: React.FC = () => { - const navigate = useNavigate() - const glowStyles = ` - @keyframes glow { - 0%, 100% { filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.5)); } - 50% { filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.8)); } - } - .logo-glow { - animation: glow 3s ease-in-out infinite; - } - ` +interface ApiService { + login: ( + email: string, + password: string + ) => Promise<{ success: boolean; data?: unknown; error?: string }> +} + +interface LoginPageProps { + apiService: ApiService +} + +const LoginPage: React.FC = ({ apiService }) => { const [email, setEmail] = useState('') const [password, setPassword] = useState('') - const [rememberMe, setRememberMe] = useState(false) - const [loading, setLoading] = useState(false) - const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState('') - const [success, setSuccess] = useState('') - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault() - setError('') - setSuccess('') - setLoading(true) - - try { - const response = await fetch('/api/v1/user/login', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ email, password }), - }) - - const data = await response.json() - - if (!response.ok) { - setError(data.message || 'Login failed. Please try again.') - setLoading(false) - return - } - - // Store token in localStorage - if (data.data?.token) { - localStorage.setItem('token', data.data.token) - localStorage.setItem('user', JSON.stringify(data.data.user || {})) - - // Store remember me preference - if (rememberMe) { - localStorage.setItem('rememberMe', 'true') - localStorage.setItem('savedEmail', email) - } - - setSuccess('Login successful! Redirecting...') - - // Redirect after brief delay - setTimeout(() => { - navigate('/dashboard') - }, 1000) - } - } catch (err) { - setError('An error occurred. Please check your connection and try again.') - console.error('Login error:', err) - } finally { - setLoading(false) - } - } - setIsLoading(true) + const navigate = useNavigate() + const handleLogin = async () => { try { + setError('') const response = await apiService.login(email, password) - if (!response.success) { - throw new Error(response.message || 'Login failed. Please try again.') - } - - setSuccess('Login successful! Redirecting...') - - // Store token if provided - if (response.data?.token) { - localStorage.setItem('authToken', response.data.token) - } - - // Store user info if remember me is checked - if (rememberMe) { - localStorage.setItem('rememberedEmail', email) + if (response.success) { + navigate('/dashboard') } else { - localStorage.removeItem('rememberedEmail') + setError(response.error || 'Login failed') } - - // Redirect to dashboard after a short delay - setTimeout(() => { - navigate('/dashboard') - }, 1000) - } catch (err: any) { - setError(err.message || 'An error occurred during login. Please try again.') - console.error('Login error:', err) - } finally { - setIsLoading(false) + } catch (err) { + setError('An error occurred during login') + console.error(err) } } - // Load remembered email on component mount - useEffect(() => { - const rememberedEmail = localStorage.getItem('rememberedEmail') - if (rememberedEmail) { - setEmail(rememberedEmail) - setRememberMe(true) - } - }, []) - Artificial Intelligence Logo - - -
- {/* Left Section */} -
-

- Welcome Back -

-

- Sign in to your account to continue -

- -
- {/* Error Message */} - {error && ( -
-

{error}

-
- {error} -
- )} - - {/* Success Message */} - {success && ( -
-

{success}

-
- {success} -
- )} - - {/* Email Input */} -
- - setEmail(e.target.value)} - placeholder="you@example.com" - className="w-full px-4 py-2.5 bg-[#2a2a2a] border border-gray-600 rounded-lg text-sm sm:text-base text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:border-transparent transition disabled:opacity-50" - required - disabled={loading} - disabled={isLoading} - /> -
- - {/* Password Input */} -
- - setPassword(e.target.value)} - placeholder="••••••••" - className="w-full px-4 py-2.5 bg-[#2a2a2a] border border-gray-600 rounded-lg text-sm sm:text-base text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:border-transparent transition disabled:opacity-50" - required - disabled={loading} - disabled={isLoading} - /> - - {/* Remember Me & Forgot Password */} -
- - - Forgot password? - -
-
- - {/* Submit Button */} - - + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault() + handleLogin() + } -

- Don't have an account?{' '} - - Create Account - -

+ return ( +
+
+

Login

+ + {error &&
{error}
} + +
+ + setEmail(e.target.value)} + className="w-full bg-zinc-700 text-white px-4 py-2 rounded" + required + />
- {/* Right Section */} -
- Robot +
+ + setPassword(e.target.value)} + className="w-full bg-zinc-700 text-white px-4 py-2 rounded" + required + />
-
+ + +
) }