import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/api/api_client.dart'; import '../core/auth/auth_state.dart'; import '../core/models/page_result.dart'; import '../models/product.dart'; import '../repositories/product_repository.dart'; import 'connectivity_provider.dart'; final productRepositoryProvider = Provider((ref) { return ProductRepository(ref.watch(apiClientProvider)); }); final productListProvider = AsyncNotifierProvider>( ProductListNotifier.new, ); class ProductListNotifier extends AsyncNotifier> { int _page = 1; int _pageSize = 20; String _keyword = ''; int? _categoryId; PageResult? _cache; @override Future> build() async { ref.watch(authStateProvider.select((s) => s.user?.shopId)); ref.watch(networkRecoveryCountProvider); try { final result = await _fetch(); _cache = result; return result; } catch (_) { if (_cache != null) return _cache!; rethrow; } } Future> _fetch() { final repo = ref.read(productRepositoryProvider); return repo.list( page: _page, pageSize: _pageSize, keyword: _keyword.isEmpty ? null : _keyword, categoryId: _categoryId, ); } void setPage(int page) { _page = page; reload(); } void setPageSize(int pageSize) { _pageSize = pageSize; _page = 1; reload(); } void setKeyword(String keyword) { _keyword = keyword; _page = 1; reload(); } void setCategoryId(int? categoryId) { _categoryId = categoryId; _page = 1; reload(); } void reload() { state = const AsyncValue.loading(); _fetch().then((result) { _cache = result; state = AsyncValue.data(result); }, onError: (e, st) { if (_cache != null) { state = AsyncValue.data(_cache!); } else { state = AsyncValue.error(e, st); } }); } Future createProduct(Map data) async { final repo = ref.read(productRepositoryProvider); await repo.create(data); reload(); } Future updateProduct(int id, Map data) async { final repo = ref.read(productRepositoryProvider); await repo.update(id, data); reload(); } Future deleteProduct(int id) async { final repo = ref.read(productRepositoryProvider); await repo.delete(id); reload(); } }