MIF_E31230910_MP-HRIS-MOBILE/lib/screens/auth/login_screen.dart

129 lines
4.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../core/error_handler.dart';
import '../../core/theme.dart';
import '../../providers/auth_provider.dart';
import '../../services/fcm_service.dart';
import '../../widgets/atoms/custom_text_field.dart';
import '../../widgets/atoms/custom_button.dart';
class LoginScreen extends StatefulWidget {
const LoginScreen({super.key});
@override
State<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
final _formKey = GlobalKey<FormState>();
@override
void dispose() {
_emailController.dispose();
_passwordController.dispose();
super.dispose();
}
void _handleLogin() async {
if (_formKey.currentState!.validate()) {
final success = await context.read<AuthProvider>().login(
_emailController.text,
_passwordController.text,
);
if (success && mounted) {
await FcmService().initialize(context);
if (mounted) Navigator.pushReplacementNamed(context, '/onboarding/check');
} else if (mounted) {
ErrorHandler.showError(context.read<AuthProvider>().errorMessage ?? 'Login Failed');
}
}
}
@override
Widget build(BuildContext context) {
final isLoading = context.watch<AuthProvider>().isLoading;
return Scaffold(
backgroundColor: AppTheme.bgWhite,
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: AppTheme.spacingLg),
child: Center(
child: SingleChildScrollView(
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(height: AppTheme.spacingXl),
Image.asset(
'assets/images/logo.png',
height: 80,
width: 200,
fit: BoxFit.contain,
),
const SizedBox(height: AppTheme.spacingXxl),
Align(
alignment: Alignment.centerLeft,
child: Text(
"Masuk ke Akun",
style: AppTheme.heading3,
),
),
const SizedBox(height: AppTheme.spacingLg),
CustomTextField(
label: "Email",
hint: "Masukkan Email Anda",
controller: _emailController,
keyboardType: TextInputType.emailAddress,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Email tidak boleh kosong';
}
return null;
},
),
const SizedBox(height: AppTheme.spacingMd),
CustomTextField(
label: "Password",
hint: "Masukkan Password",
controller: _passwordController,
isPassword: true,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Password tidak boleh kosong';
}
return null;
},
),
const SizedBox(height: AppTheme.spacingXl),
CustomButton(
text: "Masuk",
onPressed: _handleLogin,
isLoading: isLoading,
type: ButtonType.primary,
),
const SizedBox(height: AppTheme.spacingXl),
],
),
),
),
),
),
),
);
}
}