worldhopper/lib/providers/opds_provider.dart

78 lines
2.1 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:worldhopper/models/opds_feed.dart';
import 'package:worldhopper/repositories/opds_repository.dart';
/// Provider for OPDSRepository instance
final opdsRepositoryProvider = Provider<OPDSRepository>((ref) {
return OPDSRepository();
});
/// Provider for fetching a feed from a server
final opdsFeedProvider = FutureProvider.family<OPDSFeed, FeedRequest>(
(ref, request) async {
final repository = ref.watch(opdsRepositoryProvider);
return await repository.fetchFeed(
request.serverId,
request.url,
forceRefresh: request.forceRefresh,
);
},
);
/// Provider for fetching the root feed of a server
final opdsRootFeedProvider = FutureProvider.family<OPDSFeed, RootFeedRequest>(
(ref, request) async {
final repository = ref.watch(opdsRepositoryProvider);
return await repository.fetchRootFeed(
request.serverId,
forceRefresh: request.forceRefresh,
);
},
);
/// Request object for fetching feeds
class FeedRequest {
final String serverId;
final String url;
final bool forceRefresh;
const FeedRequest({
required this.serverId,
required this.url,
this.forceRefresh = false,
});
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FeedRequest &&
runtimeType == other.runtimeType &&
serverId == other.serverId &&
url == other.url &&
forceRefresh == other.forceRefresh;
@override
int get hashCode => serverId.hashCode ^ url.hashCode ^ forceRefresh.hashCode;
}
/// Request object for fetching root feeds
class RootFeedRequest {
final String serverId;
final bool forceRefresh;
const RootFeedRequest({
required this.serverId,
this.forceRefresh = false,
});
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is RootFeedRequest &&
runtimeType == other.runtimeType &&
serverId == other.serverId &&
forceRefresh == other.forceRefresh;
@override
int get hashCode => serverId.hashCode ^ forceRefresh.hashCode;
}