File-Drive-App-Frontend/lib/controllers/session_controller.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();
}
}