Perform capabilities check on comments

This commit is contained in:
Hank Grabowski 2024-06-26 15:11:58 -04:00
parent ee2421f691
commit dfb3474bd3
2 changed files with 43 additions and 25 deletions

View file

@ -171,18 +171,21 @@ class _InteractionsBarControlState extends State<InteractionsBarControl> {
}
Widget buildCommentButton() {
final canComment = widget.entry.getCanComment();
final tooltip =
canComment.canDo ? 'Press to add a comment' : canComment.reason;
return buildButton(
Icons.comment,
comments,
true,
'Press to add a comment',
() async => await addComment(),
tooltip,
canComment.canDo ? () async => await addComment() : null,
);
}
Widget buildReshareButton() {
final reshareable = widget.entry.getIsReshareable(widget.isMine);
final canReshare = reshareable.isReshareable == Reshareable.yes;
final canReshare = reshareable.canDo;
late final String tooltip;
if (canReshare) {
tooltip = youReshared ? 'Press to undo reshare' : 'Press to reshare';

View file

@ -5,30 +5,45 @@ import '../models/visibility.dart';
import '../services/setting_service.dart';
import 'known_network_extensions.dart';
enum Reshareable {
no,
yes,
}
class ReshareableResult {
final Reshareable isReshareable;
class InteractionCapabilityResult {
final bool canDo;
final String reason;
const ReshareableResult({required this.isReshareable, required this.reason});
const InteractionCapabilityResult(
{required this.canDo, required this.reason});
}
extension InteractionAvailabilityExtension on TimelineEntry {
ReshareableResult getIsReshareable(bool isMine) {
InteractionCapabilityResult getCanComment() {
final settingsService = getIt<SettingsService>();
final nc = settingsService.networkCapabilities
.getCapabilities(networkInfo.network);
if (!nc.comment) {
return InteractionCapabilityResult(
canDo: false,
reason:
"User disabled commenting on ${networkInfo.network.labelName} items. Go into settings to change.",
);
}
return InteractionCapabilityResult(
canDo: true,
reason: "Can comment on item",
);
}
InteractionCapabilityResult getIsReshareable(bool isMine) {
if (isMine) {
return const ReshareableResult(
isReshareable: Reshareable.no,
return const InteractionCapabilityResult(
canDo: false,
reason: "Can't reshare your own post",
);
}
if (networkInfo.network == KnownNetworks.bluesky) {
return const ReshareableResult(
isReshareable: Reshareable.no,
return const InteractionCapabilityResult(
canDo: false,
reason:
"Resharing of Bluesky posts through the API isn't supported by Friendica.",
);
@ -39,24 +54,24 @@ extension InteractionAvailabilityExtension on TimelineEntry {
.getCapabilities(networkInfo.network);
if (!nc.reshare) {
return ReshareableResult(
isReshareable: Reshareable.no,
return InteractionCapabilityResult(
canDo: false,
reason:
"User disabled resharing ${networkInfo.network.labelName}. Go into settings to change.",
"User disabled resharing ${networkInfo.network.labelName} items. Go into settings to change.",
);
}
if (visibility.type == VisibilityType.public ||
visibility.type == VisibilityType.unlisted) {
return const ReshareableResult(
isReshareable: Reshareable.yes,
reason: "Can reshare post",
return const InteractionCapabilityResult(
canDo: true,
reason: "Can reshare item",
);
}
return const ReshareableResult(
isReshareable: Reshareable.no,
reason: "Can't reshare private posts",
return const InteractionCapabilityResult(
canDo: false,
reason: "Can't reshare private items",
);
}
}