mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00

* feat: add riverpod based favorite album provider * feat: add album is saved, new releases and tracks providers * feat: add artist related providers * feat: add all categories providers * feat: add lyrics provider * feat: add playlist related providers * feat: add search provider * feat: add view and spotify friends provider * feat: add playlist create and update and favorite handlers * feat: use providers in home screen * chore: fix dart lint issues * feat: use new providers for playlist and albums screen * feat: use providers in artist page * feat: use providers on library page * feat: use provider for playlist and album card and heart button * feat: use provider in search page * feat: use providers in generate playlist * feat: use provider in lyrics screen * feat: use provider for create playlist * feat: use provider in add track dialog * feat: use providers in remaining pages and remove fl_query * fix: remove direct access to provider.value * fix: glitching when loading * fix: user album loading next page indicator * feat: make many provider autoDispose after 5 minutes of no usage * fix: ignore episodes in tracks
96 lines
2.5 KiB
Dart
96 lines
2.5 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart' hide Page;
|
|
import 'package:spotify/spotify.dart';
|
|
|
|
class PaginationProps {
|
|
final bool hasNextPage;
|
|
final bool isLoading;
|
|
final VoidCallback onFetchMore;
|
|
final Future<void> Function() onRefresh;
|
|
final Future<List<Track>> Function() onFetchAll;
|
|
|
|
const PaginationProps({
|
|
required this.hasNextPage,
|
|
required this.isLoading,
|
|
required this.onFetchMore,
|
|
required this.onFetchAll,
|
|
required this.onRefresh,
|
|
});
|
|
|
|
@override
|
|
operator ==(Object other) {
|
|
return other is PaginationProps &&
|
|
other.hasNextPage == hasNextPage &&
|
|
other.isLoading == isLoading &&
|
|
other.onFetchMore == onFetchMore &&
|
|
other.onFetchAll == onFetchAll &&
|
|
other.onRefresh == onRefresh;
|
|
}
|
|
|
|
@override
|
|
int get hashCode =>
|
|
super.hashCode ^
|
|
hasNextPage.hashCode ^
|
|
isLoading.hashCode ^
|
|
onFetchMore.hashCode ^
|
|
onFetchAll.hashCode ^
|
|
onRefresh.hashCode;
|
|
}
|
|
|
|
class InheritedTrackView extends InheritedWidget {
|
|
final String collectionId;
|
|
final String title;
|
|
final String? description;
|
|
final String image;
|
|
final String routePath;
|
|
final List<Track> tracks;
|
|
final PaginationProps pagination;
|
|
final bool isLiked;
|
|
final String shareUrl;
|
|
|
|
// events
|
|
final FutureOr<bool?> Function()? onHeart; // if null heart button will hidden
|
|
|
|
const InheritedTrackView({
|
|
super.key,
|
|
required super.child,
|
|
required this.collectionId,
|
|
required this.title,
|
|
this.description,
|
|
required this.image,
|
|
required this.tracks,
|
|
required this.pagination,
|
|
required this.routePath,
|
|
required this.shareUrl,
|
|
this.isLiked = false,
|
|
this.onHeart,
|
|
});
|
|
|
|
@override
|
|
bool updateShouldNotify(InheritedTrackView oldWidget) {
|
|
return oldWidget.title != title ||
|
|
oldWidget.description != description ||
|
|
oldWidget.image != image ||
|
|
oldWidget.tracks != tracks ||
|
|
oldWidget.pagination != pagination ||
|
|
oldWidget.isLiked != isLiked ||
|
|
oldWidget.onHeart != onHeart ||
|
|
oldWidget.shareUrl != shareUrl ||
|
|
oldWidget.routePath != routePath ||
|
|
oldWidget.collectionId != collectionId ||
|
|
oldWidget.child != child;
|
|
}
|
|
|
|
static InheritedTrackView of(BuildContext context) {
|
|
final widget =
|
|
context.dependOnInheritedWidgetOfExactType<InheritedTrackView>();
|
|
if (widget == null) {
|
|
throw Exception(
|
|
'InheritedTrackView not found. Make sure to wrap [TrackView] with [InheritedTrackView]',
|
|
);
|
|
}
|
|
return widget;
|
|
}
|
|
}
|