124 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:async';
 | |
| 
 | |
| import 'package:dio/dio.dart';
 | |
| import 'package:flutter_riverpod/flutter_riverpod.dart';
 | |
| import 'package:island/models/webfeed.dart';
 | |
| import 'package:island/pods/network.dart';
 | |
| 
 | |
| final webFeedListProvider = FutureProvider.family<List<SnWebFeed>, String>((
 | |
|   ref,
 | |
|   pubName,
 | |
| ) async {
 | |
|   final client = ref.watch(apiClientProvider);
 | |
|   final response = await client.get('/sphere/publishers/$pubName/feeds');
 | |
|   return (response.data as List)
 | |
|       .map((json) => SnWebFeed.fromJson(json))
 | |
|       .toList();
 | |
| });
 | |
| 
 | |
| class WebFeedNotifier
 | |
|     extends
 | |
|         AutoDisposeFamilyAsyncNotifier<
 | |
|           SnWebFeed,
 | |
|           ({String pubName, String? feedId})
 | |
|         > {
 | |
|   @override
 | |
|   FutureOr<SnWebFeed> build(({String pubName, String? feedId}) arg) async {
 | |
|     if (arg.feedId == null || arg.feedId!.isEmpty) {
 | |
|       return SnWebFeed(
 | |
|         id: '',
 | |
|         url: '',
 | |
|         title: '',
 | |
|         publisherId: arg.pubName,
 | |
|         createdAt: DateTime.now(),
 | |
|         updatedAt: DateTime.now(),
 | |
|         deletedAt: null,
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     try {
 | |
|       final client = ref.read(apiClientProvider);
 | |
|       final response = await client.get(
 | |
|         '/sphere/publishers/${arg.pubName}/feeds/${arg.feedId}',
 | |
|       );
 | |
|       return SnWebFeed.fromJson(response.data);
 | |
|     } catch (e) {
 | |
|       rethrow;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   Future<void> saveFeed(SnWebFeed feed) async {
 | |
|     state = const AsyncValue.loading();
 | |
|     try {
 | |
|       final client = ref.read(apiClientProvider);
 | |
|       final url = '/sphere/publishers/${feed.publisherId}/feeds';
 | |
| 
 | |
|       final response =
 | |
|           feed.id.isEmpty
 | |
|               ? await client.post(url, data: feed.toJson())
 | |
|               : await client.patch('$url/${feed.id}', data: feed.toJson());
 | |
| 
 | |
|       state = AsyncValue.data(SnWebFeed.fromJson(response.data));
 | |
|     } catch (error, stackTrace) {
 | |
|       state = AsyncValue.error(error, stackTrace);
 | |
|       rethrow;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   Future<void> deleteFeed() async {
 | |
|     final feedId = arg.feedId;
 | |
|     if (feedId == null || feedId.isEmpty) return;
 | |
| 
 | |
|     state = const AsyncValue.loading();
 | |
|     try {
 | |
|       final client = ref.read(apiClientProvider);
 | |
|       await client.delete('/sphere/publishers/${arg.pubName}/feeds/$feedId');
 | |
|       state = AsyncValue.data(
 | |
|         SnWebFeed(
 | |
|           id: '',
 | |
|           url: '',
 | |
|           title: '',
 | |
|           publisherId: arg.pubName,
 | |
|           createdAt: DateTime.now(),
 | |
|           updatedAt: DateTime.now(),
 | |
|           deletedAt: null,
 | |
|         ),
 | |
|       );
 | |
|     } catch (error, stackTrace) {
 | |
|       state = AsyncValue.error(error, stackTrace);
 | |
|       rethrow;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   Future<void> scrapFeed() async {
 | |
|     final feedId = arg.feedId;
 | |
|     if (feedId == null || feedId.isEmpty) return;
 | |
| 
 | |
|     state = const AsyncValue.loading();
 | |
|     try {
 | |
|       final client = ref.read(apiClientProvider);
 | |
|       await client.post(
 | |
|         '/sphere/publishers/${arg.pubName}/feeds/$feedId/scrap',
 | |
|         options: Options(
 | |
|           sendTimeout: const Duration(seconds: 60),
 | |
|           receiveTimeout: const Duration(seconds: 180),
 | |
|         ),
 | |
|       );
 | |
| 
 | |
|       // Reload the feed
 | |
|       final response = await client.get(
 | |
|         '/sphere/publishers/${arg.pubName}/feeds/$feedId',
 | |
|       );
 | |
|       state = AsyncValue.data(SnWebFeed.fromJson(response.data));
 | |
|     } catch (error, stackTrace) {
 | |
|       state = AsyncValue.error(error, stackTrace);
 | |
|       rethrow;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| final webFeedNotifierProvider = AsyncNotifierProvider.autoDispose
 | |
|     .family<WebFeedNotifier, SnWebFeed, ({String pubName, String? feedId})>(
 | |
|       WebFeedNotifier.new,
 | |
|     );
 |