fedi-feed-router/app/Livewire/Articles.php

88 lines
2.3 KiB
PHP

<?php
namespace App\Livewire;
use App\Enums\ApprovalStatusEnum;
use App\Jobs\ArticleDiscoveryJob;
use App\Models\RouteArticle;
use Livewire\Component;
use Livewire\WithPagination;
class Articles extends Component
{
use WithPagination;
public string $tab = 'pending';
public string $search = '';
public bool $isRefreshing = false;
public function setTab(string $tab): void
{
$this->tab = $tab;
$this->search = '';
$this->resetPage();
}
public function updatedSearch(): void
{
$this->resetPage();
}
public function approve(int $routeArticleId): void
{
RouteArticle::findOrFail($routeArticleId)->approve();
}
public function reject(int $routeArticleId): void
{
RouteArticle::findOrFail($routeArticleId)->reject();
}
public function restore(int $routeArticleId): void
{
$routeArticle = RouteArticle::findOrFail($routeArticleId);
$routeArticle->update(['approval_status' => ApprovalStatusEnum::PENDING]);
}
public function clear(): void
{
RouteArticle::where('approval_status', ApprovalStatusEnum::PENDING)
->update(['approval_status' => ApprovalStatusEnum::REJECTED]);
}
public function refresh(): void
{
$this->isRefreshing = true;
ArticleDiscoveryJob::dispatch();
$this->dispatch('refresh-started');
}
public function render(): \Illuminate\Contracts\View\View
{
$query = RouteArticle::with(['article.feed', 'feed', 'platformChannel'])
->orderBy('created_at', 'desc');
if ($this->tab === 'pending') {
$query->where('approval_status', ApprovalStatusEnum::PENDING);
} elseif ($this->search !== '') {
$search = $this->search;
$query->whereHas('article', function ($q) use ($search) {
$q->where('title', 'like', "%{$search}%")
->orWhere('description', 'like', "%{$search}%");
});
}
$routeArticles = $query->paginate(15);
$pendingCount = RouteArticle::where('approval_status', ApprovalStatusEnum::PENDING)->count();
return view('livewire.articles', [
'routeArticles' => $routeArticles,
'pendingCount' => $pendingCount,
])->layout('layouts.app');
}
}