- AuthService, AuthRemoteDataSource 구현 - JWT 토큰 관리 (SecureStorage 사용) - 로그인 화면 API 연동 및 에러 처리 - freezed 패키지로 Auth 관련 DTO 모델 생성 - 의존성 주입 설정 업데이트
112 lines
2.9 KiB
Dart
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();
|
|
}
|
|
}
|