From 53418cf41c90f198ab57a6a528b2dae13a3613fb Mon Sep 17 00:00:00 2001 From: minhtrannhat Date: Wed, 8 Jan 2025 12:00:00 -0500 Subject: [PATCH] feat(web): add login page --- web/app/login/page.tsx | 62 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 web/app/login/page.tsx diff --git a/web/app/login/page.tsx b/web/app/login/page.tsx new file mode 100644 index 0000000..a951269 --- /dev/null +++ b/web/app/login/page.tsx @@ -0,0 +1,62 @@ +'use client'; + +import { useState, FormEvent } from 'react'; +import { useRouter } from 'next/navigation'; +import { api } from '@/lib/api'; + +export default function LoginPage() { + const router = useRouter(); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + + const handleSubmit = async (e: FormEvent) => { + e.preventDefault(); + setError(''); + setLoading(true); + + try { + const response = await api.login(email, password); + localStorage.setItem('accessToken', response.accessToken); + localStorage.setItem('refreshToken', response.refreshToken); + localStorage.setItem('activeOrg', JSON.stringify(response.activeOrg)); + api.setAccessToken(response.accessToken); + router.push('/dashboard'); + } catch (err) { + setError(err instanceof Error ? err.message : 'Login failed'); + } finally { + setLoading(false); + } + }; + + return ( +
+

IncidentOps

+
+

Login

+ {error &&

{error}

} + setEmail(e.target.value)} + required + /> + setPassword(e.target.value)} + required + /> + +

+ Don't have an account? Register +

+
+
+ ); +}