라이브 티커 · 갤럭시 검색 색인 · 주간 랭킹 스냅샷 · 연속 ZAP 상한 · 가입 행성 Zap · 성운 목표 · 랭킹 갱신 안내 · 행성 터치 반응

This commit is contained in:
Sn-Kinos
2026-10-05 22:38:42 +09:00
parent 000c058097
commit 4bb92c2ee7
44 changed files with 727 additions and 78 deletions
+24
View File
@@ -85,10 +85,21 @@ class GalaxySnapshot {
this.event,
this.joined = true,
this.memberships = const [],
this.joinedIds = const {},
});
final List<PlanetNode> planets;
/// 내가 가입한 모든 팬덤 ID(`users.fandomIds` + 대표). 10/3 통합회신 #10 「다른 가입 팬덤에서도 Zap」 —
/// 갤럭시에서 고른 행성이 여기에 있으면 그 행성에 Zap 한다.
final Set<String> joinedIds;
/// Zap 이 향할 행성 — 고른 행성이 가입 팬덤이면 그 행성, 아니면 대표 행성(상세정의 5장 「B팬덤 Zap 은 B행성에 귀속」).
PlanetNode? zapTargetFor(PlanetNode? selected) =>
selected != null && (selected.isMine || joinedIds.contains(selected.id))
? selected
: mine;
/// 가입하거나 만든 행성/성운 — 최신 가입순(명세 §2.58 「행성/성운 모아보기」).
/// [PlanetNode.isMine] 이 대표 팬덤(C-15)이다.
final List<PlanetNode> memberships;
@@ -138,6 +149,7 @@ class GalaxySnapshot {
event: event,
joined: joined,
memberships: memberships,
joinedIds: joinedIds,
);
}
}
@@ -181,6 +193,9 @@ abstract interface class GalaxyRepository {
/// 대표 팬덤 변경 — `fn-primary-fandom-set`(원장 C-15). 30일 대기 중이면
/// E-FDM-04 로 거부된다.
Future<void> setPrimary(String fandomId);
/// 행성 이름 검색 — Figma 「Galaxy_검색」(`353:217832`). 맵에 올라온 행성만이 아니라 **전체** 행성에서 찾는다.
Future<List<PlanetNode>> search(String query);
}
/// 서버가 붙기 전까지 쓰는 표본. **정책값이 아니다.**
@@ -192,6 +207,15 @@ class SampleGalaxyRepository implements GalaxyRepository {
@override
Future<void> setPrimary(String fandomId) async {}
@override
Future<List<PlanetNode>> search(String query) async {
final q = query.trim().toLowerCase();
return [
for (final p in (await load()).planets)
if (q.isNotEmpty && p.name.toLowerCase().contains(q)) p,
];
}
/// 표본은 원장이 없으므로 잔액을 돌려주지 않는다. 화면은 -1 을 「모름」으로 읽는다.
@override
Future<ZapResult> zap({