webteractive/filament-browser-timezone
Installation:
composer require webteractive/filament-browser-timezone
No additional configuration is required for basic usage.
First Use Case: Access the browser timezone in a Filament resource:
use Webteractive\FilamentBrowserTimezone\BrowserTimezone;
// In a Resource, Form, or Widget
$timezone = BrowserTimezone::get(); // Returns 'America/New_York' or fallback
Where to Look First:
BrowserTimezone facade (automatically available)config/filament-browser-timezone.php (published via php artisan vendor:publish --tag="filament-browser-timezone-config")use Webteractive\FilamentBrowserTimezone\BrowserTimezone;
class UserResource extends Resource {
public function table(Table $table): Table {
return $table->columns([
TextColumn::make('created_at')
->dateTime()
->timezone(BrowserTimezone::get()) // Dynamic timezone
->label('Created At'),
]);
}
}
// Override browser timezone for specific users (e.g., admins)
if (auth()->user()->is_admin) {
$timezone = 'UTC';
} else {
$timezone = BrowserTimezone::get('UTC'); // Fallback to UTC
}
use Webteractive\FilamentBrowserTimezone\BrowserTimezone;
class EventForm extends Form {
public function form(Form $form): Form {
return $form->schema([
DateTimePicker::make('event_time')
->timezone(BrowserTimezone::get())
->label('Event Time'),
]);
}
}
use Webteractive\FilamentBrowserTimezone\BrowserTimezone;
class RecentActivityWidget extends Widget {
protected function getTableQuery(): Builder {
return Activity::query()
->where('created_at', '>=', now()->setTimezone(BrowserTimezone::get()))
->latest();
}
}
if (BrowserTimezone::has()) {
$timezone = BrowserTimezone::get();
} else {
// Fallback logic (e.g., user preference or default)
$timezone = auth()->user()->timezone ?? config('app.timezone');
}
Enable debug mode in config/filament-browser-timezone.php:
'debug' => env('APP_ENV') === 'local',
Logs timezone detection attempts to Laravel logs.
// In PHPUnit/Pest tests
BrowserTimezone::resetState(); // Clear cached state
BrowserTimezone::setForTesting('Europe/London'); // Mock timezone
Clear timezone data manually:
php artisan filament:timezone:clear
Or programmatically:
BrowserTimezone::clear();
Browser Compatibility:
fallback_timezone.Session Key Conflicts:
session_key in config doesn’t clash with existing session keys.'browser_timezone'.Livewire Component Injection:
panels::body.start). If hooks are disabled or overridden, timezone detection may fail.register method includes:
Panel::make()->hooks([
RenderHook::make('panels.body.start')
->view('filament-browser-timezone::timezone-sync'),
]);
Timezone Validation:
'Invalid/Zone') are rejected since v1.5.2. Use BrowserTimezone::isValid('Europe/London') to validate manually.Caching Interference:
BrowserTimezone::get() isn’t cached globally (it reads from the session).Check Session Data:
dd(session()->get('browser_timezone')); // Debug stored value
Validate JavaScript Detection:
F12) and check the Network tab for livewire requests containing timezone data.Intl.DateTimeFormat unsupported).Log Timezone Detection:
Enable debug mode and check storage/logs/laravel.log for:
[BrowserTimezone] Detected: America/New_York
[BrowserTimezone] Fallback used: UTC
Clear Stale Data:
php artisan filament:timezone:clear
Custom Timezone Logic: Override the default detection by publishing the Livewire component:
php artisan vendor:publish --tag="filament-browser-timezone-views"
Modify resources/views/vendor/filament-browser-timezone/timezone-sync.blade.php.
Add Timezone to User Model: Sync browser timezone to the user model:
use Webteractive\FilamentBrowserTimezone\BrowserTimezone;
auth()->user()->update(['timezone' => BrowserTimezone::get()]);
Multi-Tenancy Support: Store timezone per tenant:
session()->put('tenant_' . tenant()->id . '_timezone', BrowserTimezone::get());
Fallback Hierarchy:
Extend the fallback logic in BrowserTimezone::get():
$timezone = BrowserTimezone::get() ?: auth()->user()->timezone ?: config('app.timezone');
Avoid Redundant Calls: Cache the timezone in a property if used repeatedly:
private $userTimezone;
public function getUserTimezone() {
return $this->userTimezone ??= BrowserTimezone::get();
}
Lazy-Load Timezone: Defer timezone resolution until needed:
$timezone = fn() => BrowserTimezone::get();
Disable for Non-Interactive Requests: Skip detection for APIs or CLI:
if (!app()->runningInConsole() && !request()->wantsJson()) {
$timezone = BrowserTimezone::get();
}
Fallback Timezone Validation:
Since v1.5.2, invalid fallback_timezone values default to 'UTC'. Validate with:
if (!BrowserTimezone::isValid(config('filament-browser-timezone.fallback_timezone'))) {
config(['filament-browser-timezone.fallback_timezone' => 'UTC']);
}
Session Driver:
Ensure your session driver (e.g., file, database, redis) is properly configured. Timezone data won’t persist if sessions fail.
Livewire Version Conflicts:
The package supports Livewire v3/v4. If you encounter issues, pin the Livewire version in composer.json:
"require": {
"livewire/livewire": "^3.0||^4.0"
}
Mock Timezone in Tests:
// Pest/PHPUnit
BrowserTimezone::setForTesting('Asia/Tokyo');
$this->assertEquals('Asia/Tokyo', BrowserTimezone::get());
Reset State:
BrowserTimezone::resetState(); // Clears cached session data
Test Fallback:
// Simulate missing session data
session()->forget('browser_timezone');
$this->assertEquals('UTC', BrowserTimezone::get('UTC'));
How can I help you explore Laravel packages today?