bind_partner_controller.dart 4.1 KB
import 'package:doublefeel_flutter/app/modules/user_onboarding/widget/guide_common_scaffold.dart';
import 'package:doublefeel_flutter/app/modules/user_onboarding/widget/onboarding_common_widgets.dart';
import 'package:doublefeel_flutter/app/routes/app_pages.dart';
import 'package:doublefeel_flutter/core/network/api/friend_api.dart';
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/core/services/user_state_service.dart';
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:share_plus/share_plus.dart';

class BindPartnerController extends GetxController {
  BindPartnerController(this._friendApi);

  final FriendApi _friendApi;

  final TextEditingController partnerIdController = TextEditingController();

  final RxString partnerIdInput = ''.obs;

  final RxBool isSubmitting = false.obs;

  final RxString myInviteCode = ''.obs;

  @override
  void onInit() {
    super.onInit();
    partnerIdController.addListener(() {
      partnerIdInput.value = partnerIdController.text.trim();
    });

    final userPrefs = Get.find<UserPreferencesStorage>();
    myInviteCode.value =
        userPrefs.preferences.value.meUserInfo?.uniqueCode ?? '';
  }

  @override
  void onClose() {
    partnerIdController.dispose();
    super.onClose();
  }

  bool get canSubmit => partnerIdInput.value.isNotEmpty;

  void onShareMyCode() {
    Share.share("""嘿 ❤️ 我发现了一个叫 DoubleFeel 的 App!
它可以帮我们互相关心 — 记录压力和睡眠、查看 HRV 与身体状态、及时了解彼此的健康状况。
快来一起使用吧 👉 https://Xxxxxxx
我的好友id:${myInviteCode.value}""");
  }

  Future<void> onSubmitPartnerId() async {
    if (!canSubmit || isSubmitting.value) return;
    isSubmitting.value = true;
    try {
      final result = await _friendApi.addFriend(partnerIdInput.value);
      if (result is AppFailure) {
        return;
      }
      Get.to(_BindSuccessPage());
    } catch (e) {
    } finally {
      isSubmitting.value = false;
    }
  }

  void onSkip() {
    final userStateService = Get.find<UserStateService>();
    if (!userStateService.isVip) {
      Get.toNamed(Routes.MEMBERSHIP_OFFER);
    } else {
      Get.offAllNamed(AppRoutes.home);
    }
  }
}

class _BindSuccessPage extends StatelessWidget {
  const _BindSuccessPage();
  @override
  Widget build(BuildContext context) {
    final l10n = context.l10n;
    return GuideCommonScaffold(
      onBackPressed: () => Get.back(),
      bottom: OnboardingBottomButton(
        label: l10n.continueButton,
        enabled: true,
        onPressed: () {
          final userStateService = Get.find<UserStateService>();
          if (!userStateService.isVip) {
            Get.toNamed(Routes.MEMBERSHIP_OFFER);
          } else {
            Get.offAllNamed(AppRoutes.home);
          }
        },
      ),
      child: OnboardingPageScrollBody(
        horizontalPadding: 0,
        topPadding: 0,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          mainAxisSize: MainAxisSize.min,
          children: [
            Container(
              height: 509,
              decoration:
                  BoxDecoration(color: const Color(0xFFFF0000).withAlpha(120)),
            ),
            const SizedBox(height: 16),
            OnboardingTitleText(
              context.l10n.healthCompanionIsNowAvailable,
              maxWidth: 310,
            ),
            const SizedBox(height: 8),
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 16),
              child: Text(
                l10n.youCanNowViewEachOtherSHrvStressLevelsAndSleepPatternsAndReachOutToCheckInWhenTheOtherPersonSeemsTired,
                textAlign: TextAlign.center,
                style: TextStyle(
                  color: Colors.black,
                  fontSize: 12,
                  fontWeight: FontWeight.w400,
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}