import 'dart:async'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:island/models/publication_site.dart'; import 'package:island/pods/network.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'site_pages.g.dart'; @riverpod Future> sitePages( Ref ref, String pubName, String siteSlug, ) async { final apiClient = ref.watch(apiClientProvider); final resp = await apiClient.get('/zone/sites/$pubName/$siteSlug/pages'); final data = resp.data as List; return data.map((json) => SnPublicationPage.fromJson(json)).toList(); } @riverpod Future sitePage(Ref ref, String pageId) async { final apiClient = ref.watch(apiClientProvider); final resp = await apiClient.get('/zone/sites/pages/$pageId'); return SnPublicationPage.fromJson(resp.data); } class SitePagesNotifier extends AutoDisposeFamilyAsyncNotifier< List, ({String pubName, String siteSlug}) > { @override Future> build( ({String pubName, String siteSlug}) arg, ) async { return fetchPages(); } Future> fetchPages() async { try { final apiClient = ref.read(apiClientProvider); final resp = await apiClient.get( '/zone/sites/${arg.pubName}/${arg.siteSlug}/pages', ); final data = resp.data as List; return data.map((json) => SnPublicationPage.fromJson(json)).toList(); } catch (e) { rethrow; } } Future createPage(Map pageData) async { state = const AsyncValue.loading(); try { final apiClient = ref.read(apiClientProvider); final resp = await apiClient.post( '/zone/sites/${arg.pubName}/${arg.siteSlug}/pages', data: pageData, ); final newPage = SnPublicationPage.fromJson(resp.data); // Refresh the pages list ref.invalidate(sitePagesProvider(arg.pubName, arg.siteSlug)); return newPage; } catch (error, stackTrace) { state = AsyncValue.error(error, stackTrace); rethrow; } } Future updatePage( String pageId, Map pageData, ) async { state = const AsyncValue.loading(); try { final apiClient = ref.read(apiClientProvider); final resp = await apiClient.patch( '/zone/sites/pages/$pageId', data: pageData, ); final updatedPage = SnPublicationPage.fromJson(resp.data); // Refresh the pages list ref.invalidate(sitePagesProvider(arg.pubName, arg.siteSlug)); return updatedPage; } catch (error, stackTrace) { state = AsyncValue.error(error, stackTrace); rethrow; } } Future deletePage(String pageId) async { state = const AsyncValue.loading(); try { final apiClient = ref.read(apiClientProvider); await apiClient.delete('/zone/sites/pages/$pageId'); // Refresh the pages list ref.invalidate(sitePagesProvider(arg.pubName, arg.siteSlug)); } catch (error, stackTrace) { state = AsyncValue.error(error, stackTrace); rethrow; } } } final sitePagesNotifierProvider = AsyncNotifierProvider.autoDispose.family< SitePagesNotifier, List, ({String pubName, String siteSlug}) >(SitePagesNotifier.new);