relatica/lib/controls/timeline/post_control.dart

80 wiersze
2.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import '../../models/entry_tree_item.dart';
import '../../models/timeline_entry.dart';
import '../../services/timeline_manager.dart';
import '../../utils/entry_tree_item_flattening.dart';
import 'flattened_tree_entry_control.dart';
class PostControl extends StatefulWidget {
final EntryTreeItem originalItem;
final bool openRemote;
final bool showStatusOpenButton;
const PostControl(
{super.key,
required this.originalItem,
required this.openRemote,
required this.showStatusOpenButton});
@override
State<PostControl> createState() => _PostControlState();
}
class _PostControlState extends State<PostControl> {
static final _logger = Logger('$PostControl');
var showContent = true;
var showComments = false;
EntryTreeItem get item => widget.originalItem;
TimelineEntry get entry => item.entry;
bool get isPublic => item.entry.isPublic;
bool get hasComments => entry.engagementSummary.repliesCount > 0;
@override
void initState() {
showContent = entry.spoilerText.isEmpty;
}
@override
Widget build(BuildContext context) {
final manager = context.watch<TimelineManager>();
_logger.finest('Building ${item.entry.toShortString()}');
final items = widget.originalItem.flatten(topLevelOnly: !showComments);
final widgets = <Widget>[];
for (var i = 0; i < items.length; i++) {
final itemWidget = FlattenedTreeEntryControl(
originalItem: items[i],
openRemote: widget.openRemote,
showStatusOpenButton: widget.showStatusOpenButton,
);
widgets.add(itemWidget);
if (i == 0 && hasComments) {
widgets.add(
TextButton(
onPressed: () async {
setState(() {
showComments = !showComments;
});
if (showComments) {
await manager.refreshStatusChain(entry.id);
}
},
child:
Text(showComments ? 'Hide Comments' : 'Load & Show Comments'),
),
);
}
}
return Column(children: widgets);
}
}