🛠️ Refactor Blade views for Livewire component consistency, streamline login view, and improve key usage across components

- Replaced `state` and `computed` with `Livewire\Component` implementations in `language/selector.blade.php` for enhanced maintainability.
- Adjusted `login.blade.php` syntax for dynamic href generation and removed commented-out sign-up link.
- Added unique `wire:key` attributes to iterable elements for enhanced performance and reactivity.
- Simplified controller routing and corrected indentation in `web.php`, improving clarity.
This commit is contained in:
HolgerHatGarKeineNode
2026-01-17 17:07:15 +01:00
parent eebe453f5a
commit 4c0d387692
5 changed files with 80 additions and 81 deletions

View File

@@ -1,48 +1,54 @@
<?php
use function Livewire\Volt\{state, computed};
use Livewire\Component;
state(['langCountry' => fn() => session('lang_country', config('lang-country.fallback'))]);
new class extends Component {
public $langCountry;
$languages = computed(function () {
// Scan lang folder for available languages
$availableLanguages = collect(glob(base_path('lang/*.json')))
->map(fn($file) => pathinfo($file, PATHINFO_FILENAME))
->toArray();
$allLanguages = [
'de' => ['name' => 'Deutsch', 'countries' => ['de-DE', 'de-AT', 'de-CH']],
'en' => ['name' => 'English', 'countries' => ['en-GB', 'en-US', 'en-AU', 'en-CA']],
'es' => ['name' => 'Español', 'countries' => ['es-ES', 'es-CL', 'es-CO']],
'hu' => ['name' => 'Magyar', 'countries' => ['hu-HU']],
'nl' => ['name' => 'Nederlands', 'countries' => ['nl-NL', 'nl-BE']],
'pl' => ['name' => 'Polski', 'countries' => ['pl-PL']],
'pt' => ['name' => 'Português', 'countries' => ['pt-PT']],
];
// Filter languages based on available JSON files and allowed languages
$languages = array_filter($allLanguages, function ($data, $key) use ($availableLanguages) {
return in_array($key, $availableLanguages) &&
count(array_intersect($data['countries'], config('lang-country.allowed'))) > 0;
}, ARRAY_FILTER_USE_BOTH);
// Build options array
$options = [];
foreach ($languages as $langCode => $langData) {
foreach ($langData['countries'] as $langCountry) {
[$lang, $countryCode] = explode('-', $langCountry);
$options[] = [
'value' => $langCountry,
'label' => $langData['name'] . ' (' . strtoupper($countryCode) . ')',
];
}
public function mount() {
$this->langCountry = session('lang_country', config('lang-country.fallback'));
}
return $options;
});
public function getLanguagesProperty() {
// Scan lang folder for available languages
$availableLanguages = collect(glob(base_path('lang/*.json')))
->map(fn($file) => pathinfo($file, PATHINFO_FILENAME))
->toArray();
$updateLanguage = function () {
return redirect()->route('lang_country.switch', ['lang_country' => $this->langCountry]);
$allLanguages = [
'de' => ['name' => 'Deutsch', 'countries' => ['de-DE', 'de-AT', 'de-CH']],
'en' => ['name' => 'English', 'countries' => ['en-GB', 'en-US', 'en-AU', 'en-CA']],
'es' => ['name' => 'Español', 'countries' => ['es-ES', 'es-CL', 'es-CO']],
'hu' => ['name' => 'Magyar', 'countries' => ['hu-HU']],
'nl' => ['name' => 'Nederlands', 'countries' => ['nl-NL', 'nl-BE']],
'pl' => ['name' => 'Polski', 'countries' => ['pl-PL']],
'pt' => ['name' => 'Português', 'countries' => ['pt-PT']],
];
// Filter languages based on available JSON files and allowed languages
$languages = array_filter($allLanguages, function ($data, $key) use ($availableLanguages) {
return in_array($key, $availableLanguages) &&
count(array_intersect($data['countries'], config('lang-country.allowed'))) > 0;
}, ARRAY_FILTER_USE_BOTH);
// Build options array
$options = [];
foreach ($languages as $langCode => $langData) {
foreach ($langData['countries'] as $langCountry) {
[$lang, $countryCode] = explode('-', $langCountry);
$options[] = [
'value' => $langCountry,
'label' => $langData['name'] . ' (' . strtoupper($countryCode) . ')',
];
}
}
return $options;
}
public function updateLanguage() {
return redirect()->route('lang_country.switch', ['lang_country' => $this->langCountry]);
}
};
?>
@@ -55,7 +61,7 @@ $updateLanguage = function () {
:placeholder="__('Sprache wählen')"
>
@foreach($this->languages as $option)
<flux:select.option value="{{ $option['value'] }}">
<flux:select.option value="{{ $option['value'] }}" wire:key="language-option-{{ $loop->index }}">
<div class="flex items-center space-x-2">
<img alt="{{ str($option['value'])->after('-')->lower() }}"
src="{{ asset('vendor/blade-flags/country-'.str($option['value'])->after('-')->lower().'.svg') }}"