[plugin] Add ente_feature_flag plugin

This commit is contained in:
Neeraj Gupta 2024-04-23 10:16:19 +05:30
parent 24d3156a5b
commit 41b151ce7b
6 changed files with 168 additions and 0 deletions

View 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

View file

@ -0,0 +1 @@
include: ../../analysis_options.yaml

View file

@ -0,0 +1 @@
export 'src/service.dart';

View 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,
);
}
}

View 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;
}

View 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: