Files
timebank-cc-public/app/Http/Livewire/ProfileStatusBadge.php
Ronald Huynen 2547717edb Initial commit
2026-03-23 21:37:59 +01:00

94 lines
2.7 KiB
PHP

<?php
namespace App\Http\Livewire;
use App\Services\PresenceService;
use Livewire\Component;
class ProfileStatusBadge extends Component
{
public $profileId;
public $profileType;
public $guard = 'web';
public $status = 'offline';
public $lastSeen;
public $showText = true;
public $showIcon = true;
public $size = 'sm';
public function mount($profileId = null, $guard = 'web', $showText = true, $showIcon = true, $size = 'sm')
{
$this->profileId = $profileId ?? auth($guard)->id();
$this->guard = strtolower($guard);
$this->showText = $showText;
$this->showIcon = $showIcon;
$this->size = $size;
$this->checkStatus();
}
public function checkStatus()
{
try {
if (!$this->profileId) {
$this->status = 'offline';
return;
}
$profileModel = $this->getUserModel();
if (!$profileModel) {
$this->status = 'offline';
return;
}
// Use PresenceService to determine online status
// This relies on recent activity tracking, not just authentication status
$presenceService = app(PresenceService::class);
if ($presenceService->isUserOnline($profileModel, $this->guard)) {
$lastSeen = $presenceService->getUserLastSeen($profileModel, $this->guard);
if ($lastSeen) {
$this->lastSeen = $lastSeen;
$minutesAgo = $lastSeen->diffInMinutes(now());
if ($minutesAgo <= 2) {
$this->status = 'online';
} elseif ($minutesAgo <= 5) {
$this->status = 'idle';
} else {
$this->status = 'offline';
}
} else {
$this->status = 'online';
}
} else {
$this->status = 'offline';
$this->lastSeen = $presenceService->getUserLastSeen($profileModel, $this->guard);
}
} catch (\Exception $e) {
$this->status = 'offline';
}
}
protected function getUserModel()
{
switch ($this->guard) {
case 'admin':
return \App\Models\Admin::find($this->profileId);
case 'bank':
return \App\Models\Bank::find($this->profileId);
case 'organization':
return \App\Models\Organization::find($this->profileId);
default:
return \App\Models\User::find($this->profileId);
}
}
public function render()
{
return view('livewire.profile-status-badge');
}
}