From 0322716c6016ce24bb3f32aa0fce3b8c69187756 Mon Sep 17 00:00:00 2001 From: Fransolet Thomas Date: Thu, 30 Mar 2023 18:54:02 +0200 Subject: [PATCH] clean code + AdminPopup + add audiosNotWorking in context --- lib/Components/AdminPopup.dart | 73 +++++++++++++++++++++++++ lib/Components/CustomAppBar.dart | 19 ++++++- lib/Helpers/DatabaseHelper.dart | 30 +++++++++- lib/Models/visitContext.dart | 10 +++- lib/Screens/Visit/visit.dart | 2 +- lib/Services/downloadConfiguration.dart | 7 ++- 6 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 lib/Components/AdminPopup.dart diff --git a/lib/Components/AdminPopup.dart b/lib/Components/AdminPopup.dart new file mode 100644 index 0000000..2a540d3 --- /dev/null +++ b/lib/Components/AdminPopup.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; +import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; +import 'package:mymuseum_visitapp/Models/visitContext.dart'; +import 'package:mymuseum_visitapp/app_context.dart'; +import 'package:provider/provider.dart'; +import '../constants.dart'; + +class AdminPopup extends StatefulWidget { + const AdminPopup({ + Key? key, + }) : super(key: key); + + + @override + State createState() => _AdminPopupState(); +} + +class _AdminPopupState extends State { + final TextEditingController _controller = TextEditingController(); + bool isPasswordOk = false; + String password = "FORT2023!"; + VisitAppContext? visitAppContext; + + @override + Widget build(BuildContext context) { + Size size = MediaQuery.of(context).size; + final appContext = Provider.of(context); + visitAppContext = appContext.getContext() as VisitAppContext; + + isPasswordOk = visitAppContext!.isAdmin!; + + return Container( + width: size.width*0.65, + height: isPasswordOk ? size.height*0.1 : size.height*0.25, + margin: const EdgeInsets.all(kDefaultPadding), + child: isPasswordOk ? Column( + children: [ + Text("Audios qui ne fonctionnent pas :"), + Text("TODO list"), + ], + ) : + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text("Mot de passe admin"), + SizedBox( + width: size.width*0.65, + height: size.height *0.2, + child: TextFormField( + controller: _controller, + onChanged: (value) { + if(value == password) { + setState(() { + isPasswordOk = true; + visitAppContext!.isAdmin = true; + appContext.setContext(visitAppContext!); + DatabaseHelper.instance.updateTableMain(DatabaseTableType.main, visitAppContext!); + }); + } + }, + //style: const TextStyle(color: Colors.white), + obscureText: true, + enableSuggestions: false, + autocorrect: false, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/Components/CustomAppBar.dart b/lib/Components/CustomAppBar.dart index 4a1fac2..3e81a5e 100644 --- a/lib/Components/CustomAppBar.dart +++ b/lib/Components/CustomAppBar.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:mymuseum_visitapp/Components/AdminPopup.dart'; import 'package:mymuseum_visitapp/Components/LanguageSelection.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; import 'package:mymuseum_visitapp/Screens/Home/home.dart'; @@ -26,9 +27,23 @@ class _CustomAppBarState extends State { final appContext = Provider.of(context); VisitAppContext visitAppContext = appContext.getContext(); - final notchInset = MediaQuery.of(context).padding; + //final notchInset = MediaQuery.of(context).padding; return AppBar( - title: Text(widget.title), + title: + InkWell( + onLongPress: () { + showDialog( + builder: (BuildContext context) => const AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)) + ), + content: AdminPopup(), + contentPadding: EdgeInsets.zero, + ), context: context + ); + }, + child: Text(widget.title), + ), centerTitle: true, leading: widget.isHomeButton ? IconButton( icon: const Icon(Icons.home), diff --git a/lib/Helpers/DatabaseHelper.dart b/lib/Helpers/DatabaseHelper.dart index c239ffe..d44aae5 100644 --- a/lib/Helpers/DatabaseHelper.dart +++ b/lib/Helpers/DatabaseHelper.dart @@ -62,6 +62,9 @@ class DatabaseHelper { static const columnSectionId = 'sectionId'; static const columnSectionType = 'sectionType'; + static const columnIsAdmin = 'isAdmin'; + + DatabaseHelper._privateConstructor(); static final DatabaseHelper instance = DatabaseHelper._privateConstructor(); @@ -151,7 +154,8 @@ class DatabaseHelper { CREATE TABLE $mainTable ( $columnId TEXT NOT NULL PRIMARY KEY, $columnLanguage TEXT NOT NULL, - $columnInstanceId TEXT NOT NULL + $columnInstanceId TEXT NOT NULL, + $columnIsAdmin BOOLEAN NOT NULL CHECK ($columnIsAdmin IN (0,1)) ) '''); break; @@ -227,6 +231,27 @@ class DatabaseHelper { } } + void updateTableMain(DatabaseTableType type, VisitAppContext visitAppContext) async { + try { + Database db = await instance.database; + var nameOfTable = _getTableName(type); + + // CHECK IF EXIST + String checkQuery = "PRAGMA table_info($nameOfTable)"; + var test = await db.rawQuery(checkQuery); + + if(test.where((e) => e.toString().contains(columnIsAdmin)).isEmpty) { + await db.rawQuery("ALTER TABLE $nameOfTable Add $columnIsAdmin BOOLEAN CHECK ($columnIsAdmin IN (0,1))"); + } else { + print("IN"); + } + DatabaseHelper.instance.insert(DatabaseTableType.main, visitAppContext.toMap()); + } catch (e) { + print("ERROR IN updateTableMain"); + print(e); + } + } + Future isExist(DatabaseTableType type) async { Database db = await instance.database; var nameOfTable = _getTableName(type); @@ -283,7 +308,8 @@ class DatabaseHelper { dataToReturn = VisitAppContext( id: element["id"], instanceId: element["instanceId"], - language: element["language"] + language: element["language"], + isAdmin: element["isAdmin"] == 1 ? true : false, ); break; case DatabaseTableType.configurations: diff --git a/lib/Models/visitContext.dart b/lib/Models/visitContext.dart index 6034327..4cf2ae8 100644 --- a/lib/Models/visitContext.dart +++ b/lib/Models/visitContext.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:manager_api/api.dart'; import 'package:mymuseum_visitapp/Models/articleRead.dart'; import 'package:mymuseum_visitapp/Models/beaconSection.dart'; +import 'package:mymuseum_visitapp/Models/resourceModel.dart'; class VisitAppContext with ChangeNotifier{ String? id = ""; @@ -18,13 +19,18 @@ class VisitAppContext with ChangeNotifier{ bool isScanBeaconAlreadyAllowed = false; bool isMaximizeTextSize = false; - VisitAppContext({this.language, this.id, this.configuration, this.instanceId}); + List audiosNotWorking = []; + + bool? isAdmin = false; + + VisitAppContext({this.language, this.id, this.configuration, this.isAdmin, this.instanceId}); Map toMap() { return { 'id': id, 'instanceId': instanceId, 'language': language, + 'isAdmin': isAdmin }; } @@ -39,6 +45,6 @@ class VisitAppContext with ChangeNotifier{ @override String toString() { - return 'VisitAppContext{id: $id, instanceId: $instanceId, language: $language, configuration: $configuration, beaconSections: $beaconSections}'; + return 'VisitAppContext{id: $id, instanceId: $instanceId, language: $language, configuration: $configuration, beaconSections: $beaconSections, isAdmin: $isAdmin}'; } } \ No newline at end of file diff --git a/lib/Screens/Visit/visit.dart b/lib/Screens/Visit/visit.dart index d17f030..f671aa1 100644 --- a/lib/Screens/Visit/visit.dart +++ b/lib/Screens/Visit/visit.dart @@ -37,7 +37,7 @@ class _VisitPageState extends State with WidgetsBindingObserver { int timeBetweenBeaconPopUp = 20000; // 20 sec int meterToBeacon = 100; // 15 meters - bool modeDebugBeacon = true; + bool modeDebugBeacon = false; // Beacon specific final controller = Get.find(); diff --git a/lib/Services/downloadConfiguration.dart b/lib/Services/downloadConfiguration.dart index d6c3c36..1e80c9a 100644 --- a/lib/Services/downloadConfiguration.dart +++ b/lib/Services/downloadConfiguration.dart @@ -12,7 +12,6 @@ class DownloadConfiguration { static Future download(AppContext appContext, ConfigurationDTO configuration) async { print("COUCOUCOU IIIIINNNN"); - // TODO ADD POPUP LANGUAGE SELECTION ExportConfigurationDTO? exportConfigurationDTO = await ApiService.exportConfiguration(appContext.clientAPI, configuration.id!, (appContext.getContext() as VisitAppContext).language!); if(exportConfigurationDTO != null) { @@ -97,6 +96,12 @@ class DownloadConfiguration { await DatabaseHelper.instance.insert(DatabaseTableType.resources, resourceModel.toMap()); } catch (e) { print("We got an issue inserting audio data ${audioData.first.id}"); + + // Update context with not working audios + VisitAppContext visitAppContext = appContext.getContext() as VisitAppContext; + visitAppContext.audiosNotWorking.add(resourceModel); + visitAppContext.audiosNotWorking = visitAppContext.audiosNotWorking.toSet().toList(); // Remove duplicates + appContext.setContext(visitAppContext); } } }