139 lines
3.4 KiB
Dart
139 lines
3.4 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> {
|
||
|
bool loading = false;
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return SimpleDialog(
|
||
|
children: [
|
||
|
Container(
|
||
|
constraints: global.getConstraints(context),
|
||
|
width: global.getWidth(context),
|
||
|
child: SingleChildScrollView(
|
||
|
child: SingleFullPostDisplay(
|
||
|
level: 0,
|
||
|
model: widget.originPostModel.reblog ?? widget.originPostModel,
|
||
|
),
|
||
|
),
|
||
|
)
|
||
|
],
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class SingleFullPostDisplay extends StatefulWidget {
|
||
|
const SingleFullPostDisplay({
|
||
|
super.key,
|
||
|
required this.level,
|
||
|
required this.model,
|
||
|
this.toBeDistributed,
|
||
|
});
|
||
|
final int level;
|
||
|
final PostModel model;
|
||
|
final List<PostModel>? toBeDistributed;
|
||
|
|
||
|
@override
|
||
|
State<SingleFullPostDisplay> createState() => _SingleFullPostDisplayState();
|
||
|
}
|
||
|
|
||
|
class _SingleFullPostDisplayState extends State<SingleFullPostDisplay> {
|
||
|
bool loading = true;
|
||
|
List<PostModel> ancestors = [];
|
||
|
List<PostModel> descendants = [];
|
||
|
|
||
|
@override
|
||
|
void initState() {
|
||
|
if (widget.level == 0) {
|
||
|
loadPosts();
|
||
|
} else {
|
||
|
setState(() {
|
||
|
loading = false;
|
||
|
});
|
||
|
}
|
||
|
super.initState();
|
||
|
}
|
||
|
|
||
|
void loadPosts() async {
|
||
|
final r = await getContextForPost(widget.model);
|
||
|
if (r.value != null) {
|
||
|
setState(() {
|
||
|
if (widget.level == 0) {
|
||
|
ancestors = r.value!.ancestors;
|
||
|
}
|
||
|
descendants = r.value!.descendants;
|
||
|
});
|
||
|
}
|
||
|
if (mounted) {
|
||
|
setState(() {
|
||
|
loading = false;
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
List<PostModel> toBeDistributed = widget.toBeDistributed ?? [];
|
||
|
List<Post> ancestorWidgets = ancestors
|
||
|
.map(
|
||
|
(e) => Post(model: e),
|
||
|
)
|
||
|
.toList();
|
||
|
|
||
|
List<Widget> descendantsWidgets = [];
|
||
|
|
||
|
if (widget.toBeDistributed == null) {
|
||
|
for (var element in descendants) {
|
||
|
toBeDistributed.add(element);
|
||
|
if (element.id == widget.model.id) {}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (var element in toBeDistributed) {
|
||
|
if (element.inReplyTo == widget.model.id) {
|
||
|
descendantsWidgets.add(SingleFullPostDisplay(
|
||
|
level: widget.level + 1,
|
||
|
model: element,
|
||
|
toBeDistributed: toBeDistributed,
|
||
|
));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
List<Widget> c = [];
|
||
|
c.addAll(ancestorWidgets);
|
||
|
c.add(Post(model: widget.model));
|
||
|
c.addAll(descendantsWidgets);
|
||
|
|
||
|
return Container(
|
||
|
padding: const EdgeInsets.fromLTRB(8, 0, 0, 0),
|
||
|
decoration: BoxDecoration(
|
||
|
border: widget.level == 0
|
||
|
? const Border()
|
||
|
: Border(
|
||
|
left: BorderSide(
|
||
|
width: 4,
|
||
|
color: widget.level.isEven
|
||
|
? Theme.of(context).colorScheme.secondary
|
||
|
: Theme.of(context).colorScheme.primary,
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
child: Column(children: c));
|
||
|
}
|
||
|
}
|