feat: 알림 설정 개선 및 USD 환율 자동 적용

- 알림 권한 첫 부여 시 기본 설정 자동 적용 (2일전, 반복 알림 활성화)
- 반복 알림 설명 문구를 설정 상태에 따라 동적으로 변경
- USD 통화 구독에 대한 환율 자동 적용 기능 추가
- 설정 화면 텍스트 색상을 어두운 색상으로 변경하여 가독성 향상
- 광고 위젯 레이아웃 및 화면 간격 조정

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
JiWoong Sul
2025-07-14 18:01:17 +09:00
parent 111c519883
commit ddf735149a
9 changed files with 577 additions and 413 deletions

View File

@@ -66,19 +66,38 @@ class _FloatingNavigationBarState extends State<FloatingNavigationBar>
builder: (context, child) {
return Positioned(
bottom: 20,
left: 20,
right: 20,
left: 16,
right: 16,
height: 88,
child: Transform.translate(
offset: Offset(0, 100 * (1 - _animation.value)),
child: Opacity(
opacity: _animation.value,
child: GlassmorphismCard(
child: Stack(
children: [
// 흰색 배경 레이어 (완전 불투명)
Container(
decoration: BoxDecoration(
color: AppColors.surfaceColor,
borderRadius: BorderRadius.circular(24),
boxShadow: const [
BoxShadow(
color: AppColors.shadowBlack,
blurRadius: 20,
spreadRadius: -5,
offset: Offset(0, 10),
),
],
),
),
// 글래스모피즘 레이어 (시각적 효과)
GlassmorphismCard(
padding:
const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
borderRadius: 24,
blur: 10.0,
backgroundColor: Colors.transparent,
boxShadow: const [], // 그림자는 배경 레이어에서 처리
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
@@ -112,6 +131,8 @@ class _FloatingNavigationBarState extends State<FloatingNavigationBar>
],
),
),
],
),
),
),
);

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import '../providers/subscription_provider.dart';
import '../services/currency_util.dart';
import '../theme/app_colors.dart';
import 'animated_wave_background.dart';
import 'glassmorphism_card.dart';
@@ -35,9 +36,9 @@ class MainScreenSummaryCard extends StatelessWidget {
opacity: Tween<double>(begin: 0.0, end: 1.0).animate(
CurvedAnimation(parent: fadeController, curve: Curves.easeIn)),
child: Padding(
padding: const EdgeInsets.fromLTRB(20, 16, 20, 4),
padding: const EdgeInsets.fromLTRB(16, 23, 16, 12),
child: GlassmorphismCard(
borderRadius: 24,
borderRadius: 16,
blur: 15,
backgroundColor: AppColors.glassCard,
gradient: LinearGradient(
@@ -78,14 +79,49 @@ class MainScreenSummaryCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
'이번 달 총 구독 비용',
style: TextStyle(
color: AppColors
.darkNavy, // color.md 가이드: 밝은 배경 위 어두운 텍스트
fontSize: 15,
fontWeight: FontWeight.w500,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'이번 달 총 구독 비용',
style: TextStyle(
color: AppColors
.darkNavy, // color.md 가이드: 밝은 배경 위 어두운 텍스트
fontSize: 15,
fontWeight: FontWeight.w500,
),
),
FutureBuilder<String>(
future: CurrencyUtil.getExchangeRateInfo(),
builder: (context, snapshot) {
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
return Container(
padding: const EdgeInsets.symmetric(
horizontal: 8,
vertical: 4,
),
decoration: BoxDecoration(
color: const Color(0xFFE5F2FF),
borderRadius: BorderRadius.circular(4),
border: Border.all(
color: const Color(0xFFBFDBFE),
width: 1,
),
),
child: Text(
snapshot.data!,
style: const TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500,
color: Color(0xFF3B82F6),
),
),
);
}
return const SizedBox.shrink();
},
),
],
),
const SizedBox(height: 8),
Row(

View File

@@ -187,7 +187,7 @@ class _NativeAdWidgetState extends State<NativeAdWidget> {
// 광고 정상 노출
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: GlassmorphismCard(
borderRadius: 16,
blur: 10,