온보딩 닉네임을 소셜 계정 표시 이름으로 미리 채움

This commit is contained in:
Sn-Kinos
2026-10-06 18:39:00 +09:00
parent e9e4260e2c
commit 363c74736c
4 changed files with 50 additions and 2 deletions
+16 -1
View File
@@ -1,6 +1,9 @@
import 'package:flutter/widgets.dart' show StringCharacters;
import 'package:cloud_firestore/cloud_firestore.dart';
import '../../core/data/backend.dart';
import '../my/my_data.dart'
show nicknameMaxLength, nicknameMinLength, nicknameReserved;
/// 온보딩 6단계(10/3 통합회신 1항 · 해석 확인 Q-OB-02 A · FR-CMN-03~08)가 서버와 주고받는 것.
abstract interface class OnboardingRepository {
@@ -41,6 +44,16 @@ class OnboardingFandom {
final bool nebula;
}
/// 소셜 계정 표시 이름을 닉네임 칸 기본값으로 — 해석 확인 Q-E11 임시값.
/// 닉네임 규칙(2~20자 · 사칭 금지어)에 걸리면 빈칸이다. 길이는 글자(grapheme) 기준.
String suggestedNickname(String? providerName) {
final n = (providerName ?? '').trim();
final len = n.characters.length;
return len < nicknameMinLength || len > nicknameMaxLength || nicknameReserved(n)
? ''
: n;
}
/// 계정이 온보딩을 거쳐야 하는가 — 서버에 가입 약관 동의(`termsAgreedAt`)가 없으면 그렇다.
/// 트리거가 아직 사용자 문서를 만들지 않았어도(갓 생성된 계정) 그렇다.
Future<bool> needsOnboardingFirestore(String uid) async {
@@ -67,7 +80,9 @@ class FirestoreOnboardingRepository implements OnboardingRepository {
final nickname = data['nickname'];
final country = data['countryCode'];
return (
nickname: nickname is String ? nickname : '',
nickname: nickname is String && nickname.isNotEmpty
? nickname
: suggestedNickname(_backend.providerDisplayName),
country: country is String && country.isNotEmpty ? country : null,
);
}