102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Http\Livewire\Menu;
 | |
| 
 | |
| use Livewire\Component;
 | |
| use Illuminate\Contracts\View\View;
 | |
| use Illuminate\Support\Facades\Request;
 | |
| use Illuminate\Support\Str;
 | |
| 
 | |
| class Favorites extends Component
 | |
| {
 | |
|     public $favorites = [];
 | |
| 
 | |
|     protected $listeners = [
 | |
|         'addedFavorite' => 'render',
 | |
|         'removedFavorite' => 'render',
 | |
|     ];
 | |
| 
 | |
|     public function render(): View
 | |
|     {
 | |
|         $this->favorites = collect();
 | |
| 
 | |
|         $favorites = setting('favorites.menu.' . user()->id, []);
 | |
| 
 | |
|         if (!empty($favorites)) {
 | |
|             $favorites = json_decode($favorites, true);
 | |
| 
 | |
|             foreach ($favorites as $favorite) {
 | |
|                 $favorite['active'] = false;
 | |
| 
 | |
|                 try {
 | |
|                     $favorite['url'] = $this->getUrl($favorite);
 | |
|                 } catch (\Exception $e) {
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 $favorite['id'] = $this->getId($favorite);
 | |
| 
 | |
|                 if ($this->isActive($favorite['url'])) {
 | |
|                     $favorite['active'] = true;
 | |
|                 }
 | |
| 
 | |
|                 $this->favorites->push($favorite);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return view('livewire.menu.favorites');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get url.
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function getUrl($favorite)
 | |
|     {
 | |
|         if (! empty($favorite['route'])) {
 | |
|             $route = $favorite['route'];
 | |
| 
 | |
|             if (is_array($route)) {
 | |
|                 $url = route($route[0], $route[1]);
 | |
|             } else {
 | |
|                 $url = route($route);
 | |
|             }
 | |
| 
 | |
|             return str_replace(url('/') . '/', '', $url);
 | |
|         }
 | |
| 
 | |
|         if (empty($favorite['url'])) {
 | |
|             return '/#';
 | |
|         }
 | |
| 
 | |
|         return str_replace(url('/') . '/', '', url($favorite['url']));
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get active state for current item.
 | |
|      *
 | |
|      * @return mixed
 | |
|      */
 | |
|     public function isActive($url)
 | |
|     {
 | |
|         if (empty($url) || in_array($url, ['/'])) {
 | |
|             return Request::is($url);
 | |
|         } else {
 | |
|             return Request::is($url, $url . '/*');
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function getId($favorite)
 | |
|     {
 | |
|         $id = Str::of($favorite['url'])
 | |
|                 ->replace(url('/'), '-')
 | |
|                 ->replace(company_id(), '')
 | |
|                 ->replace(['/', '?', '='], '-')
 | |
|                 ->trim('-')
 | |
|                 ->squish();
 | |
| 
 | |
|         return 'menu-favorites-' . $id;
 | |
|     }
 | |
| }
 |