From ca9cd9b8754237ff2c8d0709baa70b5e7d71d9f1 Mon Sep 17 00:00:00 2001 From: HolgerHatGarKeineNode Date: Sun, 23 Nov 2025 19:21:19 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Enhance=20timezone=20support=20acro?= =?UTF-8?q?ss=20application?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduced a `SetTimezone` middleware to dynamically apply user-specific timezones. - Added a `timezone chooser` component for users to select their timezone. - Enhanced date and time display in views with `asDate`, `asTime`, and `asDateTime` methods. - Updated `AppServiceProvider` to leverage `preventLazyLoading` in local environments and set custom `Carbon` instance for dates. - Expanded configuration with `user-timezone`. - Integrated timezone support into meetups and events for consistent scheduling. --- app/Attributes/SeoDataAttribute.php | 1 + app/Http/Middleware/SetTimezone.php | 36 +++++++++++++ app/Models/Meetup.php | 4 +- app/Providers/AppServiceProvider.php | 9 +++- bootstrap/app.php | 1 + config/app.php | 2 + .../components/layouts/app/sidebar.blade.php | 11 +++- resources/views/livewire/dashboard.blade.php | 2 +- .../views/livewire/meetups/index.blade.php | 20 +++---- .../meetups/landingpage-event.blade.php | 6 +-- .../livewire/meetups/landingpage.blade.php | 4 +- .../views/livewire/settings/profile.blade.php | 6 +++ .../views/livewire/timezone/chooser.blade.php | 52 +++++++++++++++++++ 13 files changed, 134 insertions(+), 20 deletions(-) create mode 100644 app/Http/Middleware/SetTimezone.php create mode 100644 resources/views/livewire/timezone/chooser.blade.php diff --git a/app/Attributes/SeoDataAttribute.php b/app/Attributes/SeoDataAttribute.php index dea3bca..b6ff4dc 100644 --- a/app/Attributes/SeoDataAttribute.php +++ b/app/Attributes/SeoDataAttribute.php @@ -9,6 +9,7 @@ class SeoDataAttribute { public function __construct( public ?string $key = null, // e.g., 'meetups_index', 'event_show', etc. + public ?string $image = null, // image url override ) {} // Centralized SEO data definitions by key as SEOData instances (lazy initialized) diff --git a/app/Http/Middleware/SetTimezone.php b/app/Http/Middleware/SetTimezone.php new file mode 100644 index 0000000..24f635c --- /dev/null +++ b/app/Http/Middleware/SetTimezone.php @@ -0,0 +1,36 @@ +user() + && $timezone = $request->user()->timezone + ) { + config([ + 'app.timezone' => $timezone, + 'app.user-timezone' => $timezone, + ]); + + return $next($request); + } + config([ + 'app.timezone' => 'Europe/Berlin', + 'app.user-timezone' => 'Europe/Berlin', + ]); + + return $next($request); + } +} diff --git a/app/Models/Meetup.php b/app/Models/Meetup.php index 7bff5e8..157c9b3 100644 --- a/app/Models/Meetup.php +++ b/app/Models/Meetup.php @@ -123,6 +123,7 @@ class Meetup extends Model implements HasMedia return Attribute::make( get: fn() => $nextEvent ? [ + 'id' => $nextEvent->id, 'start' => $nextEvent->start, 'portalLink' => url()->route('meetups.landingpage-event', ['country' => $this->city->country, 'meetup' => $this, 'event' => $nextEvent]), @@ -139,7 +140,8 @@ class Meetup extends Model implements HasMedia protected function belongsToMe(): Attribute { return Attribute::make( - get: fn() => DB::table('meetup_user')->where('meetup_id', $this->id)->where('user_id', auth()->id())->exists(), + get: fn() => DB::table('meetup_user')->where('meetup_id', $this->id)->where('user_id', + auth()->id())->exists(), ); } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..d3b4b8d 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,9 @@ namespace App\Providers; +use App\Support\Carbon; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Date; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -11,7 +14,9 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { - // + Date::use( + Carbon::class + ); } /** @@ -19,6 +24,6 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - // + Model::preventLazyLoading(app()->environment('local')); } } diff --git a/bootstrap/app.php b/bootstrap/app.php index 1a2891a..0575e3d 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -14,6 +14,7 @@ return Application::configure(basePath: dirname(__DIR__)) ->withMiddleware(function (Middleware $middleware) { $middleware->web(append: [ \Stefro\LaravelLangCountry\Middleware\LangCountrySession::class, + \App\Http\Middleware\SetTimezone::class, ]); }) ->withExceptions(function (Exceptions $exceptions) { diff --git a/config/app.php b/config/app.php index 76a1b7f..13fbf34 100644 --- a/config/app.php +++ b/config/app.php @@ -67,6 +67,8 @@ return [ 'timezone' => 'UTC', + 'user-timezone' => 'UTC', + /* |-------------------------------------------------------------------------- | Application Locale Configuration diff --git a/resources/views/components/layouts/app/sidebar.blade.php b/resources/views/components/layouts/app/sidebar.blade.php index 4b8580d..402476b 100644 --- a/resources/views/components/layouts/app/sidebar.blade.php +++ b/resources/views/components/layouts/app/sidebar.blade.php @@ -82,8 +82,15 @@ - - + +
+
+ +
+
+ +
+
diff --git a/resources/views/livewire/dashboard.blade.php b/resources/views/livewire/dashboard.blade.php index 81539c9..fb04b03 100644 --- a/resources/views/livewire/dashboard.blade.php +++ b/resources/views/livewire/dashboard.blade.php @@ -96,7 +96,7 @@ class extends Component { {{ $event->meetup->city->name }}, {{ $event->meetup->city->country->name }} - {{ $event->start->format('d.m.Y H:i') }} + {{ $event->start->asDateTime() }} diff --git a/resources/views/livewire/meetups/index.blade.php b/resources/views/livewire/meetups/index.blade.php index 4efc9ea..83ffa64 100644 --- a/resources/views/livewire/meetups/index.blade.php +++ b/resources/views/livewire/meetups/index.blade.php @@ -100,16 +100,18 @@ class extends Component { @if($meetup->nextEvent && $meetup->nextEvent['start']->isFuture()) -
- - {{ $meetup->nextEvent['start']->format('d.m.Y H:i') }} - -
- {{ $meetup->nextEvent['attendees'] }} {{ __('Zusagen') }} - - {{ $meetup->nextEvent['might_attendees'] }} {{ __('Vielleicht') }} + +
+ + {{ $meetup->nextEvent['start']->asDateTime() }} + +
+ {{ $meetup->nextEvent['attendees'] }} {{ __('Zusagen') }} + + {{ $meetup->nextEvent['might_attendees'] }} {{ __('Vielleicht') }} +
-
+ @endif diff --git a/resources/views/livewire/meetups/landingpage-event.blade.php b/resources/views/livewire/meetups/landingpage-event.blade.php index 5e0fd1a..fe5bfe5 100644 --- a/resources/views/livewire/meetups/landingpage-event.blade.php +++ b/resources/views/livewire/meetups/landingpage-event.blade.php @@ -163,7 +163,7 @@ class extends Component { - {{ $event->start->format('d.m.Y') }} + {{ $event->start->asDateTime() }}
@@ -171,9 +171,9 @@ class extends Component {
-
{{ $event->start->format('H:i') }} Uhr
+
{{ $event->start->asTime() }} Uhr
{{ $event->start->isoFormat('dddd, D. MMMM YYYY') }}
+ class="text-sm text-zinc-600 dark:text-zinc-400">{{ $event->start->asDate() }}
diff --git a/resources/views/livewire/meetups/landingpage.blade.php b/resources/views/livewire/meetups/landingpage.blade.php index db2ca5f..196d10b 100644 --- a/resources/views/livewire/meetups/landingpage.blade.php +++ b/resources/views/livewire/meetups/landingpage.blade.php @@ -215,12 +215,12 @@ class extends Component { @foreach($events as $event) - {{ $event->start->format('d.m.Y') }} + {{ $event->start->asDate() }} - {{ $event->start->format('H:i') }} Uhr + {{ $event->start->asTime() }} Uhr @if($event->location) diff --git a/resources/views/livewire/settings/profile.blade.php b/resources/views/livewire/settings/profile.blade.php index 38d14de..776a445 100644 --- a/resources/views/livewire/settings/profile.blade.php +++ b/resources/views/livewire/settings/profile.blade.php @@ -115,6 +115,12 @@ class extends Component {
+
+ {{ __('Zeitzone') }} + {{ __('Wähle deine Zeitzone aus...') }} + +
+
{{ __('Spracheinstellungen') }} {{ __('Wähle deine Sprache aus...') }} diff --git a/resources/views/livewire/timezone/chooser.blade.php b/resources/views/livewire/timezone/chooser.blade.php new file mode 100644 index 0000000..010e8f2 --- /dev/null +++ b/resources/views/livewire/timezone/chooser.blade.php @@ -0,0 +1,52 @@ +currentRouteName = request()->route()->getName(); + $this->currentRouteParams = request()->route()->parameters(); + $this->selectedTimezone = config('app.timezone', 'UTC'); + } + + public function updatedSelectedTimezone() + { + // Handle timezone change here + // You can emit an event or update user settings + auth()->user()->update([ + 'timezone' => $this->selectedTimezone, + ]); + Flux::toast(text: __('Zeitzone erfolgreich aktualisiert'), heading: __('Zeitzone'), variant: 'success'); + if ($this->withRedirect) { + $this->redirectRoute($this->currentRouteName, $this->currentRouteParams, navigate: true); + } + } + + public function with(): array + { + return [ + 'timezones' => \DateTimeZone::listIdentifiers(), + ]; + } +}; ?> + +
+ + + + + @foreach($timezones as $timezone) + + {{ $timezone }} + + @endforeach + +