Added examples for feature flags

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2025-04-29 11:31:42 +02:00
parent 2a7829a2d0
commit c162e8b294
2 changed files with 78 additions and 20 deletions
+1
View File
@@ -1,5 +1,6 @@
enum Feature { enum Feature {
logging(true), logging(true),
authentication(true),
; ;
final bool enabledAtStartup; final bool enabledAtStartup;
+61 -4
View File
@@ -102,6 +102,7 @@ class _HomeScreenState extends State<HomeScreen> {
maxCrossAxisExtent: 300, maxCrossAxisExtent: 300,
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
children: [ children: [
// Theme
Card( Card(
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
@@ -216,6 +217,10 @@ class _HomeScreenState extends State<HomeScreen> {
), ),
); );
} }
Arcane.log(
"Setting ${Arcane.theme.currentThemeMode.name} theme color to ${themeColors[index]}",
);
}, },
child: Container( child: Container(
color: themeColors[index], color: themeColors[index],
@@ -238,6 +243,8 @@ class _HomeScreenState extends State<HomeScreen> {
), ),
), ),
), ),
// Authentication
Card( Card(
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
@@ -250,8 +257,8 @@ class _HomeScreenState extends State<HomeScreen> {
style: Theme.of(context).textTheme.headlineSmall, style: Theme.of(context).textTheme.headlineSmall,
), ),
ElevatedButton( ElevatedButton(
child: Text(isSignedIn ? "Sign out" : "Sign in"), onPressed: Feature.authentication.enabled
onPressed: () async { ? () async {
if (isSignedIn) { if (isSignedIn) {
await Arcane.auth.logOut( await Arcane.auth.logOut(
onLoggedOut: () async { onLoggedOut: () async {
@@ -269,7 +276,9 @@ class _HomeScreenState extends State<HomeScreen> {
}, },
); );
} }
}, }
: null,
child: Text(isSignedIn ? "Sign out" : "Sign in"),
), ),
Center( Center(
child: Text("Status: ${Arcane.auth.status.name}"), child: Text("Status: ${Arcane.auth.status.name}"),
@@ -278,9 +287,50 @@ class _HomeScreenState extends State<HomeScreen> {
), ),
), ),
), ),
// Feature flags
Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
"Feature Flags",
style: Theme.of(context).textTheme.headlineSmall,
),
Expanded(
child: ListView.builder(
itemCount: Feature.values.length,
itemBuilder: (context, i) {
final Feature feature = Feature.values[i];
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(feature.name),
Switch(
value: feature.enabled,
onChanged: (_) {
feature.enabled
? feature.disable()
: feature.enable();
},
),
],
);
},
),
),
], ],
), ),
), ),
),
],
),
),
// Logging
Padding( Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: SizedBox( child: SizedBox(
@@ -299,6 +349,13 @@ class _HomeScreenState extends State<HomeScreen> {
fontStyle: FontStyle.italic, fontStyle: FontStyle.italic,
), ),
), ),
if (Feature.logging.disabled)
Text(
"Logging feature is disabled.",
style: Theme.of(context).textTheme.labelSmall?.copyWith(
fontWeight: FontWeight.bold,
),
),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemCount: latestLogs.length, itemCount: latestLogs.length,
@@ -320,7 +377,7 @@ class _HomeScreenState extends State<HomeScreen> {
super.initState(); super.initState();
_subscription = Arcane.logger.logStream.listen((message) { _subscription = Arcane.logger.logStream.listen((message) {
setState(() { setState(() {
latestLogs.insert(0, message); if (Feature.logging.enabled) latestLogs.insert(0, message);
}); });
}); });
} }