|
2 | 2 |
|
3 | 3 | namespace LaraZeus\Sky\Classes; |
4 | 4 |
|
| 5 | +use LaraZeus\Sky\Classes\LinkRenderers\GenericLinkRenderer; |
| 6 | +use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer; |
5 | 7 | use LaraZeus\Sky\SkyPlugin; |
6 | 8 |
|
7 | 9 | class RenderNavItem |
8 | 10 | { |
9 | | - public static function render(array $item, string $class = ''): string |
10 | | - { |
11 | | - $color = 'border-b border-b-secondary-500 text-secondary-500'; |
12 | | - |
13 | | - if ($item['type'] === 'page-link' || $item['type'] === 'page_link') { |
14 | | - $page = SkyPlugin::get()->getModel('Post')::page()->whereDate('published_at', '<=', now())->find($item['data']['page_id']) ?? ''; |
15 | | - $activeClass = (request()->routeIs('page', $page)) ? $color : 'border-transparent'; |
16 | | - |
17 | | - return '<a class="' . $class . ' ' . $activeClass . '" |
18 | | - target="' . ($item['data']['target'] ?? '_self') . '" |
19 | | - href="' . route('page', $page) . '" |
| 11 | + /** |
| 12 | + * @var class-string<NavLinkRenderer> |
| 13 | + */ |
| 14 | + public static string $defaultRendererClass = GenericLinkRenderer::class; |
| 15 | + |
| 16 | + private static function anchorLink( |
| 17 | + string $classes, |
| 18 | + string $target, |
| 19 | + string $link, |
| 20 | + string $label, |
| 21 | + bool $wrap = false, |
| 22 | + string $wrapClass = '', |
| 23 | + ): string { |
| 24 | + // TODO: make this component based? |
| 25 | + // Then it's probably easier for users to further customize this? |
| 26 | + return '<a class="' . $classes . '" |
| 27 | + target="' . $target . '" |
| 28 | + href="' . $link . '" |
20 | 29 | >' . |
21 | | - $item['label'] . |
22 | | - '</a>'; |
23 | | - } elseif ($item['type'] === 'post-link' || $item['type'] === 'post_link') { |
24 | | - $post = SkyPlugin::get()->getModel('Post')::find($item['data']['post_id']) ?? ''; |
25 | | - $activeClass = (request()->routeIs('post', $post)) ? $color : 'border-transparent'; |
26 | | - |
27 | | - return '<a class="' . $class . ' ' . $activeClass . '" |
28 | | - target="' . ($item['data']['target'] ?? '_self') . '" |
29 | | - href="' . route('post', $post) . '" |
30 | | - >' . |
31 | | - $item['label'] . |
32 | | - '</a>'; |
33 | | - } elseif ($item['type'] === 'library-link' || $item['type'] === 'library_link') { |
34 | | - $tag = SkyPlugin::get()->getModel('Tag')::find($item['data']['library_id']) ?? ''; |
35 | | - $activeClass = (str(request()->url())->contains($tag->library->first()->slug)) ? $color : 'border-transparent'; |
36 | | - |
37 | | - return '<a class="' . $class . ' ' . $activeClass . '" |
38 | | - target="' . ($item['data']['target'] ?? '_self') . '" |
39 | | - href="' . route('library.tag', $tag->slug) . '" |
40 | | - >' . |
41 | | - $item['label'] . |
42 | | - '</a>'; |
| 30 | + $label . |
| 31 | + '</a>'; |
| 32 | + } |
43 | 33 |
|
| 34 | + public static function render(array $item, string $class = ''): string |
| 35 | + { |
| 36 | + $itemType = $item['type']; |
| 37 | + if (str($itemType)->contains('_')) { |
| 38 | + $itemType = str($itemType)->replace('_', '-')->toString(); |
| 39 | + } |
| 40 | + $renderersMap = SkyPlugin::get()->getNavRenderers(); |
| 41 | + // TODO: make match current behavior with underscore or hyphen |
| 42 | + if (array_key_exists($itemType, $renderersMap)) { |
| 43 | + $rendererClass = $renderersMap[$itemType]; |
| 44 | + $renderer = new $rendererClass($item); |
44 | 45 | } else { |
45 | | - return '<a class="' . $class . '" |
46 | | - target="' . ($item['data']['target'] ?? '_self') . '" |
47 | | - href="' . $item['data']['url'] . '" |
48 | | - >' . |
49 | | - $item['label'] . |
50 | | - '</a>'; |
| 46 | + $renderer = new static::$defaultRendererClass($item); |
51 | 47 | } |
| 48 | + /** |
| 49 | + * @var NavLinkRenderer $renderer |
| 50 | + */ |
| 51 | + return static::anchorLink(...$renderer->getPreparedLink($class)); |
52 | 52 | } |
53 | 53 | } |
0 commit comments