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.

47 lines
1.5KB

  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. var currentTime = DateTime.now().millisecondsSinceEpoch;
  18. var isNotExpired = (currentTime - (int.tryParse(expiredTime) ?? 0)) < ConstCommon.kExpiredTime;
  19. if (token.isNotEmpty && isNotExpired) {
  20. yield AuthenticationStatus.authenticated;
  21. } else {
  22. yield AuthenticationStatus.unauthenticated;
  23. }
  24. } catch (_) {
  25. yield AuthenticationStatus.unauthenticated;
  26. }
  27. yield* _controller.stream;
  28. }
  29. Future<User> signInWithCredentials(String username, String password) {
  30. final client = RestClient(dio);
  31. var result = client.login(UserRequest(username: username, password: password));
  32. return result;
  33. }
  34. void logOut() {
  35. _controller.add(AuthenticationStatus.unauthenticated);
  36. }
  37. void dispose() => _controller.close();
  38. }