Files
superport/lib/screens/login/controllers/login_controller.dart
JiWoong Sul c573096d84 feat: API 인증 시스템 구현 및 로그인 화면 연동
- AuthService, AuthRemoteDataSource 구현
- JWT 토큰 관리 (SecureStorage 사용)
- 로그인 화면 API 연동 및 에러 처리
- freezed 패키지로 Auth 관련 DTO 모델 생성
- 의존성 주입 설정 업데이트
2025-07-24 15:14:53 +09:00

112 lines
2.9 KiB
Dart

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<AuthService>();
/// 아이디 입력 컨트롤러
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<bool> 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();
}
}