mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-18 19:23:31 +00:00
118 lines
3.8 KiB
Dart
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,
|
|
),
|
|
);
|
|
}
|
|
}
|