2022-11-09 02:28:48 +00:00
|
|
|
import 'package:flutter/material.dart';
|
2022-11-17 16:04:14 +00:00
|
|
|
import 'package:go_router/go_router.dart';
|
|
|
|
import 'package:logging/logging.dart';
|
2022-12-08 18:37:30 +00:00
|
|
|
import 'package:provider/provider.dart';
|
2022-11-09 02:28:48 +00:00
|
|
|
|
2022-11-19 03:49:11 +00:00
|
|
|
import '../controls/app_bottom_nav_bar.dart';
|
2023-03-20 00:54:28 +00:00
|
|
|
import '../controls/linear_status_indicator.dart';
|
2023-03-20 14:06:44 +00:00
|
|
|
import '../controls/login_aware_cached_network_image.dart';
|
2023-04-13 14:30:09 +00:00
|
|
|
import '../controls/responsive_max_width.dart';
|
2023-03-14 03:47:40 +00:00
|
|
|
import '../controls/standard_app_drawer.dart';
|
2022-11-29 15:33:16 +00:00
|
|
|
import '../controls/timeline/timeline_panel.dart';
|
2023-01-29 15:14:34 +00:00
|
|
|
import '../globals.dart';
|
2022-11-17 16:04:14 +00:00
|
|
|
import '../models/TimelineIdentifiers.dart';
|
2023-03-14 03:47:40 +00:00
|
|
|
import '../services/auth_service.dart';
|
2023-01-29 15:14:34 +00:00
|
|
|
import '../services/network_status_service.dart';
|
2022-12-08 18:37:30 +00:00
|
|
|
import '../services/timeline_manager.dart';
|
2023-03-14 03:47:40 +00:00
|
|
|
import '../utils/active_profile_selector.dart';
|
2022-11-17 16:04:14 +00:00
|
|
|
|
|
|
|
class HomeScreen extends StatefulWidget {
|
2022-11-19 03:49:11 +00:00
|
|
|
const HomeScreen({super.key});
|
|
|
|
|
2022-11-17 16:04:14 +00:00
|
|
|
@override
|
|
|
|
State<HomeScreen> createState() => _HomeScreenState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _HomeScreenState extends State<HomeScreen> {
|
|
|
|
final _logger = Logger('$HomeScreen');
|
2022-11-09 02:28:48 +00:00
|
|
|
|
2023-11-16 21:34:21 +00:00
|
|
|
TimelineIdentifiers currentTimeline = TimelineIdentifiers.home();
|
2022-11-09 02:28:48 +00:00
|
|
|
|
2023-03-20 00:54:28 +00:00
|
|
|
void updateTimeline(TimelineManager manager) {
|
2023-11-27 19:16:11 +00:00
|
|
|
_logger.finer('Updating timeline: $currentTimeline');
|
2023-03-20 00:54:28 +00:00
|
|
|
Future.delayed(const Duration(milliseconds: 100), () async {
|
|
|
|
await manager.updateTimeline(
|
|
|
|
currentTimeline, TimelineRefreshType.refresh);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
getIt<ActiveProfileSelector<TimelineManager>>()
|
|
|
|
.activeEntry
|
|
|
|
.andThenSuccess((m) => updateTimeline(m));
|
|
|
|
}
|
|
|
|
|
2022-11-09 02:28:48 +00:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2022-11-17 16:04:14 +00:00
|
|
|
_logger.finest('Build');
|
2023-03-11 03:17:34 +00:00
|
|
|
final accountService = getIt<AccountsService>();
|
2023-01-29 15:14:34 +00:00
|
|
|
final nss = getIt<NetworkStatusService>();
|
2023-03-20 00:54:28 +00:00
|
|
|
|
2023-04-07 12:55:37 +00:00
|
|
|
final timeline = TimelinePanel(timeline: currentTimeline);
|
|
|
|
|
2022-11-09 02:28:48 +00:00
|
|
|
return Scaffold(
|
2023-03-15 01:58:49 +00:00
|
|
|
appBar: AppBar(
|
|
|
|
leading: accountService.loggedIn
|
|
|
|
? Builder(builder: (context) {
|
|
|
|
return IconButton(
|
|
|
|
onPressed: () {
|
|
|
|
Scaffold.of(context).openDrawer();
|
|
|
|
},
|
2023-03-20 14:06:44 +00:00
|
|
|
icon: LoginAwareCachedNetworkImage(
|
2023-03-15 01:58:49 +00:00
|
|
|
imageUrl: accountService.currentProfile.avatar));
|
|
|
|
})
|
|
|
|
: null,
|
|
|
|
backgroundColor: Theme.of(context).canvasColor,
|
2023-11-16 21:21:06 +00:00
|
|
|
title: buildTimelineSelector(context),
|
2023-03-15 01:58:49 +00:00
|
|
|
),
|
|
|
|
body: Center(
|
|
|
|
child: Column(
|
|
|
|
children: [
|
2023-03-20 00:54:28 +00:00
|
|
|
StandardLinearProgressIndicator(nss.timelineLoadingStatus),
|
2023-04-13 14:30:09 +00:00
|
|
|
Expanded(
|
|
|
|
child: ResponsiveMaxWidth(child: timeline),
|
|
|
|
),
|
2023-03-15 01:58:49 +00:00
|
|
|
],
|
2022-11-17 16:04:14 +00:00
|
|
|
),
|
2023-03-15 01:58:49 +00:00
|
|
|
),
|
2023-04-07 12:55:37 +00:00
|
|
|
drawer: const StandardAppDrawer(),
|
|
|
|
bottomNavigationBar: AppBottomNavBar(
|
2023-03-15 01:58:49 +00:00
|
|
|
currentButton: NavBarButtons.timelines,
|
2023-04-07 12:55:37 +00:00
|
|
|
onHomeButtonReclick: () => timeline.scrollToTop(),
|
2023-03-15 01:58:49 +00:00
|
|
|
),
|
|
|
|
floatingActionButton: FloatingActionButton.small(
|
|
|
|
onPressed: () {
|
|
|
|
context.push('/post/new');
|
|
|
|
},
|
2023-10-31 01:44:16 +00:00
|
|
|
child: const Icon(Icons.add),
|
2023-03-15 01:58:49 +00:00
|
|
|
));
|
2022-11-09 02:28:48 +00:00
|
|
|
}
|
2023-11-16 21:21:06 +00:00
|
|
|
|
|
|
|
Widget buildTimelineSelector(BuildContext context) {
|
|
|
|
final standardTypes = [
|
|
|
|
TimelineType.self,
|
|
|
|
TimelineType.home,
|
|
|
|
TimelineType.global,
|
|
|
|
TimelineType.local,
|
|
|
|
];
|
|
|
|
|
|
|
|
final manager = context
|
|
|
|
.watch<ActiveProfileSelector<TimelineManager>>()
|
|
|
|
.activeEntry
|
|
|
|
.value;
|
|
|
|
|
|
|
|
final circles = manager.getCircles().getValueOrElse(() => []).toList();
|
|
|
|
circles.sort((g1, g2) => g1.name.compareTo(g2.name));
|
|
|
|
|
|
|
|
final items = [
|
|
|
|
...standardTypes
|
|
|
|
.map((t) => TimelineIdentifiers(timeline: t))
|
|
|
|
.map((e) => DropdownMenuItem(value: e, child: Text(e.toLabel()))),
|
|
|
|
const DropdownMenuItem(
|
|
|
|
value: null,
|
|
|
|
enabled: false,
|
|
|
|
child: Divider(),
|
|
|
|
),
|
|
|
|
const DropdownMenuItem(
|
|
|
|
value: null,
|
|
|
|
enabled: false,
|
|
|
|
child: Text(
|
|
|
|
'Circles',
|
|
|
|
style: TextStyle(
|
|
|
|
fontWeight: FontWeight.bold,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
decoration: TextDecoration.underline,
|
|
|
|
),
|
|
|
|
)),
|
|
|
|
...circles
|
|
|
|
.map((c) => TimelineIdentifiers(
|
|
|
|
timeline: TimelineType.circle, auxData: c.id, label: c.name))
|
|
|
|
.map((e) => DropdownMenuItem(
|
|
|
|
value: e,
|
|
|
|
child: Text(
|
|
|
|
e.toLabel(),
|
|
|
|
overflow: TextOverflow.fade,
|
|
|
|
))),
|
|
|
|
];
|
|
|
|
|
2023-11-16 21:34:21 +00:00
|
|
|
if (items.where((i) => i.value == currentTimeline).isEmpty) {
|
|
|
|
currentTimeline = TimelineIdentifiers.home();
|
|
|
|
}
|
|
|
|
|
2023-11-16 21:21:06 +00:00
|
|
|
return DropdownButton<TimelineIdentifiers?>(
|
|
|
|
value: currentTimeline,
|
|
|
|
items: items,
|
|
|
|
isExpanded: true,
|
|
|
|
onChanged: (value) {
|
|
|
|
setState(() {
|
|
|
|
if (value == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
currentTimeline = value;
|
|
|
|
updateTimeline(manager);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2022-11-09 02:28:48 +00:00
|
|
|
}
|