akaunting/app/Http/Livewire/Menu/Favorites.php
2022-06-14 22:48:06 +03:00

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;
}
}