Hi, I tried to make like/dislike in the site and I found the code in github it works but when I click like or dislike button I get 2 and not 1(exemple like:2 dislike:0) but I need like:1 dislike:0 or like:0 dislike:1 and also I get 2 message with sweetalert if I have like:1 and I click in like button to unlike product it should give me one message “you have unliked the product” and not “you have unliked the product” then " you have liked the product" so please how to change code to work correctly and thank you very much
productcontroller:
public function jquery()
{
$products = Product::withCount('likes', 'dislikes')
->when(auth()->check(), function ($query) {
$query->with(['ratings' => function ($query) {
$query->where('user_id', auth()->id());
}]);
})
->get();
return view('site.pages.jquery', compact('products'));
}
public function rateProduct(Request $request)
{
if (auth()->guest()) {
return response(['message' => 'You are not logged in. Please log in to rate post'], 401);
}
$request->validate([
'type' => 'required|in:like,dislike',
'product_id' => 'required|exists:products,id'
]);
$user = auth()->id();
$product = Product::find($request->input('product_id'));
$unrated = (boolean) $product->ratings()->where('user_id', $user)->where('type', $request->input('type'))->count();
$detached = (boolean) $product->ratings()->detach($user);
if (!$unrated) {
$product->ratings()->attach($user, [
'type' => $request->input('type')
]);
}
$product->loadCount('likes', 'dislikes');
$likes = $product->likes_count;
$dislikes = $product->dislikes_count;
return response(compact('detached', 'unrated', 'likes', 'dislikes'));
}
jquery.blade.php
<div class="likes text-right" data-product-id="{{ $product->id }}">
<a href="#" class="like{{ auth()->check() && $product->ratings->where('pivot.type', 'like')->count() ? ' active' : '' }}">
<i class="fa fa-thumbs-up"></i> <span class="count">{{ $product->likes_count }}</span>
</a>
<a href="#" class="dislike{{ auth()->check() && $product->ratings->where('pivot.type', 'dislike')->count() ? ' active' : '' }}">
<i class="fa fa-thumbs-down"></i> <span class="count">{{ $product->dislikes_count }}</span>
</a>
</div>
</div>
@push('scripts')
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@9"></script>
<script>
$(function() {
$('.likes a').click(function (e) {
var _token = $('meta[name="csrf-token"]').attr('content');
var type = $(this).hasClass('like') ? 'like' : 'dislike';
var product_id = $(this).parent('.likes').data('product-id');
var $parent = $(this).parent('.likes');
$.post("{{ route('products.rateProduct') }}", {
_token,
type,
product_id
})
.done((data) => {
var message = 'You have ' + type + 'd this post';
$parent.children('a').removeClass('active');
$parent.find('.like .count').text(data.likes);
$parent.find('.dislike .count').text(data.dislikes);
if (data.detached && data.unrated) {
message = 'You have un' + type + 'd this post'
} else if (!data.detached && !data.unrated) {
$(this).addClass('active');
} else if (data.detached && !data.unrated) {
$(this).addClass('active');
}
Swal.fire(
'Success!',
message,
'success'
);
})
.fail(({responseJSON}) => {
var message = responseJSON.errors && responseJSON.errors[Object.keys(responseJSON.errors)[0]] ?
responseJSON.errors[Object.keys(responseJSON.errors)[0]][0] :
responseJSON.message;
Swal.fire(
'Error!',
message,
'error'
);
});
});
})
</script>
@endpush