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.6KB

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