2022-11-09 02:24:29 +00:00
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:result_monad/result_monad.dart';
|
2022-11-10 02:02:26 +00:00
|
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
2022-11-09 02:24:29 +00:00
|
|
|
|
2023-01-24 00:56:04 +00:00
|
|
|
import '../friendica_client/friendica_client.dart';
|
2022-11-10 02:02:26 +00:00
|
|
|
import '../globals.dart';
|
|
|
|
import '../models/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 {
|
2023-02-24 21:36:20 +00:00
|
|
|
Credentials? _currentCredentials;
|
2022-11-10 02:02:26 +00:00
|
|
|
bool _loggedIn = false;
|
2022-11-09 02:24:29 +00:00
|
|
|
|
2023-02-24 21:36:20 +00:00
|
|
|
bool get loggedIn => _loggedIn && _currentCredentials != null;
|
|
|
|
|
|
|
|
Credentials get currentCredentials => _currentCredentials!;
|
2022-11-10 02:02:26 +00:00
|
|
|
|
|
|
|
Future<bool> getStoredLoginState() async {
|
|
|
|
final prefs = await SharedPreferences.getInstance();
|
|
|
|
return prefs.getBool('logged-in') ?? false;
|
|
|
|
}
|
|
|
|
|
|
|
|
FutureResult<FriendicaClient, ExecError> signIn(
|
|
|
|
Credentials credentials) async {
|
2023-02-24 22:53:48 +00:00
|
|
|
final client = ProfileClient(credentials);
|
2022-11-10 02:02:26 +00:00
|
|
|
final result = await client.getMyProfile();
|
|
|
|
if (result.isFailure) {
|
2023-02-24 19:50:14 +00:00
|
|
|
await clearCredentials();
|
2022-11-10 02:02:26 +00:00
|
|
|
return result.errorCast();
|
|
|
|
}
|
|
|
|
|
2023-02-24 19:50:14 +00:00
|
|
|
getIt<SecretsService>().storeCredentials(
|
|
|
|
client.credentials.copy(
|
|
|
|
userId: result.value.id,
|
|
|
|
avatar: result.value.avatarUrl,
|
|
|
|
),
|
|
|
|
);
|
2022-11-10 02:02:26 +00:00
|
|
|
await _setLoginState(true);
|
2023-02-24 21:36:20 +00:00
|
|
|
_currentCredentials = credentials;
|
2022-11-09 02:24:29 +00:00
|
|
|
notifyListeners();
|
2022-11-10 02:02:26 +00:00
|
|
|
return Result.ok(client);
|
2022-11-09 02:24:29 +00:00
|
|
|
}
|
|
|
|
|
2022-11-10 02:02:26 +00:00
|
|
|
Future signOut() async {
|
|
|
|
await _setLoginState(false);
|
2022-11-21 03:26:49 +00:00
|
|
|
getIt<TimelineManager>().clear();
|
2023-02-24 21:36:20 +00:00
|
|
|
_currentCredentials = null;
|
2022-11-09 02:24:29 +00:00
|
|
|
notifyListeners();
|
|
|
|
}
|
2022-11-10 02:02:26 +00:00
|
|
|
|
|
|
|
Future clearCredentials() async {
|
2023-02-24 21:36:20 +00:00
|
|
|
_currentCredentials = null;
|
2022-11-10 02:02:26 +00:00
|
|
|
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
|
|
|
}
|