243 lines
9.6 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:auto_size_text/auto_size_text.dart';
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/Helpers/DatabaseHelper.dart';
import 'package:mymuseum_visitapp/Helpers/networkCheck.dart';
import 'package:mymuseum_visitapp/Screens/Visit/visit.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 HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
//List<ConfigurationDTO> configurations = [ConfigurationDTO(label: "Test 0", isOffline: false), ConfigurationDTO(label: "Test 1", isOffline: true), ConfigurationDTO(label: "Test 2", isOffline: true)];
List<ConfigurationDTO> configurations = [];
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
final appContext = Provider.of<AppContext>(context);
return Scaffold(
appBar: CustomAppBar(
title: "Home page - liste parcours",
isHomeButton: false,
),
body: SingleChildScrollView(
child: Container(
width: size.width,
height: size.height,
child: FutureBuilder(
future: getConfigurations(appContext.clientAPI),
builder: (context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
configurations = List<ConfigurationDTO>.from(snapshot.data).where((configuration) => configuration.isMobile!).toList();
return RefreshIndicator (
onRefresh: () {
setState(() {});
return Future(() => null);
},
color: kSecondColor,
child: ListView.builder(
shrinkWrap: true, //I've set this as true here depending on what your listview content is
//physics: NeverScrollableScrollPhysics(),//This prevents scrolling, but may inhibit refresh indicator, remove as you need
itemBuilder: (BuildContext context, int index) {
return InkWell(
onTap: () {
setState(() {
print(configurations[index].label);
Navigator.of(context).pushReplacement(MaterialPageRoute(
builder: (context) => VisitPage(configurationId: configurations[index].id!),
));
});
},
child: Container(
height: size.height*0.15,
decoration: boxDecoration(configurations[index], false),
margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
child: Stack(
children: [
Align(
alignment: Alignment.topLeft,
child: Padding(
padding: const EdgeInsets.only(top: 20, left: 10),
child: AutoSizeText(
configurations[index].label!,
style: const TextStyle(fontSize: kMenuTitleDetailSize),
maxLines: 1,
),
),
),
if(configurations[index].isOffline!) // TODO check if already downloaded
Positioned(
bottom: 0,
right: 0,
child: Container(
width: 45,
height: 45,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: kMainColor,
borderRadius: BorderRadius.circular(20.0),
),
margin: const EdgeInsets.all(8),
child: InkWell(
onTap: () async {
downloadClicked(appContext, configurations[index]);
},
child: const Icon(Icons.download_outlined, color: Colors.white),
),
/*AutoSizeText(
configurations[index].isOffline.toString(),
style: const TextStyle(fontSize: kMenuDescriptionDetailSize, fontFamily: ""),
maxLines: 1,
),*/
)
)
],
),
),
);
},
itemCount: configurations.length
),
);
} else if (snapshot.connectionState == ConnectionState.none) {
return Text("No data");
} else {
return Center(
child: Container(
height: size.height * 0.15,
child: Loading()
)
);
}
}
),
),
),
floatingActionButton: const ScannerBouton(isReplacement: false),
//floatingActionButtonLocation: FloatingActionButtonLocation.miniCenterFloat,
);
}
Future<List<ConfigurationDTO>?> getConfigurations(Client client) async {
try {
List<ConfigurationDTO>? configurations;
bool isOnline = await hasNetwork();
if(isOnline) {
//var client = new Client("http://192.168.31.140:8089"); // TODO REMOVE
configurations = await client.configurationApi!.configurationGet();
return configurations ?? [];
} else {
print("Search in local DB as we don't have internet connection");
configurations = List<ConfigurationDTO>.from(await DatabaseHelper.instance.getData(DatabaseTableType.configurations));
print("RESULT AAH");
return configurations ?? []; // TODO return local list..
}
} catch (e) {
print(e);
print("IN CATCH");
return [];
}
}
Future<List<SectionDTO>?> getAllSections(Client client, String configurationId) async {
try {
bool isOnline = await hasNetwork();
if(isOnline) {
List<SectionDTO>? sections = await client.sectionApi!.sectionGetFromConfiguration(configurationId);
print(sections);
return sections;
} else {
return []; // TODO return local list..
}
} catch (e) {
print(e);
print("IN CATCH");
return [];
}
}
Future<void> downloadClicked(AppContext appContext, ConfigurationDTO configuration) async {
// Display config only downloaded - TODO
// Update local DB - Configuration
await DatabaseHelper.instance.insert(DatabaseTableType.configurations, configuration.toJson());
var teeest = await DatabaseHelper.instance.getData(DatabaseTableType.configurations);
print("RESULT new or update config");
print(teeest);
print("TODO download");
List<SectionDTO>? sections = await getAllSections(appContext.clientAPI, configuration.id!);
if(sections!.isNotEmpty) {
// Update local DB - Sections
for(var section in sections) {
print("Section to store == ");
print(section.toJson());
print(section.type == SectionType.Quizz);
var test = sectionToMap(section);
print("SECTION TOOOOO MAAAAAAAAAAAAAAAAAAAAP");
print(test);
await DatabaseHelper.instance.insert(DatabaseTableType.sections, sectionToMap(section));
}
}
}
Map<String, dynamic> sectionToMap(SectionDTO section) {
return {
'id': section.id,
'label': section.label,
'title': jsonEncode(section.title),
'description': jsonEncode(section.description),
'imageId': section.imageId,
'imageSource': section.imageSource,
'configurationId': section.configurationId,
'isSubSection': section.isSubSection,
'parentId': section.parentId,
'type': section.type!.toJson(),
'data': section.data,
'dateCreation': section.dateCreation!.toUtc().toIso8601String(),
'orderOfElement': section.order,
//'token': token
};
}
}
boxDecoration(ConfigurationDTO configuration, bool isSelected) { // TODO to change
return BoxDecoration(
color: kSecondColor,
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(20.0),
boxShadow: const [
BoxShadow(
color: kSecondColor,
spreadRadius: 0.15,
blurRadius: 3.5,
offset: Offset(0, 1), // changes position of shadow
),
],
);
}