mangayomi/lib/modules/anime/widgets/aniskip_countdown_btn.dart
2024-01-11 14:31:01 +01:00

139 lines
4.9 KiB
Dart

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<AniSkipCountDownButton> createState() =>
_AniSkipCountDownButtonState();
}
class _AniSkipCountDownButtonState extends ConsumerState<AniSkipCountDownButton>
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();
}
}