import 'dart:convert'; import 'dart:developer'; import 'dart:typed_data'; //import 'package:confetti/confetti.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:manager_api_new/api.dart'; import 'package:mymuseum_visitapp/Components/CustomAppBar.dart'; import 'package:mymuseum_visitapp/Components/Loading.dart'; import 'package:mymuseum_visitapp/Components/loading_common.dart'; import 'package:mymuseum_visitapp/Components/rounded_button.dart'; import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Models/ResponseSubDTO.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/article_page.dart'; //import 'package:mymuseum_visitapp/Screens/Quizz/drawPath.dart'; import 'package:mymuseum_visitapp/Screens/Quizz/questions_list.dart'; import 'package:mymuseum_visitapp/Screens/Quizz/quizz_page.dart'; //import 'package:mymuseum_visitapp/Screens/Quizz/showResponses.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 SectionPage extends StatefulWidget { const SectionPage({Key? key, required this.visitAppContextIn, required this.sectionId}) : super(key: key); final String sectionId; final VisitAppContext visitAppContextIn; @override State createState() => _SectionPageState(); } class _SectionPageState extends State { final GlobalKey _scaffoldKey = GlobalKey(); SectionDTO? sectionDTO; late VisitAppContext visitAppContext; late dynamic rawSectionData; List resourcesModel = []; @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; visitAppContext = appContext.getContext(); return Scaffold( key: _scaffoldKey, appBar: CustomAppBar( title: sectionDTO != null ? TranslationHelper.get(sectionDTO!.title, visitAppContext) : "", isHomeButton: false, ), body: OrientationBuilder( builder: (context, orientation) { return FutureBuilder( future: getSectionDetail(appContext, visitAppContext.clientAPI, widget.sectionId), builder: (context, AsyncSnapshot snapshot) { if(sectionDTO != null) { switch(sectionDTO!.type) { case SectionType.Article: ArticleDTO articleDTO = ArticleDTO.fromJson(rawSectionData)!; return ArticlePage(visitAppContextIn: widget.visitAppContextIn, articleDTO: articleDTO, resourcesModel: resourcesModel); case SectionType.Quiz: QuizDTO quizDTO = QuizDTO.fromJson(rawSectionData)!; return QuizPage(visitAppContextIn: widget.visitAppContextIn, quizDTO: quizDTO, resourcesModel: resourcesModel); default: return const Center(child: Text("Unsupported type")); } } else { return const LoadingCommon(); } } ); } ) ); } Future getSectionDetail(AppContext appContext, Client client, String sectionId) async { try { if(sectionDTO == 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 rawSectionData = await client.sectionApi!.sectionGetDetail(sectionId); SectionDTO sectionOnline = jsonDecode(jsonEncode(rawSectionData)).map((json) => SectionDTO.fromJson(json)).whereType().toList(); sectionDTO = sectionOnline; } switch(sectionDTO!.type) { case SectionType.Quiz: QuizDTO? quizDTO = QuizDTO.fromJson(jsonDecode(rawSectionData)); if(quizDTO != null) { quizDTO.questions!.sort((a, b) => a.order!.compareTo(b.order!)); if(quizDTO.questions != null && quizDTO.questions!.isNotEmpty) { quizDTO.questions!.sort((a, b) => a.order!.compareTo(b.order!)); for (var question in quizDTO.questions!) { if(isConfigOffline) { // OFFLINE if(question.imageBackgroundResourceId != null) { List> ressourceQuizz = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.resources, question.imageBackgroundResourceId!); if(ressourceQuizz.isNotEmpty) { resourcesModel.add(DatabaseHelper.instance.getResourceFromDB(ressourceQuizz.first)); } else { print("EMPTY resourcesModel - second"); } } } else { // ONLINE if(question.imageBackgroundResourceId != null) { resourcesModel.add(ResourceModel(id: question.imageBackgroundResourceId, source: question.imageBackgroundResourceUrl, type: ResourceType.Image)); } } } } } break; default: break; } /*setState(() { //print(sectionDTO!.title); });*/ } else { return null; // TODO return local list.. } } catch (e) { print(e); print("IN CATCH"); return null; } } }