From 66680bd753c5aa48fa59f1a73ab6176222ddbabc Mon Sep 17 00:00:00 2001 From: Lewis Larsen Date: Sun, 18 Aug 2024 23:24:07 +0100 Subject: [PATCH] feat: Updated experiments --- app/Providers/AppServiceProvider.php | 31 +- .../livewire/layout/navigation.blade.php | 464 +++++++++++++----- .../profile/experiments-manager.blade.php | 78 ++- 3 files changed, 420 insertions(+), 153 deletions(-) diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index fad3224d..0d733c71 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -14,7 +14,7 @@ /** * Core application service provider. - * Handles service registration and authorization setup. + * Handles service registration, authorization setup, and feature flags. */ class AppServiceProvider extends ServiceProvider { @@ -34,10 +34,7 @@ public function boot(): void Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class); $this->defineGates(); - - /* Feature::define('example-experiment', function () { - return false; - });*/ + $this->defineFeatures(); } /** @@ -56,4 +53,28 @@ private function defineGates(): void { Gate::define('viewPulse', fn (User $user): bool => $user->isAdmin()); } + + /** + * Define feature flags with additional metadata. + */ + private function defineFeatures(): void + { + $features = [ + 'navigation-redesign' => [ + 'title' => 'Navigation Redesign', + 'description' => 'A new, more intuitive navigation structure for improved user experience.', + 'group' => 'UI/UX', + 'icon' => 'heroicon-o-bars-3', + ], + ]; + + foreach ($features as $key => $metadata) { + Feature::define($key, function (): false { + return false; + }); + + // Store the metadata for later use + config(["features.{$key}" => $metadata]); + } + } } diff --git a/resources/views/livewire/layout/navigation.blade.php b/resources/views/livewire/layout/navigation.blade.php index f99d1040..ccaeb6ba 100644 --- a/resources/views/livewire/layout/navigation.blade.php +++ b/resources/views/livewire/layout/navigation.blade.php @@ -25,149 +25,103 @@ public function toggleUserDropdown(): void } }; ?> +@feature('navigation-redesign') +@else + +@endfeature diff --git a/resources/views/livewire/profile/experiments-manager.blade.php b/resources/views/livewire/profile/experiments-manager.blade.php index 44628e0b..9cbf5986 100644 --- a/resources/views/livewire/profile/experiments-manager.blade.php +++ b/resources/views/livewire/profile/experiments-manager.blade.php @@ -88,17 +88,22 @@ private function getExperimentDetails(string $experiment): array $user = $this->getCurrentUser(); $isActive = Feature::active($experiment) ?? false; $isEnabled = Feature::for($user)->active($experiment) ?? false; + $metadata = config("features.{$experiment}", []); Log::debug('Getting experiment details', [ 'experiment' => $experiment, 'isActive' => $isActive, - 'isEnabled' => $isEnabled + 'isEnabled' => $isEnabled, + 'metadata' => $metadata, ]); return [ 'name' => $experiment, - 'title' => $this->getExperimentTitle($experiment), - 'description' => $this->getExperimentDescription($experiment), + 'title' => $metadata['title'] ?? $this->getExperimentTitle($experiment), + 'description' => $metadata['description'] ?? $this->getExperimentDescription($experiment), + 'group' => $metadata['group'] ?? 'Uncategorized', + 'rolloutPercentage' => $metadata['rolloutPercentage'] ?? 0, + 'icon' => $metadata['icon'] ?? 'heroicon-o-beaker', 'active' => $isActive, 'enabled' => $isEnabled, ]; @@ -168,31 +173,36 @@ private function getCurrentUser(): User
- @foreach ($this->experiments as $experiment) -
-
-
-
-
- @svg('heroicon-o-beaker', 'w-10 h-10 text-gray-500 dark:text-gray-400') + @foreach ($this->experiments->groupBy('group') as $group => $groupExperiments) +
+

{{ $group }}

+ @foreach ($groupExperiments as $experiment) +
+
+
+
+
+ @svg($experiment['icon'], 'w-10 h-10 text-gray-500 dark:text-gray-400') +
+
+

{{ $experiment['title'] }}

+

+ {{ $experiment['enabled'] ? __('Enabled for you') : __('Disabled for you') }} +

+
+
+
+ + {{ __('View Details') }} + +
-
-

{{ $experiment['title'] }}

-

- {{ $experiment['enabled'] ? __('Enabled for you') : __('Disabled for you') }} -

-
-
-
- - {{ __('View Details') }} -
-
+ @endforeach
@endforeach
@@ -214,16 +224,30 @@ class="mr-3" $experiment = $this->experiments->firstWhere('name', $selectedExperiment); @endphp
-

{{ $experiment['title'] }}

+
+ @svg($experiment['icon'], 'w-8 h-8 text-gray-500 dark:text-gray-400 mr-3') +

{{ $experiment['title'] }}

+

{{ $experiment['description'] }}

-
+
{{ __('Status:') }} {{ $experiment['enabled'] ? __('Enabled') : __('Disabled') }}
+
+ {{ __('Group:') }} + {{ $experiment['group'] }} +
+
+ +
+

+ {{ __('Note:') }} + {{ __('You may need to reload the page (F5 or Cmd/Ctrl + R) to see the effects of enabling or disabling an experiment.') }} +