relatica/lib/screens/home.dart

175 wiersze
5.9 KiB
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/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<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
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<ActiveProfileSelector<TimelineManager>>()
.activeEntry
.andThenSuccess((m) => updateTimeline(m));
}
@override
Widget build(BuildContext context) {
_logger.finest('Build');
final accountService = getIt<AccountsService>();
final nss = getIt<NetworkStatusService>();
final manager = context
.watch<ActiveProfileSelector<TimelineManager>>()
.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<TimelineType>(
initialValue: currentType,
// Callback that sets the selected popup menu item.
onSelected: (value) {
setState(() {
currentType = value;
});
updateTimeline(manager);
},
itemBuilder: (BuildContext context) => types
.map((e) => PopupMenuItem<TimelineType>(
value: e,
child: Text(e.toLabel()),
))
.toList()),
if (currentType != TimelineType.group)
DropdownButton<TimelineType>(
value: currentType,
items: types
.map((e) => DropdownMenuItem<TimelineType>(
value: e,
child: Text(e.toLabel()),
))
.toList(),
onChanged: (value) {
setState(() {
currentType = value!;
});
updateTimeline(manager);
}),
const HorizontalPadding(
width: 5.0,
),
if (currentType == TimelineType.group)
DropdownButton<GroupData>(
value: currentGroup,
items: groups
.map((g) => DropdownMenuItem<GroupData>(
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),
));
}
}