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 createState() => _FullPostViewState(); } class _FullPostViewState extends State { List ancestors = []; List 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 ancestors; final List descendants; @override Widget build(BuildContext context) { List ancestorWidgets = ancestors .map( (e) => Post(model: e), ) .toList(); List 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 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)); } }