Skip to content

Commit

Permalink
Merge pull request #309 from aeecleclair/Rework-MapNotifier
Browse files Browse the repository at this point in the history
Optimisation: Improve image management in every module
  • Loading branch information
julien4215 authored Mar 12, 2024
2 parents 0db7ae9 + 59446d3 commit ec4d4ad
Show file tree
Hide file tree
Showing 61 changed files with 1,801 additions and 2,182 deletions.
13 changes: 1 addition & 12 deletions lib/admin/providers/section_logo_provider.dart
Original file line number Diff line number Diff line change
@@ -1,25 +1,14 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/admin/class/simple_group.dart';
import 'package:myecl/admin/providers/group_list_provider.dart';
import 'package:myecl/tools/providers/map_provider.dart';
import 'package:myecl/tools/token_expire_wrapper.dart';

class SimpleGroupLogoNotifier extends MapNotifier<SimpleGroup, Image> {
SimpleGroupLogoNotifier() : super();
}

final allGroupLogosProvider = StateNotifierProvider<SimpleGroupLogoNotifier,
AsyncValue<Map<SimpleGroup, AsyncValue<List<Image>>?>>>((ref) {
Map<SimpleGroup, AsyncValue<List<Image>>?>>((ref) {
SimpleGroupLogoNotifier simpleGroupLogoNotifier = SimpleGroupLogoNotifier();
tokenExpireWrapperAuth(ref, () async {
ref.watch(allGroupListProvider).maybeWhen(data: (allGroup) {
simpleGroupLogoNotifier.loadTList(allGroup);
return simpleGroupLogoNotifier;
}, orElse: () {
simpleGroupLogoNotifier.loadTList([]);
return simpleGroupLogoNotifier;
});
});
return simpleGroupLogoNotifier;
});
3 changes: 1 addition & 2 deletions lib/admin/providers/simple_groups_groups_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ class SimpleGroupsGroupsNotifier extends MapNotifier<String, Group> {
}

final simpleGroupsGroupsProvider = StateNotifierProvider<
SimpleGroupsGroupsNotifier,
AsyncValue<Map<String, AsyncValue<List<Group>>?>>>((ref) {
SimpleGroupsGroupsNotifier, Map<String, AsyncValue<List<Group>>?>>((ref) {
SimpleGroupsGroupsNotifier simpleGroupsGroupsNotifier =
SimpleGroupsGroupsNotifier();
tokenExpireWrapperAuth(ref, () async {
Expand Down
5 changes: 3 additions & 2 deletions lib/admin/ui/pages/edit_page/edit_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ class EditAssociationPage extends HookConsumerWidget {
final description = useTextEditingController();
final simpleGroupsGroupsNotifier =
ref.watch(simpleGroupsGroupsProvider.notifier);
final simpleGroupsGroups = ref.watch(simpleGroupsGroupsProvider);
final simpleGroupsGroups =
ref.watch(simpleGroupsGroupsProvider.select((value) => value[groupId]));

void displayToastWithContext(TypeMsg type, String msg) {
displayToast(context, type, msg);
Expand All @@ -45,7 +46,7 @@ class EditAssociationPage extends HookConsumerWidget {
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 30.0),
child: AutoLoaderChild(
value: simpleGroupsGroups,
group: simpleGroupsGroups,
notifier: simpleGroupsGroupsNotifier,
mapKey: groupId,
loader: (groupId) async =>
Expand Down
16 changes: 8 additions & 8 deletions lib/admin/ui/pages/edit_page/results.dart
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,14 @@ class MemberResults extends HookConsumerWidget {
.then((value) {
if (value) {
simpleGroupGroupsNotifier
.setTData(newGroup.id,
AsyncData([newGroup]))
.then((value) {
displayToastWithContext(
TypeMsg.msg,
AdminTextConstants
.addedMember);
});
.setTData(
newGroup.id,
AsyncData([newGroup]),
);
displayToastWithContext(
TypeMsg.msg,
AdminTextConstants
.addedMember);
} else {
displayToastWithContext(
TypeMsg.error,
Expand Down
196 changes: 90 additions & 106 deletions lib/admin/ui/pages/edit_page/search_user.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,114 +36,98 @@ class SearchUser extends HookConsumerWidget {
displayToast(context, type, msg);
}

final simpleGroup = simpleGroupsGroups[groupId];
if (simpleGroup == null) {
return const Loader();
}
return AsyncChild(
value: simpleGroupsGroups,
builder: (context, value) {
final simpleGroup = value[groupId];
if (simpleGroup == null) {
return const Loader();
}
return AsyncChild(
value: simpleGroup,
builder: (context, g) {
return Column(
children: [
StyledSearchBar(
label: AdminTextConstants.members,
color: ColorConstants.gradient1,
padding: const EdgeInsets.all(0),
onChanged: (value) async {
if (value.isNotEmpty) {
await usersNotifier.filterUsers(value,
excludeGroup: [group.value!.toSimpleGroup()]);
} else {
usersNotifier.clear();
}
},
onSuffixIconTap: (focusNode, editingController) {
add.value = !add.value;
if (!add.value) {
editingController.clear();
usersNotifier.clear();
focusNode.unfocus();
} else {
focusNode.requestFocus();
}
},
suffixIcon: Padding(
padding: const EdgeInsets.all(7.0),
child: Container(
padding: const EdgeInsets.all(7),
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [
ColorConstants.gradient1,
ColorConstants.gradient2
],
begin: Alignment.topLeft,
end: Alignment.bottomRight),
boxShadow: [
BoxShadow(
color:
ColorConstants.gradient2.withOpacity(0.4),
offset: const Offset(2, 3),
blurRadius: 5)
],
borderRadius:
const BorderRadius.all(Radius.circular(10)),
),
child: HeroIcon(
!add.value ? HeroIcons.plus : HeroIcons.xMark,
size: 20,
color: Colors.white,
),
),
),
value: simpleGroup,
builder: (context, g) {
return Column(
children: [
StyledSearchBar(
label: AdminTextConstants.members,
color: ColorConstants.gradient1,
padding: const EdgeInsets.all(0),
onChanged: (value) async {
if (value.isNotEmpty) {
await usersNotifier.filterUsers(value,
excludeGroup: [group.value!.toSimpleGroup()]);
} else {
usersNotifier.clear();
}
},
onSuffixIconTap: (focusNode, editingController) {
add.value = !add.value;
if (!add.value) {
editingController.clear();
usersNotifier.clear();
focusNode.unfocus();
} else {
focusNode.requestFocus();
}
},
suffixIcon: Padding(
padding: const EdgeInsets.all(7.0),
child: Container(
padding: const EdgeInsets.all(7),
decoration: BoxDecoration(
gradient: const LinearGradient(colors: [
ColorConstants.gradient1,
ColorConstants.gradient2
], begin: Alignment.topLeft, end: Alignment.bottomRight),
boxShadow: [
BoxShadow(
color: ColorConstants.gradient2.withOpacity(0.4),
offset: const Offset(2, 3),
blurRadius: 5)
],
borderRadius: const BorderRadius.all(Radius.circular(10)),
),
child: HeroIcon(
!add.value ? HeroIcons.plus : HeroIcons.xMark,
size: 20,
color: Colors.white,
),
if (add.value) const SizedBox(height: 10),
if (add.value) const MemberResults(),
if (!add.value)
...g[0].members.map((x) => UserUi(
user: x,
onDelete: () {
showDialog(
context: context,
builder: (BuildContext context) =>
CustomDialogBox(
descriptions: AdminTextConstants
.removeAssociationMember,
title: AdminTextConstants.deleting,
onYes: () async {
await tokenExpireWrapper(ref,
() async {
Group newGroup = g[0].copyWith(
members: g[0]
.members
.where((element) =>
element.id != x.id)
.toList());
final value = await groupNotifier
.deleteMember(newGroup, x);
if (value) {
simpleGroupGroupsNotifier
.setTData(newGroup.id,
AsyncData([newGroup]));
displayToastWithContext(
TypeMsg.msg,
AdminTextConstants
.updatedAssociation);
} else {
displayToastWithContext(
TypeMsg.msg,
AdminTextConstants
.updatingError);
}
});
}));
})),
],
);
});
),
),
),
if (add.value) const SizedBox(height: 10),
if (add.value) const MemberResults(),
if (!add.value)
...g[0].members.map((x) => UserUi(
user: x,
onDelete: () {
showDialog(
context: context,
builder: (BuildContext context) => CustomDialogBox(
descriptions:
AdminTextConstants.removeAssociationMember,
title: AdminTextConstants.deleting,
onYes: () async {
await tokenExpireWrapper(ref, () async {
Group newGroup = g[0].copyWith(
members: g[0]
.members
.where(
(element) => element.id != x.id)
.toList());
final value = await groupNotifier
.deleteMember(newGroup, x);
if (value) {
simpleGroupGroupsNotifier.setTData(
newGroup.id, AsyncData([newGroup]));
displayToastWithContext(TypeMsg.msg,
AdminTextConstants.updatedAssociation);
} else {
displayToastWithContext(TypeMsg.msg,
AdminTextConstants.updatingError);
}
});
}));
})),
],
);
});
}
}
19 changes: 15 additions & 4 deletions lib/advert/providers/advert_poster_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,39 @@ import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:myecl/advert/providers/advert_posters_provider.dart';
import 'package:myecl/auth/providers/openid_provider.dart';
import 'package:myecl/advert/repositories/advert_poster_repository.dart';
import 'package:myecl/tools/providers/single_notifier.dart';

class AdvertPosterNotifier extends SingleNotifier<Image> {
final advertPosterRepository = AdvertPosterRepository();
AdvertPosterNotifier({required String token})
final AdvertPostersNotifier advertPostersNotifier;
AdvertPosterNotifier(
{required String token, required this.advertPostersNotifier})
: super(const AsyncValue.loading()) {
advertPosterRepository.setToken(token);
}

Future<Image> getAdvertPoster(String id) async {
return await advertPosterRepository.getAdvertPoster(id);
final image = await advertPosterRepository.getAdvertPoster(id);
advertPostersNotifier.setTData(id, AsyncData([image]));
return image;
}

Future<Image> updateAdvertPoster(String id, Uint8List bytes) async {
return await advertPosterRepository.addAdvertPoster(bytes, id);
advertPostersNotifier.setTData(id, const AsyncLoading());
final image = await advertPosterRepository.addAdvertPoster(bytes, id);
advertPostersNotifier.setTData(id, AsyncData([image]));
return image;
}
}

final advertPosterProvider =
StateNotifierProvider<AdvertPosterNotifier, AsyncValue<Image>>((ref) {
final token = ref.watch(tokenProvider);
return AdvertPosterNotifier(token: token);
final advertPostersNotifier = ref.watch(advertPostersProvider.notifier);
return AdvertPosterNotifier(
token: token, advertPostersNotifier: advertPostersNotifier);
});
22 changes: 5 additions & 17 deletions lib/advert/providers/advert_posters_provider.dart
Original file line number Diff line number Diff line change
@@ -1,25 +1,13 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:myecl/advert/class/advert.dart';
import 'package:myecl/advert/providers/advert_list_provider.dart';
import 'package:myecl/tools/providers/map_provider.dart';
import 'package:myecl/tools/token_expire_wrapper.dart';

class AdvertPosterNotifier extends MapNotifier<Advert, Image> {
AdvertPosterNotifier() : super();
class AdvertPostersNotifier extends MapNotifier<String, Image> {
AdvertPostersNotifier() : super();
}

final advertPostersProvider = StateNotifierProvider<AdvertPosterNotifier,
AsyncValue<Map<Advert, AsyncValue<List<Image>>?>>>((ref) {
AdvertPosterNotifier advertPosterNotifier = AdvertPosterNotifier();
tokenExpireWrapperAuth(ref, () async {
ref.watch(advertListProvider).maybeWhen(data: (advert) {
advertPosterNotifier.loadTList(advert);
return advertPosterNotifier;
}, orElse: () {
advertPosterNotifier.loadTList([]);
return advertPosterNotifier;
});
});
final advertPostersProvider = StateNotifierProvider<AdvertPostersNotifier,
Map<String, AsyncValue<List<Image>>?>>((ref) {
AdvertPostersNotifier advertPosterNotifier = AdvertPostersNotifier();
return advertPosterNotifier;
});
Loading

0 comments on commit ec4d4ad

Please sign in to comment.