import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; import '../controls/app_bottom_nav_bar.dart'; import '../controls/timeline/status_control.dart'; import '../models/TimelineIdentifiers.dart'; import '../services/timeline_manager.dart'; class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); @override State createState() => _HomeScreenState(); } class _HomeScreenState extends State { final _logger = Logger('$HomeScreen'); final postText = TextEditingController(); var currentType = TimelineType.home; final types = [ TimelineType.home, TimelineType.global, TimelineType.local, ]; @override Widget build(BuildContext context) { _logger.finest('Build'); final tm = context.watch(); return Scaffold( appBar: AppBar( title: Text('Home'), actions: [ IconButton( onPressed: () { context.push('/post/new'); }, icon: Icon(Icons.add), ), ], ), body: Column( children: [ DropdownButton( value: currentType, items: types .map((e) => DropdownMenuItem( value: e, child: Text(e.name), )) .toList(), onChanged: (value) { setState(() { currentType = value!; }); }), Expanded(child: buildTimelineComponent(context, tm)) ], ), bottomNavigationBar: AppBottomNavBar( currentButton: NavBarButtons.home, ), ); } Widget buildTimelineComponent(BuildContext context, TimelineManager manager) { final result = manager.getTimeline(TimelineIdentifiers(timeline: currentType)); if (result.isFailure) { return Center(child: Text('Error getting timeline: ${result.error}')); } final items = result.value; print('items count = ${items.length}'); return RefreshIndicator( onRefresh: () async { await manager.updateTimeline( TimelineIdentifiers.home(), TimelineRefreshType.refresh); }, child: ListView.separated( itemBuilder: (context, index) { if (index == 0) { return TextButton( onPressed: () async => await manager.updateTimeline( TimelineIdentifiers.home(), TimelineRefreshType.loadNewer), child: const Text('Load newer posts')); } if (index == items.length + 1) { return TextButton( onPressed: () async => await manager.updateTimeline( TimelineIdentifiers.home(), TimelineRefreshType.loadOlder), child: const Text('Load older posts')); } final itemIndex = index - 1; final item = items[itemIndex]; _logger.finest( 'Building item: $itemIndex: ${item.entry.toShortString()}'); return StatusControl(originalItem: item); }, separatorBuilder: (context, index) => Divider(), itemCount: items.length + 2, ), ); } }