템플릿마다 메인 대시보드 전체 테마(배경/타일/아이콘 색)가 같이 바뀌게 추가

용어 정리: 템플릿 = 상점에서 사는 색/애니메이션 상품, 테마 = 그 템플릿이
몰고 오는 화면 전체 디자인(배경색/타일색/아이콘색). 1단계로 메인 대시보드부터
적용 - 프로필 카드 그라데이션뿐 아니라 페이지 배경, 타일 카드 배경/테두리,
아이콘 동그라미 배경, 타일 아이콘 강조색, 제목/부제목 텍스트 색까지 장착한
템플릿에 맞춰 통째로 바뀐다. 잠긴/비활성 타일(NFC 미인증 등)은 기존처럼
중립 회색(sage)을 그대로 써서 상태 구분은 유지.

6개 기존 템플릿마다 직접 디자인한 테마(lib/theme/profile_themes.dart)를
새로 만들었고, 최고가 "갤럭시" 템플릿은 다른 5개와 달리 통째로 다크 테마로
디자인해 프리미엄 아이템 느낌을 살렸다.

백엔드 /api/shop/equipped가 템플릿 code를 같이 내려주도록 수정해서
프론트엔드가 code로 디자인해둔 테마를 찾아 쓸 수 있게 했다.
This commit is contained in:
2026-10-01 06:13:18 +00:00
parent edf0444b71
commit 0fc80eb5c5
3 changed files with 146 additions and 45 deletions
+4 -8
View File
@@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart' show Color;
import 'package:http/http.dart' as http;
import '../config.dart';
import '../theme/profile_themes.dart';
class ShopTemplate {
final int id;
@@ -125,9 +126,7 @@ class ProfileShopController extends ChangeNotifier {
/// 🏠 메인 대시보드 프로필 카드 렌더링 전용 - 상점 화면을 열지 않고도
/// 현재 장착 중인 테마 색상만 가볍게 조회한다.
static Future<(Color? primary, Color? secondary)> fetchEquippedColors(
String studentId,
) async {
static Future<ProfileTheme?> fetchEquippedTheme(String studentId) async {
try {
final url = Uri.parse(
'$baseUrl/api/shop/equipped?studentId=${Uri.encodeComponent(studentId)}',
@@ -136,15 +135,12 @@ class ProfileShopController extends ChangeNotifier {
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
if (data['equipped'] == true) {
return (
_parseColor(data['primaryColor'] as String),
_parseColor(data['secondaryColor'] as String),
);
return profileThemes[data['code'] as String?];
}
}
} catch (_) {
// 실패하면 그냥 기본 모습으로 보여준다.
}
return (null, null);
return null;
}
}