Files
listenmeister/lib/pages/login.dart
2025-10-26 19:55:33 +01:00

89 lines
2.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:listenmeister/main.dart';
class LoginPage extends StatefulWidget {
const LoginPage({super.key});
@override
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final TextEditingController _emailCtl = TextEditingController();
final TextEditingController _pwCtl = TextEditingController();
bool _isRegister = false;
bool _loading = false;
String? _error;
Future<void> _submit() async {
setState(() {
_loading = true;
_error = null;
});
try {
final String email = _emailCtl.text.trim();
final String password = _pwCtl.text.trim();
if (_isRegister) {
await apiService.register(email, password);
} else {
await apiService.login(email, password);
}
} catch (e) {
setState(() => _error = e.toString());
} finally {
if (mounted) {
setState(() => _loading = false);
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(_isRegister ? 'Registrierung' : 'Login')),
body: Padding(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _emailCtl,
decoration: const InputDecoration(labelText: 'Email'),
keyboardType: TextInputType.emailAddress,
),
const SizedBox(height: 8),
TextField(
controller: _pwCtl,
decoration: const InputDecoration(labelText: 'Passwort'),
obscureText: true,
),
const SizedBox(height: 20),
if (_error != null) ...[
Text(
_error!,
style: TextStyle(color: Theme.of(context).colorScheme.error),
),
const SizedBox(height: 12),
],
ElevatedButton(
onPressed: _loading ? null : _submit,
child: _loading
? const CircularProgressIndicator()
: Text(_isRegister ? 'Registrieren' : 'Einloggen'),
),
TextButton(
onPressed: _loading
? null
: () => setState(() => _isRegister = !_isRegister),
child: Text(
_isRegister ? 'Ich habe schon ein Konto' : 'Neu registrieren',
),
),
],
),
),
);
}
}