import 'package:flutter/material.dart'; import 'package:superport/core/errors/failures.dart'; import 'package:superport/data/models/auth/login_request.dart'; import 'package:superport/di/injection_container.dart'; import 'package:superport/services/auth_service.dart'; /// 로그인 화면의 상태 및 비즈니스 로직을 담당하는 ChangeNotifier 기반 컨트롤러 class LoginController extends ChangeNotifier { final AuthService _authService = inject(); /// 아이디 입력 컨트롤러 final TextEditingController idController = TextEditingController(); /// 비밀번호 입력 컨트롤러 final TextEditingController pwController = TextEditingController(); /// 아이디 입력란 포커스 final FocusNode idFocus = FocusNode(); /// 비밀번호 입력란 포커스 final FocusNode pwFocus = FocusNode(); /// 아이디 저장 여부 bool saveId = false; /// 로딩 상태 bool _isLoading = false; bool get isLoading => _isLoading; /// 에러 메시지 String? _errorMessage; String? get errorMessage => _errorMessage; /// 아이디 저장 체크박스 상태 변경 void setSaveId(bool value) { saveId = value; notifyListeners(); } /// 로그인 처리 Future login() async { // 입력값 검증 if (idController.text.trim().isEmpty) { _errorMessage = '이메일을 입력해주세요.'; notifyListeners(); return false; } if (pwController.text.isEmpty) { _errorMessage = '비밀번호를 입력해주세요.'; notifyListeners(); return false; } // 이메일 형식 검증 final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); if (!emailRegex.hasMatch(idController.text.trim())) { _errorMessage = '올바른 이메일 형식이 아닙니다.'; notifyListeners(); return false; } // 로딩 시작 _isLoading = true; _errorMessage = null; notifyListeners(); try { // 로그인 요청 final request = LoginRequest( email: idController.text.trim(), password: pwController.text, ); final result = await _authService.login(request); return result.fold( (failure) { _errorMessage = failure.message; _isLoading = false; notifyListeners(); return false; }, (loginResponse) { _isLoading = false; notifyListeners(); return true; }, ); } catch (e) { _errorMessage = '로그인 중 오류가 발생했습니다.'; _isLoading = false; notifyListeners(); return false; } } /// 에러 메시지 초기화 void clearError() { _errorMessage = null; notifyListeners(); } @override void dispose() { idController.dispose(); pwController.dispose(); idFocus.dispose(); pwFocus.dispose(); super.dispose(); } }