today_tab.dart 12 KB
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:table_calendar/table_calendar.dart';

import '../../controllers/home_controller.dart';
import '../../controllers/today_controller.dart';
import '../../widgets/today/today_date_strip.dart';
import '../../widgets/today/today_hrv_ad_banner.dart';
import '../../widgets/today/today_hrv_number_card.dart';
import '../../widgets/today/today_hrv_chart_card.dart';
import '../../widgets/today/today_actions_card.dart';
import '../../widgets/today/premium_card.dart';

class TodayTab extends GetView<TodayController> {
  const TodayTab({super.key});

  static const _bgColor = Color(0xFFF2F2F7);
  static const _h1 = Color(0xFF0F0F11);

  @override
  Widget build(BuildContext context) {
    final homeCtrl = Get.find<HomeController>();

    return Container(
      color: _bgColor,
      child: Stack(
        children: [
          CustomScrollView(
            physics: const ClampingScrollPhysics(),
            slivers: [
              SliverToBoxAdapter(
                child: SizedBox(
                  height: 323,
                  child: PageView.builder(
                    itemCount: 10,
                    itemBuilder: (context, index) {
                      return Container(
                        decoration: BoxDecoration(
                          gradient: LinearGradient(
                            begin: Alignment.topCenter,
                            end: Alignment.bottomCenter,
                            colors: [
                              const Color(0xFFC5B0FF),
                              const Color(0xFFF5F2FF)
                            ],
                          ),
                        ),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.end,
                          children: [
                            Text('Page $index'),
                            Text('Page $index'),
                            Text('Page $index'),
                            Text(
                              'Hi, 你今日的综合压力状态',
                              textAlign: TextAlign.center,
                              style: TextStyle(
                                color: const Color(0xFF78787D),
                                fontSize: 14,
                                fontWeight: FontWeight.w500,
                              ),
                            ),
                            Text(
                              '状态正常',
                              textAlign: TextAlign.center,
                              style: TextStyle(
                                color: const Color(0xFF0F0F11),
                                fontSize: 28,
                                fontWeight: FontWeight.w500,
                              ),
                            ),
                            Container(
                              width: 220,
                              height: 14,
                              margin: EdgeInsets.only(bottom: 36),
                              decoration: ShapeDecoration(
                                shape: RoundedRectangleBorder(
                                    borderRadius: BorderRadius.circular(7)),
                              ),
                              child: Stack(
                                children: [
                                  Positioned(
                                    left: 0,
                                    top: 0,
                                    child: Opacity(
                                      opacity: 0.50,
                                      child: Container(
                                        width: 20,
                                        height: 14,
                                        decoration: ShapeDecoration(
                                          color: const Color(0xFFFF5279),
                                          shape: RoundedRectangleBorder(
                                              borderRadius:
                                                  BorderRadius.circular(7)),
                                        ),
                                      ),
                                    ),
                                  ),
                                  Positioned(
                                    left: 24,
                                    top: 0,
                                    child: Opacity(
                                      opacity: 0.50,
                                      child: Container(
                                        width: 20,
                                        height: 14,
                                        decoration: ShapeDecoration(
                                          color: const Color(0xFFFF9A6E),
                                          shape: RoundedRectangleBorder(
                                              borderRadius:
                                                  BorderRadius.circular(7)),
                                        ),
                                      ),
                                    ),
                                  ),
                                  Positioned(
                                    left: 48,
                                    top: 0,
                                    child: Container(
                                      width: 148,
                                      height: 14,
                                      decoration: ShapeDecoration(
                                        color: const Color(0xFF7B9BFB),
                                        shape: RoundedRectangleBorder(
                                            borderRadius:
                                                BorderRadius.circular(7)),
                                      ),
                                    ),
                                  ),
                                  Positioned(
                                    left: 200,
                                    top: 0,
                                    child: Opacity(
                                      opacity: 0.50,
                                      child: Container(
                                        width: 20,
                                        height: 14,
                                        decoration: ShapeDecoration(
                                          color: const Color(0xFF3BD39C),
                                          shape: RoundedRectangleBorder(
                                              borderRadius:
                                                  BorderRadius.circular(7)),
                                        ),
                                      ),
                                    ),
                                  ),
                                ],
                              ),
                            )
                          ],
                        ),
                      );
                    },
                  ),
                ),
              ),
              // ── 各内容卡片 ──
              SliverPadding(
                padding: const EdgeInsets.symmetric(horizontal: 16),
                sliver: SliverList(
                  delegate: SliverChildListDelegate([
                    Obx(() {
                      final isVip = Get.find<UserPreferencesStorage>()
                              .preferences
                              .value
                              .vipInfo
                              ?.isVip ??
                          false;
                      if (isVip) return const SizedBox.shrink();
                      return const PremiumCard();
                    }),
                    // 1. HRV 表盘引导 Banner
                    const TodayHrvAdBanner(),
                    const SizedBox(height: 12),

                    // 3. HRV + 心率数字卡
                    const TodayHrvNumberCard(),
                    const SizedBox(height: 12),

                    // 4. HRV 趋势图
                    const TodayHrvChartCard(),
                    const SizedBox(height: 12),
                    Container(
                      padding: const EdgeInsets.fromLTRB(20, 20, 20, 16),
                      margin: const EdgeInsets.only(bottom: 12),
                      decoration: BoxDecoration(
                        color: Colors.white,
                        borderRadius: BorderRadius.circular(16),
                      ),
                      child: Text(
                        '立即测量HRV',
                        style: TextStyle(
                          color: const Color(0xFF0F0F11),
                          fontSize: 16,
                          fontWeight: FontWeight.w600,
                        ),
                      ),
                    ),
                    // 5. 每日行动
                    const TodayActionsCard(),

                    // 底部安全间距(留给 TabBar 高度)
                    const SizedBox(height: 180),
                  ]),
                ),
              ),
            ],
          ),
          Positioned(
            top: 0,
            left: 0,
            right: 0,
            height: 106 + MediaQuery.of(context).padding.top,
            child: Container(
              color: const Color(0xFFDDD2FF).withValues(alpha: 0.9),
            ),
          ),
          Positioned(
            top: MediaQuery.of(context).padding.top,
            left: 0,
            right: 0,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                Container(
                  height: 48,
                  padding:
                      const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
                  child: Row(
                    children: [
                      Text(
                        '今日',
                        textAlign: TextAlign.center,
                        style: TextStyle(
                          color: const Color(0xFF0F0F11),
                          fontSize: 24,
                          fontWeight: FontWeight.w600,
                        ),
                      ),
                      const Spacer(),
                      // Pro 折扣徽章
                      Container(
                        width: 95,
                        height: 28.6,
                        decoration: BoxDecoration(
                          color: const Color(0xFFFFDF51),
                          borderRadius: BorderRadius.circular(27.6),
                        ),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          crossAxisAlignment: CrossAxisAlignment.center,
                          children: [
                            // Pro 皇冠图标
                            const Icon(
                              Icons.workspace_premium,
                              size: 20,
                              color: Color(0xFF0F0F11),
                            ),
                            const SizedBox(width: 2),
                            const Text(
                              '20%优惠',
                              style: TextStyle(
                                fontSize: 14,
                                fontWeight: FontWeight.w500,
                                color: Color(0xFF0F0F11),
                              ),
                            ),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
                TableCalendar(
                  calendarFormat: CalendarFormat.week,
                  headerVisible: false,
                  focusedDay: DateTime.now(),
                  firstDay: DateTime(2026),
                  lastDay: DateTime(2027),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  bool _isSameDay(DateTime a, DateTime b) =>
      a.year == b.year && a.month == b.month && a.day == b.day;
}