Files
Redesnigned-Finamp/lib/screens/album_screen.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

112 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:get_it/get_it.dart';
import 'package:hive/hive.dart';
import '../models/jellyfin_models.dart';
import '../models/finamp_models.dart';
import '../services/jellyfin_api_helper.dart';
import '../services/finamp_settings_helper.dart';
import '../services/downloads_helper.dart';
import '../components/now_playing_bar.dart';
import '../components/AlbumScreen/album_screen_content.dart';
import '../services/music_player_background_task.dart';
class AlbumScreen extends StatefulWidget {
const AlbumScreen({
Key? key,
this.parent,
}) : super(key: key);
static const routeName = "/music/album";
/// The album to show. Can also be provided as an argument in a named route
final BaseItemDto? parent;
@override
State<AlbumScreen> createState() => _AlbumScreenState();
}
class _AlbumScreenState extends State<AlbumScreen> {
Future<List<BaseItemDto>?>? albumScreenContentFuture;
JellyfinApiHelper jellyfinApiHelper = GetIt.instance<JellyfinApiHelper>();
final audioHandler = GetIt.instance<MusicPlayerBackgroundTask>();
@override
Widget build(BuildContext context) {
final BaseItemDto parent = widget.parent ??
ModalRoute.of(context)!.settings.arguments as BaseItemDto;
return Scaffold(
body: ValueListenableBuilder<Box<FinampSettings>>(
valueListenable: FinampSettingsHelper.finampSettingsListener,
builder: (context, box, widget) {
bool isOffline = box.get("FinampSettings")?.isOffline ?? false;
if (isOffline) {
final downloadsHelper = GetIt.instance<DownloadsHelper>();
// The downloadedParent won't be null here if we've already
// navigated to it in offline mode
final downloadedParent =
downloadsHelper.getDownloadedParent(parent.id)!;
return AlbumScreenContent(
parent: downloadedParent.item,
children: downloadedParent.downloadedChildren.values.toList(),
);
} else {
albumScreenContentFuture ??= jellyfinApiHelper.getItems(
parentItem: parent,
sortBy: "ParentIndexNumber,IndexNumber,SortName",
includeItemTypes: "Audio",
isGenres: false,
);
return FutureBuilder<List<BaseItemDto>?>(
future: albumScreenContentFuture,
builder: (context, snapshot) {
if (snapshot.hasData) {
final List<BaseItemDto> items = snapshot.data!;
return AlbumScreenContent(parent: parent, children: items);
} else if (snapshot.hasError) {
return CustomScrollView(
physics: const NeverScrollableScrollPhysics(),
slivers: [
SliverAppBar(
title: Text(AppLocalizations.of(context)!.error),
),
SliverFillRemaining(
child: Center(child: Text(snapshot.error.toString())),
)
],
);
} else {
// We return all of this so that we can have an app bar while loading.
// This is especially important for iOS, where there isn't a hardware back button.
return CustomScrollView(
physics: const NeverScrollableScrollPhysics(),
slivers: [
SliverAppBar(
title: Text(parent.name ??
AppLocalizations.of(context)!.unknownName),
),
const SliverFillRemaining(
child: Center(
child: CircularProgressIndicator.adaptive(),
),
)
],
);
}
},
);
}
},
),
bottomNavigationBar: const NowPlayingBar(),
);
}
}