2023-03-17 20:52:49 +00:00
|
|
|
import 'package:logging/logging.dart';
|
|
|
|
import 'package:relatica/models/instance_info.dart';
|
|
|
|
import 'package:relatica/utils/active_profile_selector.dart';
|
2023-03-23 14:51:41 +00:00
|
|
|
import 'package:result_monad/result_monad.dart';
|
2023-03-17 20:52:49 +00:00
|
|
|
|
|
|
|
import '../globals.dart';
|
2023-03-23 14:51:41 +00:00
|
|
|
import '../models/exec_error.dart';
|
2023-03-17 20:52:49 +00:00
|
|
|
import '../models/friendica_version.dart';
|
2023-04-27 00:55:52 +00:00
|
|
|
import '../models/friendica_version_requirement.dart';
|
2023-03-17 20:52:49 +00:00
|
|
|
|
|
|
|
enum RelaticaFeatures {
|
2023-03-23 14:14:25 +00:00
|
|
|
diasporaReshare('Resharing Diaspora Posts'),
|
2023-03-23 14:51:41 +00:00
|
|
|
directMessageCreation('Direct message creation with OAuth login'),
|
2023-03-23 14:14:25 +00:00
|
|
|
postSpoilerText('Spoiler Text on Posts'),
|
2023-04-27 13:13:13 +00:00
|
|
|
reshareIdFix('Reshare ID fix'),
|
2023-03-23 14:14:25 +00:00
|
|
|
statusEditing('Post/Comment Editing'),
|
|
|
|
usingActualFollowRequests(
|
|
|
|
'Using Follow Request System not Friend Request Notifications'),
|
|
|
|
;
|
|
|
|
|
|
|
|
final String errorLabel;
|
|
|
|
|
|
|
|
const RelaticaFeatures(this.errorLabel);
|
|
|
|
|
|
|
|
String get label => errorLabel;
|
2023-03-17 20:52:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
class FriendicaVersionChecker {
|
|
|
|
static final _logger = Logger('FriendicaVersionTest');
|
|
|
|
|
|
|
|
const FriendicaVersionChecker();
|
|
|
|
|
|
|
|
bool canUseFeature(RelaticaFeatures feature) {
|
2023-04-27 00:55:52 +00:00
|
|
|
final requirement = featureVersionRequirement[feature];
|
|
|
|
if (requirement == null) {
|
2023-03-17 20:52:49 +00:00
|
|
|
_logger.severe(
|
|
|
|
'Return false since no minimum version data in table for: $feature',
|
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return getIt<ActiveProfileSelector<InstanceInfo>>()
|
|
|
|
.activeEntry
|
2023-04-27 00:55:52 +00:00
|
|
|
.andThenSuccess(
|
|
|
|
(info) => requirement.versionMeetsRequirement(info.friendicaVersion),
|
|
|
|
)
|
2023-03-17 20:52:49 +00:00
|
|
|
.fold(
|
|
|
|
onSuccess: (versionMet) => versionMet,
|
|
|
|
onError: (error) {
|
|
|
|
_logger.severe(
|
|
|
|
'Unable to calculate needed version data so returning false: $error');
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2023-03-23 14:51:41 +00:00
|
|
|
Result<bool, ExecError> canUseFeatureResult(RelaticaFeatures feature) {
|
|
|
|
if (canUseFeature(feature)) {
|
|
|
|
return Result.ok(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
return buildErrorResult(
|
|
|
|
type: ErrorType.minVersionError,
|
|
|
|
message: versionErrorString(feature),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2023-04-27 00:55:52 +00:00
|
|
|
FriendicaVersionRequirement getVersionRequirement(RelaticaFeatures feature) =>
|
|
|
|
featureVersionRequirement[feature] ?? unknownRequirement;
|
2023-03-17 20:52:49 +00:00
|
|
|
|
|
|
|
String versionErrorString(RelaticaFeatures feature) =>
|
2023-04-27 00:55:52 +00:00
|
|
|
"${feature.label} ${getVersionRequirement(feature)}";
|
2023-03-17 20:52:49 +00:00
|
|
|
|
2023-04-27 00:55:52 +00:00
|
|
|
static final featureVersionRequirement =
|
|
|
|
<RelaticaFeatures, FriendicaVersionRequirement>{
|
|
|
|
RelaticaFeatures.diasporaReshare: FriendicaVersionRequirement(v2023_04),
|
2023-04-27 13:13:13 +00:00
|
|
|
RelaticaFeatures.directMessageCreation: FriendicaVersionRequirement(
|
|
|
|
v2023_04,
|
|
|
|
),
|
2023-04-27 00:55:52 +00:00
|
|
|
RelaticaFeatures.postSpoilerText: FriendicaVersionRequirement(v2023_04),
|
2023-04-27 13:13:13 +00:00
|
|
|
RelaticaFeatures.reshareIdFix: FriendicaVersionRequirement(
|
|
|
|
v2023_04,
|
|
|
|
),
|
2023-04-27 00:55:52 +00:00
|
|
|
RelaticaFeatures.statusEditing: FriendicaVersionRequirement(v2023_04),
|
2023-04-27 13:13:13 +00:00
|
|
|
RelaticaFeatures.usingActualFollowRequests: FriendicaVersionRequirement(
|
|
|
|
v2023_04,
|
|
|
|
),
|
2023-03-17 20:52:49 +00:00
|
|
|
};
|
|
|
|
}
|