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 + +