relatica/lib/screens/home.dart
2022-11-17 11:04:14 -05:00

118 lines
3.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
import 'package:go_router/go_router.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import '../models/TimelineIdentifiers.dart';
import '../services/timeline_manager.dart';
class HomeScreen extends StatefulWidget {
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final _logger = Logger('$HomeScreen');
final postText = TextEditingController();
var currentType = TimelineType.home;
final types = [
TimelineType.home,
TimelineType.global,
TimelineType.local,
];
@override
Widget build(BuildContext context) {
_logger.finest('Build');
final tm = context.watch<TimelineManager>();
return Scaffold(
appBar: AppBar(
title: Text('Home'),
actions: [
IconButton(
onPressed: () {
context.push('/post/new');
},
icon: Icon(Icons.add),
),
],
),
body: Column(
children: [
DropdownButton<TimelineType>(
value: currentType,
items: types
.map((e) => DropdownMenuItem<TimelineType>(
value: e,
child: Text(e.name),
))
.toList(),
onChanged: (value) {
setState(() {
currentType = value!;
});
}),
Expanded(child: buildTimelineComponent(context, tm))
],
),
);
}
Widget buildTimelineComponent(BuildContext context, TimelineManager manager) {
final result =
manager.getTimeline(TimelineIdentifiers(timeline: currentType));
if (result.isFailure) {
return Center(child: Text('Error getting timeline: ${result.error}'));
}
final items = result.value;
return RefreshIndicator(
onRefresh: () async {
await manager.refreshTimeline(TimelineIdentifiers.home());
},
child: ListView.separated(
itemBuilder: (context, index) {
final item = items[index];
final entry = item.entry;
return ListTile(
subtitle: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
HtmlWidget(
item.entry.body,
onTapUrl: (url) async {
print(url);
return true;
},
onTapImage: (imageMetadata) {
print(imageMetadata);
},
),
if (entry.links.isNotEmpty)
Text('Preview: ${entry.links.first.url}'),
if (entry.mediaAttachments.isNotEmpty)
...entry.mediaAttachments
.map((a) => Text('Media: ${a.uri}')),
Text(
'Engagement -- Likes: ${entry.likes.length}, Dislikes: ${entry.dislikes.length}, Comments:${item.totalChildren} ')
],
),
),
//trailing: Text(item.parentId),
title: Text(
'${entry.id} for ${item.isMine ? 'Me' : entry.author} for post ${entry.parentId}'),
trailing: Text(DateTime.fromMillisecondsSinceEpoch(
entry.creationTimestamp * 1000)
.toIso8601String()),
);
},
separatorBuilder: (context, index) => Divider(),
itemCount: items.length,
),
);
}
}