import { onAuthStateChanged } from 'https://www.gstatic.com/firebasejs/10.12.1/firebase-auth.js'; import auth from '../firebase/auth.js'; import { collection, onSnapshot, addDoc, deleteDoc, doc, updateDoc, increment, getDoc, } from 'https://www.gstatic.com/firebasejs/10.12.1/firebase-firestore.js'; import db from '../firebase/db.js'; const params = new URL(document.location.toString()).searchParams; const id = params.get('id'); let user; const placeDocRef = doc(db, 'places', id ?? '-'); const commentsCollectionRef = collection(db, 'places', id ?? '-', 'comments'); const form = document.getElementById('comment'); const input = form.querySelector('input'); const rating = form.querySelector('select'); const submit = form.querySelector('button'); const toolTipText = document.getElementById('tooltip-text'); const comments = document.getElementById('comments'); onAuthStateChanged(auth, async (userSnapshot) => { user = userSnapshot; input.disabled = !user; rating.disabled = !user; submit.disabled = !user; if (user) { submit.style.cursor = 'pointer'; submit.style.color = 'black'; } else { toolTipText.innerText = 'You need to be logged-in to comment.'; submit.style.cursor = 'default'; submit.style.color = 'rgba(16, 16, 16, 0.3)'; } }); form.addEventListener('submit', async (e) => { e.preventDefault(); if (!user || !form.comment.value) { return; } submit.disabled = true; await addDoc(commentsCollectionRef, { comment: form.comment.value, uid: user.uid, name: user.displayName, email: user.email, rating: parseInt(form.rating.value), }); const doc = await getDoc(placeDocRef); const place = doc.data(); const ratingCount = place.ratingCount ?? 1; const newRating = (place.rating + parseInt(form.rating.value)) / (ratingCount + 1); const newRatingCount = place.ratingCount ? increment(1) : 2; await updateDoc(placeDocRef, { rating: newRating, ratingCount: newRatingCount, }); form.comment.value = ''; form.rating.value = 5; submit.disabled = false; }); const unsubscribe = onSnapshot(commentsCollectionRef, (snapshot) => { comments.innerHTML = ''; let hasRated = false; let isOwnComment = false; snapshot.docs.forEach((doc) => { const comment = doc.data(); if (comment.uid === user?.uid) { hasRated = true; } isOwnComment = comment.uid === user?.uid; let starsDisplay = ''; for (let i = 0; i < comment.rating; i++) { starsDisplay += ''; } for (let i = 0; i < 5 - comment.rating; i++) { starsDisplay += ''; } const commentWrapper = document.createElement('div'); commentWrapper.className = 'comment'; commentWrapper.innerHTML = `
${comment.name}
${comment.email}
${comment.comment}