madari-oss/lib/features/widgetter/plugins/stremio/containers/shimmer.dart
2025-01-30 21:58:43 +05:30

304 lines
12 KiB
Dart

import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:shimmer/shimmer.dart';
final _logger = Logger('StreamioShimmer');
class StreamioShimmer extends StatelessWidget {
final String? image;
final String tag;
const StreamioShimmer({
super.key,
this.image,
required this.tag,
});
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final screenSize = MediaQuery.of(context).size;
return Stack(
children: [
Container(
width: screenSize.width,
height: screenSize.height,
color: colorScheme.surface,
),
SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: screenSize.height * 0.65,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
flex: 2,
child: Stack(
children: [
Container(
constraints: const BoxConstraints(
maxHeight: 220,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: colorScheme.surface,
),
),
Hero(
tag: tag,
child: Container(
constraints: const BoxConstraints(
maxHeight: 220,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
image: image != null
? DecorationImage(
image: CachedNetworkImageProvider(
image!),
fit: BoxFit.cover,
)
: null,
),
),
),
],
),
),
const SizedBox(width: 16),
Expanded(
flex: 3,
child: Shimmer.fromColors(
baseColor: colorScheme.surfaceContainerHighest,
highlightColor: colorScheme.surface,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
height: 48,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(4),
),
),
const SizedBox(height: 8),
Container(
height: 24,
width: 200,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(4),
),
),
const SizedBox(height: 16),
Container(
height: 32,
width: 120,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(4),
),
),
],
),
),
),
],
),
),
),
Shimmer.fromColors(
baseColor: colorScheme.surfaceContainerHighest,
highlightColor: colorScheme.surface,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: List.generate(
3,
(index) => Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: Container(
height: 16,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(4),
),
),
),
),
),
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 24,
width: 80,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(4),
),
),
const SizedBox(height: 16),
SizedBox(
height: 160,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: 6,
itemBuilder: (context, index) => Padding(
padding: const EdgeInsets.only(right: 12),
child: Column(
children: [
Container(
width: 80,
height: 80,
decoration: BoxDecoration(
color: colorScheme.surface,
shape: BoxShape.circle,
),
),
const SizedBox(height: 8),
Container(
width: 80,
height: 16,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(4),
),
),
const SizedBox(height: 4),
Container(
width: 60,
height: 14,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(4),
),
),
],
),
),
),
),
],
),
),
const SizedBox(height: 16),
Shimmer.fromColors(
baseColor: colorScheme.surfaceContainerHighest,
highlightColor: colorScheme.surface,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 24,
width: 100,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(4),
),
),
const SizedBox(height: 12),
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: List.generate(
5,
(index) => Container(
width: 100,
height: 40,
margin: const EdgeInsets.only(right: 8),
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(20),
),
),
),
),
),
],
),
),
),
const SizedBox(height: 16),
Shimmer.fromColors(
baseColor: colorScheme.surfaceContainerHighest,
highlightColor: colorScheme.surface,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: List.generate(
4,
(index) => Padding(
padding: const EdgeInsets.only(bottom: 8),
child: Container(
height: 70,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(8),
),
),
),
),
),
),
),
const SizedBox(height: 16),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 24,
width: 100,
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(4),
),
),
const SizedBox(height: 16),
GridView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 16 / 9,
crossAxisSpacing: 8,
mainAxisSpacing: 8,
),
itemCount: 4,
itemBuilder: (context, index) => Container(
decoration: BoxDecoration(
color: colorScheme.surface,
borderRadius: BorderRadius.circular(8),
),
),
),
],
),
),
const SizedBox(height: 32),
],
),
),
],
);
}
}