Files
PiliPlus/lib/pages/video/introduction/ugc/widgets/triple_mixin.dart
2026-05-24 13:22:00 +08:00

124 lines
3.0 KiB
Dart

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<double>? _tripleAnimation;
AnimationController get tripleAnimCtr =>
_tripleAnimCtr ??= AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1200),
reverseDuration: const Duration(milliseconds: 400),
);
Animation<double> 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();
}
}