From 85a1483356c3fa193504999df40f5fa3d8507414 Mon Sep 17 00:00:00 2001 From: Aditya Tripathi Date: Sun, 2 Nov 2025 22:27:24 +0000 Subject: [PATCH 1/4] feat: developer view for shared env variables --- .../SharedVariables/Environment/Show.php | 117 +++++++++++++++++- app/Livewire/SharedVariables/Project/Show.php | 117 +++++++++++++++++- app/Livewire/SharedVariables/Team/Index.php | 117 +++++++++++++++++- .../environment/show.blade.php | 32 +++-- .../shared-variables/project/show.blade.php | 32 +++-- .../shared-variables/team/index.blade.php | 32 +++-- 6 files changed, 420 insertions(+), 27 deletions(-) diff --git a/app/Livewire/SharedVariables/Environment/Show.php b/app/Livewire/SharedVariables/Environment/Show.php index bee757a64c..6c8342c41b 100644 --- a/app/Livewire/SharedVariables/Environment/Show.php +++ b/app/Livewire/SharedVariables/Environment/Show.php @@ -19,7 +19,11 @@ class Show extends Component public array $parameters; - protected $listeners = ['refreshEnvs' => '$refresh', 'saveKey', 'environmentVariableDeleted' => '$refresh']; + public string $view = 'normal'; + + public ?string $variables = null; + + protected $listeners = ['refreshEnvs' => 'refreshEnvs', 'saveKey', 'environmentVariableDeleted' => 'refreshEnvs']; public function saveKey($data) { @@ -39,6 +43,7 @@ class Show extends Component 'team_id' => currentTeam()->id, ]); $this->environment->refresh(); + $this->getDevView(); } catch (\Throwable $e) { return handleError($e, $this); } @@ -49,6 +54,116 @@ class Show extends Component $this->parameters = get_route_parameters(); $this->project = Project::ownedByCurrentTeam()->where('uuid', request()->route('project_uuid'))->firstOrFail(); $this->environment = $this->project->environments()->where('uuid', request()->route('environment_uuid'))->firstOrFail(); + $this->getDevView(); + } + + public function switch() + { + $this->view = $this->view === 'normal' ? 'dev' : 'normal'; + $this->getDevView(); + } + + public function getDevView() + { + $this->variables = $this->formatEnvironmentVariables($this->environment->environment_variables->sortBy('key')); + } + + private function formatEnvironmentVariables($variables) + { + return $variables->map(function ($item) { + if ($item->is_shown_once) { + return "$item->key=(Locked Secret, delete and add again to change)"; + } + if ($item->is_multiline) { + return "$item->key=(Multiline environment variable, edit in normal view)"; + } + + return "$item->key=$item->value"; + })->join("\n"); + } + + public function submit() + { + try { + $this->authorize('update', $this->environment); + $this->handleBulkSubmit(); + $this->getDevView(); + } catch (\Throwable $e) { + return handleError($e, $this); + } finally { + $this->refreshEnvs(); + } + } + + private function handleBulkSubmit() + { + $variables = parseEnvFormatToArray($this->variables); + $changesMade = false; + + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } + + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + } + + private function deleteRemovedVariables($variables) + { + $variablesToDelete = $this->environment->environment_variables()->whereNotIn('key', array_keys($variables))->get(); + + if ($variablesToDelete->isEmpty()) { + return 0; + } + + $this->environment->environment_variables()->whereNotIn('key', array_keys($variables))->delete(); + + return $variablesToDelete->count(); + } + + private function updateOrCreateVariables($variables) + { + $count = 0; + foreach ($variables as $key => $value) { + $found = $this->environment->environment_variables()->where('key', $key)->first(); + + if ($found) { + if (! $found->is_shown_once && ! $found->is_multiline) { + if ($found->value !== $value) { + $found->value = $value; + $found->save(); + $count++; + } + } + } else { + $this->environment->environment_variables()->create([ + 'key' => $key, + 'value' => $value, + 'is_multiline' => false, + 'is_literal' => false, + 'type' => 'environment', + 'team_id' => currentTeam()->id, + ]); + $count++; + } + } + + return $count; + } + + public function refreshEnvs() + { + $this->environment->refresh(); + $this->getDevView(); } public function render() diff --git a/app/Livewire/SharedVariables/Project/Show.php b/app/Livewire/SharedVariables/Project/Show.php index 712a9960b3..a3abe5df23 100644 --- a/app/Livewire/SharedVariables/Project/Show.php +++ b/app/Livewire/SharedVariables/Project/Show.php @@ -12,7 +12,11 @@ class Show extends Component public Project $project; - protected $listeners = ['refreshEnvs' => '$refresh', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => '$refresh']; + public string $view = 'normal'; + + public ?string $variables = null; + + protected $listeners = ['refreshEnvs' => 'refreshEnvs', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => 'refreshEnvs']; public function saveKey($data) { @@ -32,6 +36,7 @@ class Show extends Component 'team_id' => currentTeam()->id, ]); $this->project->refresh(); + $this->getDevView(); } catch (\Throwable $e) { return handleError($e, $this); } @@ -46,6 +51,116 @@ class Show extends Component return redirect()->route('dashboard'); } $this->project = $project; + $this->getDevView(); + } + + public function switch() + { + $this->view = $this->view === 'normal' ? 'dev' : 'normal'; + $this->getDevView(); + } + + public function getDevView() + { + $this->variables = $this->formatEnvironmentVariables($this->project->environment_variables->sortBy('key')); + } + + private function formatEnvironmentVariables($variables) + { + return $variables->map(function ($item) { + if ($item->is_shown_once) { + return "$item->key=(Locked Secret, delete and add again to change)"; + } + if ($item->is_multiline) { + return "$item->key=(Multiline environment variable, edit in normal view)"; + } + + return "$item->key=$item->value"; + })->join("\n"); + } + + public function submit() + { + try { + $this->authorize('update', $this->project); + $this->handleBulkSubmit(); + $this->getDevView(); + } catch (\Throwable $e) { + return handleError($e, $this); + } finally { + $this->refreshEnvs(); + } + } + + private function handleBulkSubmit() + { + $variables = parseEnvFormatToArray($this->variables); + $changesMade = false; + + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } + + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + } + + private function deleteRemovedVariables($variables) + { + $variablesToDelete = $this->project->environment_variables()->whereNotIn('key', array_keys($variables))->get(); + + if ($variablesToDelete->isEmpty()) { + return 0; + } + + $this->project->environment_variables()->whereNotIn('key', array_keys($variables))->delete(); + + return $variablesToDelete->count(); + } + + private function updateOrCreateVariables($variables) + { + $count = 0; + foreach ($variables as $key => $value) { + $found = $this->project->environment_variables()->where('key', $key)->first(); + + if ($found) { + if (! $found->is_shown_once && ! $found->is_multiline) { + if ($found->value !== $value) { + $found->value = $value; + $found->save(); + $count++; + } + } + } else { + $this->project->environment_variables()->create([ + 'key' => $key, + 'value' => $value, + 'is_multiline' => false, + 'is_literal' => false, + 'type' => 'project', + 'team_id' => currentTeam()->id, + ]); + $count++; + } + } + + return $count; + } + + public function refreshEnvs() + { + $this->project->refresh(); + $this->getDevView(); } public function render() diff --git a/app/Livewire/SharedVariables/Team/Index.php b/app/Livewire/SharedVariables/Team/Index.php index 82473528cc..6311d9a87f 100644 --- a/app/Livewire/SharedVariables/Team/Index.php +++ b/app/Livewire/SharedVariables/Team/Index.php @@ -12,7 +12,11 @@ class Index extends Component public Team $team; - protected $listeners = ['refreshEnvs' => '$refresh', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => '$refresh']; + public string $view = 'normal'; + + public ?string $variables = null; + + protected $listeners = ['refreshEnvs' => 'refreshEnvs', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => 'refreshEnvs']; public function saveKey($data) { @@ -32,6 +36,7 @@ class Index extends Component 'team_id' => currentTeam()->id, ]); $this->team->refresh(); + $this->getDevView(); } catch (\Throwable $e) { return handleError($e, $this); } @@ -40,6 +45,116 @@ class Index extends Component public function mount() { $this->team = currentTeam(); + $this->getDevView(); + } + + public function switch() + { + $this->view = $this->view === 'normal' ? 'dev' : 'normal'; + $this->getDevView(); + } + + public function getDevView() + { + $this->variables = $this->formatEnvironmentVariables($this->team->environment_variables->sortBy('key')); + } + + private function formatEnvironmentVariables($variables) + { + return $variables->map(function ($item) { + if ($item->is_shown_once) { + return "$item->key=(Locked Secret, delete and add again to change)"; + } + if ($item->is_multiline) { + return "$item->key=(Multiline environment variable, edit in normal view)"; + } + + return "$item->key=$item->value"; + })->join("\n"); + } + + public function submit() + { + try { + $this->authorize('update', $this->team); + $this->handleBulkSubmit(); + $this->getDevView(); + } catch (\Throwable $e) { + return handleError($e, $this); + } finally { + $this->refreshEnvs(); + } + } + + private function handleBulkSubmit() + { + $variables = parseEnvFormatToArray($this->variables); + $changesMade = false; + + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } + + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + } + + private function deleteRemovedVariables($variables) + { + $variablesToDelete = $this->team->environment_variables()->whereNotIn('key', array_keys($variables))->get(); + + if ($variablesToDelete->isEmpty()) { + return 0; + } + + $this->team->environment_variables()->whereNotIn('key', array_keys($variables))->delete(); + + return $variablesToDelete->count(); + } + + private function updateOrCreateVariables($variables) + { + $count = 0; + foreach ($variables as $key => $value) { + $found = $this->team->environment_variables()->where('key', $key)->first(); + + if ($found) { + if (! $found->is_shown_once && ! $found->is_multiline) { + if ($found->value !== $value) { + $found->value = $value; + $found->save(); + $count++; + } + } + } else { + $this->team->environment_variables()->create([ + 'key' => $key, + 'value' => $value, + 'is_multiline' => false, + 'is_literal' => false, + 'type' => 'team', + 'team_id' => currentTeam()->id, + ]); + $count++; + } + } + + return $count; + } + + public function refreshEnvs() + { + $this->team->refresh(); + $this->getDevView(); } public function render() diff --git a/resources/views/livewire/shared-variables/environment/show.blade.php b/resources/views/livewire/shared-variables/environment/show.blade.php index 0799a74222..41c8249045 100644 --- a/resources/views/livewire/shared-variables/environment/show.blade.php +++ b/resources/views/livewire/shared-variables/environment/show.blade.php @@ -9,17 +9,33 @@ @endcan + @can('update', $environment) + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} + @endcan
You can use these variables anywhere with @{{ environment.VARIABLENAME }}
-
- @forelse ($environment->environment_variables->sort()->sortBy('key') as $env) - - @empty -
No environment variables found.
- @endforelse -
+ @if ($view === 'normal') +
+ @forelse ($environment->environment_variables->sort()->sortBy('key') as $env) + + @empty +
No environment variables found.
+ @endforelse +
+ @else +
+ @can('update', $environment) + + Save All Environment Variables + @else + + @endcan +
+ @endif diff --git a/resources/views/livewire/shared-variables/project/show.blade.php b/resources/views/livewire/shared-variables/project/show.blade.php index 7db3b61a27..cb99824a0c 100644 --- a/resources/views/livewire/shared-variables/project/show.blade.php +++ b/resources/views/livewire/shared-variables/project/show.blade.php @@ -9,6 +9,9 @@ @endcan + @can('update', $project) + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} + @endcan
You can use these variables anywhere with
@@ -16,12 +19,25 @@
-
- @forelse ($project->environment_variables->sort()->sortBy('key') as $env) - - @empty -
No environment variables found.
- @endforelse -
+ @if ($view === 'normal') +
+ @forelse ($project->environment_variables->sort()->sortBy('key') as $env) + + @empty +
No environment variables found.
+ @endforelse +
+ @else +
+ @can('update', $project) + + Save All Environment Variables + @else + + @endcan +
+ @endif diff --git a/resources/views/livewire/shared-variables/team/index.blade.php b/resources/views/livewire/shared-variables/team/index.blade.php index 1fbdfc2c5a..b043bcc0ee 100644 --- a/resources/views/livewire/shared-variables/team/index.blade.php +++ b/resources/views/livewire/shared-variables/team/index.blade.php @@ -9,18 +9,34 @@ @endcan + @can('update', $team) + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} + @endcan
You can use these variables anywhere with @{{ team.VARIABLENAME }}
-
- @forelse ($team->environment_variables->sort()->sortBy('key') as $env) - - @empty -
No environment variables found.
- @endforelse -
+ @if ($view === 'normal') +
+ @forelse ($team->environment_variables->sort()->sortBy('key') as $env) + + @empty +
No environment variables found.
+ @endforelse +
+ @else +
+ @can('update', $team) + + Save All Environment Variables + @else + + @endcan +
+ @endif From 2e6b8a69f89af419a385a840707d2cb2bde23321 Mon Sep 17 00:00:00 2001 From: Aditya Tripathi Date: Sun, 2 Nov 2025 22:30:59 +0000 Subject: [PATCH 2/4] feat: make text area larger since its full page --- .../livewire/shared-variables/environment/show.blade.php | 4 ++-- .../views/livewire/shared-variables/project/show.blade.php | 4 ++-- .../views/livewire/shared-variables/team/index.blade.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/views/livewire/shared-variables/environment/show.blade.php b/resources/views/livewire/shared-variables/environment/show.blade.php index 41c8249045..02cc07b280 100644 --- a/resources/views/livewire/shared-variables/environment/show.blade.php +++ b/resources/views/livewire/shared-variables/environment/show.blade.php @@ -29,11 +29,11 @@ @else
@can('update', $environment) - Save All Environment Variables @else - @endcan
diff --git a/resources/views/livewire/shared-variables/project/show.blade.php b/resources/views/livewire/shared-variables/project/show.blade.php index cb99824a0c..99d95059a6 100644 --- a/resources/views/livewire/shared-variables/project/show.blade.php +++ b/resources/views/livewire/shared-variables/project/show.blade.php @@ -31,11 +31,11 @@ @else
@can('update', $project) - Save All Environment Variables @else - @endcan
diff --git a/resources/views/livewire/shared-variables/team/index.blade.php b/resources/views/livewire/shared-variables/team/index.blade.php index b043bcc0ee..44399dcda9 100644 --- a/resources/views/livewire/shared-variables/team/index.blade.php +++ b/resources/views/livewire/shared-variables/team/index.blade.php @@ -30,11 +30,11 @@ @else
@can('update', $team) - Save All Environment Variables @else - @endcan
From 28cb561c042864840ce9333550a4ee46931fc713 Mon Sep 17 00:00:00 2001 From: Aditya Tripathi Date: Mon, 3 Nov 2025 20:54:34 +0000 Subject: [PATCH 3/4] feat: add database transactions and component-level authorization to shared variables --- .../SharedVariables/Environment/Show.php | 32 +++++++++++-------- app/Livewire/SharedVariables/Project/Show.php | 32 +++++++++++-------- app/Livewire/SharedVariables/Team/Index.php | 32 +++++++++++-------- .../environment/show.blade.php | 15 +++------ .../shared-variables/project/show.blade.php | 15 +++------ .../shared-variables/team/index.blade.php | 15 +++------ 6 files changed, 66 insertions(+), 75 deletions(-) diff --git a/app/Livewire/SharedVariables/Environment/Show.php b/app/Livewire/SharedVariables/Environment/Show.php index 6c8342c41b..6b1d35d14b 100644 --- a/app/Livewire/SharedVariables/Environment/Show.php +++ b/app/Livewire/SharedVariables/Environment/Show.php @@ -5,6 +5,7 @@ namespace App\Livewire\SharedVariables\Environment; use App\Models\Application; use App\Models\Project; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Support\Facades\DB; use Livewire\Component; class Show extends Component @@ -98,23 +99,26 @@ class Show extends Component private function handleBulkSubmit() { $variables = parseEnvFormatToArray($this->variables); - $changesMade = false; - // Delete removed variables - $deletedCount = $this->deleteRemovedVariables($variables); - if ($deletedCount > 0) { - $changesMade = true; - } + DB::transaction(function () use ($variables) { + $changesMade = false; - // Update or create variables - $updatedCount = $this->updateOrCreateVariables($variables); - if ($updatedCount > 0) { - $changesMade = true; - } + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } - if ($changesMade) { - $this->dispatch('success', 'Environment variables updated.'); - } + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + }); } private function deleteRemovedVariables($variables) diff --git a/app/Livewire/SharedVariables/Project/Show.php b/app/Livewire/SharedVariables/Project/Show.php index a3abe5df23..93ead33a33 100644 --- a/app/Livewire/SharedVariables/Project/Show.php +++ b/app/Livewire/SharedVariables/Project/Show.php @@ -4,6 +4,7 @@ namespace App\Livewire\SharedVariables\Project; use App\Models\Project; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Support\Facades\DB; use Livewire\Component; class Show extends Component @@ -95,23 +96,26 @@ class Show extends Component private function handleBulkSubmit() { $variables = parseEnvFormatToArray($this->variables); - $changesMade = false; - // Delete removed variables - $deletedCount = $this->deleteRemovedVariables($variables); - if ($deletedCount > 0) { - $changesMade = true; - } + DB::transaction(function () use ($variables) { + $changesMade = false; - // Update or create variables - $updatedCount = $this->updateOrCreateVariables($variables); - if ($updatedCount > 0) { - $changesMade = true; - } + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } - if ($changesMade) { - $this->dispatch('success', 'Environment variables updated.'); - } + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + }); } private function deleteRemovedVariables($variables) diff --git a/app/Livewire/SharedVariables/Team/Index.php b/app/Livewire/SharedVariables/Team/Index.php index 6311d9a87f..bd23bca82e 100644 --- a/app/Livewire/SharedVariables/Team/Index.php +++ b/app/Livewire/SharedVariables/Team/Index.php @@ -4,6 +4,7 @@ namespace App\Livewire\SharedVariables\Team; use App\Models\Team; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Support\Facades\DB; use Livewire\Component; class Index extends Component @@ -89,23 +90,26 @@ class Index extends Component private function handleBulkSubmit() { $variables = parseEnvFormatToArray($this->variables); - $changesMade = false; - // Delete removed variables - $deletedCount = $this->deleteRemovedVariables($variables); - if ($deletedCount > 0) { - $changesMade = true; - } + DB::transaction(function () use ($variables) { + $changesMade = false; - // Update or create variables - $updatedCount = $this->updateOrCreateVariables($variables); - if ($updatedCount > 0) { - $changesMade = true; - } + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } - if ($changesMade) { - $this->dispatch('success', 'Environment variables updated.'); - } + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + }); } private function deleteRemovedVariables($variables) diff --git a/resources/views/livewire/shared-variables/environment/show.blade.php b/resources/views/livewire/shared-variables/environment/show.blade.php index 02cc07b280..fde2d0ae89 100644 --- a/resources/views/livewire/shared-variables/environment/show.blade.php +++ b/resources/views/livewire/shared-variables/environment/show.blade.php @@ -9,9 +9,7 @@ @endcan - @can('update', $environment) - {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} - @endcan + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }}
You can use these variables anywhere with @{{ environment.VARIABLENAME }} @else
- @can('update', $environment) - - Save All Environment Variables - @else - - @endcan + + Save All Environment Variables
@endif
diff --git a/resources/views/livewire/shared-variables/project/show.blade.php b/resources/views/livewire/shared-variables/project/show.blade.php index 99d95059a6..f89ad9ce71 100644 --- a/resources/views/livewire/shared-variables/project/show.blade.php +++ b/resources/views/livewire/shared-variables/project/show.blade.php @@ -9,9 +9,7 @@ @endcan - @can('update', $project) - {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} - @endcan + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }}
You can use these variables anywhere with
@@ -30,14 +28,9 @@
@else
- @can('update', $project) - - Save All Environment Variables - @else - - @endcan + + Save All Environment Variables
@endif diff --git a/resources/views/livewire/shared-variables/team/index.blade.php b/resources/views/livewire/shared-variables/team/index.blade.php index 44399dcda9..fcfca35fb3 100644 --- a/resources/views/livewire/shared-variables/team/index.blade.php +++ b/resources/views/livewire/shared-variables/team/index.blade.php @@ -9,9 +9,7 @@ @endcan - @can('update', $team) - {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} - @endcan + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }}
You can use these variables anywhere with @{{ team.VARIABLENAME }} @else
- @can('update', $team) - - Save All Environment Variables - @else - - @endcan + + Save All Environment Variables
@endif
From ac14a327233a0b519ccbfb7bf8a21f19097f05ea Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Wed, 26 Nov 2025 09:37:18 +0100 Subject: [PATCH 4/4] fix: dispatch success message after transaction commits Move the success dispatch outside the DB transaction closure to ensure it only fires after the transaction has successfully committed. Use reference variable to track changes across the closure boundary. --- app/Livewire/SharedVariables/Environment/Show.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/Livewire/SharedVariables/Environment/Show.php b/app/Livewire/SharedVariables/Environment/Show.php index 6b1d35d14b..328986cea0 100644 --- a/app/Livewire/SharedVariables/Environment/Show.php +++ b/app/Livewire/SharedVariables/Environment/Show.php @@ -99,10 +99,9 @@ class Show extends Component private function handleBulkSubmit() { $variables = parseEnvFormatToArray($this->variables); + $changesMade = false; - DB::transaction(function () use ($variables) { - $changesMade = false; - + DB::transaction(function () use ($variables, &$changesMade) { // Delete removed variables $deletedCount = $this->deleteRemovedVariables($variables); if ($deletedCount > 0) { @@ -114,11 +113,12 @@ class Show extends Component if ($updatedCount > 0) { $changesMade = true; } - - if ($changesMade) { - $this->dispatch('success', 'Environment variables updated.'); - } }); + + // Only dispatch success after transaction has committed + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } } private function deleteRemovedVariables($variables)