spotube/lib/modules/artist/artist_card.dart
2025-04-21 21:27:59 +06:00

77 lines
2.2 KiB
Dart

import 'package:auto_route/auto_route.dart';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotify/spotify.dart';
import 'package:spotube/collections/routes.gr.dart';
import 'package:spotube/components/image/universal_image.dart';
import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/image.dart';
import 'package:spotube/provider/blacklist/blacklist_provider.dart';
class ArtistCard extends HookConsumerWidget {
final Artist artist;
const ArtistCard(this.artist, {super.key});
@override
Widget build(BuildContext context, ref) {
final theme = Theme.of(context);
final backgroundImage = UniversalImage.imageProvider(
artist.images.asUrlString(
placeholder: ImagePlaceholder.artist,
),
);
final isBlackListed = ref.watch(
blacklistProvider.select(
(blacklist) => blacklist.asData?.value.any(
(element) => element.elementId == artist.id,
),
),
);
return SizedBox(
width: 180,
child: Button.card(
onPressed: () {
context.navigateTo(ArtistRoute(artistId: artist.id!));
},
child: Column(
children: [
Avatar(
initials: artist.name!.trim()[0].toUpperCase(),
provider: backgroundImage,
size: 130,
),
const Gap(10),
AutoSizeText(
artist.name!,
maxLines: 2,
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: theme.typography.bold,
),
const Spacer(),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
if (isBlackListed == true) ...[
DestructiveBadge(
child: Text(context.l10n.blacklisted.toUpperCase()),
),
const Gap(5),
],
SecondaryBadge(
child: Text(context.l10n.artist.toUpperCase()),
)
],
)
],
),
),
);
}
}