import 'dart:async'; import 'package:farm_tpf/custom_model/user.dart'; import 'package:farm_tpf/custom_model/user_request.dart'; import 'package:farm_tpf/data/api/dio_provider.dart'; import 'package:farm_tpf/data/api/rest_client.dart'; import 'package:farm_tpf/utils/const_common.dart'; import 'package:farm_tpf/utils/pref.dart'; enum AuthenticationStatus { unknown, authenticated, unauthenticated } class AuthenticationRepository { final _controller = StreamController(); final dio = DioProvider.instance(); final pref = LocalPref(); Stream get status async* { try { var token = await pref.getString(DATA_CONST.TOKEN_KEY); var expiredTime = await pref.getString(DATA_CONST.EXPIRED_TIME); int currentTime = DateTime.now().millisecondsSinceEpoch; bool isNotExpired = (currentTime - int.tryParse(expiredTime)) < ConstCommon.kExpiredTime; if (token.isNotEmpty && isNotExpired) { yield AuthenticationStatus.authenticated; } else { yield AuthenticationStatus.unauthenticated; } } catch (_) { yield AuthenticationStatus.unauthenticated; } yield* _controller.stream; } Future signInWithCredentials(String username, String password) { final client = RestClient(dio); var result = client.login(UserRequest(username: username, password: password)); return result; } void logOut() { pref.saveString(DATA_CONST.TOKEN_KEY, ""); pref.saveString(DATA_CONST.PUSH_KEY, ""); _controller.add(AuthenticationStatus.unauthenticated); } void dispose() => _controller.close(); }