import 'package:cached_network_image/cached_network_image.dart'; 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/padding.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, ]; @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 currentTimeline = TimelineIdentifiers( timeline: currentType, auxData: currentGroup?.id ?? '', ); return Scaffold( appBar: AppBar( leading: accountService.loggedIn ? Builder(builder: (context) { return IconButton( onPressed: () { Scaffold.of(context).openDrawer(); }, icon: CachedNetworkImage( 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; }); }, 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!; }); }), 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; }); }), ], ), ), body: Center( child: Column( children: [ ValueListenableBuilder( valueListenable: nss.timelineLoadingStatus, builder: (context2, executing, _) { if (executing) { return const LinearProgressIndicator(); } return const SizedBox(); }), Expanded(child: TimelinePanel(timeline: currentTimeline)), ], ), ), drawer: StandardAppDrawer(), bottomNavigationBar: const AppBottomNavBar( currentButton: NavBarButtons.timelines, ), floatingActionButton: FloatingActionButton.small( onPressed: () { context.push('/post/new'); }, child: Icon(Icons.add), )); } }