2025-08-01 18:27:40 +07:00

151 lines
4.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:enaklo_pos/data/datasources/auth_local_datasource.dart';
import 'package:flutter_svg/flutter_svg.dart';
import '../../core/assets/assets.gen.dart';
import '../../core/components/buttons.dart';
import '../../core/components/custom_text_field.dart';
import '../../core/components/spaces.dart';
import '../../core/constants/colors.dart';
import '../home/pages/dashboard_page.dart';
import 'bloc/login/login_bloc.dart';
class LoginPage extends StatefulWidget {
const LoginPage({super.key});
@override
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final emailController = TextEditingController();
final passwordController = TextEditingController();
bool isPasswordVisible = false;
@override
void dispose() {
emailController.dispose();
passwordController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
padding: const EdgeInsets.symmetric(horizontal: 260.0, vertical: 20.0),
children: [
const SpaceHeight(80.0),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 130.0),
child: SvgPicture.asset(
Assets.icons.homeResto.path,
width: 100,
height: 100,
color: AppColors.primary,
)),
const SpaceHeight(24.0),
const Center(
child: Text(
'Apskel POS',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w700,
color: Colors.black,
),
),
),
const SpaceHeight(8.0),
const Center(
child: Text(
'Akses Login Kasir Resto',
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w400,
color: Colors.grey,
),
),
),
const SpaceHeight(40.0),
CustomTextField(
controller: emailController,
label: 'Email',
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
),
const SpaceHeight(12.0),
CustomTextField(
controller: passwordController,
label: 'Password',
obscureText: !isPasswordVisible,
textInputAction: TextInputAction.done,
suffixIcon: InkWell(
onTap: () => setState(() {
isPasswordVisible = !isPasswordVisible;
}),
child: Icon(
isPasswordVisible
? Icons.visibility_outlined
: Icons.visibility_off_outlined,
color: Colors.grey,
size: 20,
),
),
),
const SpaceHeight(24.0),
BlocListener<LoginBloc, LoginState>(
listener: (context, state) {
state.maybeWhen(
orElse: () {},
success: (authResponseModel) {
AuthLocalDataSource().saveAuthData(authResponseModel);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => const DashboardPage(),
),
);
},
error: (message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(message),
backgroundColor: AppColors.red,
),
);
},
);
},
child: BlocBuilder<LoginBloc, LoginState>(
builder: (context, state) {
return state.maybeWhen(
orElse: () {
return Button.filled(
onPressed: () {
context.read<LoginBloc>().add(
LoginEvent.login(
email: emailController.text,
password: passwordController.text,
),
);
},
label: 'Masuk',
);
},
loading: () {
return const Center(
child: CircularProgressIndicator(),
);
},
);
},
),
),
],
),
);
}
}