[plugin] Add ente_feature_flag plugin
This commit is contained in:
parent
24d3156a5b
commit
41b151ce7b
6 changed files with 168 additions and 0 deletions
10
mobile/plugins/ente_feature_flag/.metadata
Normal file
10
mobile/plugins/ente_feature_flag/.metadata
Normal file
|
@ -0,0 +1,10 @@
|
|||
# This file tracks properties of this Flutter project.
|
||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||
#
|
||||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: 0b8abb4724aa590dd0f429683339b1e045a1594d
|
||||
channel: stable
|
||||
|
||||
project_type: plugin
|
1
mobile/plugins/ente_feature_flag/analysis_options.yaml
Normal file
1
mobile/plugins/ente_feature_flag/analysis_options.yaml
Normal file
|
@ -0,0 +1 @@
|
|||
include: ../../analysis_options.yaml
|
|
@ -0,0 +1 @@
|
|||
export 'src/service.dart';
|
66
mobile/plugins/ente_feature_flag/lib/src/model.dart
Normal file
66
mobile/plugins/ente_feature_flag/lib/src/model.dart
Normal file
|
@ -0,0 +1,66 @@
|
|||
import "dart:convert";
|
||||
import "dart:io";
|
||||
|
||||
import "package:flutter/foundation.dart";
|
||||
|
||||
class RemoteFlags {
|
||||
final bool enableStripe;
|
||||
final bool disableCFWorker;
|
||||
final bool mapEnabled;
|
||||
final bool faceSearchEnabled;
|
||||
final bool passKeyEnabled;
|
||||
final bool recoveryKeyVerified;
|
||||
final bool internalUser;
|
||||
final bool betaUser;
|
||||
|
||||
RemoteFlags({
|
||||
required this.enableStripe,
|
||||
required this.disableCFWorker,
|
||||
required this.mapEnabled,
|
||||
required this.faceSearchEnabled,
|
||||
required this.passKeyEnabled,
|
||||
required this.recoveryKeyVerified,
|
||||
required this.internalUser,
|
||||
required this.betaUser,
|
||||
});
|
||||
|
||||
static RemoteFlags defaultValue = RemoteFlags(
|
||||
enableStripe: Platform.isAndroid,
|
||||
disableCFWorker: false,
|
||||
mapEnabled: false,
|
||||
faceSearchEnabled: false,
|
||||
passKeyEnabled: false,
|
||||
recoveryKeyVerified: false,
|
||||
internalUser: kDebugMode,
|
||||
betaUser: kDebugMode,
|
||||
);
|
||||
|
||||
String toJson() => json.encode(toMap());
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
'enableStripe': enableStripe,
|
||||
'disableCFWorker': disableCFWorker,
|
||||
'mapEnabled': mapEnabled,
|
||||
'faceSearchEnabled': faceSearchEnabled,
|
||||
'passKeyEnabled': passKeyEnabled,
|
||||
'recoveryKeyVerified': recoveryKeyVerified,
|
||||
'internalUser': internalUser,
|
||||
'betaUser': betaUser,
|
||||
};
|
||||
}
|
||||
|
||||
factory RemoteFlags.fromMap(Map<String, dynamic> map) {
|
||||
return RemoteFlags(
|
||||
enableStripe: map['enableStripe'] ?? defaultValue.enableStripe,
|
||||
disableCFWorker: map['disableCFWorker'] ?? defaultValue.disableCFWorker,
|
||||
mapEnabled: map['mapEnabled'] ?? defaultValue.mapEnabled,
|
||||
faceSearchEnabled:
|
||||
map['faceSearchEnabled'] ?? defaultValue.faceSearchEnabled,
|
||||
passKeyEnabled: map['passKeyEnabled'] ?? defaultValue.passKeyEnabled,
|
||||
recoveryKeyVerified:
|
||||
map['recoveryKeyVerified'] ?? defaultValue.recoveryKeyVerified,
|
||||
internalUser: map['internalUser'] ?? defaultValue.internalUser,
|
||||
betaUser: map['betaUser'] ?? defaultValue.betaUser,
|
||||
);
|
||||
}
|
||||
}
|
71
mobile/plugins/ente_feature_flag/lib/src/service.dart
Normal file
71
mobile/plugins/ente_feature_flag/lib/src/service.dart
Normal file
|
@ -0,0 +1,71 @@
|
|||
// ignore_for_file: always_use_package_imports
|
||||
|
||||
import "dart:convert";
|
||||
import "dart:io";
|
||||
|
||||
import "package:dio/dio.dart";
|
||||
import "package:flutter/foundation.dart";
|
||||
import "package:shared_preferences/shared_preferences.dart";
|
||||
|
||||
import "model.dart";
|
||||
|
||||
class FeatureFlagService {
|
||||
late final SharedPreferences _prefs;
|
||||
late final Dio _enteDio;
|
||||
|
||||
FeatureFlagService(this._prefs, this._enteDio) {
|
||||
Future.delayed(const Duration(seconds: 5), () {
|
||||
_fetch();
|
||||
});
|
||||
}
|
||||
|
||||
RemoteFlags? _flags;
|
||||
|
||||
RemoteFlags get flags {
|
||||
try {
|
||||
if (_flags == null) {
|
||||
_fetch().ignore();
|
||||
}
|
||||
_flags ??= RemoteFlags.fromMap(
|
||||
jsonDecode(_prefs.getString("remote_flags") ?? "{}"),
|
||||
);
|
||||
return _flags!;
|
||||
} catch (e) {
|
||||
debugPrint("Error getting flags: $e");
|
||||
return RemoteFlags.defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _fetch() async {
|
||||
try {
|
||||
if (_prefs.containsKey("token")) {
|
||||
return;
|
||||
}
|
||||
if (kDebugMode) {
|
||||
debugPrint("Fetching feature flags");
|
||||
}
|
||||
final response = await _enteDio.get("/remote-store/feature_flags");
|
||||
final remoteFlags = RemoteFlags.fromMap(response.data);
|
||||
await _prefs.setString("remote_flags", remoteFlags.toJson());
|
||||
_flags = remoteFlags;
|
||||
} catch (e) {
|
||||
debugPrint("Failed to sync feature flags $e");
|
||||
}
|
||||
}
|
||||
|
||||
bool get disableCFWorker => flags.disableCFWorker;
|
||||
|
||||
bool get internalUser => flags.internalUser;
|
||||
|
||||
bool get betaUser => flags.betaUser;
|
||||
|
||||
bool get enableStripe => Platform.isIOS ? false : flags.enableStripe;
|
||||
|
||||
bool get mapEnabled => flags.mapEnabled;
|
||||
|
||||
bool get faceSearchEnabled => flags.faceSearchEnabled;
|
||||
|
||||
bool get passKeyEnabled => flags.passKeyEnabled;
|
||||
|
||||
bool get recoveryKeyVerified => flags.recoveryKeyVerified;
|
||||
}
|
19
mobile/plugins/ente_feature_flag/pubspec.yaml
Normal file
19
mobile/plugins/ente_feature_flag/pubspec.yaml
Normal file
|
@ -0,0 +1,19 @@
|
|||
name: ente_feature_flag
|
||||
version: 0.0.1
|
||||
publish_to: none
|
||||
|
||||
environment:
|
||||
sdk: '>=3.3.0 <4.0.0'
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
collection:
|
||||
dio:
|
||||
shared_preferences:
|
||||
stack_trace:
|
||||
|
||||
dev_dependencies:
|
||||
flutter_lints:
|
||||
|
||||
flutter:
|
Loading…
Add table
Reference in a new issue