select_friend_view.dart 5.2 KB
import 'package:doublefeel_flutter/core/theme/app_colors.dart';
import 'package:doublefeel_flutter/core/util/size_extensions.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import '../controllers/friends_controller.dart';
import '../controllers/select_friend_logic.dart';
import '../widgets/friend_health_card.dart';

class SelectFriendView extends StatefulWidget {
  const SelectFriendView({super.key, required this.friendsController});

  final FriendsController friendsController;

  @override
  State<SelectFriendView> createState() => _SelectFriendViewState();
}

class _SelectFriendViewState extends State<SelectFriendView> {
  late final SelectFriendLogic _logic;

  @override
  void initState() {
    super.initState();
    _logic = SelectFriendLogic(widget.friendsController);
    _logic.initialize();
  }

  @override
  void dispose() {
    _logic.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      decoration: BoxDecoration(
        color: const Color(0xFFF5F2FF),
        borderRadius: BorderRadius.vertical(top: Radius.circular(12.dp)),
      ),
      child: Stack(
        children: [
          Column(
            children: [
              _SelectFriendHeader(onClose: () => Get.back<void>()),
              Expanded(
                child: Obx(() {
                  if (widget.friendsController.isLoading.value &&
                      _logic.friends.isEmpty) {
                    return const Center(child: CircularProgressIndicator());
                  }

                  final selectedIndex = _logic.selectedIndex.value;
                  return ListView.separated(
                    padding: EdgeInsets.fromLTRB(
                      16.dp,
                      0,
                      16.dp,
                      118.dp + MediaQuery.viewPaddingOf(context).bottom,
                    ),
                    itemBuilder: (context, index) {
                      final friend = _logic.friends[index];
                      final isSelected = selectedIndex == index;
                      return FriendHealthCard(
                        name: friend.name,
                        updatedAt: friend.updatedAt,
                        sleepQualityScore: friend.sleepQualityScore,
                        steps: friend.steps,
                        statusText: friend.statusText,
                        stressValue: friend.stressValue,
                        isOnWatchFace: friend.isOnWatchFace,
                        isSelected: isSelected,
                        showCheckbox: true,
                        onTap: () => _logic.selectFriendAt(index),
                      );
                    },
                    separatorBuilder: (_, __) => SizedBox(height: 12.dp),
                    itemCount: _logic.friends.length,
                  );
                }),
              ),
            ],
          ),
          Positioned(
            left: 49.dp,
            right: 49.dp,
            bottom: 36.dp + MediaQuery.viewPaddingOf(context).bottom,
            child: _SyncButton(onTap: _syncSelectedFriend),
          ),
        ],
      ),
    );
  }

  void _syncSelectedFriend() {
    if (_logic.syncSelectedFriendToWatchFace()) {
      Get.back<void>();
    }
  }
}

class _SelectFriendHeader extends StatelessWidget {
  const _SelectFriendHeader({required this.onClose});

  final VoidCallback onClose;

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: 56.dp,
      child: Row(
        children: [
          Padding(
            padding: EdgeInsets.only(left: 22.dp),
            child: GestureDetector(
              onTap: onClose,
              behavior: HitTestBehavior.opaque,
              child: SizedBox(
                width: 40.dp,
                height: 40.dp,
                child: const Center(
                  child: Icon(
                    Icons.close,
                    color: AppColors.primary,
                    size: 20,
                  ),
                ),
              ),
            ),
          ),
          const Expanded(
            child: Center(
              child: Text(
                '选择好友',
                style: TextStyle(
                  color: AppColors.textPrimary,
                  fontSize: 16,
                  fontWeight: FontWeight.w600,
                  height: 1.4,
                ),
              ),
            ),
          ),
          SizedBox(width: 62.dp),
        ],
      ),
    );
  }
}

class _SyncButton extends StatelessWidget {
  const _SyncButton({required this.onTap});

  final VoidCallback onTap;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onTap,
      behavior: HitTestBehavior.opaque,
      child: Container(
        height: 48.dp,
        alignment: Alignment.center,
        decoration: BoxDecoration(
          color: AppColors.primary,
          borderRadius: BorderRadius.circular(24.dp),
        ),
        child: const Text(
          '选择并同步至表盘',
          style: TextStyle(
            color: Colors.white,
            fontSize: 16,
            fontWeight: FontWeight.w600,
            height: 1.4,
          ),
        ),
      ),
    );
  }
}