diff --git a/app/Http/Controllers/Forum/BaseController.php b/app/Http/Controllers/Forum/BaseController.php index 5fc413e67..312796479 100644 --- a/app/Http/Controllers/Forum/BaseController.php +++ b/app/Http/Controllers/Forum/BaseController.php @@ -84,14 +84,14 @@ private function globalViewers(): View { /** @var Renderer $renderer */ $renderer = app(Renderer::class); - return $renderer->render('Online w serwisie', requestUri:null); + return $renderer->render('/', local:false); } private function localViewers(): View { /** @var Renderer $renderer */ $renderer = app(Renderer::class); - return $renderer->render('Aktualnie na tej stronie', requestUri:$this->request->getRequestUri()); + return $renderer->render($this->request->getRequestUri(), local:true); } /** diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 61832f87c..ad7c358b6 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -84,7 +84,7 @@ private function globalViewers(): View { /** @var Renderer $renderer */ $renderer = app(Renderer::class); - return $renderer->render('Użytkownicy online', requestUri:null); + return $renderer->render('/', local:false); } private function flags(): array diff --git a/app/Services/Session/Renderer.php b/app/Services/Session/Renderer.php index 60410cacc..50074faa4 100644 --- a/app/Services/Session/Renderer.php +++ b/app/Services/Session/Renderer.php @@ -1,110 +1,50 @@ data($requestUri); - - $total = $collection->sum('count'); - $guests = $collection->where('user_id', null)->sum('count'); - $registered = $total - $guests; - $robots = $collection->filter(fn($item) => $item->robot)->sum('count'); - - $guests -= $robots; - $total -= $robots; - - $collection = $this->map($collection); - - if ($this->request->user()) { - if (!$collection->contains('user_id', $this->request->user()->id)) { - $collection->push(new Session(['user_id' => $this->request->user()->id, 'path' => $requestUri])); - $total++; - $registered++; - } - } else if ($collection->count() === 0) { - // we keep session in redis but also - list of online users - in postgres. - // we refresh table every 1 minute, so info about user's current page might be sometimes outdated. - $total++; - $guests++; - } - - $collection = $this->unique($collection); - $collection = $this->registered->setup($collection); - - $groups = [self::USER => []]; - foreach ($collection->groupBy('group') as $name => $users) { - if ($name === '') { - $name = self::USER; - } else if (!isset($groups[$name])) { - $groups[$name] = []; - } - foreach ($users as $user) { - if ($user['user_id'] !== null) { - $groups[$name][] = $this->makeProfileLink($user['user_id'], $user['name']); - } - } + $sessions = $this->session->sessionsIn($requestUri); + if ($this->isUserLogged()) { + $sessions = $sessions->coalesceUser($this->loggedUserId()); + } else { + $sessions = $sessions->coalesceGuest(); } + $viewers = $this->store->viewers($sessions); - unset($groups[self::USER]); - ksort($groups); - + $viewersCount = $viewers->guestsCount + \count($viewers->users); return view('components.viewers', [ - 'isLocalViewers' => $requestUri !== null, - 'title' => $title, - 'groups' => $requestUri === null ? $groups : [], - 'total' => $total, - 'guests' => $guests, - 'registered' => $registered, + 'local' => $local, + 'guestsCount' => $viewers->guestsCount, + 'usersCount' => \count($viewers->users), + 'title' => $local + ? 'Aktualnie na tej stronie' + : "$viewersCount użytkowników online", + 'users' => $viewers->users, ]); } - private function data(?string $requestUri): Support\Collection - { - return $this - ->db - ->table('sessions') - ->when($requestUri !== null, fn(Builder $builder) => $builder - ->where('path', 'LIKE', \mb_strToLower(\strTok($requestUri, '?')) . '%')) - ->groupBy(['user_id', 'robot']) - ->get(['user_id', 'robot', new Expression('COUNT(*)')]); - } - - private function map(Support\Collection $collection): Support\Collection - { - return $collection->map(fn($item) => new Session((array)$item)); - } - - private function makeProfileLink(int $userId, string $userName): string + private function isUserLogged(): bool { - return link_to_route('profile', $userName, [$userId], ['data-user-id' => $userId]); + return !!$this->request->user(); } - private function unique(Support\Collection $sessions): Support\Collection + private function loggedUserId() { - $guests = $sessions->filter(fn(Session $item) => $item->userId === null); - $sessions - ->filter(fn(Session $item) => $item->userId !== null) - ->unique('user_id') - ->each(fn(Session $item) => $guests->push($item)); - return $guests; + return $this->request->user()->id; } } diff --git a/resources/feature/viewersOnline/viewers-online.scss b/resources/feature/viewersOnline/viewers-online.scss new file mode 100644 index 000000000..3aba1bbcb --- /dev/null +++ b/resources/feature/viewersOnline/viewers-online.scss @@ -0,0 +1,57 @@ +@mixin dark { + body.theme-dark & { + @content; + } +} + +@mixin light { + body.theme-light & { + @content; + } +} + +.viewers-online { + .viewer-pill { + padding: 4px; + overflow: hidden; + border-radius: 21px; + align-items: center; + + @include dark { + background: #2e2e2e; + border: 1px solid #383838; + } + + @include light { + background: white; + border: 1px solid #dedede; + } + + .viewer-pill-title { + padding-left: 6px; + padding-right: 14px; + font-size: 0.8em; + line-height: 1.3em; + } + } + + .viewers-users-group { + margin-left: -6px; + } + + .viewers-users { + max-width: 90%; + + .viewers-user { + border-radius: 32px; + overflow: hidden; + margin-right: -12px; + @include dark { + border: 1px solid #444; + } + @include light { + border: 1px solid #dedede; + } + } + } +} diff --git a/resources/sass/core.scss b/resources/sass/core.scss index 8b5445d6c..1ea46079a 100644 --- a/resources/sass/core.scss +++ b/resources/sass/core.scss @@ -81,6 +81,7 @@ @import "pages/wiki"; @import "../feature/stickyAside/sticky-aside"; +@import "../feature/viewersOnline/viewers-online"; @import "../js/components/defaultAvatar"; @import "../../node_modules/@riddled/4play/src/style"; diff --git a/resources/views/components/viewers.twig b/resources/views/components/viewers.twig index cb25b845d..20d6c161a 100644 --- a/resources/views/components/viewers.twig +++ b/resources/views/components/viewers.twig @@ -1,6 +1,6 @@

- {% if isLocalViewers %} + {% if local %} {% else %} @@ -9,20 +9,37 @@

- + +
+ {% for user in users %} + {% if user.groupName %} +
+
+ {{ user_avatar(user.avatarUrl, user.name) }} +
+ + {{ user.name }} +
+ {{ user.groupName }} +
+
+ {% endif %} + {% endfor %} +
+ {% if local %} +
+ {% for user in users %} + {% if not user.groupName %} +
+ {{ user_avatar(user.avatarUrl, user.name) }} +
+ {% endif %} + {% endfor %} +
+ {% endif %} +