import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:share_location/foreign_types/memory.dart'; import 'package:share_location/models/memory_pack.dart'; import 'package:share_location/utils/loadable.dart'; import 'package:share_location/widgets/timeline_page.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; final supabase = Supabase.instance.client; class TimelineScroll extends StatefulWidget { TimelineScroll({ Key? key, }) : super(key: key); @override State createState() => _TimelineScrollState(); } class _TimelineScrollState extends State with Loadable { final pageController = PageController(); Map? timeline; @override initState() { super.initState(); loadTimeline(); } Future loadTimeline() async { final response = await supabase .from('memories') .select() .order('created_at', ascending: false) .execute(); final memories = List.from( List>.from(response.data).map(Memory.parse)); final timelineMapped = convertMemoriesToTimeline(memories); setState(() { timeline = timelineMapped; }); } static Map convertMemoriesToTimeline( final List memories, ) { final map = >{}; for (final memory in memories) { final date = DateFormat('yyyy-MM-dd').format(memory.creationDate); if (map.containsKey(date)) { map[date]!.add(memory); } else { map[date] = [memory]; } } return Map.fromEntries( map.entries.map( (entry) => MapEntry( entry.key, MemoryPack(entry.value), ), ), ); } @override Widget build(BuildContext context) { if (timeline == null) { return const Center( child: CircularProgressIndicator(), ); } return Scaffold( body: PageView.builder( controller: pageController, scrollDirection: Axis.vertical, itemCount: timeline!.length, itemBuilder: (_, index) => ChangeNotifierProvider( create: (_) => timeline!.values.elementAt(index), child: TimelinePage( date: DateTime.parse(timeline!.keys.toList()[index]), onNextTimeline: () { pageController.nextPage( duration: const Duration(milliseconds: 500), curve: Curves.ease, ); }, onPreviousTimeline: () { pageController.previousPage( duration: const Duration(milliseconds: 500), curve: Curves.ease, ); }, ), ), ), ); } }