mangayomi-mirror/lib/modules/anime/widgets/aniskip_countdown_btn.dart
Moustapha Kodjo Amadou 80efee40d1 dart format
2025-05-30 17:43:42 +01:00

151 lines
5.3 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();
}
}