initial codex commit
Some checks failed
Release / build (push) Failing after 48s
Release / release-dev (push) Has been skipped
Release / release-master (push) Has been skipped
Release / windows-build (push) Has been cancelled

This commit is contained in:
2025-12-11 01:08:30 +00:00
parent e6d7e71a36
commit 40ee16d2d5
20 changed files with 2902 additions and 283 deletions

View File

@@ -1,9 +1,12 @@
import 'package:flutter/foundation.dart';
import 'package:mileograph_flutter/objects/objects.dart';
import 'package:mileograph_flutter/services/apiService.dart';
import 'package:shared_preferences/shared_preferences.dart';
class AuthService extends ChangeNotifier {
final ApiService api;
static const _tokenKey = 'auth_token';
bool _restoring = false;
AuthService({required this.api});
@@ -29,6 +32,7 @@ class AuthService extends ChangeNotifier {
access_token: accessToken,
email: email,
);
_persistToken(accessToken);
notifyListeners();
}
@@ -65,8 +69,66 @@ class AuthService extends ChangeNotifier {
);
}
Future<void> tryRestoreSession() async {
if (_restoring || _user != null) return;
_restoring = true;
try {
final prefs = await SharedPreferences.getInstance();
final token = prefs.getString(_tokenKey);
if (token == null || token.isEmpty) return;
final userResponse = await api.get(
'/users/me',
headers: {
'Authorization': 'Bearer $token',
'accept': 'application/json',
},
);
setLoginData(
userId: userResponse['user_id'],
username: userResponse['username'],
fullName: userResponse['full_name'],
accessToken: token,
email: userResponse['email'],
);
} catch (_) {
await _clearToken();
} finally {
_restoring = false;
}
}
Future<void> _persistToken(String token) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_tokenKey, token);
}
Future<void> _clearToken() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove(_tokenKey);
}
Future<void> register({
required String username,
required String email,
required String fullName,
required String password,
String inviteCode = '',
}) async {
final formData = {
'user_name': username,
'email': email,
'full_name': fullName,
'password': password,
'invitation_code': inviteCode,
'empty': '',
'empty2': '',
};
await api.postForm('/register', formData);
}
void logout() {
_user = null;
_clearToken();
notifyListeners();
}
}