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/timeline/timeline_panel.dart'; import '../globals.dart'; import '../models/TimelineIdentifiers.dart'; import '../models/group_data.dart'; import '../services/network_status_service.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; GroupData? currentGroup; final types = [ TimelineType.self, TimelineType.home, TimelineType.global, TimelineType.local, TimelineType.group, ]; @override Widget build(BuildContext context) { _logger.finest('Build'); final nss = getIt(); final manager = context.watch(); final groups = manager.getGroups().getValueOrElse(() => []).toList(); groups.sort((g1, g2) => g1.name.compareTo(g2.name)); final currentTimeline = TimelineIdentifiers( timeline: currentType, auxData: currentGroup?.id ?? '', ); return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).canvasColor, title: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ DropdownButton( value: currentType, items: types .map((e) => DropdownMenuItem( value: e, child: Text(e.toLabel()), )) .toList(), onChanged: (value) { setState(() { currentType = value!; }); }), const HorizontalPadding(), if (currentType == TimelineType.group) DropdownButton( value: currentGroup, items: groups .map((g) => DropdownMenuItem( value: g, child: Text(g.name), )) .toList(), onChanged: (value) { setState(() { currentGroup = value; }); }), ], ), actions: [ ValueListenableBuilder( valueListenable: nss.timelineLoadingStatus, builder: (context2, executing, _) { if (executing) { final theme = Theme.of(context); final size = theme.appBarTheme.actionsIconTheme?.size ?? theme.iconTheme.size ?? 24; return Center( child: SizedBox( width: size, height: size, child: const CircularProgressIndicator(), ), ); } return IconButton( onPressed: () async => await manager.updateTimeline( currentTimeline, TimelineRefreshType.refresh), icon: Icon( Icons.refresh, color: Theme.of(context).textTheme.bodyLarge?.color, )); }), IconButton( onPressed: () { context.push('/post/new'); }, icon: Icon( Icons.edit, color: Theme.of(context).textTheme.bodyLarge?.color, ), ), ], ), body: Column( children: [ Expanded( child: TimelinePanel( timeline: currentTimeline, )), ], ), bottomNavigationBar: const AppBottomNavBar( currentButton: NavBarButtons.timelines, ), ); } }