MenuBuilder::processMenu()   B
last analyzed

Complexity

Conditions 8
Paths 6

Size

Total Lines 35
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
eloc 21
c 1
b 0
f 0
nc 6
nop 2
dl 0
loc 35
rs 8.4444
1
<?php
2
3
declare(strict_types=1);
4
5
namespace KielD01\LaravelMaterialDashboardPro\Helpers;
6
7
use Illuminate\Support\Facades\Config;
8
use KielD01\LaravelMaterialDashboardPro\Helpers\Icons\FontAwesomeIcon;
9
use KielD01\LaravelMaterialDashboardPro\Helpers\Icons\MaterialIcon;
10
11
class MenuBuilder
12
{
13
	public function build(): array
14
	{
15
		return $this->processMenu(
16
			Config::get('mdp.menu', [])
17
		);
18
	}
19
20
	private function processMenu(array $menuItems, bool $isChild = false): array
21
	{
22
		/** @var MenuVisibilityResolver $menuResolver */
23
		$menuResolver = resolve(Config::get('mdp.core.menu_permission_resolver'));
24
25
		foreach ($menuItems as $index => $menuItem) {
26
			if (!array_key_exists('can', $menuItem) || $menuResolver->resolve($menuItem['can'])) {
27
				$link = array_key_exists('link', $menuItem) ?
28
					$menuItem['link'] :
29
					['type' => MenuItemLinkType::URI, 'uri' => '#'];
30
31
				$hasIcon = array_key_exists('icon', $menuItem);
32
33
				/** @var FontAwesomeIcon|MaterialIcon $iconClass */
34
				$iconClass = null;
35
				$icon = null;
36
37
				if ($hasIcon) {
38
					[$iconClass, $icon] = $menuItem['icon'];
39
				}
40
41
				$menuItems[$index] = new MenuItem(
42
					$menuItem['title'],
43
					$link['type'],
44
					$link[$link['type']],
45
					$isChild && !$hasIcon ? null : new $iconClass($icon),
46
					$this->processMenu($menuItem['children'] ?? [], true),
47
					$isChild
48
				);
49
			} else {
50
				unset($menuItems[$index]);
51
			}
52
		}
53
54
		return $menuItems;
55
	}
56
}
57