퀘스트 제목 다국어 · HOME 다시 읽기 · 내 퀘스트 검토 중·반려됨 구분

This commit is contained in:
Sn-Kinos
2026-10-06 01:22:28 +09:00
parent cf3dd06774
commit 83d9c1e8d4
10 changed files with 139 additions and 26 deletions
@@ -9,7 +9,7 @@ import 'package:flutter/painting.dart' show Color;
import 'home_data.dart';
import '../inside/inside_repository_firestore.dart' show insideQuestionFrom;
import '../quest/quest_data.dart' show QuestType;
import '../quest/quest_repository_firestore.dart' show openTimeAttack, questToday;
import '../quest/quest_repository_firestore.dart' show openTimeAttack, questTitle, questToday;
import '../../core/i18n/app_locale.dart';
/// 홈의 실 서버 구현 — 화면 대조 원장 F1.
@@ -426,7 +426,7 @@ class FirestoreHomeRepository implements HomeRepository {
);
final started = count > 0;
return QuestSummary(
title: quest.strOr('title'),
title: questTitle(quest),
type: QuestType.parse(quest.strOr('type')),
category: QuestType.parse(quest.strOr('type')).label,
rewardPop: openTimeAttack(quest)?.rewardPop ??
+26 -2
View File
@@ -57,6 +57,19 @@ import 'widgets/briefing_share.dart';
///
/// 값은 [HomeRepository] 가 준다. 지금은 [SampleHomeRepository] 라 서버 없이 뜨고,
/// 5주차 Firestore 연동 때 구현체만 바꾼다.
/// HOME 을 다시 읽으라는 신호 — 포그라운드 Push 수신 · 위에 띄운 화면이 닫힘 · HOME 탭 복귀.
/// HOME 은 진입 때 한 번 읽어서 타임어택 발동 Push · 후원 뒤에도 카드가 낡아 있었다(10/6 실기기).
/// ponytail: 어느 화면이 닫혀도 HOME 을 한 번 다시 읽는다. 읽기 비용이 문제면 HOME 이 보일 때만.
final ValueNotifier<int> homeRefreshSignal = ValueNotifier(0);
/// 페이지(시트 · 대화상자 제외)가 닫히면 [homeRefreshSignal] 을 울린다. 루트 · HOME 탭 내비게이터에 하나씩.
class HomeRefreshObserver extends NavigatorObserver {
@override
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
if (route is PageRoute) homeRefreshSignal.value++;
}
}
class HomeScreen extends StatefulWidget {
const HomeScreen({
super.key,
@@ -97,7 +110,7 @@ class HomeScreen extends StatefulWidget {
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
late Future<HomeSnapshot> _snapshot;
Future<GalaxySnapshot>? _galaxy;
ZapController? _zap;
@@ -113,13 +126,22 @@ class _HomeScreenState extends State<HomeScreen> {
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
homeRefreshSignal.removeListener(_refresh);
_zap?.dispose();
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) _refresh();
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
homeRefreshSignal.addListener(_refresh);
_snapshot = widget.repository.load();
if (widget.galaxyRepository case final repository?) {
_galaxy = repository.load();
@@ -156,6 +178,7 @@ class _HomeScreenState extends State<HomeScreen> {
}
Future<void> _refresh() async {
if (!mounted) return;
final next = widget.repository.load();
setState(() => _snapshot = next);
await next;
@@ -176,7 +199,8 @@ class _HomeScreenState extends State<HomeScreen> {
body: FutureBuilder<HomeSnapshot>(
future: _snapshot,
builder: (context, snap) {
if (snap.connectionState != ConnectionState.done) {
// 다시 읽는 동안은 앞 데이터를 그대로 둔다 — 화면이 스피너로 깜빡이지 않게.
if (snap.connectionState != ConnectionState.done && !snap.hasData) {
return const Center(child: CircularProgressIndicator());
}
if (snap.hasError) {