import 'package:flutter/material.dart'; import 'package:sales_chat/models/user.dart'; import 'package:sales_chat/services/api_service.dart'; class AuthProvider with ChangeNotifier { final ApiService _apiService; User? _user; bool _isLoading = false; String? _error; AuthProvider(this._apiService); User? get user => _user; bool get isLoading => _isLoading; String? get error => _error; bool get isLoggedIn => _user != null; Future get isAuthenticated => _apiService.isAuthenticated; /// 使用邮箱/用户名和密码登录。 /// 至少提供其中一个 [email] 或 [username]。 Future login({ String? email, String? username, required String password, }) async { _isLoading = true; _error = null; notifyListeners(); try { final response = await _apiService.login( email: email, username: username, password: password, ); _user = response.user; _isLoading = false; notifyListeners(); return true; } catch (e) { _error = _parseError(e); _isLoading = false; notifyListeners(); return false; } } /// 以访客身份登录(临时用户)。 Future loginAsGuest({required String nickname}) async { _isLoading = true; _error = null; notifyListeners(); try { final response = await _apiService.createTemporaryUser(nickname: nickname); _user = response.user; _isLoading = false; notifyListeners(); return true; } catch (e) { _error = _parseError(e); _isLoading = false; notifyListeners(); return false; } } /// 注册新用户。 Future register({ String? username, String? email, String? nickname, required String password, }) async { _isLoading = true; _error = null; notifyListeners(); try { final response = await _apiService.register( username: username, email: email, nickname: nickname, password: password, ); _user = response.user; _isLoading = false; notifyListeners(); return true; } catch (e) { _error = _parseRegisterError(e); _isLoading = false; notifyListeners(); return false; } } Future logout() async { _isLoading = true; notifyListeners(); try { await _apiService.logout(); } finally { _user = null; _isLoading = false; notifyListeners(); } } Future loadUser() async { if (!await _apiService.isAuthenticated) return; _isLoading = true; notifyListeners(); try { _user = await _apiService.getCurrentUser(); } catch (e) { _user = null; } finally { _isLoading = false; notifyListeners(); } } void clearError() { _error = null; notifyListeners(); } String _parseError(dynamic e) { final errStr = e.toString(); if (errStr.contains('401')) { return 'Email/username or password incorrect'; } else if (errStr.contains('422') || errStr.contains('password')) { return 'Email/username or password incorrect'; } else if (errStr.contains('timeout')) { return 'Network timeout, please retry'; } else if (errStr.contains('SocketException')) { return 'Network connection failed'; } else if (errStr.contains('banned')) { return 'Account has been banned'; } return 'Login failed, please retry'; } String _parseRegisterError(dynamic e) { final errorStr = e.toString(); if (errorStr.contains('exist')) { return 'Username or email already exists'; } else if (errorStr.contains('empty')) { return 'Username or email is required'; } else if (errorStr.contains('timeout')) { return 'Network timeout, please retry'; } else if (errorStr.contains('SocketException')) { return 'Network connection failed'; } else if (errorStr.contains('not allowed')) { return 'Server does not allow new user registration'; } return 'Registration failed, please retry'; } }