Files
hstream/app/Livewire/PlaylistOverview.php
2025-09-18 15:31:27 +02:00

124 lines
2.9 KiB
PHP

<?php
namespace App\Livewire;
use App\Models\Playlist;
use App\Models\PlaylistEpisode;
use App\Services\PlaylistService;
use Livewire\Component;
use Livewire\WithPagination;
use Livewire\Attributes\Url;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\Eloquent\Collection;
class PlaylistOverview extends Component
{
use WithPagination;
protected PlaylistService $playlistService;
#[Url(history: true)]
public $search;
public int $pagination = 25;
public Playlist $playlist;
public Collection $playlistEpisodes;
public function boot(PlaylistService $playlistService)
{
$this->playlistService = $playlistService;
}
public function mount($playlist_id)
{
$this->playlist = Playlist::with(['episodes.episode'])->findOrFail($playlist_id);
// Set position if null
$this->playlist->episodes->each(function ($item, $index) {
if ($item->position === null) {
$item->position = $index + 1;
$item->save();
}
});
$this->refreshEpisodes();
}
public function refreshEpisodes()
{
$this->playlistEpisodes = $this->playlist->episodes()->orderBy('position')->with('episode')->get();
}
public function moveUp($episodeId)
{
if (! Auth::check()) {
return;
}
if (Auth::user()->id !== $this->playlist->user->id) {
return;
}
$episode = PlaylistEpisode::find($episodeId);
$above = PlaylistEpisode::where('playlist_id', $episode->playlist_id)
->where('position', '<', $episode->position)
->orderBy('position', 'desc')
->first();
if ($above) {
$this->playlistService->swapPositions($episode, $above);
}
$this->refreshEpisodes();
}
public function moveDown($episodeId)
{
if (! Auth::check()) {
return;
}
if (Auth::user()->id !== $this->playlist->user->id) {
return;
}
$episode = PlaylistEpisode::find($episodeId);
$below = PlaylistEpisode::where('playlist_id', $episode->playlist_id)
->where('position', '>', $episode->position)
->orderBy('position')
->first();
if ($below) {
$this->playlistService->swapPositions($episode, $below);
}
$this->refreshEpisodes();
}
public function remove($episodeId)
{
if (! Auth::check()) {
return;
}
if (Auth::user()->id !== $this->playlist->user->id) {
return;
}
PlaylistEpisode::find($episodeId)?->delete();
$this->playlistService->reorderPositions($this->playlist);
$this->refreshEpisodes();
}
public function render()
{
return view('livewire.playlist-overview', [
'query' => $this->search,
]);
}
}