import 'dart:async'; import 'dart:convert'; import 'dart:io'; //import 'dart:html'; import 'dart:ui' as ui; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:manager_api/api.dart'; import 'package:provider/provider.dart'; import 'package:tablet_app/Components/loading_common.dart'; import 'package:tablet_app/Models/agenda.dart'; import 'package:tablet_app/Models/tabletContext.dart'; import 'package:tablet_app/Screens/Agenda/event_list_item.dart'; import 'package:tablet_app/Screens/Agenda/event_popup.dart'; import 'package:tablet_app/Screens/Agenda/month_filter.dart'; import 'package:tablet_app/app_context.dart'; import 'package:tablet_app/constants.dart'; class AgendaView extends StatefulWidget { final SectionDTO? section; AgendaView({this.section}); @override _AgendaView createState() => _AgendaView(); } class _AgendaView extends State { AgendaDTO agendaDTO = AgendaDTO(); late Agenda agenda; late ValueNotifier> filteredAgenda = ValueNotifier>([]); late Uint8List mapIcon; @override void initState() { print(widget.section!.data); agendaDTO = AgendaDTO.fromJson(jsonDecode(widget.section!.data!))!; print(agendaDTO); super.initState(); } @override void dispose() { super.dispose(); } Future getAndParseJsonInfo(TabletAppContext tabletAppContext) async { try { // Récupération du contenu JSON depuis l'URL var httpClient = HttpClient(); // We need to get detail to get url from resourceId var resourceIdForSelectedLanguage = agendaDTO.resourceIds!.where((ri) => ri.language == tabletAppContext.language).first.value; ResourceDTO? resourceDTO = await tabletAppContext.clientAPI!.resourceApi!.resourceGetDetail(resourceIdForSelectedLanguage!); var request = await httpClient.getUrl(Uri.parse(resourceDTO!.url!)); var response = await request.close(); var jsonString = await response.transform(utf8.decoder).join(); agenda = Agenda.fromJson(jsonString); agenda.events = agenda.events.where((a) => a.dateFrom != null && a.dateFrom!.isAfter(DateTime.now())).toList(); agenda.events.sort((a, b) => a.dateFrom!.compareTo(b.dateFrom!)); filteredAgenda.value = agenda.events; mapIcon = await getByteIcon(); return agenda; } catch(e) { print("Erreur lors du parsing du json : ${e.toString()}"); return null; } } getByteIcon() async { final ByteData bytes = await rootBundle.load('assets/icons/marker.png'); var icon = await getBytesFromAsset(bytes, 25); return icon; } Future getBytesFromAsset(ByteData data, int width) async { //ByteData data = await rootBundle.load(path); ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List(), targetWidth: width); ui.FrameInfo fi = await codec.getNextFrame(); return (await fi.image.toByteData(format: ui.ImageByteFormat.png)) !.buffer .asUint8List(); } @override Widget build(BuildContext context) { Size size = MediaQuery.of(context).size; final TabletAppContext tabletAppContext = Provider.of(context).getContext(); return FutureBuilder(future: getAndParseJsonInfo(tabletAppContext), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (snapshot.data == null) { return Center( child: Text("Le json n'est pas valide") ); } else { return Center( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( flex: 1, child: Container( decoration: BoxDecoration( color: kBackgroundColor, borderRadius: BorderRadius.all(Radius.circular(tabletAppContext.configuration!.roundedValue?.toDouble() ?? 30.0)), ), child: Padding( padding: const EdgeInsets.all(8.0), child: MonthFilter( events: snapshot.data.events, onMonthSelected: (filteredList) { print('events sélectionné: $filteredList'); var result = filteredList != null ? filteredList : []; result.sort((a, b) => a.dateFrom!.compareTo(b.dateFrom!)); filteredAgenda.value = result; }), ), ), ), Expanded( flex: 4, child: Padding( padding: const EdgeInsets.only(left: 8.0, bottom: 2.0, top: 2.0), child: Container( child: ValueListenableBuilder>( valueListenable: filteredAgenda, builder: (context, value, _) { return GridView.builder( scrollDirection: Axis.vertical, // Changer pour horizontal si nécessaire gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 4, // Nombre de colonnes dans la grid crossAxisSpacing: 4.0, // Espace entre les colonnes mainAxisSpacing: 4.0, // Espace entre les lignes childAspectRatio: 0.75, // Aspect ratio des enfants de la grid ), itemCount: value.length, itemBuilder: (BuildContext context, int index) { EventAgenda eventAgenda = value[index]; return GestureDetector( onTap: () { print("${eventAgenda.name}"); showDialog( context: context, builder: (BuildContext context) { return EventPopup(eventAgenda: eventAgenda, mapProvider: agendaDTO.mapProvider ?? MapProvider.Google, mapIcon: mapIcon); }, ); }, child: EventListItem( eventAgenda: eventAgenda, ), ); }, ); } ), ), ), ), ], ), ); } } else if (snapshot.connectionState == ConnectionState.none) { return Text("No data"); } else { return Center( child: Container( height: size.height * 0.2, child: LoadingCommon() ) ); } }, ); } } //_webView