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() }}

Mar 17, 2025 - 23:34
 0
can someone knows how solve this?

Image description

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