<?php
namespace App\Raceday\EventSubscriber;
use App\Profile\Model\Profile;
use App\Raceday\Event\RacedayAttendEvent;
use App\Raceday\Event\RacedayEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Mercure\HubInterface;
use Symfony\Component\Mercure\Update;
class RacedayAttendeesSubscriber implements EventSubscriberInterface
{
public function __construct(
protected HubInterface $hub,
protected \Twig\Environment $twig
) {
}
public static function getSubscribedEvents()
{
return [
RacedayEvents::ATTEND => 'updateRacedayAttendees',
RacedayEvents::UNATTEND => 'updateRacedayAttendees',
];
}
public function updateRacedayAttendees(RacedayAttendEvent $event)
{
$attendees = $event->raceday->getAttendees();
$attendeeProfiles = [];
foreach ($attendees as $attendee) {
$attendeeProfiles[] = Profile::getById($attendee->getObjectId());
}
$sortedAttendeeProfile = [];
foreach ($attendeeProfiles as $profile) {
$key = explode('\\', $profile->getPrimaryProfile());
$key = end($key);
$key = str_replace('Profile', '', $key);
$key = mb_strtolower($key);
$sortedAttendeeProfile[$key][] = $profile;
usort($sortedAttendeeProfile[$key], fn ($a, $b) => strcmp($a->getName(), $b->getName()));
}
// dd($sortedAttendeeProfile);
$html = $this->twig->render('network/raceday/event/attend.stream.twig', ['event' => $event->raceday, 'attendees' => $sortedAttendeeProfile]);
$this->hub->publish(new Update($event->getTopic(), $html));
}
}