class ReviewSystem { constructor() { this.reviewForm = document.getElementById('review-form'); this.reviewsContainer = document.getElementById('reviews-container'); this.ratingInput = document.getElementById('rating-input'); this.initializeReviews(); } initializeReviews() { // تهيئة نظام التقييم بالنجوم this.initializeStarRating(); // معالجة إرسال المراجعة this.reviewForm?.addEventListener('submit', (e) => this.handleReviewSubmit(e)); // تهيئة فلترة المراجعات this.initializeReviewFilters(); // تحميل المراجعات الحالية this.loadReviews(); } initializeStarRating() { const ratingStars = document.querySelectorAll('.rating-stars i'); ratingStars.forEach((star, index) => { star.addEventListener('mouseover', () => { this.updateStars(ratingStars, index); }); star.addEventListener('click', () => { this.ratingInput.value = index + 1; star.classList.add('selected'); }); }); // إعادة تعيين النجوم عند إزالة المؤشر document.querySelector('.rating-stars')?.addEventListener('mouseleave', () => { this.updateStars(ratingStars, this.ratingInput.value - 1); }); } updateStars(stars, activeIndex) { stars.forEach((star, index) => { star.classList.toggle('active', index <= activeIndex); }); } async handleReviewSubmit(e) { e.preventDefault(); const formData = new FormData(e.target); try { const response = await fetch('/api/reviews.php', { method: 'POST', body: formData }); if (!response.ok) throw new Error('فشل إرسال المراجعة'); const review = await response.json(); this.addReviewToDOM(review); this.showNotification('تم إضافة مراجعتك بنجاح'); e.target.reset(); this.updateStars(document.querySelectorAll('.rating-stars i'), -1); } catch (error) { console.error('Review submission error:', error); this.showNotification('حدث خطأ أثناء إرسال المراجعة', 'error'); } } initializeReviewFilters() { const filterButtons = document.querySelectorAll('.review-filter'); filterButtons.forEach(button => { button.addEventListener('click', () => { filterButtons.forEach(btn => btn.classList.remove('active')); button.classList.add('active'); this.filterReviews(button.dataset.rating); }); }); // تهيئة الترتيب document.getElementById('review-sort')?.addEventListener('change', (e) => { this.sortReviews(e.target.value); }); } async loadReviews() { try { const productId = this.reviewsContainer?.dataset.productId; const response = await fetch(`/api/reviews.php?product_id=${productId}`); if (!response.ok) throw new Error('فشل تحميل المراجعات'); const reviews = await response.json(); this.displayReviews(reviews); } catch (error) { console.error('Reviews loading error:', error); this.showNotification('حدث خطأ أثناء تحميل المراجعات', 'error'); } } displayReviews(reviews) { if (!this.reviewsContainer) return; if (reviews.length === 0) { this.reviewsContainer.innerHTML = '

لا توجد مراجعات بعد

'; return; } this.reviewsContainer.innerHTML = reviews.map(review => `
${review.userName}

${review.userName}

${this.generateStars(review.rating)}
${review.date}
${review.verified ? ' شراء موثق' : ''}

${review.content}

${review.images ? this.generateImageGallery(review.images) : ''}
`).join(''); } generateStars(rating) { return Array(5).fill().map((_, index) => ` `).join(''); } generateImageGallery(images) { return `
${images.map(image => ` صورة المراجعة `).join('')}
`; } filterReviews(rating) { const reviews = document.querySelectorAll('.review-card'); reviews.forEach(review => { if (rating === 'all' || review.dataset.rating === rating) { review.style.display = 'block'; } else { review.style.display = 'none'; } }); } sortReviews(criteria) { const reviews = Array.from(document.querySelectorAll('.review-card')); const container = this.reviewsContainer; if (!container) return; reviews.sort((a, b) => { switch (criteria) { case 'newest': return new Date(b.querySelector('.review-date').textContent) - new Date(a.querySelector('.review-date').textContent); case 'highest': return b.dataset.rating - a.dataset.rating; case 'lowest': return a.dataset.rating - b.dataset.rating; case 'helpful': return parseInt(b.querySelector('.helpful-count').textContent) - parseInt(a.querySelector('.helpful-count').textContent); default: return 0; } }); reviews.forEach(review => container.appendChild(review)); } async markHelpful(reviewId) { try { const response = await fetch('/api/helpful-review.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ reviewId }) }); if (!response.ok) throw new Error('فشل تسجيل المساعدة'); const data = await response.json(); document.querySelector(`[data-review-id="${reviewId}"] .helpful-count`).textContent = data.helpfulCount; this.showNotification('شكراً لتقييمك'); } catch (error) { console.error('Helpful marking error:', error); } } reportReview(reviewId) { const reason = prompt('يرجى ذكر سبب الإبلاغ عن هذه المراجعة:'); if (!reason) return; fetch('/api/report-review.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ reviewId, reason }) }) .then(response => { if (response.ok) { this.showNotification('شكراً لإبلاغك. سنراجع المحتوى.'); } }) .catch(error => { console.error('Review report error:', error); this.showNotification('حدث خطأ أثناء الإبلاغ', 'error'); }); } showImageModal(imageSrc) { const modal = document.createElement('div'); modal.className = 'image-modal'; modal.innerHTML = ` `; document.body.appendChild(modal); modal.querySelector('.close-modal').addEventListener('click', () => modal.remove()); modal.addEventListener('click', (e) => { if (e.target === modal) modal.remove(); }); } showNotification(message, type = 'success') { const notification = document.createElement('div'); notification.className = `review-notification ${type}`; notification.textContent = message; document.body.appendChild(notification); setTimeout(() => { notification.classList.add('show'); }, 100); setTimeout(() => { notification.classList.remove('show'); setTimeout(() => notification.remove(), 300); }, 2000); } } // تهيئة نظام المراجعات const reviewSystem = new ReviewSystem();