diff --git a/lib/Components/ScannerDialog.dart b/lib/Components/ScannerDialog.dart index 57d0dda..a37215c 100644 --- a/lib/Components/ScannerDialog.dart +++ b/lib/Components/ScannerDialog.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; -import 'package:mymuseum_visitapp/Screens/Article/article.dart'; +import 'package:mymuseum_visitapp/Screens/Article/article_page.dart'; import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/constants.dart'; import 'package:qr_code_scanner/qr_code_scanner.dart'; diff --git a/lib/Helpers/DatabaseHelper.dart b/lib/Helpers/DatabaseHelper.dart index 446cb1c..7ae726b 100644 --- a/lib/Helpers/DatabaseHelper.dart +++ b/lib/Helpers/DatabaseHelper.dart @@ -319,8 +319,8 @@ class DatabaseHelper { ); } - ArticleRead getArticleReadFromDB(dynamic element) { - return ArticleRead( + SectionRead getArticleReadFromDB(dynamic element) { + return SectionRead( id: element["id"], readTime: element["readTime"] ); diff --git a/lib/Models/articleRead.dart b/lib/Models/articleRead.dart index 7a5df38..3bcd71b 100644 --- a/lib/Models/articleRead.dart +++ b/lib/Models/articleRead.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:manager_api/api.dart'; -class ArticleRead { +class SectionRead { String id = ""; int readTime; - ArticleRead({required this.id, required this.readTime}); + SectionRead({required this.id, required this.readTime}); Map toMap() { return { @@ -14,8 +14,8 @@ class ArticleRead { }; } - factory ArticleRead.fromJson(Map json) { - return ArticleRead( + factory SectionRead.fromJson(Map json) { + return SectionRead( id: json['id'] as String, readTime: json['readTime'] as int ); @@ -23,6 +23,6 @@ class ArticleRead { @override String toString() { - return 'ArticleRead{id: $id, readTime: $readTime}'; + return 'SectionRead{id: $id, readTime: $readTime}'; } } \ No newline at end of file diff --git a/lib/Models/beaconSection.dart b/lib/Models/beaconSection.dart index 0f12b32..65ac317 100644 --- a/lib/Models/beaconSection.dart +++ b/lib/Models/beaconSection.dart @@ -5,12 +5,13 @@ class BeaconSection { int? orderInConfig; String? configurationId; String? sectionId; + SectionType? sectionType; /*int? rssi; int? accuracy; String? proximityUUID;*/ bool? found = false; - BeaconSection({this.minorBeaconId, this.orderInConfig, this.configurationId, this.sectionId, this.found}); + BeaconSection({this.minorBeaconId, this.orderInConfig, this.configurationId, this.sectionId, this.sectionType, this.found}); Map toMap() { return { @@ -18,6 +19,7 @@ class BeaconSection { 'orderInConfig': orderInConfig, 'configurationId': configurationId, 'sectionId': sectionId, + 'sectionType': sectionType, /*'rssi': rssi, 'accuracy': accuracy, 'proximityUUID': proximityUUID,*/ @@ -31,6 +33,7 @@ class BeaconSection { orderInConfig: json['orderInConfig'] as int, configurationId: json['configurationId'] as String, sectionId: json['sectionId'] as String, + sectionType: SectionType.fromJson(json[r'sectionType']), /*rssi: json['rssi'] as int, accuracy: json['accuracy'] as int, proximityUUID: json['proximityUUID'] as String,*/ @@ -40,6 +43,6 @@ class BeaconSection { @override String toString() { - return 'BeaconSection{minorBeaconId: $minorBeaconId, orderInConfig: $orderInConfig, sectionId: $sectionId, configurationId: $configurationId, found: $found}'; + return 'BeaconSection{minorBeaconId: $minorBeaconId, orderInConfig: $orderInConfig, sectionId: $sectionId, sectionType: $sectionType, configurationId: $configurationId, found: $found}'; } } \ No newline at end of file diff --git a/lib/Models/visitContext.dart b/lib/Models/visitContext.dart index 5a8bf2d..e214071 100644 --- a/lib/Models/visitContext.dart +++ b/lib/Models/visitContext.dart @@ -12,8 +12,8 @@ class VisitAppContext with ChangeNotifier{ List? sectionIds; // Use to valid QR code found List? beaconSections; List? currentSections; - List readArticles = []; - bool isArticleCurrentlyShown = false; + List readSections = []; + bool isContentCurrentlyShown = false; bool isScanningBeacons = false; VisitAppContext({this.language, this.id, this.configuration, this.instanceId}); diff --git a/lib/Screens/Article/article.dart b/lib/Screens/Article/article_page.dart similarity index 96% rename from lib/Screens/Article/article.dart rename to lib/Screens/Article/article_page.dart index c9a9cfa..f2b36b7 100644 --- a/lib/Screens/Article/article.dart +++ b/lib/Screens/Article/article_page.dart @@ -5,10 +5,8 @@ import 'package:flutter/material.dart'; import 'package:manager_api/api.dart'; import 'package:mymuseum_visitapp/Components/CustomAppBar.dart'; import 'package:mymuseum_visitapp/Components/Loading.dart'; -import 'package:mymuseum_visitapp/Components/ScannerBouton.dart'; import 'package:mymuseum_visitapp/Components/SliderImages.dart'; import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; -import 'package:mymuseum_visitapp/Helpers/networkCheck.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Models/articleRead.dart'; import 'package:mymuseum_visitapp/Models/resourceModel.dart'; @@ -41,13 +39,13 @@ class _ArticlePageState extends State { @override void initState() { - widget.visitAppContextIn.isArticleCurrentlyShown = true; + widget.visitAppContextIn.isContentCurrentlyShown = true; super.initState(); } @override void dispose() { - visitAppContext!.isArticleCurrentlyShown = false; + visitAppContext!.isContentCurrentlyShown = false; super.dispose(); } @@ -55,7 +53,7 @@ class _ArticlePageState extends State { Widget build(BuildContext context) { final appContext = Provider.of(context); Size size = MediaQuery.of(context).size; - final notchInset = MediaQuery.of(context).padding; + //final notchInset = MediaQuery.of(context).padding; visitAppContext = appContext.getContext(); @@ -257,9 +255,9 @@ class _ArticlePageState extends State { if(sectionTest.isNotEmpty) { sectionDTO = DatabaseHelper.instance.getSectionFromDB(sectionTest.first); try { - ArticleRead articleRead = ArticleRead(id: sectionDTO!.id!, readTime: DateTime.now().millisecondsSinceEpoch); + SectionRead articleRead = SectionRead(id: sectionDTO!.id!, readTime: DateTime.now().millisecondsSinceEpoch); await DatabaseHelper.instance.insert(DatabaseTableType.articleRead, articleRead.toMap()); - visitAppContext!.readArticles.add(articleRead); + visitAppContext!.readSections.add(articleRead); appContext.setContext(visitAppContext!); } catch (e) { diff --git a/lib/Screens/Home/configurations_list.dart b/lib/Screens/Home/configurations_list.dart index f5a45df..bc3e5b5 100644 --- a/lib/Screens/Home/configurations_list.dart +++ b/lib/Screens/Home/configurations_list.dart @@ -2,17 +2,11 @@ import 'dart:convert'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; import 'package:manager_api/api.dart'; import 'package:mymuseum_visitapp/Components/LanguageSelection.dart'; import 'package:mymuseum_visitapp/Components/Loading.dart'; -import 'package:mymuseum_visitapp/Components/SearchBox.dart'; -import 'package:mymuseum_visitapp/Components/SearchNumberBox.dart'; -import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; -import 'package:mymuseum_visitapp/Helpers/requirement_state_controller.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; -import 'package:mymuseum_visitapp/Screens/Article/article.dart'; import 'package:mymuseum_visitapp/Screens/Visit/visit.dart'; import 'package:mymuseum_visitapp/Services/apiService.dart'; import 'package:mymuseum_visitapp/Services/downloadConfiguration.dart'; @@ -350,7 +344,7 @@ class _ConfigurationsListState extends State { var isFinish = await DownloadConfiguration.download(appContext, configuration); - print("C4EST FINIITO"); + print("C'EST FINI."); print(isFinish); Navigator.of(context).pop(); diff --git a/lib/Screens/Home/home.dart b/lib/Screens/Home/home.dart index 29cfa26..1c45189 100644 --- a/lib/Screens/Home/home.dart +++ b/lib/Screens/Home/home.dart @@ -136,7 +136,7 @@ class _HomePageState extends State with WidgetsBindingObserver { if(visitAppContext.beaconSections == null) { List? sections = await ApiService.getAllBeacons(client, visitAppContext.instanceId!); if(sections != null && sections.isNotEmpty) { - List beaconSections = sections.map((e) => BeaconSection(minorBeaconId: e.beaconId, orderInConfig: e.order, configurationId: e.configurationId, sectionId: e.id)).toList(); + List beaconSections = sections.map((e) => BeaconSection(minorBeaconId: e.beaconId, orderInConfig: e.order, configurationId: e.configurationId, sectionId: e.id, sectionType: e.type)).toList(); visitAppContext.beaconSections = beaconSections; print("Got some Beacons for you"); print(beaconSections); diff --git a/lib/Screens/Quizz/quizz_page.dart b/lib/Screens/Quizz/quizz_page.dart new file mode 100644 index 0000000..5d6c88b --- /dev/null +++ b/lib/Screens/Quizz/quizz_page.dart @@ -0,0 +1,326 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; +import 'package:manager_api/api.dart'; +import 'package:mymuseum_visitapp/Components/CustomAppBar.dart'; +import 'package:mymuseum_visitapp/Components/Loading.dart'; +import 'package:mymuseum_visitapp/Components/SliderImages.dart'; +import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; +import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; +import 'package:mymuseum_visitapp/Models/articleRead.dart'; +import 'package:mymuseum_visitapp/Models/resourceModel.dart'; +import 'package:mymuseum_visitapp/Models/visitContext.dart'; +import 'package:mymuseum_visitapp/Screens/Article/audio_player.dart'; +import 'package:mymuseum_visitapp/Services/apiService.dart'; +import 'package:mymuseum_visitapp/app_context.dart'; +import 'package:mymuseum_visitapp/client.dart'; +import 'package:mymuseum_visitapp/constants.dart'; +import 'package:provider/provider.dart'; + +class QuizzPage extends StatefulWidget { + const QuizzPage({Key? key, required this.visitAppContextIn, required this.sectionId}) : super(key: key); + + final String sectionId; + final VisitAppContext visitAppContextIn; + + @override + State createState() => _QuizzPageState(); +} + +class _QuizzPageState extends State { + SectionDTO? sectionDTO; + QuizzDTO? quizzDTO; + List resourcesModel = []; + ResourceModel? audioResourceModel; + final GlobalKey _scaffoldKey = GlobalKey(); + late Uint8List audiobytes; + VisitAppContext? visitAppContext; + + @override + void initState() { + widget.visitAppContextIn.isContentCurrentlyShown = true; + super.initState(); + } + + @override + void dispose() { + visitAppContext!.isContentCurrentlyShown = false; + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final appContext = Provider.of(context); + Size size = MediaQuery.of(context).size; + //final notchInset = MediaQuery.of(context).padding; + + visitAppContext = appContext.getContext(); + + return Scaffold( + key: _scaffoldKey, + appBar: CustomAppBar( + title: sectionDTO != null ? TranslationHelper.get(sectionDTO!.title, visitAppContext!) : "", + isHomeButton: false, + ), + body: FutureBuilder( + future: getQuizz(appContext, appContext.clientAPI, widget.sectionId), + builder: (context, AsyncSnapshot snapshot) { + if(quizzDTO != null && sectionDTO != null) { + if(size.height > size.width) { + return Column( + children: [ + Text("TODO show QUESTION THEN COLUMN WITH ALL RESPONSE") + ], + ); + } else { + return Container( + height: size.height, + width: size.width, + child: Column( + children: [ + Text("TODO show QUESTION THEN GRID LIKE IN TABLET") + ], + ), + ); + } + } else { + return const Loading(); + } + } + ), + //floatingActionButton: const ScannerBouton(isReplacement: true), + ); + } + + /*Widget getImages(Size size, bool isContentTop) { + if(size.width > size.height) { + return SizedBox( + width: size.width *0.5, + height: size.height * 0.75, + child: Padding( + padding: isContentTop ? const EdgeInsets.only(left: 8.0, right: 8.0, bottom: 8.0): const EdgeInsets.only(left: 8.0, right: 8.0, top: 8.0), + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: kBlue2, + width: 0.5, + ), + color: Colors.white, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(5.0), + boxShadow: const [kDefaultShadow], + ), + child: SliderImagesWidget( + resources: resourcesModel, + height: size.height * 0.29, + imagesDTO: quizzDTO!.images!, + ) + ) + ) + ); + } else { + return SizedBox( + width: size.width, + height: size.height * 0.3, + child: Padding( + padding: isContentTop ? const EdgeInsets.only(left: 8.0, right: 8.0, bottom: 8.0): const EdgeInsets.only(left: 8.0, right: 8.0, top: 8.0), + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: kBlue2, + width: 0.5, + ), + color: Colors.white, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(5.0), + boxShadow: const [kDefaultShadow], + ), + child: SliderImagesWidget( + resources: resourcesModel, + height: size.height * 0.29, + imagesDTO: articleDTO!.images!, + ) + ) + ) + ); + } + } +*/ + + /*Widget getContent(Size size, AppContext appContext) { + if(size.width > size.height) { + return SingleChildScrollView( + child: Container( + width: size.width *0.5, + height: size.height * 0.76, + //color: Colors.blueAccent, + child: Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0, top: 8.0, bottom: 8.0), + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: kBlue2, + width: 0.5, + ), + color: Colors.white, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(5.0), + boxShadow: const [kDefaultShadow], + ), + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + TranslationHelper.get(articleDTO!.content, appContext.getContext()), + textAlign: TextAlign.left, + style: const TextStyle(fontSize: kArticleContentSize) + ), + ), + ) + ) + ) + ), + ); + } else { + return Expanded( + child: Container( + width: size.width, + //height: size.height * 0.65, + //color: Colors.blueAccent, + child: Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0, top: 8.0, bottom: 8.0), + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: kBlue2, + width: 0.5, + ), + color: Colors.white, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(5.0), + boxShadow: const [kDefaultShadow], + ), + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + TranslationHelper.get(articleDTO!.content, appContext.getContext()), + textAlign: TextAlign.left, + style: const TextStyle(fontSize: kArticleContentSize) + ), + ), + ) + ) + ) + ), + ); + } + }*/ + + Future getQuizz(AppContext appContext, Client client, String sectionId) async { + try { + if(sectionDTO == null || quizzDTO == null) { + bool isConfigOffline = (appContext.getContext() as VisitAppContext).configuration!.isOffline!; + if(isConfigOffline) + { + // OFFLINE + List> sectionTest = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.sections, sectionId); + if(sectionTest.isNotEmpty) { + sectionDTO = DatabaseHelper.instance.getSectionFromDB(sectionTest.first); + try { + SectionRead sectionRead = SectionRead(id: sectionDTO!.id!, readTime: DateTime.now().millisecondsSinceEpoch); + await DatabaseHelper.instance.insert(DatabaseTableType.articleRead, sectionRead.toMap()); + visitAppContext!.readSections.add(sectionRead); + + appContext.setContext(visitAppContext!); + } catch (e) { + print("DATABASE ERROR SECTIONREAD"); + print(e); + } + } else { + print("EMPTY SECTION"); + } + } else + { + // ONLINE + SectionDTO? sectionOnline = await client.sectionApi!.sectionGetDetail(sectionId); + if(sectionOnline != null) { + sectionDTO = sectionOnline; + } else { + print("EMPTY SECTION"); + } + } + + if(sectionDTO!.type == SectionType.Quizz) { + quizzDTO = QuizzDTO.fromJson(jsonDecode(sectionDTO!.data!)); + } + if(quizzDTO != null) { + if(quizzDTO!.questions != null && quizzDTO!.questions!.isNotEmpty) { + quizzDTO!.questions!.sort((a, b) => a.order!.compareTo(b.order!)); + /*var audioIdArticle = articleDTO!.audioIds!.where((audioId) => audioId.language == (appContext.getContext() as VisitAppContext).language); + if(audioIdArticle.isNotEmpty && audioIdArticle.first.value != null) { + if(isConfigOffline) + { + // OFFLINE + List> ressourceTest = await DatabaseHelper + .instance.queryWithColumnId( + DatabaseTableType.resources, audioIdArticle.first.value!); + if (ressourceTest.isNotEmpty) { + audioResourceModel = DatabaseHelper.instance.getResourceFromDB(ressourceTest.first); + Uint8List base64String = base64Decode(audioResourceModel!.data!); + audiobytes = base64String; + } else { + print("EMPTY resourcesModel - first"); + } + } + else + { + // ONLINE + ResourceModel? resourceAudioOnline = await ApiService.downloadAudio(client, audioIdArticle.first.value!); + if(resourceAudioOnline != null) { + audioResourceModel = resourceAudioOnline; + Uint8List base64String = base64Decode(resourceAudioOnline.data!); + audiobytes = base64String; + } else { + print("EMPTY resourcesModel online - audio"); + } + } + }*/ + for (var question in quizzDTO!.questions!) { + if(isConfigOffline) + { + // OFFLINE + if(question.resourceId != null) { + List> ressourceQuizz = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.resources, question.resourceId!); + if(ressourceQuizz.isNotEmpty) { + resourcesModel.add(DatabaseHelper.instance.getResourceFromDB(ressourceQuizz.first)); + } else { + print("EMPTY resourcesModel - second"); + } + } + } + else + { + // ONLINE + if(question.resourceId != null) { + resourcesModel.add(ResourceModel(id: question.resourceId, source: question.source_, type: ResourceType.Image)); + } + } + } + } + } + + setState(() { + //print(sectionDTO!.title); + }); + } else { + return null; // TODO return local list.. + } + } catch (e) { + print(e); + print("IN CATCH"); + return null; + } + } +} diff --git a/lib/Screens/Scanner/scanner_old.dart b/lib/Screens/Scanner/scanner_old.dart index 85c85c2..82cdd9b 100644 --- a/lib/Screens/Scanner/scanner_old.dart +++ b/lib/Screens/Scanner/scanner_old.dart @@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mymuseum_visitapp/Components/CustomAppBar.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; -import 'package:mymuseum_visitapp/Screens/Article/article.dart'; +import 'package:mymuseum_visitapp/Screens/Article/article_page.dart'; import 'package:mymuseum_visitapp/app_context.dart'; import 'package:qr_code_scanner/qr_code_scanner.dart'; diff --git a/lib/Screens/Visit/beaconArticleFound.dart b/lib/Screens/Visit/beaconArticleFound.dart index c4a88e4..f00c7d8 100644 --- a/lib/Screens/Visit/beaconArticleFound.dart +++ b/lib/Screens/Visit/beaconArticleFound.dart @@ -10,7 +10,7 @@ import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Models/beaconSection.dart'; import 'package:mymuseum_visitapp/Models/resourceModel.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; -import 'package:mymuseum_visitapp/Screens/Article/article.dart'; +import 'package:mymuseum_visitapp/Screens/Article/article_page.dart'; import 'package:mymuseum_visitapp/Services/apiService.dart'; import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/client.dart'; diff --git a/lib/Screens/Visit/components/body.dart b/lib/Screens/Visit/components/body.dart index 4d3a60a..eb219be 100644 --- a/lib/Screens/Visit/components/body.dart +++ b/lib/Screens/Visit/components/body.dart @@ -7,7 +7,8 @@ import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Models/articleRead.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; -import 'package:mymuseum_visitapp/Screens/Article/article.dart'; +import 'package:mymuseum_visitapp/Screens/Article/article_page.dart'; +import 'package:mymuseum_visitapp/Screens/Quizz/quizz_page.dart'; import 'package:mymuseum_visitapp/Services/apiService.dart'; import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/constants.dart'; @@ -100,15 +101,33 @@ class _BodyState extends State { itemIndex: index, sectionDTO: sectionsToDisplay[index], press: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ArticlePage( - visitAppContextIn: appContext.getContext(), - articleId: sectionsToDisplay[index].id!, - ), - ), - ); + switch(sectionsToDisplay[index].type) { + case SectionType.Article: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ArticlePage( + visitAppContextIn: appContext.getContext(), + articleId: sectionsToDisplay[index].id!, + ), + ), + ); + break; + case SectionType.Quizz: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => QuizzPage( + visitAppContextIn: appContext.getContext(), + sectionId: sectionsToDisplay[index].id!, + ), + ), + ); + break; + default: + // TODO HANDLE, SHOW NOT SUPPORTED + break; + } }, ), ), @@ -147,7 +166,7 @@ class _BodyState extends State { List? sectionsDownloaded = await ApiService.getAllSections(appContext.clientAPI, visitAppContext.configuration!.id!); print(sectionsDownloaded); if(sectionsDownloaded!.isNotEmpty) { - sections = sectionsDownloaded.where((s) => s.type == SectionType.Article).toList(); // HERE TODO IF support more than article type + sections = sectionsDownloaded.where((s) => s.type == SectionType.Article || s.type == SectionType.Quizz).toList(); // TODO Support more than Article and Quizz section type print(sections); } } diff --git a/lib/Screens/Visit/components/section_card.dart b/lib/Screens/Visit/components/section_card.dart index 32895c2..3e2bc50 100644 --- a/lib/Screens/Visit/components/section_card.dart +++ b/lib/Screens/Visit/components/section_card.dart @@ -59,7 +59,7 @@ class SectionCard extends StatelessWidget { child: Container( margin: const EdgeInsets.only(right: 10), decoration: BoxDecoration( - color: visitAppContext.readArticles.any((element) => element.id == sectionDTO.id) ? kBackgroundGrey : Colors.white, + color: visitAppContext.readSections.any((element) => element.id == sectionDTO.id) ? kBackgroundGrey : Colors.white, border: Border.all( color: kBlue2, width: 0.2, diff --git a/lib/Screens/Visit/visit.dart b/lib/Screens/Visit/visit.dart index d465c13..c820a44 100644 --- a/lib/Screens/Visit/visit.dart +++ b/lib/Screens/Visit/visit.dart @@ -12,7 +12,8 @@ import 'package:mymuseum_visitapp/Helpers/requirement_state_controller.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Models/beaconSection.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; -import 'package:mymuseum_visitapp/Screens/Article/article.dart'; +import 'package:mymuseum_visitapp/Screens/Article/article_page.dart'; +import 'package:mymuseum_visitapp/Screens/Quizz/quizz_page.dart'; import 'package:mymuseum_visitapp/Screens/Visit/beaconArticleFound.dart'; import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/constants.dart'; @@ -179,7 +180,7 @@ class _VisitPageState extends State with WidgetsBindingObserver { if(beaconList.isNotEmpty && !modeDebugBeacon) { // FILTER ALREADY READ - beaconList = beaconList.where((b) => !visitAppContext.readArticles.any((ra) => ra.id == b!.sectionId)); + beaconList = beaconList.where((b) => !visitAppContext.readSections.any((ra) => ra.id == b!.sectionId)); } if(beaconList.isNotEmpty) @@ -187,7 +188,7 @@ class _VisitPageState extends State with WidgetsBindingObserver { var milliLastTime = lastTimePopUpWasClosed == null ? 0 : lastTimePopUpWasClosed!.millisecondsSinceEpoch; var checkIfMoreThanSec = (DateTime.now().millisecondsSinceEpoch - milliLastTime) > timeBetweenBeaconPopUp; - if(!_isDialogShowing && !visitAppContext.isArticleCurrentlyShown && checkIfMoreThanSec && visitAppContext.isScanningBeacons) { + if(!_isDialogShowing && !visitAppContext.isContentCurrentlyShown && checkIfMoreThanSec && visitAppContext.isScanningBeacons) { print("Before sorting"); print(beaconList); beaconList.toList().sort((a, b) => a!.orderInConfig!.compareTo(b!.orderInConfig!)); @@ -280,15 +281,34 @@ class _VisitPageState extends State with WidgetsBindingObserver { Navigator.of(context).pop(); //visitAppContext.isArticleCurrentlyShown = true; lastTimePopUpWasClosed = DateTime.now(); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ArticlePage( - visitAppContextIn: visitAppContext, - articleId: beaconSection!.sectionId!, - ), - ), - ); + + switch(beaconSection!.sectionType!) { + case SectionType.Article: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ArticlePage( + visitAppContextIn: visitAppContext, + articleId: beaconSection.sectionId!, + ), + ), + ); + break; + case SectionType.Quizz: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => QuizzPage( + visitAppContextIn: visitAppContext, + sectionId: beaconSection.sectionId!, + ), + ), + ); + break; + default: + // TODO HANDLE, SHOW NOT SUPPORTED + break; + } }, ) ], diff --git a/lib/Services/downloadConfiguration.dart b/lib/Services/downloadConfiguration.dart index 2a44fb5..d6c3c36 100644 --- a/lib/Services/downloadConfiguration.dart +++ b/lib/Services/downloadConfiguration.dart @@ -42,7 +42,7 @@ class DownloadConfiguration { if(sections!.isNotEmpty) { List sectionsInDB = await DatabaseHelper.instance.queryWithConfigurationId(DatabaseTableType.sections, configuration.id!); - List sectionsToKeep = sections.where((s) => s.type == SectionType.Article).toList(); // TODO handle other type of section + List sectionsToKeep = sections.where((s) => s.type == SectionType.Article || s.type == SectionType.Quizz).toList(); // TODO handle other type of section (for now, Article and Quizz) sectionsToKeep.sort((a,b) => a.order!.compareTo(b.order!)); int newOrder = 0; @@ -119,70 +119,6 @@ class DownloadConfiguration { cleanLocalResources(usedImageOrAudioIds, configuration); } } - - // Update local DB - Configuration - OLD COOODE - /*await DatabaseHelper.instance.insert(DatabaseTableType.configurations, ModelsHelper.configurationToMap(configuration)); - List usedImageOrAudioIds = []; - - var currentLanguage = (appContext.getContext() as VisitAppContext).language; - - if(configuration.imageId != null) { - ImageDTO image = ImageDTO(resourceId: configuration.imageId, source_: configuration.imageSource); - usedImageOrAudioIds.add(configuration.imageId!); - await ApiService.downloadAndPushLocalImage(appContext.clientAPI, image); - } - - List? sections = await ApiService.getAllSections(appContext.clientAPI, configuration.id!); - - if(sections!.isNotEmpty) { - - List sectionsInDB = await DatabaseHelper.instance.queryWithConfigurationId(DatabaseTableType.sections, configuration.id!); - - List sectionsToKeep = sections.where((s) => s.type == SectionType.Article).toList(); // TODO handle other type of section - - sectionsToKeep.sort((a,b) => a.order!.compareTo(b.order!)); - int newOrder = 0; - // Update local DB - Sections - for(var section in sectionsToKeep) { - section.order = newOrder; - await DatabaseHelper.instance.insert(DatabaseTableType.sections, ModelsHelper.sectionToMap(section)); - - // Download section image - if(section.imageId != null) { - usedImageOrAudioIds.add(section.imageId!); - await ApiService.downloadAndPushLocalImage(appContext.clientAPI, ImageDTO(source_: section.imageSource, resourceId: section.imageId)); - } - - // Download all images.. - ArticleDTO? articleDTO = ArticleDTO.fromJson(jsonDecode(section.data!)); - - if(articleDTO != null) { - for(var image in articleDTO.images!) { - usedImageOrAudioIds.add(image.resourceId!); - await ApiService.downloadAndPushLocalImage(appContext.clientAPI, image); - } - - var audioIdArticle = articleDTO.audioIds!.where((audioId) => audioId.language == currentLanguage); - if(audioIdArticle.isNotEmpty && audioIdArticle.first.value != null) - { - usedImageOrAudioIds.add(audioIdArticle.first.value!); - await ApiService.downloadAndPushLocalAudio(appContext.clientAPI, audioIdArticle.first.value!); - } - } - newOrder = newOrder + 1; - } - - List sectionIdsToRemove = sectionsInDB.map((s) => s.id).where((sectionId) => !sectionsToKeep.map((sk) => sk.id).contains(sectionId)).toList(); - - for(var sectionIdToRemove in sectionIdsToRemove) { - print("section with id removed"); - print(sectionIdToRemove); - await DatabaseHelper.instance.delete(sectionIdToRemove!, DatabaseTableType.sections); - } - - cleanLocalResources(usedImageOrAudioIds, configuration); - }*/ - return true; } } diff --git a/lib/main.dart b/lib/main.dart index 125e17e..6611da0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,15 +25,15 @@ void main() async { print("we've got an local db !"); print(localContext); - List articleReadTest = List.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead)); - localContext.readArticles = articleReadTest; + List articleReadTest = List.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead)); + localContext.readSections = articleReadTest; } else { localContext = VisitAppContext(language: "FR", id: "UserId_Init", instanceId: "633ee379d9405f32f166f047"); DatabaseHelper.instance.insert(DatabaseTableType.main, localContext.toMap()); - List articleReadTest = List.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead)); - localContext.readArticles = articleReadTest; - print(localContext.readArticles); + List articleReadTest = List.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead)); + localContext.readSections = articleReadTest; + print(localContext.readSections); print("NO LOCAL DB !"); }