import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:odoo_rpc/odoo_rpc.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../services/odoo_service.dart'; import 'loyalty_dashboard.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); bool _isLoading = false; final String _odooUrl = 'https://erp.mapan.co.id'; final String _odooDb = 'mapangroup_o19'; void _login() async { setState(() => _isLoading = true); try { final service = OdooService(); service.connect(_odooUrl); final session = await service.login( _odooDb, _usernameController.text.trim(), _passwordController.text.trim(), ); final prefs = await SharedPreferences.getInstance(); await prefs.setString('odoo_url', _odooUrl); final sessionJson = json.encode({ 'id': session.id, 'user_id': session.userId, 'partner_id': session.partnerId, 'user_login': session.userLogin, 'user_name': session.userName, 'user_lang': session.userLang, 'user_tz': session.userTz, 'is_system': session.isSystem, 'server_version': session.serverVersion, }); await prefs.setString('odoo_session', sessionJson); if (mounted) { Navigator.pushReplacement( context, MaterialPageRoute( builder: (_) => LoyaltyDashboard( partnerId: session.partnerId, ), ), ); } } on OdooException catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Login failed: ${e.message}')), ); } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Error: $e')), ); } finally { if (mounted) setState(() => _isLoading = false); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Login to Odoo')), body: Padding( padding: const EdgeInsets.all(24.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ TextField( controller: _usernameController, decoration: const InputDecoration( labelText: 'Email / Username', border: OutlineInputBorder(), ), ), const SizedBox(height: 12), TextField( controller: _passwordController, decoration: const InputDecoration( labelText: 'Password', border: OutlineInputBorder(), ), obscureText: true, ), const SizedBox(height: 24), SizedBox( height: 50, child: _isLoading ? const Center(child: CircularProgressIndicator()) : ElevatedButton( onPressed: _login, child: const Text('Login', style: TextStyle(fontSize: 18)), ), ), ], ), ), ); } }