can someone knows how solve this?
i'm trying to make a pagination reviews with livewire my codes are below: @foreach($filteredReviews as $review) {{ $review->comment }} @endforeach {{ $filteredReviews->links() }}

i'm trying to make a pagination reviews with livewire my codes are below:
@foreach($filteredReviews as $review)
{{ $review->comment }}
@endforeach
{{ $filteredReviews->links() }}
namespace App\Livewire\Client\SingleProduct;
use Livewire\Component;
use App\Models\Product;
use App\Models\Review;
use App\Models\Shop;
use Gloudemans\Shoppingcart\Facades\Cart;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use Livewire\WithPagination;
class SingleProduct extends Component
{
use WithPagination;
public $productId;
public $single_produto;
public $reviews;
public $filteredReviews;
public $averageRating;
public $starRatings = [];
public $isOptionsVisible = false;
public $sortBy = 'MOST_RECENT';
public $searchTerm = '';
public $shopName;
public bool $inWishlist = false;
public function mount($id)
{
$this->productId = $id;
$this->single_produto = Product::findOrFail($id);
$this->fetchReviews();
$this->calculateAverages();
$this->fetchShopName();
$this->inWishlist = $this->isInWishlist($id);
$this->calculateReviewDates();
}
private function fetchReviews()
{
// Consulta apenas os IDs das reviews paginadas
$query = Review::where('product_id', $this->productId);
// Adiciona a ordenação conforme a seleção
if ($this->sortBy === 'MOST_RECENT') {
$query->latest();
} elseif ($this->sortBy === 'HIGHEST_RATING') {
$query->orderBy('rating', 'desc');
} elseif ($this->sortBy === 'LOWEST_RATING') {
$query->orderBy('rating', 'asc');
}
// Aplica a paginação, retornando apenas os IDs das reviews
$this->filteredReviews = $query->orderBy('created_at', 'desc')->paginate(5);
}
private function calculateAverages()
{
$this->averageRating = $this->filteredReviews->items() > 0
? number_format($this->filteredReviews->avg('rating'), 2, ',', '')
: 0;
$this->initializeStarRatings();
}
private function calculateReviewDates()
{
foreach ($this->filteredReviews as $review) {
$diffInDays = Carbon::parse($review->created_at)->diffInDays(Carbon::now());
$diffInHours = Carbon::parse($review->created_at)->diffInHours(Carbon::now());
// Se a diferença for menor que 1 dia, mostra em horas
if ($diffInDays < 1) {
$review->time_since_review = $diffInHours . ' hora' . ($diffInHours > 1 ? 's' : '') . ' atrás';
} elseif ($diffInDays == 1) {
$review->time_since_review = 'Há 1 dia na Sense Party';
} else {
$review->time_since_review = 'Há ' . $diffInDays . ' dias na Sense Party';
}
}
}
private function initializeStarRatings()
{
$this->starRatings = Review::where('product_id', $this->productId)
->selectRaw('rating, count(*) as count')
->groupBy('rating')
->pluck('count', 'rating')
->toArray();
$totalReviews = array_sum($this->starRatings);
// Garante que todas as chaves de 1 a 5 existem no array
foreach (range(1, 5) as $star) {
$this->starRatings[$star] = $this->starRatings[$star] ?? 0;
}
foreach (range(1, 5) as $star) {
$this->starRatings[$star] = $totalReviews > 0
? ($this->starRatings[$star] / $totalReviews) * 100
: 0;
}
}
private function fetchShopName()
{
$shop = Shop::where('client_id', $this->single_produto->client_id)->first();
$this->shopName = $shop ? $shop->shop_name : 'Nome da loja não encontrado';
}
public function addToCart()
{
Cart::add([
'id' => $this->single_produto->id,
'name' => $this->single_produto->name,
'qty' => 1,
'price' => $this->single_produto->price,
]);
$this->dispatch('cart_updated');
}
public function toggleWishlist()
{
if (Auth::guard('client')->check()) {
$user = Auth::guard('client')->user();
$productId = $this->single_produto->id;
if ($user->wishlist->contains($productId)) {
$user->wishlist()->detach($productId);
$this->inWishlist = false;
$message = 'Produto removido da lista de desejos!';
$type = 'error';
} else {
$user->wishlist()->attach($productId);
$this->inWishlist = true;
$message = 'Produto adicionado à lista de desejos!';
$type = 'success';
}
$this->dispatch('showToastr', $type, $message);
}
}
public function toggleOptions()
{
$this->isOptionsVisible = !$this->isOptionsVisible;
}
public function openReviewPopup()
{
$this->dispatch('showReviewPopup', ['productId' => $this->single_produto->id]);
}
public function show()
{
$this->visible = true;
}
public function hide()
{
$this->visible = false;
}
public function updatedSearchTerm()
{
$this->fetchReviews();
}
public function selectSortOption($option)
{
$this->sortBy = $option;
$this->fetchReviews();
$this->isOptionsVisible = false;
}
private function isInWishlist($productId)
{
if (Auth::guard('client')->check()) {
return Auth::guard('client')->user()->wishlist->contains($productId);
}
return false;
}
public function render()
{
return view('livewire.client.single-product.single-product', [
'single_produto' => $this->single_produto,
'reviews' => $this->filteredReviews,
'averageRating' => $this->averageRating,
'productId' => $this->productId,
'isOptionsVisible' => $this->isOptionsVisible,
'sortBy' => $this->sortBy,
'shopName' => $this->shopName,
'inWishlist' => $this->inWishlist,
]);
}
}
please help me