relatica/lib/utils/interaction_availability_util.dart

102 lines
2.8 KiB
Dart
Raw Normal View History

import '../globals.dart';
import '../models/timeline_entry.dart';
import '../models/timeline_network_info.dart';
import '../models/visibility.dart';
import '../services/feature_version_checker.dart';
import '../services/setting_service.dart';
import 'known_network_extensions.dart';
2024-06-26 19:11:58 +00:00
class InteractionCapabilityResult {
final bool canDo;
final String reason;
2024-06-26 19:11:58 +00:00
const InteractionCapabilityResult(
{required this.canDo, required this.reason});
}
extension InteractionAvailabilityExtension on TimelineEntry {
2024-06-26 19:11:58 +00:00
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 const InteractionCapabilityResult(
2024-06-26 19:11:58 +00:00
canDo: true,
reason: "Can comment on item",
);
}
InteractionCapabilityResult getCanReact() {
final settingsService = getIt<SettingsService>();
final nc = settingsService.networkCapabilities
.getCapabilities(networkInfo.network);
if (!nc.react) {
return InteractionCapabilityResult(
canDo: false,
reason:
"User disabled reacting on ${networkInfo.network.labelName} items. Go into settings to change.",
);
}
return const InteractionCapabilityResult(
canDo: true,
reason: "Can react on item",
);
}
2024-06-26 19:11:58 +00:00
InteractionCapabilityResult getIsReshareable(bool isMine) {
if (isMine) {
2024-06-26 19:11:58 +00:00
return const InteractionCapabilityResult(
canDo: false,
reason: "Can't reshare your own post",
);
}
if (networkInfo.network == KnownNetworks.bluesky) {
final result = getIt<FriendicaVersionChecker>()
.canUseFeatureResult(RelaticaFeatures.blueskyReshare);
if (result.isFailure) {
return InteractionCapabilityResult(
canDo: false,
reason: result.error.message,
);
}
}
final settingsService = getIt<SettingsService>();
final nc = settingsService.networkCapabilities
.getCapabilities(networkInfo.network);
if (!nc.reshare) {
2024-06-26 19:11:58 +00:00
return InteractionCapabilityResult(
canDo: false,
reason:
2024-06-26 19:11:58 +00:00
"User disabled resharing ${networkInfo.network.labelName} items. Go into settings to change.",
);
}
if (visibility.type == VisibilityType.public ||
visibility.type == VisibilityType.unlisted) {
2024-06-26 19:11:58 +00:00
return const InteractionCapabilityResult(
canDo: true,
reason: "Can reshare item",
);
}
2024-06-26 19:11:58 +00:00
return const InteractionCapabilityResult(
canDo: false,
reason: "Can't reshare private items",
);
}
}