KTVCentral/app/Livewire/Pages/SearchSong.php

105 lines
2.9 KiB
PHP
Raw Normal View History

<?php
namespace App\Livewire\Pages;
use Livewire\Component;
use App\Models\Artist;
use App\Models\SongLibraryCache;
class SearchSong extends Component
{
public string $search = '';
public $searchCategory = '';
public $selectedLanguage = '國語'; // 預設語言
public $selectedArtists = []; // 儲存已選的歌手 id
public $artistOptions = []; // API 回傳的搜尋結果
public string $artistSearch = ''; // 即時搜尋文字
/**
* 初始化(接收外部傳入的分類參數)
*/
public function mount(string $searchCategory = '')
{
$this->searchCategory = $searchCategory;
}
/**
* 切換語言標籤
*/
public function selectLanguage(string $lang): void
{
$this->selectedLanguage = $lang;
}
/**
* 搜尋歌手(透過 API
*/
public function updatedArtistSearch()
{
$search = $this->artistSearch;
if ($search) {
// 即時搜尋歌手,從資料庫查詢
$this->artistOptions = \App\Models\Artist::query()
->where('name', 'like', "{$search}%")
->limit(100)
->get(['id', 'name'])
->toArray();
} else {
$this->artistOptions = [];
}
}
public function addArtist($id, $name)
{
$this->selectedArtists[$id] = $name;
$this->artistSearch = ''; // 清空搜尋框
$this->artistOptions = [];
}
public function removeArtist($id)
{
unset($this->selectedArtists[$id]);
}
/**
* 點歌
*/
public function orderSong(int $songId): void
{
// TODO: 加入已點歌曲邏輯,例如:
// auth()->user()->room->addSong($songId);
$this->dispatchBrowserEvent('notify', [
'message' => '已加入已點歌曲'
]);
}
/**
* 取得歌曲清單
*/
protected function loadSongs()
{
return SongLibraryCache::query()
->when($this->search, fn($q) => $q->where('song_name', 'like', "{$this->search}%"))
->when($this->selectedLanguage, fn($q) => $q->where('language_name', $this->selectedLanguage))
->when($this->selectedArtists, fn ($q) => $q->whereHas('artists', fn ($q2) => $q2->whereIn('id', array_keys($this->selectedArtists))))
->when($this->searchCategory === 'New', fn($q) => $q->orderByDesc('add_date'))
->when($this->searchCategory === 'Hot', fn($q) => $q->orderByDesc('song_counts'), fn($q) => $q->orderByDesc('song_id'))
//->take($this->search || $this->artistSearch ? 100 : 1000)
->take(1000)
->get();
}
/**
* Render
*/
public function render()
{
$songs = $this->loadSongs();
return view('livewire.pages.search-song', [
'songs' => $songs,
'languages' => \App\Enums\SongLanguageType::options(),
'selectedLanguage' => $this->selectedLanguage,
]);
}
}