import 'package:flutter/material.dart'; import 'package:mobile/models/user.dart'; import 'package:mobile/results.dart'; import 'package:mobile/server/server.dart'; class SessionController extends ChangeNotifier { final Server server; String? _sessionToken; User? _user; SessionController({required this.server}); Future> login(String email, String password) async { switch (await server.login(email, password)) { case Success(data: final token): _sessionToken = token; notifyListeners(); return const Ok(null); case Error(message: final message): notifyListeners(); return Err(message); } } Future _validateToken() async { final token = _sessionToken; if (token == null) { return; } final res = await server.sessionUser(token); switch (res) { case Success(): return; case Error(): _sessionToken = null; return; } } User? get user { loadUser(); return _user; } Future _notifyIfTokenChanged() async { final prev = _sessionToken; _validateToken(); if (prev != _sessionToken) { notifyListeners(); } } Future loadUser() async { final token = _sessionToken; if (token == null) { _user = null; return; } final res = await server.sessionUser(token); switch (res) { case Success(data: final user): _user = user; return; case Error(): _user = null; return; } } String? get sessionToken { _notifyIfTokenChanged(); return _sessionToken; } Future logout() async { final token = _sessionToken; if (token != null) { await server.logout(token); _sessionToken = null; } notifyListeners(); } }