Files
Redesnigned-Finamp/lib/components/MusicScreen/artist_item_list_tile.dart
T
Zakaria 1563409cb1
Build / Build for Android (push) Has been cancelled
Build / Build for iOS (push) Has been cancelled
first commit
2026-05-18 14:15:38 -04:00

169 lines
5.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import '../../models/jellyfin_models.dart';
import '../../screens/artist_screen.dart';
import '../../services/jellyfin_api_helper.dart';
import '../../services/finamp_settings_helper.dart';
import '../album_image.dart';
import '../error_snackbar.dart';
enum ArtistListTileMenuItems {
addToFavourite,
removeFromFavourite,
addToMixList,
removeFromMixList,
}
class ArtistListTile extends StatefulWidget {
const ArtistListTile({
Key? key,
required this.item,
this.index,
this.parentId,
}) : super(key: key);
final BaseItemDto item;
final int? index;
final String? parentId;
@override
State<ArtistListTile> createState() => _ArtistListTileState();
}
class _ArtistListTileState extends State<ArtistListTile> {
final _jellyfinApiHelper = GetIt.instance<JellyfinApiHelper>();
late BaseItemDto mutableItem = widget.item;
@override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
final listTile = ListTile(
onTap: () {
Navigator.of(context)
.pushNamed(ArtistScreen.routeName, arguments: mutableItem);
},
leading: AlbumImage(item: mutableItem),
title: Text(
mutableItem.name ?? "Unknown Name",
overflow: TextOverflow.ellipsis,
),
subtitle: null,
trailing:
_jellyfinApiHelper.selectedMixArtistsIds.contains(mutableItem.id)
? const Icon(Icons.explore)
: null,
);
return GestureDetector(
onLongPressStart: (details) async {
Feedback.forLongPress(context);
// Some options are disabled in offline mode
final isOffline = FinampSettingsHelper.finampSettings.isOffline;
final selection = await showMenu<ArtistListTileMenuItems>(
context: context,
position: RelativeRect.fromLTRB(
details.globalPosition.dx,
details.globalPosition.dy,
screenSize.width - details.globalPosition.dx,
screenSize.height - details.globalPosition.dy,
),
items: [
mutableItem.userData!.isFavorite
? const PopupMenuItem<ArtistListTileMenuItems>(
value: ArtistListTileMenuItems.removeFromFavourite,
child: ListTile(
leading: Icon(Icons.favorite_border),
title: Text("Remove Favourite"),
),
)
: const PopupMenuItem<ArtistListTileMenuItems>(
value: ArtistListTileMenuItems.addToFavourite,
child: ListTile(
leading: Icon(Icons.favorite),
title: Text("Add Favourite"),
),
),
_jellyfinApiHelper.selectedMixArtistsIds.contains(mutableItem.id)
? PopupMenuItem<ArtistListTileMenuItems>(
enabled: !isOffline,
value: ArtistListTileMenuItems.removeFromMixList,
child: ListTile(
leading: const Icon(Icons.explore_off),
title: const Text("Remove From Mix"),
enabled: isOffline ? false : true,
),
)
: PopupMenuItem<ArtistListTileMenuItems>(
value: ArtistListTileMenuItems.addToMixList,
enabled: !isOffline,
child: ListTile(
leading: const Icon(Icons.explore),
title: const Text("Add To Mix"),
enabled: !isOffline,
),
),
],
);
if (!mounted) return;
switch (selection) {
case ArtistListTileMenuItems.addToFavourite:
try {
final newUserData =
await _jellyfinApiHelper.addFavourite(mutableItem.id);
if (!mounted) return;
setState(() {
mutableItem.userData = newUserData;
});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("Favourite added.")));
} catch (e) {
errorSnackbar(e, context);
}
break;
case ArtistListTileMenuItems.removeFromFavourite:
try {
final newUserData =
await _jellyfinApiHelper.removeFavourite(mutableItem.id);
if (!mounted) return;
setState(() {
mutableItem.userData = newUserData;
});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("Favourite removed.")));
} catch (e) {
errorSnackbar(e, context);
}
break;
case ArtistListTileMenuItems.addToMixList:
try {
_jellyfinApiHelper.addArtistToMixBuilderList(mutableItem);
setState(() {});
} catch (e) {
errorSnackbar(e, context);
}
break;
case ArtistListTileMenuItems.removeFromMixList:
try {
_jellyfinApiHelper.removeArtistFromBuilderList(mutableItem);
setState(() {});
} catch (e) {
errorSnackbar(e, context);
}
break;
case null:
break;
}
},
child: listTile);
}
}