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/linear_status_indicator.dart'; import '../controls/login_aware_cached_network_image.dart'; import '../controls/padding.dart'; import '../controls/responsive_max_width.dart'; import '../controls/standard_app_drawer.dart'; import '../controls/timeline/timeline_panel.dart'; import '../globals.dart'; import '../models/TimelineIdentifiers.dart'; import '../models/group_data.dart'; import '../services/auth_service.dart'; import '../services/network_status_service.dart'; import '../services/timeline_manager.dart'; import '../utils/active_profile_selector.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; GroupData? currentGroup; final types = [ TimelineType.self, TimelineType.home, TimelineType.global, TimelineType.local, TimelineType.group, ]; void updateTimeline(TimelineManager manager) { if (currentType == TimelineType.group && currentGroup == null) { _logger.finest('Group timeline but no group selected so not updating'); return; } _logger.finest('Updating timeline: $currentTimeline'); Future.delayed(const Duration(milliseconds: 100), () async { await manager.updateTimeline( currentTimeline, TimelineRefreshType.refresh); }); } TimelineIdentifiers get currentTimeline => TimelineIdentifiers( timeline: currentType, auxData: currentGroup?.id ?? '', ); @override void initState() { super.initState(); getIt>() .activeEntry .andThenSuccess((m) => updateTimeline(m)); } @override Widget build(BuildContext context) { _logger.finest('Build'); final accountService = getIt(); final nss = getIt(); final manager = context .watch>() .activeEntry .value; final groups = manager.getGroups().getValueOrElse(() => []).toList(); groups.sort((g1, g2) => g1.name.compareTo(g2.name)); if (!groups.contains(currentGroup)) { currentGroup = null; } final timeline = TimelinePanel(timeline: currentTimeline); return Scaffold( appBar: AppBar( leading: accountService.loggedIn ? Builder(builder: (context) { return IconButton( onPressed: () { Scaffold.of(context).openDrawer(); }, icon: LoginAwareCachedNetworkImage( imageUrl: accountService.currentProfile.avatar)); }) : null, backgroundColor: Theme.of(context).canvasColor, title: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ if (currentType == TimelineType.group) PopupMenuButton( initialValue: currentType, // Callback that sets the selected popup menu item. onSelected: (value) { setState(() { currentType = value; }); updateTimeline(manager); }, itemBuilder: (BuildContext context) => types .map((e) => PopupMenuItem( value: e, child: Text(e.toLabel()), )) .toList()), if (currentType != TimelineType.group) DropdownButton( value: currentType, items: types .map((e) => DropdownMenuItem( value: e, child: Text(e.toLabel()), )) .toList(), onChanged: (value) { setState(() { currentType = value!; }); updateTimeline(manager); }), const HorizontalPadding( width: 5.0, ), if (currentType == TimelineType.group) DropdownButton( value: currentGroup, items: groups .map((g) => DropdownMenuItem( value: g, child: Text(g.name), )) .toList(), onChanged: (value) { setState(() { currentGroup = value; }); updateTimeline(manager); }), ], ), ), body: Center( child: Column( children: [ StandardLinearProgressIndicator(nss.timelineLoadingStatus), Expanded( child: ResponsiveMaxWidth(child: timeline), ), ], ), ), drawer: const StandardAppDrawer(), bottomNavigationBar: AppBottomNavBar( currentButton: NavBarButtons.timelines, onHomeButtonReclick: () => timeline.scrollToTop(), ), floatingActionButton: FloatingActionButton.small( onPressed: () { context.push('/post/new'); }, child: const Icon(Icons.add), )); } }