relatica/lib/services/auth_service.dart

65 lines
1.8 KiB
Dart
Raw Normal View History

2022-11-09 02:24:29 +00:00
import 'package:flutter/foundation.dart';
import 'package:result_monad/result_monad.dart';
import 'package:shared_preferences/shared_preferences.dart';
2022-11-09 02:24:29 +00:00
import '../friendica_client/friendica_client.dart';
import '../globals.dart';
import '../models/auth/credentials.dart';
import '../models/exec_error.dart';
import 'secrets_service.dart';
2022-11-22 05:21:41 +00:00
import 'timeline_manager.dart';
2022-11-09 02:24:29 +00:00
class AuthService extends ChangeNotifier {
Credentials? _currentCredentials;
bool _loggedIn = false;
2022-11-09 02:24:29 +00:00
bool get loggedIn => _loggedIn && _currentCredentials != null;
Credentials get currentCredentials => _currentCredentials!;
Future<bool> getStoredLoginState() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getBool('logged-in') ?? false;
}
FutureResult<FriendicaClient, ExecError> signIn(
Credentials credentials) async {
final client = ProfileClient(credentials);
final result = await client.getMyProfile();
if (result.isFailure) {
await clearCredentials();
return result.errorCast();
}
getIt<SecretsService>().storeCredentials(
client.credentials.copy(
userId: result.value.id,
avatar: result.value.avatarUrl,
),
);
await _setLoginState(true);
_currentCredentials = credentials;
2022-11-09 02:24:29 +00:00
notifyListeners();
return Result.ok(client);
2022-11-09 02:24:29 +00:00
}
Future signOut() async {
await _setLoginState(false);
getIt<TimelineManager>().clear();
_currentCredentials = null;
2022-11-09 02:24:29 +00:00
notifyListeners();
}
Future clearCredentials() async {
_currentCredentials = null;
await _setLoginState(false);
notifyListeners();
}
Future<void> _setLoginState(bool state) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('logged-in', state);
_loggedIn = state;
}
2022-11-09 02:24:29 +00:00
}