import 'dart:async'; import 'package:PiliPlus/pages/video/pay_coins/view.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; mixin TripleMixin on GetxController, TickerProvider { // 是否点赞 final RxBool hasLike = false.obs; // 投币数量 final RxNum coinNum = RxNum(0); // 是否投币 bool get hasCoin => coinNum.value != 0; // 是否收藏 final RxBool hasFav = false.obs; bool get hasTriple => hasLike.value && hasCoin && hasFav.value; bool get isLogin; bool isHasCopyright(int copyright) { return copyright != 2; } bool reachCoinLimit(bool hasCopyRight, num coinNum) { return (!hasCopyRight && coinNum >= 1) || coinNum >= 2; } int get copyright; void onPayCoin(int coin, bool coinWithLike); void actionCoinVideo() { if (!isLogin) { SmartDialog.showToast('账号未登录'); return; } final coinNum = this.coinNum.value; final copyright = this.copyright; final hasCopyright = isHasCopyright(copyright); if (reachCoinLimit(hasCopyright, coinNum)) { SmartDialog.showToast('达到投币上限啦~'); return; } if (GlobalData().coins != null && GlobalData().coins! < 1) { SmartDialog.showToast('硬币不足'); // return; } PayCoinsPage.toPayCoinsPage( onPayCoin: onPayCoin, hasCoin: coinNum == 1, hasCopyright: hasCopyright, ); } void actionTriple(); void actionLikeVideo(); // no need for pugv AnimationController? _tripleAnimCtr; Animation? _tripleAnimation; AnimationController get tripleAnimCtr => _tripleAnimCtr ??= AnimationController( vsync: this, duration: const Duration(milliseconds: 1200), reverseDuration: const Duration(milliseconds: 400), ); Animation get tripleAnimation => _tripleAnimation ??= tripleAnimCtr .drive(CurveTween(curve: Curves.easeInOut)); Timer? _timer; void _cancelTimer() { _timer?.cancel(); _timer = null; } static final _duration = PlatformUtils.isMobile ? const Duration(milliseconds: 200) : const Duration(milliseconds: 255); void onStartTriple() { _timer ??= Timer(_duration, () { HapticFeedback.lightImpact(); if (hasTriple) { SmartDialog.showToast('已完成三连'); } else { tripleAnimCtr.forward().whenComplete(() { tripleAnimCtr.reset(); actionTriple(); }); } _cancelTimer(); }); } void onCancelTriple([bool isTapUp = false]) { if (tripleAnimCtr.status == AnimationStatus.forward) { tripleAnimCtr.reverse(); } else if (_timer != null && _timer!.tick == 0) { _cancelTimer(); if (isTapUp) { actionLikeVideo(); } } } @override void onClose() { _cancelTimer(); _tripleAnimCtr?.dispose(); super.onClose(); } }