feat(client): #14/#18 产地/保质期/储存方式/描述文档 provider & repo 及公开页意见反馈

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-08 08:20:00 +08:00
parent 0d17533120
commit 8a87d4a82c
5 changed files with 429 additions and 67 deletions
+140 -20
View File
@@ -129,35 +129,155 @@ class ProductSpecListNotifier extends AsyncNotifier<List<ProductSpecOption>> {
// ── 产地 ──────────────────────────────────────────────────────
final productOriginListProvider =
FutureProvider<List<ProductOriginOption>>((ref) async {
ref.watch(authStateProvider.select((s) => s.user?.shopId));
ref.watch(networkRecoveryCountProvider);
return ref.read(productOptionRepositoryProvider).listOrigins();
});
AsyncNotifierProvider<ProductOriginListNotifier, List<ProductOriginOption>>(
ProductOriginListNotifier.new,
);
class ProductOriginListNotifier extends AsyncNotifier<List<ProductOriginOption>> {
@override
Future<List<ProductOriginOption>> build() async {
ref.watch(authStateProvider.select((s) => s.user?.shopId));
ref.watch(networkRecoveryCountProvider);
return ref.read(productOptionRepositoryProvider).listOrigins();
}
void reload() {
state = const AsyncValue.loading();
ref.read(productOptionRepositoryProvider).listOrigins().then(
(data) => state = AsyncValue.data(data),
onError: (e, st) => state = AsyncValue.error(e, st),
);
}
Future<void> create(Map<String, dynamic> data) async {
await ref.read(productOptionRepositoryProvider).createOrigin(data);
reload();
}
Future<void> updateItem(int id, Map<String, dynamic> data) async {
await ref.read(productOptionRepositoryProvider).updateOrigin(id, data);
reload();
}
Future<void> delete(int id) async {
await ref.read(productOptionRepositoryProvider).deleteOrigin(id);
reload();
}
}
// ── 保质期 ────────────────────────────────────────────────────
final productShelfLifeListProvider =
FutureProvider<List<ProductShelfLifeOption>>((ref) async {
ref.watch(authStateProvider.select((s) => s.user?.shopId));
ref.watch(networkRecoveryCountProvider);
return ref.read(productOptionRepositoryProvider).listShelfLives();
});
AsyncNotifierProvider<ProductShelfLifeListNotifier, List<ProductShelfLifeOption>>(
ProductShelfLifeListNotifier.new,
);
class ProductShelfLifeListNotifier extends AsyncNotifier<List<ProductShelfLifeOption>> {
@override
Future<List<ProductShelfLifeOption>> build() async {
ref.watch(authStateProvider.select((s) => s.user?.shopId));
ref.watch(networkRecoveryCountProvider);
return ref.read(productOptionRepositoryProvider).listShelfLives();
}
void reload() {
state = const AsyncValue.loading();
ref.read(productOptionRepositoryProvider).listShelfLives().then(
(data) => state = AsyncValue.data(data),
onError: (e, st) => state = AsyncValue.error(e, st),
);
}
Future<void> create(Map<String, dynamic> data) async {
await ref.read(productOptionRepositoryProvider).createShelfLife(data);
reload();
}
Future<void> updateItem(int id, Map<String, dynamic> data) async {
await ref.read(productOptionRepositoryProvider).updateShelfLife(id, data);
reload();
}
Future<void> delete(int id) async {
await ref.read(productOptionRepositoryProvider).deleteShelfLife(id);
reload();
}
}
// ── 储存方式 ──────────────────────────────────────────────────
final productStorageListProvider =
FutureProvider<List<ProductStorageOption>>((ref) async {
ref.watch(authStateProvider.select((s) => s.user?.shopId));
ref.watch(networkRecoveryCountProvider);
return ref.read(productOptionRepositoryProvider).listStorages();
});
AsyncNotifierProvider<ProductStorageListNotifier, List<ProductStorageOption>>(
ProductStorageListNotifier.new,
);
class ProductStorageListNotifier extends AsyncNotifier<List<ProductStorageOption>> {
@override
Future<List<ProductStorageOption>> build() async {
ref.watch(authStateProvider.select((s) => s.user?.shopId));
ref.watch(networkRecoveryCountProvider);
return ref.read(productOptionRepositoryProvider).listStorages();
}
void reload() {
state = const AsyncValue.loading();
ref.read(productOptionRepositoryProvider).listStorages().then(
(data) => state = AsyncValue.data(data),
onError: (e, st) => state = AsyncValue.error(e, st),
);
}
Future<void> create(Map<String, dynamic> data) async {
await ref.read(productOptionRepositoryProvider).createStorage(data);
reload();
}
Future<void> updateItem(int id, Map<String, dynamic> data) async {
await ref.read(productOptionRepositoryProvider).updateStorage(id, data);
reload();
}
Future<void> delete(int id) async {
await ref.read(productOptionRepositoryProvider).deleteStorage(id);
reload();
}
}
// ── 描述文档 ──────────────────────────────────────────────────
final productDescriptionDocListProvider =
FutureProvider<List<ProductDescriptionDoc>>((ref) async {
ref.watch(authStateProvider.select((s) => s.user?.shopId));
ref.watch(networkRecoveryCountProvider);
return ref.read(productOptionRepositoryProvider).listDescriptionDocs();
});
AsyncNotifierProvider<ProductDescriptionDocListNotifier, List<ProductDescriptionDoc>>(
ProductDescriptionDocListNotifier.new,
);
class ProductDescriptionDocListNotifier extends AsyncNotifier<List<ProductDescriptionDoc>> {
@override
Future<List<ProductDescriptionDoc>> build() async {
ref.watch(authStateProvider.select((s) => s.user?.shopId));
ref.watch(networkRecoveryCountProvider);
return ref.read(productOptionRepositoryProvider).listDescriptionDocs();
}
void reload() {
state = const AsyncValue.loading();
ref.read(productOptionRepositoryProvider).listDescriptionDocs().then(
(data) => state = AsyncValue.data(data),
onError: (e, st) => state = AsyncValue.error(e, st),
);
}
Future<void> create(Map<String, dynamic> data) async {
await ref.read(productOptionRepositoryProvider).createDescriptionDoc(data);
reload();
}
Future<void> updateItem(int id, Map<String, dynamic> data) async {
await ref.read(productOptionRepositoryProvider).updateDescriptionDoc(id, data);
reload();
}
Future<void> delete(int id) async {
await ref.read(productOptionRepositoryProvider).deleteDescriptionDoc(id);
reload();
}
}