import 'package:flutter/material.dart'; import 'package:localization/localization.dart'; import 'package:loris/partials/post.dart'; import '../business_logic/timeline/timeline.dart' as logic; import '../global.dart' as global; import 'package:loris/themes/themes.dart' as themes; class Thread extends StatefulWidget { const Thread({ required this.model, Key? key, this.constrained = true, }) : super(key: key); final logic.ThreadModel model; final bool constrained; @override State createState() => _ThreadState(); } class _ThreadState extends State { Set contentWarnings = {}; int sensitivePosts = 0; bool showSensitive = false; bool collapsed = false; @override Widget build(BuildContext context) { List c = [ Align( alignment: Alignment.centerRight, child: TextButton.icon( onPressed: () { setState(() { collapsed = !collapsed; }); }, icon: Icon(collapsed ? Icons.fullscreen : Icons.fullscreen_exit), label: Text(collapsed ? "expand".i18n() : "collapse".i18n())), ) ]; for (var element in widget.model.posts) { c.add(Visibility( visible: !collapsed, child: Post( model: element, hideSensitive: !showSensitive, ), )); if (element.sensitive) { sensitivePosts += 1; contentWarnings.add(element.spoilerText); } } contentWarnings.map( (e) => e.trim(), ); contentWarnings.removeWhere((element) => element == ""); if (sensitivePosts > 1 && c.length > 1) { String s = ""; int i = 0; for (var element in contentWarnings) { if (i == 0 && i < contentWarnings.length - 1) { s = "$element;"; } else if (i < contentWarnings.length - 1) { s = "$s $element;"; } else { s = "$s $element"; } i++; } c.insert( 0, Visibility( visible: !collapsed, child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Expanded(child: SelectableText(s)), ElevatedButton.icon( onPressed: () { setState(() { showSensitive = !showSensitive; }); }, icon: Icon( showSensitive ? Icons.visibility_off : Icons.visibility), label: Text(showSensitive ? "hide".i18n() : "show".i18n()), ), ], ), ), ); } if (!widget.constrained) { return Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Theme.of(context).colorScheme.surface, border: Border.all( color: Theme.of(context).colorScheme.secondary, width: 2, ), borderRadius: BorderRadius.circular(8), ), child: Column( children: c, ), ); } return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( clipBehavior: Clip.none, foregroundDecoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(8)), border: Border.all( width: 2, color: Theme.of(context).colorScheme.secondary, ), ), width: global.getWidth(context), constraints: global.getConstraints(context), child: Material( borderRadius: const BorderRadius.all(Radius.circular(8)), child: Padding( padding: themes.defaultInsideMargins, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: c, ), ), ), ), ], ); } }