import 'package:logging/logging.dart'; import 'package:relatica/models/instance_info.dart'; import 'package:relatica/utils/active_profile_selector.dart'; import 'package:result_monad/result_monad.dart'; import '../globals.dart'; import '../models/exec_error.dart'; import '../models/friendica_version.dart'; enum RelaticaFeatures { diasporaReshare('Resharing Diaspora Posts'), directMessageCreation('Direct message creation with OAuth login'), postSpoilerText('Spoiler Text on Posts'), statusEditing('Post/Comment Editing'), usingActualFollowRequests( 'Using Follow Request System not Friend Request Notifications'), ; final String errorLabel; const RelaticaFeatures(this.errorLabel); String get label => errorLabel; } class FriendicaVersionChecker { static final _logger = Logger('FriendicaVersionTest'); const FriendicaVersionChecker(); bool canUseFeature(RelaticaFeatures feature) { final neededVersion = featureVersionRequirement[feature]; if (neededVersion == null) { _logger.severe( 'Return false since no minimum version data in table for: $feature', ); return false; } return getIt>() .activeEntry .andThenSuccess((info) => info.friendicaVersion >= neededVersion) .fold( onSuccess: (versionMet) => versionMet, onError: (error) { _logger.severe( 'Unable to calculate needed version data so returning false: $error'); return false; }, ); } Result canUseFeatureResult(RelaticaFeatures feature) { if (canUseFeature(feature)) { return Result.ok(true); } return buildErrorResult( type: ErrorType.minVersionError, message: versionErrorString(feature), ); } FriendicaVersion getVersionRequirement(RelaticaFeatures feature) => featureVersionRequirement[feature] ?? unknown; String versionErrorString(RelaticaFeatures feature) => "${feature.label} requires at least Friendica ${getVersionRequirement(feature).toVersionString()}"; static final featureVersionRequirement = { RelaticaFeatures.diasporaReshare: v2023_04, RelaticaFeatures.directMessageCreation: v2023_04, RelaticaFeatures.postSpoilerText: v2023_04, RelaticaFeatures.statusEditing: v2023_04, RelaticaFeatures.usingActualFollowRequests: v2023_04, }; }