mirror of
https://github.com/HolgerHatGarKeineNode/einundzwanzig-app.git
synced 2026-01-24 12:03:17 +00:00
🛠️ 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:
@@ -18,11 +18,8 @@ use Livewire\Attributes\Validate;
|
|||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
use SimpleSoftwareIO\QrCode\Facades\QrCode;
|
use SimpleSoftwareIO\QrCode\Facades\QrCode;
|
||||||
|
|
||||||
new
|
new #[Layout('components.layouts.auth')]
|
||||||
#[Layout('components.layouts.auth')]
|
class extends Component {
|
||||||
#[SeoDataAttribute(key: 'login')]
|
|
||||||
class extends Component
|
|
||||||
{
|
|
||||||
use SeoTrait;
|
use SeoTrait;
|
||||||
|
|
||||||
#[Validate('required|string|email')]
|
#[Validate('required|string|email')]
|
||||||
@@ -208,7 +205,8 @@ class extends Component
|
|||||||
$this->authError = null;
|
$this->authError = null;
|
||||||
$this->mount();
|
$this->mount();
|
||||||
}
|
}
|
||||||
}; ?>
|
};
|
||||||
|
?>
|
||||||
|
|
||||||
<div class="flex min-h-screen" x-data="nostrLogin"
|
<div class="flex min-h-screen" x-data="nostrLogin"
|
||||||
x-init="initErrorPolling"
|
x-init="initErrorPolling"
|
||||||
@@ -258,7 +256,7 @@ class extends Component
|
|||||||
<div>
|
<div>
|
||||||
<flux:button
|
<flux:button
|
||||||
primary
|
primary
|
||||||
:href="'lightning:'.$this->lnurl"
|
href="lightning:{{ $this->lnurl }}"
|
||||||
>
|
>
|
||||||
{{ __('Click to connect') }}
|
{{ __('Click to connect') }}
|
||||||
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512"
|
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512"
|
||||||
@@ -273,12 +271,6 @@ class extends Component
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Sign up Link -->
|
|
||||||
{{--@if (Route::has('register'))
|
|
||||||
<flux:subheading class="text-center">
|
|
||||||
First time around here? <flux:link href="{{ route('register') }}" wire:navigate>Sign up for free</flux:link>
|
|
||||||
</flux:subheading>
|
|
||||||
@endif--}}
|
|
||||||
<!-- Language Selection Accordion -->
|
<!-- Language Selection Accordion -->
|
||||||
<livewire:language.selector/>
|
<livewire:language.selector/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ class extends Component {
|
|||||||
{
|
{
|
||||||
if (!auth()->check()) {
|
if (!auth()->check()) {
|
||||||
$this->redirectRoute('login');
|
$this->redirectRoute('login');
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
$this->country = request()->route('country', config('app.domain_country'));
|
$this->country = request()->route('country', config('app.domain_country'));
|
||||||
}
|
}
|
||||||
@@ -90,7 +92,7 @@ class extends Component {
|
|||||||
<flux:separator class="my-4"/>
|
<flux:separator class="my-4"/>
|
||||||
<div class="space-y-3">
|
<div class="space-y-3">
|
||||||
@foreach($myUpcomingEvents as $event)
|
@foreach($myUpcomingEvents as $event)
|
||||||
<a href="{{ route('meetups.landingpage-event', ['meetup' => $event->meetup->slug, 'event' => $event->id, 'country' => $event->meetup->city->country->code]) }}"
|
<a wire:key="event-{{ $event->id }}" href="{{ route('meetups.landingpage-event', ['meetup' => $event->meetup->slug, 'event' => $event->id, 'country' => $event->meetup->city->country->code]) }}"
|
||||||
class="block hover:bg-zinc-50 dark:hover:bg-zinc-800 rounded-lg p-3 -m-3 transition-colors">
|
class="block hover:bg-zinc-50 dark:hover:bg-zinc-800 rounded-lg p-3 -m-3 transition-colors">
|
||||||
<div class="flex items-start justify-between gap-3">
|
<div class="flex items-start justify-between gap-3">
|
||||||
<flux:avatar size="xl" :src="$event->meetup->getFirstMediaUrl('logo', 'thumb')"/>
|
<flux:avatar size="xl" :src="$event->meetup->getFirstMediaUrl('logo', 'thumb')"/>
|
||||||
|
|||||||
@@ -1,48 +1,54 @@
|
|||||||
<?php
|
<?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 () {
|
public function mount() {
|
||||||
// Scan lang folder for available languages
|
$this->langCountry = session('lang_country', config('lang-country.fallback'));
|
||||||
$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) . ')',
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 () {
|
$allLanguages = [
|
||||||
return redirect()->route('lang_country.switch', ['lang_country' => $this->langCountry]);
|
'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')"
|
:placeholder="__('Sprache wählen')"
|
||||||
>
|
>
|
||||||
@foreach($this->languages as $option)
|
@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">
|
<div class="flex items-center space-x-2">
|
||||||
<img alt="{{ str($option['value'])->after('-')->lower() }}"
|
<img alt="{{ str($option['value'])->after('-')->lower() }}"
|
||||||
src="{{ asset('vendor/blade-flags/country-'.str($option['value'])->after('-')->lower().'.svg') }}"
|
src="{{ asset('vendor/blade-flags/country-'.str($option['value'])->after('-')->lower().'.svg') }}"
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ new class extends Component {
|
|||||||
<flux:select.search class="px-4" placeholder="{{ __('Suche Zeitzone...') }}"/>
|
<flux:select.search class="px-4" placeholder="{{ __('Suche Zeitzone...') }}"/>
|
||||||
</x-slot>
|
</x-slot>
|
||||||
@foreach($timezones as $timezone)
|
@foreach($timezones as $timezone)
|
||||||
<flux:select.option value="{{ $timezone }}">
|
<flux:select.option wire:key="timezone-{{ $timezone }}" value="{{ $timezone }}">
|
||||||
{{ $timezone }}
|
{{ $timezone }}
|
||||||
</flux:select.option>
|
</flux:select.option>
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
use Laravel\Nightwatch\Http\Middleware\Sample;
|
use Laravel\Nightwatch\Http\Middleware\Sample;
|
||||||
use Livewire\Volt\Volt;
|
|
||||||
|
|
||||||
// Redirect root URL to 'welcome' page
|
// Redirect root URL to 'welcome' page
|
||||||
Route::redirect('/', 'welcome');
|
Route::redirect('/', 'welcome');
|
||||||
@@ -92,37 +91,37 @@ Route::middleware([])
|
|||||||
Route::get('/meetup/meetup-events', function ($country) {
|
Route::get('/meetup/meetup-events', function ($country) {
|
||||||
return redirect("/{$country}/meetups");
|
return redirect("/{$country}/meetups");
|
||||||
});
|
});
|
||||||
// Old event landing page route (deprecated)
|
// Old event landing page route (deprecated)
|
||||||
Route::livewire('/meetup/meetup-events/l/{event}', 'meetups.landingpage-event')
|
Route::livewire('/meetup/meetup-events/l/{event}', 'meetups.landingpage-event')
|
||||||
->name('meetups.landingpage-event-old')
|
->name('meetups.landingpage-event-old')
|
||||||
->where('event', '[0-9]+');
|
->where('event', '[0-9]+');
|
||||||
|
|
||||||
/* Meetup related routes */
|
/* Meetup related routes */
|
||||||
Route::livewire('/meetups', 'meetups.index')->name('meetups.index');
|
Route::livewire('/meetups', 'meetups.index')->name('meetups.index');
|
||||||
Route::livewire('/all-meetups', 'meetups.index')->name('meetups.index-all');
|
Route::livewire('/all-meetups', 'meetups.index')->name('meetups.index-all');
|
||||||
Route::livewire('/map', 'meetups.map')->name('meetups.map');
|
Route::livewire('/map', 'meetups.map')->name('meetups.map');
|
||||||
Route::livewire('/map-world', 'meetups.map')->name('meetups.map-world');
|
Route::livewire('/map-world', 'meetups.map')->name('meetups.map-world');
|
||||||
Route::livewire('/meetup/{meetup:slug}', 'meetups.landingpage')->name('meetups.landingpage');
|
Route::livewire('/meetup/{meetup:slug}', 'meetups.landingpage')->name('meetups.landingpage');
|
||||||
Route::livewire('/meetup/{meetup:slug}/event/{event}',
|
Route::livewire('/meetup/{meetup:slug}/event/{event}',
|
||||||
'meetups.landingpage-event')
|
'meetups.landingpage-event')
|
||||||
->name('meetups.landingpage-event')
|
->name('meetups.landingpage-event')
|
||||||
->where('event', '[0-9]+');
|
->where('event', '[0-9]+');
|
||||||
|
|
||||||
/* Course related routes */
|
/* Course related routes */
|
||||||
Route::livewire('/courses', 'courses.index')->name('courses.index');
|
Route::livewire('/courses', 'courses.index')->name('courses.index');
|
||||||
Route::livewire('/course/{course}', 'courses.landingpage')->name('courses.landingpage');
|
Route::livewire('/course/{course}', 'courses.landingpage')->name('courses.landingpage');
|
||||||
Route::livewire('/course/{course}/event/{event}', 'courses.landingpage-event')->name('courses.landingpage-event');
|
Route::livewire('/course/{course}/event/{event}', 'courses.landingpage-event')->name('courses.landingpage-event');
|
||||||
|
|
||||||
/* Lecturer related routes */
|
/* Lecturer related routes */
|
||||||
Route::livewire('/lecturers', 'lecturers.index')->name('lecturers.index');
|
Route::livewire('/lecturers', 'lecturers.index')->name('lecturers.index');
|
||||||
|
|
||||||
/* City and venue related routes */
|
/* City and venue related routes */
|
||||||
Route::livewire('/cities', 'cities.index')->name('cities.index');
|
Route::livewire('/cities', 'cities.index')->name('cities.index');
|
||||||
Route::livewire('/venues', 'venues.index')->name('venues.index');
|
Route::livewire('/venues', 'venues.index')->name('venues.index');
|
||||||
|
|
||||||
/* Self Hosted Services public routes */
|
/* Self Hosted Services public routes */
|
||||||
Route::livewire('/services', 'services.index')->name('services.index');
|
Route::livewire('/services', 'services.index')->name('services.index');
|
||||||
Route::livewire('/service/{service:slug}', 'services.landingpage')->name('services.landingpage');
|
Route::livewire('/service/{service:slug}', 'services.landingpage')->name('services.landingpage');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Authenticated user routes with country prefix
|
// Authenticated user routes with country prefix
|
||||||
|
|||||||
Reference in New Issue
Block a user