Files
hub/frontend/lib/user_checker.dart
T

87 lines
2.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'backend.dart';
import 'login_screen.dart';
import 'chat_screen.dart';
import 'chat_list_screen.dart';
class UserChecker extends StatefulWidget {
@override
_UserCheckerState createState() => _UserCheckerState();
}
class _UserCheckerState extends State<UserChecker> {
String? username;
bool isLoading = true;
final _storage = const FlutterSecureStorage();
@override
void initState() {
super.initState();
_checkSavedCredentials();
}
Future<void> _checkSavedCredentials() async {
final savedUsername = await _storage.read(key: 'username');
final savedPassword = await _storage.read(key: 'password');
if (savedUsername != null && savedPassword != null) {
_handleLogin(savedUsername, savedPassword);
} else {
setState(() {
isLoading = false;
});
}
}
static void fetchChats(Function(List<int>) onSuccess) {
Backend.sendAction("get-chats", {}).then((response) {
print("chats response: $response");
List<dynamic> chatObjects = response['chats'];
List<int> chatIds = chatObjects.map((chat) => chat['id'] as int).toList();
onSuccess(chatIds);
});
}
void _handleLogin(String user, String password) async {
bool success = await Backend.auth(user, password);
if (!success) {
setState(() {
isLoading = false;
});
return;
}
setState(() {
username = user;
isLoading = true;
});
await _storage.write(key: 'username', value: user);
await _storage.write(key: 'password', value: password);
fetchChats((chatIds) {
if (chatIds.isEmpty) {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => ChatListScreen()),
);
} else {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => ChatScreen(chatId: chatIds.first)),
);
}
});
}
@override
Widget build(BuildContext context) {
print("Build UserChecker: $username $isLoading");
if (isLoading) {
return Center(child: CircularProgressIndicator());
}
return LoginScreen(onLogin: _handleLogin);
}
}