import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/services/aniskip.dart'; import 'package:media_kit/media_kit.dart'; class AniSkipCountDownButton extends ConsumerStatefulWidget { final bool active; final bool autoSkip; final int timeoutLength; final String skipTypeText; final Results? aniSkipResult; final Player player; const AniSkipCountDownButton( {super.key, required this.skipTypeText, required this.aniSkipResult, required this.player, required this.active, required this.autoSkip, required this.timeoutLength}); @override ConsumerState createState() => _AniSkipCountDownButtonState(); } class _AniSkipCountDownButtonState extends ConsumerState with TickerProviderStateMixin { late AnimationController _controller; @override void initState() { _controller = AnimationController( vsync: this, duration: Duration(seconds: widget.timeoutLength)) ..forward(); super.initState(); if (widget.active) { if (widget.autoSkip) { _seekTo(); } else { _controller.addListener(() { if (_controller.isCompleted) { setState(() { _isCompleted = true; }); _controller.reset(); } }); } } } void _seekTo() { setState(() { _isCompleted = true; }); _controller.reset(); widget.player.seek( Duration(seconds: widget.aniSkipResult!.interval!.endTime!.ceil())); } bool _isCompleted = false; @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return widget.active && !widget.autoSkip ? _isCompleted ? const SizedBox.shrink() : AnimatedBuilder( animation: _controller, builder: (context, child) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 40), child: MaterialButton( padding: const EdgeInsets.all(0), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5)), onPressed: () { _seekTo(); }, child: Container( clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: Colors.black54, borderRadius: BorderRadius.circular(5), ), width: 200, child: Stack( children: [ RotatedBox( quarterTurns: 0, child: Container( clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular(5), ), child: SizedBox.fromSize( size: const Size(200, 40), child: LinearProgressIndicator( color: Colors.red, value: 1 - _controller.value, backgroundColor: Colors.transparent)), ), ), Positioned.fill( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text( widget.skipTypeText.toUpperCase(), style: const TextStyle( fontWeight: FontWeight.bold), ), Text((widget.timeoutLength - (_controller.duration! * _controller.value) .inSeconds) .toString()), ], ), )) ], ), ), ), ); }) : const SizedBox.shrink(); } }