laserscouter/lib/login.dart

142 lines
No EOL
3.9 KiB
Dart

import 'package:flutter/material.dart';
import 'core/api.dart';
import 'core/theme.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'eventpicker.dart';
import 'settings.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Login Page',
theme: laserTheme,
home: const LoginPage(),
);
}
}
class LoginPage extends StatefulWidget {
const LoginPage({super.key});
@override
State<LoginPage> createState() => _LoginPageState();}
class _LoginPageState extends State<LoginPage> {
final TextEditingController _teamNumberController = TextEditingController();
bool _isLoading = false;
@override
void initState() {
super.initState();
_loadSavedData();
}
Future<void> _loadSavedData() async {
final prefs = await SharedPreferences.getInstance();
if (mounted) {
_teamNumberController.text = prefs.getString('teamNumber') ?? '';
} }
Future<void> _saveData() async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('teamNumber', _teamNumberController.text);
}
@override
void dispose() {
_teamNumberController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Login'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset('assets/main.png', height: 100),
const SizedBox(height: 16.0),
TextField(
controller: _teamNumberController,
decoration: const InputDecoration(
labelText: 'Team Number',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 16.0),
ElevatedButton(
onPressed: _isLoading
? null
: () async {
final navigator = Navigator.of(context);
final scaffoldMessenger = ScaffoldMessenger.of(context);
setState(() {
_isLoading = true;
});
try {
await _saveData();
String teamNumber = _teamNumberController.text;
final result = await teamSearch(teamNumber);
navigator.push(
MaterialPageRoute(
builder: (context) => EventPicker(
eventNames: result.eventNames,
eventCodes: result.eventCodes,
),
),
);
} catch (e) {
scaffoldMessenger.showSnackBar(
SnackBar(content: Text('Error: ${e.toString()}')),
);
} finally {
if (mounted) {
setState(() {
_isLoading = false;
});
}
}
},
child: _isLoading
? const SizedBox(
height: 20,
width: 20,
child: CircularProgressIndicator(
strokeWidth: 2.0,
color: Colors.white,
),
)
: const Text('Login'),
),
const SizedBox(height: 8),
ElevatedButton(
onPressed: _isLoading
? null
: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SettingsPage(),
));
},
child: const Text('Settings'),
),
],
),
),
);
}
}