사용자 화면 문구·표본 데이터 · 퀘스트 참여 흐름 · HOME 진입 구획 · 미니맵 · 공통 확인 창 배치 수정

This commit is contained in:
Sn-Kinos
2026-10-05 00:44:39 +09:00
parent c8d29d032b
commit 8a0297eb92
66 changed files with 1812 additions and 959 deletions
+10 -133
View File
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import '../../core/i18n/app_locale.dart';
import '../../core/push/push_messaging.dart';
import '../../core/theme/tokens.dart';
import '../../core/ui/app_dialog.dart';
import '../../core/ui/app_icons.dart';
import '../auth/auth.dart';
import '../auth/auth_repository.dart';
@@ -281,13 +282,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
await _notice(context.l10n.settingsSameEmailOnly);
case AuthFailed(:final code, :final message):
_toast('[$code] $message');
case AuthNotConfigured(:final missing):
_toast(
context.l10n.settingsLinkNotReady(
_snsName(context, provider),
missing.join(' · '),
),
);
case AuthNotConfigured():
_toast(context.l10n.settingsLinkNotReady(_snsName(context, provider)));
case AuthSucceeded() || AuthCancelled():
break;
}
@@ -344,19 +340,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
}
/// 안내 팝업(확인 하나) — 시안 `554:23103`.
Future<void> _notice(String message) => showDialog<void>(
context: context,
builder: (context) => _MyDialog(
title: message,
actions: [
_DialogButton(
label: context.l10n.commonConfirm,
filled: true,
onTap: () => Navigator.of(context).pop(),
),
],
),
);
Future<void> _notice(String message) => showAlertDialog(context, message);
/// 확인 팝업(취소 · 실행) — 시안 `554:24669` · `374:14364` · `554:23257`.
Future<bool> _confirm({
@@ -366,30 +350,18 @@ class _SettingsScreenState extends State<SettingsScreen> {
bool withdraw = false,
Future<void> Function()? onConfirm,
}) async {
final ok = await showDialog<bool>(
context: context,
builder: (context) => _MyDialog(
title: title,
body: body,
actions: [
_DialogButton(
label: context.l10n.commonCancel,
onTap: () => Navigator.of(context).pop(false),
),
_DialogButton(
label: action,
filled: true,
onTap: () => Navigator.of(context).pop(true),
),
],
),
final ok = await showConfirmDialog(
context,
title,
body: body,
confirmLabel: action,
);
if (ok == true && onConfirm != null) {
await onConfirm();
} else if (ok == true && withdraw && mounted) {
_toast(context.l10n.settingsWithdrawLater);
}
return ok ?? false;
return ok;
}
}
@@ -522,101 +494,6 @@ class _SnsRow extends StatelessWidget {
}
/// 팝업 — 바탕 #2d2d2d · 좌우 31.5 · 안쪽 24/16 · 제목 16/600 가운데 · 버튼 높이 48 간격 8.
class _MyDialog extends StatelessWidget {
const _MyDialog({required this.title, this.body, required this.actions});
final String title;
final String? body;
final List<Widget> actions;
@override
Widget build(BuildContext context) => Dialog(
insetPadding: const EdgeInsets.symmetric(horizontal: 31.5),
child: Padding(
padding: const EdgeInsets.fromLTRB(16, 24, 16, 24),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
title,
textAlign: TextAlign.center,
style: myText(16, FontWeight.w600),
),
if (body case final b?) ...[
const SizedBox(height: 16),
Text(
b,
textAlign: TextAlign.center,
style: myText(16, FontWeight.w500),
),
],
const SizedBox(height: 24),
Row(
children: [
for (final (i, a) in actions.indexed) ...[
if (i > 0) const SizedBox(width: 8),
Expanded(child: a),
],
],
),
],
),
),
);
}
class _DialogButton extends StatelessWidget {
const _DialogButton({
required this.label,
required this.onTap,
this.filled = false,
});
final String label;
final VoidCallback onTap;
final bool filled;
@override
Widget build(BuildContext context) {
final shape = RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppRadius.sm),
);
final text = Text(
label,
style: myText(
16,
FontWeight.w600,
height: 1,
color: filled ? AppColors.onCosmicAccent : AppColors.onCosmic,
),
);
return SizedBox(
height: 48,
child: filled
? FilledButton(
onPressed: onTap,
style: FilledButton.styleFrom(
minimumSize: const Size.fromHeight(48),
padding: EdgeInsets.zero,
backgroundColor: AppColors.cosmicAccent,
shape: shape,
),
child: text,
)
: OutlinedButton(
onPressed: onTap,
style: OutlinedButton.styleFrom(
minimumSize: const Size.fromHeight(48),
padding: EdgeInsets.zero,
side: const BorderSide(color: AppColors.onCosmic),
shape: shape,
),
child: text,
),
);
}
}
/// 언어 설정 시트 — 시안 `357:224379`: 제목 + 닫기 · 언어 목록(고른 것에 분홍 체크) · 「선택」.
class _LanguageSheet extends StatefulWidget {
const _LanguageSheet({required this.current});