import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../state/app_state.dart'; import '../utils/colors.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _emailCtrl = TextEditingController(); final _passwordCtrl = TextEditingController(); String? _error; bool _loading = false; @override void dispose() { _emailCtrl.dispose(); _passwordCtrl.dispose(); super.dispose(); } Future _submit() async { final email = _emailCtrl.text.trim(); final password = _passwordCtrl.text; if (email.isEmpty || password.isEmpty) { setState(() => _error = 'Email dan password harus diisi'); return; } setState(() { _loading = true; _error = null; }); final state = context.read(); final err = await state.login(email, password); if (mounted) { setState(() => _loading = false); if (err != null) { setState(() => _error = err); } } } @override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: SingleChildScrollView( padding: EdgeInsets.only( left: 24, right: 24, top: 24, bottom: MediaQuery.of(context).viewInsets.bottom + 24, ), child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 400), child: Column( children: [ const SizedBox(height: 80), Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: kAccent.withValues(alpha: 0.15), shape: BoxShape.circle, ), child: const Icon(Icons.storefront_rounded, size: 48, color: kAccent), ), const SizedBox(height: 24), Text( 'Dutra Store', style: TextStyle( fontSize: 28, fontWeight: FontWeight.w800, color: kText, ), ), const SizedBox(height: 8), Text( 'Masuk untuk melanjutkan', style: TextStyle(color: kMuted, fontSize: 14), ), const SizedBox(height: 32), TextField( controller: _emailCtrl, keyboardType: TextInputType.emailAddress, style: const TextStyle(color: kText), decoration: const InputDecoration( labelText: 'Email', prefixIcon: Icon(Icons.email_outlined, color: kMuted), ), ), const SizedBox(height: 16), TextField( controller: _passwordCtrl, obscureText: true, style: const TextStyle(color: kText), decoration: const InputDecoration( labelText: 'Password', prefixIcon: Icon(Icons.lock_outlined, color: kMuted), ), ), if (_error != null) ...[ const SizedBox(height: 12), Text(_error!, style: const TextStyle(color: kDanger, fontSize: 13)), ], const SizedBox(height: 24), SizedBox( width: double.infinity, child: FilledButton( onPressed: _loading ? null : _submit, child: _loading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Color(0xFF1A1206)), ) : const Text('Masuk'), ), ), ], ), ), ), ), ); } }