로그인 4종(Google·Apple·Kakao·LINE) 전환 · 이메일 가입 비노출 · 계정 연결 · STATION 탭 비노출 플래그
This commit is contained in:
@@ -11,8 +11,10 @@ class AuthRepository extends ChangeNotifier {
|
||||
AuthRepository({
|
||||
List<SocialAuthProvider>? providers,
|
||||
AuthSession? session,
|
||||
EmailAuthProvider? qaEmailProvider,
|
||||
bool? releaseMode,
|
||||
}) : providers = providers ?? _defaultProviders(),
|
||||
_qaEmail = qaEmailProvider ?? const EmailPasswordProvider(),
|
||||
_session = session,
|
||||
_account = session?.currentAccount,
|
||||
// 기본값은 실제 빌드 모드. 테스트에서만 주입해 릴리스 동작을 재현한다
|
||||
@@ -23,21 +25,28 @@ class AuthRepository extends ChangeNotifier {
|
||||
|
||||
final bool _releaseMode;
|
||||
final AuthSession? _session;
|
||||
final EmailAuthProvider _qaEmail;
|
||||
StreamSubscription<AuthAccount?>? _sessionSubscription;
|
||||
|
||||
/// 로그인 화면에 그릴 제공자 목록. 순서는 시안 S-A-LOGIN 버튼 순서다.
|
||||
/// 로그인 화면에 그릴 제공자 목록. **여기 없는 수단은 사용자가 닿을 수 없다.**
|
||||
final List<SocialAuthProvider> providers;
|
||||
|
||||
AuthAccount? _account;
|
||||
AuthAccount? get account => _account;
|
||||
bool get isSignedIn => _account != null;
|
||||
|
||||
/// 정책 설계서 §P-01 확정 5종. **순서가 화면 버튼 순서다.**
|
||||
/// **별첨 B v1.4 확정 4종.** 순서가 회신 문구 순서이자 화면 버튼 순서다.
|
||||
///
|
||||
/// 네이버가 빠지고 이메일·LINE 이 들어왔다(답변서 Q7). 카카오·LINE 은 개발자
|
||||
/// 콘솔 앱 등록에 발주사 사업자 정보가 필요해 아직 키가 없다.
|
||||
/// > 1차 로그인은 Google / Apple / Kakao / LINE 4종입니다. 이메일/비밀번호 가입 및
|
||||
/// > X 로그인은 제외합니다.
|
||||
///
|
||||
/// **이메일은 여기 없다.** 목록에 없으면 화면이 버튼을 그리지 않고, 버튼이 없으면
|
||||
/// 사용자가 닿는 경로가 없다 — 읽는 분기가 없는 기능 플래그로 닫는 것보다 확실하다.
|
||||
/// QA 경로는 [qaEmailProvider] 하나뿐이다.
|
||||
///
|
||||
/// Apple·카카오·LINE 은 발주사 키가 없어 「키 대기」 상태다. 눌러도 예외가 아니라
|
||||
/// [AuthNotConfigured] 가 돌아오고 화면이 안내 다이얼로그를 띄운다.
|
||||
static List<SocialAuthProvider> _defaultProviders() => [
|
||||
const EmailPasswordProvider(),
|
||||
const GoogleSignInProvider(),
|
||||
AppleSignInProvider(
|
||||
webAuthenticationOptions: appleWebAuthenticationOptionsFromEnvironment(),
|
||||
@@ -49,21 +58,23 @@ class AuthRepository extends ChangeNotifier {
|
||||
lineProvider,
|
||||
];
|
||||
|
||||
/// 이메일 제공자. 화면이 입력 폼을 띄우기 전에 있는지 확인한다.
|
||||
EmailAuthProvider? get emailProvider {
|
||||
for (final p in providers) {
|
||||
if (p is EmailAuthProvider) return p;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/// QA 계정(qa-test@fanuzu.co.kr) 전용 이메일 로그인 — **디버그 빌드에서만**.
|
||||
///
|
||||
/// 별첨 B v1.4 가 이메일/비밀번호 가입을 1차 범위에서 뺐다. 그래도 발주사가
|
||||
/// 로그인 이후 화면을 확인하려면 실 계정 하나로 들어갈 수단이 필요해 코드를
|
||||
/// 남겼고, 릴리스 빌드에서는 null 이라 부를 수 있는 경로 자체가 없다.
|
||||
///
|
||||
/// [isMockSessionAvailable] 과 같은 이유로 빌드 모드로 막는다 — 릴리스
|
||||
/// 산출물에 내부 우회 입구가 새어 나가면 안 된다.
|
||||
EmailAuthProvider? get qaEmailProvider => _releaseMode ? null : _qaEmail;
|
||||
|
||||
/// 이메일 로그인·가입. 결과가 성공이면 세션을 갈아 끼운다.
|
||||
/// QA 이메일 로그인·가입. 결과가 성공이면 세션을 갈아 끼운다.
|
||||
Future<AuthOutcome> signInWithEmail({
|
||||
required String email,
|
||||
required String password,
|
||||
bool signUp = false,
|
||||
}) async {
|
||||
final impl = emailProvider;
|
||||
final impl = qaEmailProvider;
|
||||
if (impl == null) {
|
||||
return const AuthFailed('E-AUTH-03', '이메일 로그인을 쓸 수 없습니다.');
|
||||
}
|
||||
@@ -81,7 +92,14 @@ class AuthRepository extends ChangeNotifier {
|
||||
}
|
||||
|
||||
Future<AuthOutcome> signIn(SocialProvider provider) async {
|
||||
final impl = providers.firstWhere((p) => p.provider == provider);
|
||||
final impl = providers.firstWhere(
|
||||
(p) => p.provider == provider,
|
||||
orElse: () => throw ArgumentError.value(
|
||||
provider,
|
||||
'provider',
|
||||
'노출 목록에 없는 로그인 수단이다 (별첨 B v1.4 확정 4종)',
|
||||
),
|
||||
);
|
||||
late final AuthOutcome outcome;
|
||||
try {
|
||||
outcome = await impl.signIn();
|
||||
|
||||
Reference in New Issue
Block a user