125 lines
3.1 KiB
Dart
125 lines
3.1 KiB
Dart
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> {
|
|
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();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return SimpleDialog(
|
|
contentPadding: const EdgeInsets.all(24),
|
|
children: [
|
|
Container(
|
|
constraints: global.getConstraints(context),
|
|
width: global.getWidth(context),
|
|
child: SingleChildScrollView(
|
|
child: SingleFullPostDisplay(
|
|
ancestors: ancestors,
|
|
descendants: descendants,
|
|
level: 0,
|
|
model: widget.originPostModel.reblog ?? widget.originPostModel,
|
|
),
|
|
),
|
|
)
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class SingleFullPostDisplay extends StatelessWidget {
|
|
const SingleFullPostDisplay({
|
|
super.key,
|
|
required this.level,
|
|
required this.model,
|
|
required this.ancestors,
|
|
required this.descendants,
|
|
});
|
|
final int level;
|
|
final PostModel model;
|
|
final List<PostModel> ancestors;
|
|
final List<PostModel> descendants;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
List<Post> ancestorWidgets = ancestors
|
|
.map(
|
|
(e) => Post(model: e),
|
|
)
|
|
.toList();
|
|
|
|
List<Widget> descendantsWidgets = [];
|
|
|
|
// seems most efficient
|
|
// considering that lists aren't v long
|
|
for (var element in descendants) {
|
|
if (element.inReplyTo == model.id) {
|
|
descendantsWidgets.add(SingleFullPostDisplay(
|
|
level: level + 1,
|
|
model: element,
|
|
ancestors: const [],
|
|
descendants: descendants,
|
|
));
|
|
}
|
|
}
|
|
|
|
List<Widget> c = [];
|
|
c.addAll(ancestorWidgets);
|
|
c.add(Post(model: model));
|
|
c.addAll(descendantsWidgets);
|
|
|
|
return Container(
|
|
padding: EdgeInsets.fromLTRB(level == 0 ? 0 : 4, 0, 0, 0),
|
|
decoration: BoxDecoration(
|
|
border: level == 0
|
|
? const Border()
|
|
: Border(
|
|
left: BorderSide(
|
|
width: 4,
|
|
color: level.isEven
|
|
? Theme.of(context).colorScheme.secondary
|
|
: Theme.of(context).colorScheme.primary,
|
|
),
|
|
),
|
|
),
|
|
child: Column(children: c));
|
|
}
|
|
}
|