128 lines
3.1 KiB
Dart
128 lines
3.1 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:get/get.dart';
|
||
import 'package:groceries_manager/db/database.dart';
|
||
import 'package:groceries_manager/services/db_service.dart';
|
||
import 'package:groceries_manager/services/toaster_service.dart';
|
||
|
||
enum LoginState {
|
||
idle,
|
||
loading,
|
||
}
|
||
|
||
class LoginController extends GetxController {
|
||
final loginController = TextEditingController();
|
||
final passwordController = TextEditingController();
|
||
|
||
final anyUserExists = false.obs;
|
||
|
||
final loginState = LoginState.idle.obs;
|
||
|
||
@override
|
||
void onInit() {
|
||
super.onInit();
|
||
|
||
init();
|
||
}
|
||
|
||
Future<void> init() async {
|
||
loginState.value = LoginState.loading;
|
||
|
||
anyUserExists.value = await DBService.to.db.anyUserExists();
|
||
|
||
loginState.value = LoginState.idle;
|
||
}
|
||
|
||
@override
|
||
void onClose() {
|
||
loginController.dispose();
|
||
passwordController.dispose();
|
||
super.onClose();
|
||
}
|
||
|
||
String sanitize(String value) {
|
||
return value.replaceAll(RegExp(r'[^а-яА-Яa-zA-Z0-9]'), '');
|
||
}
|
||
|
||
Future<void> register() async {
|
||
final login = loginController.text;
|
||
final password = passwordController.text;
|
||
|
||
if (login.isEmpty || password.isEmpty) {
|
||
ToasterService.to.error(
|
||
title: "Ошибка",
|
||
message: "Логин и пароль не могут быть пустыми",
|
||
);
|
||
return;
|
||
}
|
||
|
||
loginState.value = LoginState.loading;
|
||
|
||
final UserData? user;
|
||
try {
|
||
user = await DBService.to.db.addUser(
|
||
login: login,
|
||
password: password,
|
||
);
|
||
} catch (e) {
|
||
ToasterService.to.error(
|
||
title: "Ошибка",
|
||
message: "Пользователь с таким логином уже существует",
|
||
);
|
||
return;
|
||
}
|
||
|
||
loginState.value = LoginState.idle;
|
||
|
||
if (user == null) {
|
||
ToasterService.to.error(
|
||
title: "Ошибка",
|
||
message: "Пользователь с таким логином уже существует",
|
||
);
|
||
return;
|
||
}
|
||
|
||
ToasterService.to.success(
|
||
title: "Успех",
|
||
message: "Пользователь успешно зарегистрирован",
|
||
);
|
||
|
||
Get.offAllNamed("/", arguments: user);
|
||
}
|
||
|
||
Future<void> login() async {
|
||
final login = loginController.text;
|
||
final password = passwordController.text;
|
||
|
||
if (login.isEmpty || password.isEmpty) {
|
||
ToasterService.to.error(
|
||
title: "Ошибка",
|
||
message: "Логин и пароль не могут быть пустыми!",
|
||
);
|
||
return;
|
||
}
|
||
|
||
loginState.value = LoginState.loading;
|
||
|
||
final user = await DBService.to.db.findUser(
|
||
login: login,
|
||
password: password,
|
||
);
|
||
|
||
loginState.value = LoginState.idle;
|
||
|
||
if (user == null) {
|
||
ToasterService.to.error(
|
||
title: "Ошибка",
|
||
message: "Пользователь с такой связкой данных не существует!",
|
||
);
|
||
return;
|
||
}
|
||
|
||
ToasterService.to.success(
|
||
title: "Успех",
|
||
message: "Привет, ${user.login}!",
|
||
);
|
||
|
||
Get.offAllNamed("/", arguments: user);
|
||
}
|
||
}
|