mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-18 19:23:31 +00:00
134 lines
4.4 KiB
Dart
134 lines
4.4 KiB
Dart
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<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,
|
|
];
|
|
|
|
@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 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: [
|
|
DropdownButton<TimelineType>(
|
|
value: currentType,
|
|
items: types
|
|
.map((e) => DropdownMenuItem<TimelineType>(
|
|
value: e,
|
|
child: Text(e.toLabel()),
|
|
))
|
|
.toList(),
|
|
onChanged: (value) {
|
|
setState(() {
|
|
currentType = value!;
|
|
});
|
|
}),
|
|
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;
|
|
});
|
|
}),
|
|
],
|
|
),
|
|
),
|
|
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),
|
|
));
|
|
}
|
|
}
|