Clean code + wip handle quizz section type
This commit is contained in:
parent
5ce70d6ead
commit
d78873c9d4
@ -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';
|
||||
|
||||
@ -319,8 +319,8 @@ class DatabaseHelper {
|
||||
);
|
||||
}
|
||||
|
||||
ArticleRead getArticleReadFromDB(dynamic element) {
|
||||
return ArticleRead(
|
||||
SectionRead getArticleReadFromDB(dynamic element) {
|
||||
return SectionRead(
|
||||
id: element["id"],
|
||||
readTime: element["readTime"]
|
||||
);
|
||||
|
||||
@ -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}';
|
||||
}
|
||||
}
|
||||
@ -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}';
|
||||
}
|
||||
}
|
||||
@ -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});
|
||||
|
||||
@ -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) {
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
|
||||
326
lib/Screens/Quizz/quizz_page.dart
Normal file
326
lib/Screens/Quizz/quizz_page.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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';
|
||||
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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<Body> {
|
||||
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<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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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();
|
||||
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;
|
||||
}
|
||||
},
|
||||
)
|
||||
],
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 !");
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user