Clean code + wip handle quizz section type

This commit is contained in:
Fransolet Thomas 2023-02-23 18:07:08 +01:00
parent 5ce70d6ead
commit d78873c9d4
16 changed files with 419 additions and 123 deletions

View File

@ -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';

View File

@ -319,8 +319,8 @@ class DatabaseHelper {
);
}
ArticleRead getArticleReadFromDB(dynamic element) {
return ArticleRead(
SectionRead getArticleReadFromDB(dynamic element) {
return SectionRead(
id: element["id"],
readTime: element["readTime"]
);

View File

@ -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<String, dynamic> toMap() {
return {
@ -14,8 +14,8 @@ class ArticleRead {
};
}
factory ArticleRead.fromJson(Map<String, dynamic> json) {
return ArticleRead(
factory SectionRead.fromJson(Map<String, dynamic> 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}';
}
}

View File

@ -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<String, dynamic> 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}';
}
}

View File

@ -12,8 +12,8 @@ class VisitAppContext with ChangeNotifier{
List<String?>? sectionIds; // Use to valid QR code found
List<BeaconSection?>? beaconSections;
List<SectionDTO?>? currentSections;
List<ArticleRead> readArticles = [];
bool isArticleCurrentlyShown = false;
List<SectionRead> readSections = [];
bool isContentCurrentlyShown = false;
bool isScanningBeacons = false;
VisitAppContext({this.language, this.id, this.configuration, this.instanceId});

View File

@ -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<ArticlePage> {
@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<ArticlePage> {
Widget build(BuildContext context) {
final appContext = Provider.of<AppContext>(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<ArticlePage> {
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) {

View File

@ -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<ConfigurationsList> {
var isFinish =
await DownloadConfiguration.download(appContext, configuration);
print("C4EST FINIITO");
print("C'EST FINI.");
print(isFinish);
Navigator.of(context).pop();

View File

@ -136,7 +136,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
if(visitAppContext.beaconSections == null) {
List<SectionDTO>? sections = await ApiService.getAllBeacons(client, visitAppContext.instanceId!);
if(sections != null && sections.isNotEmpty) {
List<BeaconSection> beaconSections = sections.map((e) => BeaconSection(minorBeaconId: e.beaconId, orderInConfig: e.order, configurationId: e.configurationId, sectionId: e.id)).toList();
List<BeaconSection> 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);

View File

@ -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<QuizzPage> createState() => _QuizzPageState();
}
class _QuizzPageState extends State<QuizzPage> {
SectionDTO? sectionDTO;
QuizzDTO? quizzDTO;
List<ResourceModel?> resourcesModel = <ResourceModel?>[];
ResourceModel? audioResourceModel;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
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<AppContext>(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<dynamic> 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<QuizzDTO?> 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<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> 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;
}
}
}

View File

@ -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';

View File

@ -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';

View File

@ -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,6 +101,8 @@ class _BodyState extends State<Body> {
itemIndex: index,
sectionDTO: sectionsToDisplay[index],
press: () {
switch(sectionsToDisplay[index].type) {
case SectionType.Article:
Navigator.push(
context,
MaterialPageRoute(
@ -109,6 +112,22 @@ class _BodyState extends State<Body> {
),
),
);
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<Body> {
List<SectionDTO>? 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);
}
}

View File

@ -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,

View File

@ -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<VisitPage> 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<VisitPage> 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<VisitPage> with WidgetsBindingObserver {
Navigator.of(context).pop();
//visitAppContext.isArticleCurrentlyShown = true;
lastTimePopUpWasClosed = DateTime.now();
switch(beaconSection!.sectionType!) {
case SectionType.Article:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ArticlePage(
visitAppContextIn: visitAppContext,
articleId: beaconSection!.sectionId!,
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;
}
},
)
],

View File

@ -42,7 +42,7 @@ class DownloadConfiguration {
if(sections!.isNotEmpty) {
List<SectionDTO> sectionsInDB = await DatabaseHelper.instance.queryWithConfigurationId(DatabaseTableType.sections, configuration.id!);
List<SectionDTO> sectionsToKeep = sections.where((s) => s.type == SectionType.Article).toList(); // TODO handle other type of section
List<SectionDTO> 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<String> 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<SectionDTO>? sections = await ApiService.getAllSections(appContext.clientAPI, configuration.id!);
if(sections!.isNotEmpty) {
List<SectionDTO> sectionsInDB = await DatabaseHelper.instance.queryWithConfigurationId(DatabaseTableType.sections, configuration.id!);
List<SectionDTO> 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<String?> 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;
}
}

View File

@ -25,15 +25,15 @@ void main() async {
print("we've got an local db !");
print(localContext);
List<ArticleRead> articleReadTest = List<ArticleRead>.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead));
localContext.readArticles = articleReadTest;
List<SectionRead> articleReadTest = List<SectionRead>.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<ArticleRead> articleReadTest = List<ArticleRead>.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead));
localContext.readArticles = articleReadTest;
print(localContext.readArticles);
List<SectionRead> articleReadTest = List<SectionRead>.from(await DatabaseHelper.instance.getData(DatabaseTableType.articleRead));
localContext.readSections = articleReadTest;
print(localContext.readSections);
print("NO LOCAL DB !");
}