Passed
Push — main ( ea72e8...8e0a3d )
by Roman
02:18
created

MenuBuilder::processMenu()   B

Complexity

Conditions 9
Paths 6

Size

Total Lines 33
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 9
eloc 19
c 1
b 0
f 0
nc 6
nop 2
dl 0
loc 33
rs 8.0555
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 static function build(): array
14
	{
15
		return self::processMenu(
16
			Config::get('mdp.menu', [])
17
		);
18
	}
19
20
	private static 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 && $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
					self::processMenu($menuItem['children'] ?? [], true),
47
					$isChild
48
				);
49
			}
50
		}
51
52
		return $menuItems;
53
	}
54
}
55