You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.7KB

  1. import 'dart:async';
  2. import 'package:farm_tpf/custom_model/user.dart';
  3. import 'package:farm_tpf/custom_model/user_request.dart';
  4. import 'package:farm_tpf/data/api/dio_provider.dart';
  5. import 'package:farm_tpf/data/api/rest_client.dart';
  6. import 'package:farm_tpf/utils/const_common.dart';
  7. import 'package:farm_tpf/utils/pref.dart';
  8. enum AuthenticationStatus { unknown, authenticated, unauthenticated }
  9. class AuthenticationRepository {
  10. final _controller = StreamController<AuthenticationStatus>();
  11. final dio = DioProvider.instance();
  12. final pref = LocalPref();
  13. Stream<AuthenticationStatus> get status async* {
  14. try {
  15. var token = await pref.getString(DATA_CONST.TOKEN_KEY);
  16. var expiredTime = await pref.getString(DATA_CONST.EXPIRED_TIME);
  17. int currentTime = DateTime.now().millisecondsSinceEpoch;
  18. bool isNotExpired =
  19. (currentTime - int.tryParse(expiredTime)) < ConstCommon.kExpiredTime;
  20. if (token.isNotEmpty && isNotExpired) {
  21. yield AuthenticationStatus.authenticated;
  22. } else {
  23. yield AuthenticationStatus.unauthenticated;
  24. }
  25. } catch (_) {
  26. yield AuthenticationStatus.unauthenticated;
  27. }
  28. yield* _controller.stream;
  29. }
  30. Future<User> signInWithCredentials(String username, String password) {
  31. final client = RestClient(dio);
  32. var result =
  33. client.login(UserRequest(username: username, password: password));
  34. return result;
  35. }
  36. void logOut() {
  37. pref.saveString(DATA_CONST.TOKEN_KEY, "");
  38. pref.saveString(DATA_CONST.PUSH_KEY, "");
  39. pref.saveString(DATA_CONST.CURRENT_FULL_NAME, "");
  40. _controller.add(AuthenticationStatus.unauthenticated);
  41. }
  42. void dispose() => _controller.close();
  43. }