63 lines
1.6 KiB
Dart
63 lines
1.6 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
import '../models/user_profile.dart';
|
|
import '../services/api_client.dart';
|
|
import '../services/token_store.dart';
|
|
|
|
enum SessionStatus { loading, signedOut, signedIn }
|
|
|
|
class SessionController extends ChangeNotifier {
|
|
SessionController(this.api, this.tokens);
|
|
final ApiClient api;
|
|
final TokenStore tokens;
|
|
SessionStatus status = SessionStatus.loading;
|
|
UserProfile? user;
|
|
|
|
Future<void> initialize() async {
|
|
final minimumSplash = Future<void>.delayed(
|
|
const Duration(milliseconds: 1100),
|
|
);
|
|
final token = await tokens.read();
|
|
if (token == null) {
|
|
status = SessionStatus.signedOut;
|
|
} else {
|
|
try {
|
|
user = await api.me();
|
|
status = SessionStatus.signedIn;
|
|
} catch (_) {
|
|
await tokens.clear();
|
|
status = SessionStatus.signedOut;
|
|
}
|
|
}
|
|
await minimumSplash;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> login(String username, String password) async {
|
|
final result = await api.login(username, password);
|
|
await tokens.write(result.token);
|
|
user = result.user;
|
|
status = SessionStatus.signedIn;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> register(Map<String, dynamic> input) async {
|
|
final result = await api.register(input);
|
|
await tokens.write(result.token);
|
|
user = result.user;
|
|
status = SessionStatus.signedIn;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> logout() async {
|
|
await tokens.clear();
|
|
user = null;
|
|
status = SessionStatus.signedOut;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> deleteAccount(String password) async {
|
|
await api.deleteAccount(password);
|
|
await logout();
|
|
}
|
|
}
|