loris/lib/dialogues/full_post_view.dart

125 lines
3.1 KiB
Dart
Raw Normal View History

2022-09-06 21:42:09 +00:00
import 'package:flutter/material.dart';
import 'package:loris/business_logic/posts/posts.dart';
import 'package:loris/business_logic/timeline/timeline.dart';
import 'package:loris/global.dart' as global;
import '../partials/post.dart';
class FullPostView extends StatefulWidget {
const FullPostView({
super.key,
required this.originPostModel,
});
final PostModel originPostModel;
@override
State<FullPostView> createState() => _FullPostViewState();
}
class _FullPostViewState extends State<FullPostView> {
2022-09-07 13:31:03 +00:00
List<PostModel> ancestors = [];
List<PostModel> descendants = [];
bool loading = true;
void loadPosts() async {
final r = await getContextForPost(widget.originPostModel);
if (r.value != null) {
setState(() {
ancestors = r.value!.ancestors;
descendants = r.value!.descendants;
});
}
if (mounted) {
setState(() {
loading = false;
});
}
}
@override
void initState() {
loadPosts();
super.initState();
}
2022-09-06 21:42:09 +00:00
@override
Widget build(BuildContext context) {
return SimpleDialog(
2022-09-07 11:01:29 +00:00
contentPadding: const EdgeInsets.all(24),
2022-09-06 21:42:09 +00:00
children: [
Container(
constraints: global.getConstraints(context),
width: global.getWidth(context),
child: SingleChildScrollView(
child: SingleFullPostDisplay(
2022-09-07 13:31:03 +00:00
ancestors: ancestors,
descendants: descendants,
2022-09-06 21:42:09 +00:00
level: 0,
model: widget.originPostModel.reblog ?? widget.originPostModel,
),
),
)
],
);
}
}
2022-09-07 13:31:03 +00:00
class SingleFullPostDisplay extends StatelessWidget {
2022-09-06 21:42:09 +00:00
const SingleFullPostDisplay({
super.key,
required this.level,
required this.model,
2022-09-07 13:31:03 +00:00
required this.ancestors,
required this.descendants,
2022-09-06 21:42:09 +00:00
});
final int level;
final PostModel model;
2022-09-07 13:31:03 +00:00
final List<PostModel> ancestors;
final List<PostModel> descendants;
2022-09-06 21:42:09 +00:00
@override
Widget build(BuildContext context) {
List<Post> ancestorWidgets = ancestors
.map(
(e) => Post(model: e),
)
.toList();
List<Widget> descendantsWidgets = [];
2022-09-07 13:31:03 +00:00
// seems most efficient
// considering that lists aren't v long
for (var element in descendants) {
if (element.inReplyTo == model.id) {
2022-09-06 21:42:09 +00:00
descendantsWidgets.add(SingleFullPostDisplay(
2022-09-07 13:31:03 +00:00
level: level + 1,
2022-09-06 21:42:09 +00:00
model: element,
2022-09-07 13:31:03 +00:00
ancestors: const [],
descendants: descendants,
2022-09-06 21:42:09 +00:00
));
}
}
List<Widget> c = [];
c.addAll(ancestorWidgets);
2022-09-07 13:31:03 +00:00
c.add(Post(model: model));
2022-09-06 21:42:09 +00:00
c.addAll(descendantsWidgets);
return Container(
2022-09-07 13:31:03 +00:00
padding: EdgeInsets.fromLTRB(level == 0 ? 0 : 4, 0, 0, 0),
2022-09-06 21:42:09 +00:00
decoration: BoxDecoration(
2022-09-07 13:31:03 +00:00
border: level == 0
2022-09-06 21:42:09 +00:00
? const Border()
: Border(
left: BorderSide(
width: 4,
2022-09-07 13:31:03 +00:00
color: level.isEven
2022-09-06 21:42:09 +00:00
? Theme.of(context).colorScheme.secondary
: Theme.of(context).colorScheme.primary,
),
),
),
child: Column(children: c));
}
}