Passed
Push — feature/v4 ( e5e380...dac4aa )
by Samuel
11:37
created

MarkerInfoWindowOpenSubscriber::handleMap()   A

Complexity

Conditions 6
Paths 5

Size

Total Lines 17
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 12
c 2
b 0
f 0
dl 0
loc 17
ccs 0
cts 12
cp 0
rs 9.2222
cc 6
nc 5
nop 1
crap 42
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Ivory Google Map package.
7
 *
8
 * (c) Eric GELOEN <[email protected]>
9
 *
10
 * For the full copyright and license information, please read the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Ivory\GoogleMap\Helper\Subscriber\Overlay;
15
16
use Ivory\GoogleMap\Event\Event;
17
use Ivory\GoogleMap\Helper\Collector\Overlay\MarkerCollector;
18
use Ivory\GoogleMap\Helper\Event\MapEvent;
19
use Ivory\GoogleMap\Helper\Event\MapEvents;
20
use Ivory\GoogleMap\Helper\Formatter\Formatter;
21
use Ivory\GoogleMap\Helper\Renderer\Event\EventRenderer;
22
use Ivory\GoogleMap\Helper\Renderer\Overlay\InfoWindowOpenRenderer;
23
use Ivory\GoogleMap\Map;
24
use Ivory\GoogleMap\Overlay\Marker;
25
26
class MarkerInfoWindowOpenSubscriber extends AbstractMarkerSubscriber
27
{
28
    /** @var InfoWindowOpenRenderer */
29
    private $infoWindowOpenRenderer;
30
31
    /** @var EventRenderer */
32
    private $eventRenderer;
33
34 1
    public function __construct(
35
        Formatter $formatter,
36
        MarkerCollector $markerCollector,
37
        InfoWindowOpenRenderer $infoWindowOpenRenderer,
38
        EventRenderer $eventRenderer
39
    ) {
40 1
        parent::__construct($formatter, $markerCollector);
41
42 1
        $this->setInfoWindowOpenRenderer($infoWindowOpenRenderer);
43 1
        $this->setEventRenderer($eventRenderer);
44 1
    }
45
46
    public function getInfoWindowOpenRenderer(): InfoWindowOpenRenderer
47
    {
48
        return $this->infoWindowOpenRenderer;
49
    }
50
51 1
    public function setInfoWindowOpenRenderer(InfoWindowOpenRenderer $infoWindowOpenRenderer): void
52
    {
53 1
        $this->infoWindowOpenRenderer = $infoWindowOpenRenderer;
54 1
    }
55
56
    public function getEventRenderer(): EventRenderer
57
    {
58
        return $this->eventRenderer;
59
    }
60
61 1
    public function setEventRenderer(EventRenderer $eventRenderer): void
62
    {
63 1
        $this->eventRenderer = $eventRenderer;
64 1
    }
65
66
    public function handleMap(MapEvent $event): void
67
    {
68
        $formatter = $this->getFormatter();
69
        $map       = $event->getMap();
70
71
        foreach ($this->getMarkerCollector()->collect($map) as $marker) {
72
            if ($marker->hasInfoWindow() && $marker->getInfoWindow()->isAutoOpen()) {
73
                $event->addCode($formatter->renderContainerAssignment(
74
                    $map,
75
                    $this->getEventRenderer()->render($rawEvent = $this->createEvent($map, $marker)),
76
                    'events.events',
77
                    $rawEvent
78
                ));
79
            }
80
            if ($marker->hasInfoWindow() && $marker->getInfoWindow()->isOpen()) {
81
                $event->addCode($formatter->renderCode($this->infoWindowOpenRenderer->render($marker->getInfoWindow(), $map, $marker)));
82
                $marker->getInfoWindow()->setOpen(false);
83
            }
84
        }
85
    }
86
87
    /** {@inheritdoc} */
88 1
    public static function getSubscribedEvents(): array
89
    {
90 1
        return [MapEvents::JAVASCRIPT_EVENT => 'handleMap'];
91
    }
92
93
    private function createEvent(Map $map, Marker $marker): Event
94
    {
95
        $formatter = $this->getFormatter();
96
97
        $rawEvent = new Event(
98
            $marker->getVariable(),
99
            $marker->getInfoWindow()->getOpenEvent(),
100
            $formatter->renderClosure($formatter->renderLines([
101
                $formatter->renderCall(
102
                    $formatter->renderProperty(
103
                        $formatter->renderContainerVariable($map, 'functions'),
104
                        'info_windows_close'
105
                    ),
106
                    [],
107
                    true
108
                ),
109
                $formatter->renderCode(
110
                    $this->getInfoWindowOpenRenderer()->render($marker->getInfoWindow(), $map, $marker),
0 ignored issues
show
Bug introduced by
It seems like $marker->getInfoWindow() can also be of type null; however, parameter $infoWindow of Ivory\GoogleMap\Helper\R...wOpenRenderer::render() does only seem to accept Ivory\GoogleMap\Overlay\InfoWindow, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

110
                    $this->getInfoWindowOpenRenderer()->render(/** @scrutinizer ignore-type */ $marker->getInfoWindow(), $map, $marker),
Loading history...
111
                    true,
112
                    false
113
                ),
114
            ]))
115
        );
116
117
        $rawEvent->setVariable($marker->getVariable().'_info_window_open_event');
118
119
        return $rawEvent;
120
    }
121
}
122