loris/lib/partials/thread.dart

145 lines
3.9 KiB
Dart

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<Thread> createState() => _ThreadState();
}
class _ThreadState extends State<Thread> {
Set<String> contentWarnings = {};
int sensitivePosts = 0;
bool showSensitive = false;
bool collapsed = false;
@override
Widget build(BuildContext context) {
List<Widget> 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,
),
),
),
),
],
);
}
}