✨ Pages management in site detail
This commit is contained in:
116
lib/pods/site_pages.dart
Normal file
116
lib/pods/site_pages.dart
Normal file
@@ -0,0 +1,116 @@
|
||||
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<List<SnPublicationPage>> 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<dynamic>;
|
||||
return data.map((json) => SnPublicationPage.fromJson(json)).toList();
|
||||
}
|
||||
|
||||
@riverpod
|
||||
Future<SnPublicationPage> 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<SnPublicationPage>,
|
||||
({String pubName, String siteSlug})
|
||||
> {
|
||||
@override
|
||||
Future<List<SnPublicationPage>> build(
|
||||
({String pubName, String siteSlug}) arg,
|
||||
) async {
|
||||
return fetchPages();
|
||||
}
|
||||
|
||||
Future<List<SnPublicationPage>> 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<dynamic>;
|
||||
return data.map((json) => SnPublicationPage.fromJson(json)).toList();
|
||||
} catch (e) {
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<SnPublicationPage?> createPage(Map<String, dynamic> 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.invalidateSelf();
|
||||
|
||||
return newPage;
|
||||
} catch (error, stackTrace) {
|
||||
state = AsyncValue.error(error, stackTrace);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<SnPublicationPage?> updatePage(
|
||||
String pageId,
|
||||
Map<String, dynamic> 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.invalidateSelf();
|
||||
|
||||
return updatedPage;
|
||||
} catch (error, stackTrace) {
|
||||
state = AsyncValue.error(error, stackTrace);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> 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.invalidateSelf();
|
||||
} catch (error, stackTrace) {
|
||||
state = AsyncValue.error(error, stackTrace);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final sitePagesNotifierProvider = AsyncNotifierProvider.autoDispose.family<
|
||||
SitePagesNotifier,
|
||||
List<SnPublicationPage>,
|
||||
({String pubName, String siteSlug})
|
||||
>(SitePagesNotifier.new);
|
||||
Reference in New Issue
Block a user