diff --git a/assets/illustrations/undraw_access_denied.png b/assets/illustrations/undraw_access_denied.png new file mode 100644 index 000000000..b359d6b42 Binary files /dev/null and b/assets/illustrations/undraw_access_denied.png differ diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index 180648c6f..3171ccad3 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -94,6 +94,7 @@ class MessageLookup extends MessageLookupByLibrary { "errorAnswerIncorrect" : MessageLookupByLibrary.simpleMessage("The answer you entered is incorrect."), "errorClassCannotBeEmpty" : MessageLookupByLibrary.simpleMessage("Class cannot be empty."), "errorCouldNotLaunchURL" : m1, + "errorDontHavePermissions" : MessageLookupByLibrary.simpleMessage("You don\'t have permission to access this page."), "errorEmailInUse" : MessageLookupByLibrary.simpleMessage("There is already an account associated with this e-mail address"), "errorEmailNotFound" : MessageLookupByLibrary.simpleMessage("An account associated with that e-mail could not be found. Please sign up instead."), "errorEventTypeCannotBeEmpty" : MessageLookupByLibrary.simpleMessage("Event type cannot be empty."), diff --git a/lib/generated/intl/messages_ro.dart b/lib/generated/intl/messages_ro.dart index 5a9b4ccdf..54a1051d8 100644 --- a/lib/generated/intl/messages_ro.dart +++ b/lib/generated/intl/messages_ro.dart @@ -94,6 +94,7 @@ class MessageLookup extends MessageLookupByLibrary { "errorAnswerIncorrect" : MessageLookupByLibrary.simpleMessage("Răspunsul introdus nu este corect."), "errorClassCannotBeEmpty" : MessageLookupByLibrary.simpleMessage("Materia trebuie precizată."), "errorCouldNotLaunchURL" : m1, + "errorDontHavePermissions" : MessageLookupByLibrary.simpleMessage("Nu ai permisiune să accesezi această pagină."), "errorEmailInUse" : MessageLookupByLibrary.simpleMessage("Există deja un cont asociat acestui e-mail."), "errorEmailNotFound" : MessageLookupByLibrary.simpleMessage("Nu am putut găsi un cont asociat cu adresa de mail. Vă rugăm să vă înregistrați."), "errorEventTypeCannotBeEmpty" : MessageLookupByLibrary.simpleMessage("Tipul de eveniment trebuie precizat."), diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index 8872950be..d3a67739d 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -1435,6 +1435,16 @@ class S { ); } + /// `You don't have permission to access this page.` + String get errorDontHavePermissions { + return Intl.message( + 'You don\'t have permission to access this page.', + name: 'errorDontHavePermissions', + desc: '', + args: [], + ); + } + /// `Request already exists` String get warningRequestExists { return Intl.message( diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 03c90f41f..20d7fbe75 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -145,6 +145,7 @@ "errorInsertGoogleEvents": "Unable to insert events in Google Calendar.", "errorLoadRequests": "Could not load requests", "errorUnknownUser": "Unknown User", + "errorDontHavePermissions": "You don't have permission to access this page.", "warningRequestExists": "Request already exists", "warningInternetConnection": "Please make sure you have an internet connection.", diff --git a/lib/l10n/intl_ro.arb b/lib/l10n/intl_ro.arb index 69224836d..c3e0cceb1 100644 --- a/lib/l10n/intl_ro.arb +++ b/lib/l10n/intl_ro.arb @@ -145,6 +145,7 @@ "errorInsertGoogleEvents": "Evenimentele nu au putut fi inserate în Google Calendar.", "errorLoadRequests": "Cererile nu au putut fi încărcate", "errorUnknownUser": "Utilizator Necunoscut", + "errorDontHavePermissions": "Nu ai permisiune să accesezi această pagină.", "warningRequestExists": "O cerere deja există", "warningInternetConnection": "Asigurați-vă că sunteți conectat la internet.", diff --git a/lib/pages/settings/view/admin_page.dart b/lib/pages/settings/view/admin_page.dart index 9891735c1..b22b8018d 100644 --- a/lib/pages/settings/view/admin_page.dart +++ b/lib/pages/settings/view/admin_page.dart @@ -1,6 +1,8 @@ +import 'package:acs_upb_mobile/authentication/service/auth_provider.dart'; import 'package:acs_upb_mobile/generated/l10n.dart'; import 'package:acs_upb_mobile/pages/settings/service/admin_provider.dart'; import 'package:acs_upb_mobile/pages/settings/view/request_card.dart'; +import 'package:acs_upb_mobile/widgets/error_page.dart'; import 'package:acs_upb_mobile/widgets/scaffold.dart'; import 'package:acs_upb_mobile/widgets/toast.dart'; import 'package:flutter/material.dart'; @@ -20,49 +22,71 @@ class _AdminPanelPageState extends State { @override Widget build(BuildContext context) { - final adminProvider = Provider.of(context, listen: false); - return AppScaffold( - actions: [ - AppScaffoldAction( - icon: FeatherIcons.filter, - tooltip: S.current.navigationFilter, - items: { - S.current.filterMenuShowAll: () { - if (!all) { - setState(() => all = true); - } else { - AppToast.show(S.current.warningFilterAlreadyAll); - } - }, - S.current.filterMenuShowUnprocessed: () { - if (all) { - setState(() => all = false); - } else { - AppToast.show(S.current.warningFilterAlreadyUnprocessed); - } - }, - }) - ], - title: Text(S.current.navigationAdmin), - body: FutureBuilder( - future: all - ? adminProvider.fetchAllRequestIds() - : adminProvider.fetchUnprocessedRequestIds(), - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - return ListView.builder( - itemCount: - snapshot.data?.length != null ? snapshot.data.length : 0, - itemBuilder: (context, index) { - return RequestCard( - requestId: snapshot.data[index], - ); + if (checkUserIsAdmin()) { + final adminProvider = Provider.of(context, listen: false); + return AppScaffold( + actions: [ + AppScaffoldAction( + icon: FeatherIcons.filter, + tooltip: S.current.navigationFilter, + items: { + S.current.filterMenuShowAll: () { + if (!all) { + setState(() => all = true); + } else { + AppToast.show(S.current.warningFilterAlreadyAll); + } }, - ); - } else { - return const Center(child: CircularProgressIndicator()); - } - }), - ); + S.current.filterMenuShowUnprocessed: () { + if (all) { + setState(() => all = false); + } else { + AppToast.show(S.current.warningFilterAlreadyUnprocessed); + } + }, + }) + ], + title: Text(S.current.navigationAdmin), + body: FutureBuilder( + future: all + ? adminProvider.fetchAllRequestIds() + : adminProvider.fetchUnprocessedRequestIds(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + return ListView.builder( + itemCount: + snapshot.data?.length != null ? snapshot.data.length : 0, + itemBuilder: (context, index) { + return RequestCard( + requestId: snapshot.data[index], + ); + }, + ); + } else { + return const Center(child: CircularProgressIndicator()); + } + }), + ); + } else { + return AppScaffold( + body: ErrorPage( + imgPath: 'assets/illustrations/undraw_access_denied.png', + errorMessage: S.current.errorDontHavePermissions, + ), + ); + } + } + + bool checkUserIsAdmin() { + final authProvider = Provider.of(context, listen: false); + if (authProvider.isAuthenticated && !authProvider.isAnonymous) { + final user = authProvider.currentUserFromCache; + if (user.isAdmin) { + return true; + } else { + return false; + } + } + return false; } } diff --git a/pubspec.yaml b/pubspec.yaml index a7b6a7856..1698f9d7a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,7 +13,7 @@ description: A mobile application for students at ACS UPB. # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # # ACS UPB Mobile uses semantic versioning. You can read more in the CONTRIBUTING.md file. -version: 1.3.1+40 +version: 1.3.1+41 environment: sdk: ">=2.7.0 <3.0.0"