bind_partner_view.dart 10.3 KB
import 'package:doublefeel_flutter/app/widget/dash_divider.dart';
import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'package:get/get.dart';

import '../../../../l10n/l10n_extensions.dart';
import '../controllers/bind_partner_controller.dart';

class BindPartnerView extends GetView<BindPartnerController> {
  const BindPartnerView({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      resizeToAvoidBottomInset: true,
      body: PopScope(
        canPop: false,
        child: Stack(
          children: [
            _buildGradientBackground(),
            Container(
              padding:
                  EdgeInsets.only(top: MediaQuery.paddingOf(context).top + 4),
              child: ListView(
                physics: const ClampingScrollPhysics(),
                children: [
                  _buildTitle(context),
                  SizedBox(height: 28),
                  _buildCardArea(context),
                  SizedBox(height: 58),
                  _buildSkipButton(context),
                ],
              ),
            ),
            Positioned(
              top: MediaQuery.paddingOf(context).top + 92,
              left: 0,
              child: Opacity(
                opacity: 0.40,
                child: Container(
                  width: 133,
                  height: 124,
                  decoration: BoxDecoration(color: const Color(0xFFFF0000)),
                ),
              ),
            ),
            Positioned(
              top: MediaQuery.paddingOf(context).top + 532,
              right: 0,
              child: Opacity(
                opacity: 0.40,
                child: Container(
                  width: 133,
                  height: 124,
                  decoration: BoxDecoration(color: const Color(0xFFFF0000)),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  /// 渐变背景
  Widget _buildGradientBackground() {
    return Positioned.fill(
      child: Container(
        decoration: const BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topCenter,
            end: Alignment.bottomCenter,
            stops: [0.0, 0.25, 0.75, 1.0],
            colors: [
              Color(0xFFE6DBFF),
              Color(0xFFEDE4FF),
              Color(0xFFEEE6FF),
              Color(0xFFF9F6FF),
            ],
          ),
        ),
      ),
    );
  }

  /// 标题文字
  Widget _buildTitle(BuildContext context) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 37),
      child: Text(
        context.l10n.bindPartnerTitle,
        textAlign: TextAlign.center,
        style: TextStyle(
          fontSize: 20,
          fontWeight: FontWeight.w600,
          color: context.colors.textPrimary,
          height: 1.4,
        ),
      ),
    );
  }

  Widget _buildCardArea(BuildContext context) {
    return Container(
      margin: EdgeInsets.symmetric(horizontal: 24),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(20),
        boxShadow: [
          BoxShadow(
            color: context.colors.primary.withValues(alpha: 0.08),
            blurRadius: 24,
            offset: const Offset(0, 8),
          ),
        ],
      ),
      child: Column(
        children: [
          SizedBox(height: 28),
          _buildMyInfoSection(context),
          SizedBox(height: 40),
          _buildOrDivider(context),
          SizedBox(height: 28),
          _buildInputSection(context),
          SizedBox(height: 16),
          // 继续按钮
          Container(
            padding: EdgeInsets.symmetric(horizontal: 32),
            child: Obx(() {
              return _buildPrimaryButton(
                label: context.l10n.continueButton,
                onTap: controller.onSubmitPartnerId,
                enabled: controller.canSubmit && !controller.isSubmitting.value,
                isLoading: controller.isSubmitting.value,
                primaryColor: context.colors.chartOrange,
              );
            }),
          ),
          SizedBox(height: 40),
        ],
      ),
    );
  }

  Widget _buildMyInfoSection(BuildContext context) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 32),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          // 标签
          Text(
            context.l10n.bindPartnerMyId,
            style: TextStyle(
              fontSize: 14,
              fontWeight: FontWeight.w400,
              color: context.colors.textPrimary,
            ),
          ),
          SizedBox(height: 13),

          Obx(() {
            return Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text(
                  controller.myInviteCode.value,
                  style: TextStyle(
                    fontSize: 32,
                    fontWeight: FontWeight.w600,
                    color: context.colors.primary,
                    height: 1.4,
                  ),
                ),
                SizedBox(width: 8),
                // 复制图标按钮
                GestureDetector(
                  onTap: () {
                    Clipboard.setData(
                      ClipboardData(text: controller.myInviteCode.value),
                    );
                  },
                  child: Container(
                    width: 20,
                    height: 20,
                    decoration: BoxDecoration(
                      color: const Color(0xFFF0F0F6),
                      borderRadius: BorderRadius.circular(6),
                    ),
                    padding: EdgeInsets.all(3),
                    child: Image.asset(
                      'assets/images/common/ic_copy_purple.webp',
                    ),
                  ),
                ),
              ],
            );
          }),
          SizedBox(height: 26),
          // 分享按钮
          _buildPrimaryButton(
            label: context.l10n.bindPartnerShareMyCode,
            onTap: controller.onShareMyCode,
            enabled: true,
            primaryColor: context.colors.primary,
          ),
        ],
      ),
    );
  }

  Widget _buildOrDivider(BuildContext context) {
    return Row(
      children: [
        Expanded(
          child: Padding(
            padding: const EdgeInsets.only(left: 27),
            child: DashedDivider(),
          ),
        ),
        Container(
          width: 36,
          height: 36,
          decoration: const BoxDecoration(
            color: Color(0xFFEDE5FF),
            shape: BoxShape.circle,
          ),
          alignment: Alignment.center,
          child: Text(
            context.l10n.bindPartnerOr,
            style: TextStyle(
              fontSize: 14,
              fontWeight: FontWeight.w400,
              color: context.colors.primary,
            ),
          ),
        ),
        Expanded(
          child: Padding(
            padding: const EdgeInsets.only(right: 27),
            child: DashedDivider(),
          ),
        ),
      ],
    );
  }

  /// 输入伙伴 ID 区域
  Widget _buildInputSection(BuildContext context) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 32),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          // 标签
          Text(
            context.l10n.bindPartnerContactId,
            style: TextStyle(
              fontSize: 14,
              fontWeight: FontWeight.w400,
              color: context.colors.textPrimary,
            ),
          ),
          SizedBox(height: 16),
          // 输入框
          Container(
            height: 52,
            decoration: BoxDecoration(
              color: Colors.white,
              border: Border.all(color: const Color(0xFFF0F0F6), width: 1),
              borderRadius: BorderRadius.circular(27),
            ),
            child: TextField(
              controller: controller.partnerIdController,
              textAlign: TextAlign.center,
              style: TextStyle(
                fontSize: 32,
                fontWeight: FontWeight.w400,
                color: context.colors.textPrimary,
              ),
              decoration: InputDecoration(
                hintText: context.l10n.bindPartnerInputHint,
                hintStyle: TextStyle(
                  fontSize: 16,
                  fontWeight: FontWeight.w400,
                  color: const Color(0xFFD0D0D2),
                ),
                border: InputBorder.none,
                contentPadding: EdgeInsets.symmetric(horizontal: 20),
              ),
            ),
          ),
        ],
      ),
    );
  }

  /// 通用主按钮
  Widget _buildPrimaryButton({
    required String label,
    required VoidCallback onTap,
    bool enabled = true,
    bool isLoading = false,
    required Color primaryColor,
  }) {
    return GestureDetector(
      onTap: enabled ? onTap : null,
      child: Container(
        width: double.infinity,
        height: 40,
        decoration: BoxDecoration(
          color: enabled ? primaryColor : primaryColor.withValues(alpha: 0.3),
          borderRadius: BorderRadius.circular(100),
        ),
        alignment: Alignment.center,
        child: isLoading
            ? SizedBox(
                width: 18,
                height: 18,
                child: const CircularProgressIndicator(
                  strokeWidth: 2,
                  valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
                ),
              )
            : Text(
                label,
                style: TextStyle(
                  fontSize: 16,
                  fontWeight: FontWeight.w600,
                  color: Colors.white,
                ),
              ),
      ),
    );
  }

  /// 底部"下次再说"按钮
  Widget _buildSkipButton(BuildContext context) {
    return GestureDetector(
      onTap: controller.onSkip,
      behavior: HitTestBehavior.opaque,
      child: Container(
        width: 280,
        height: 48,
        alignment: Alignment.center,
        child: Text(
          context.l10n.bindPartnerSkip,
          style: TextStyle(
            fontSize: 16,
            fontWeight: FontWeight.w600,
            color: const Color(0xFFA1A0A5),
          ),
        ),
      ),
    );
  }
}