Skip to content

Commit 8ee85c8

Browse files
authored
improved reviews (#67)
* changed logo click redirection * Update FavouriteDropdown.jsx * small bug fix
1 parent 9441e1f commit 8ee85c8

File tree

6 files changed

+226
-126
lines changed

6 files changed

+226
-126
lines changed

my-app/firebase.js

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -183,21 +183,21 @@ export async function addReviewForCourse(courseCode, review) {
183183

184184

185185
export async function getReviewsForCourse(courseCode) {
186-
const reviewsRef = ref(db, `reviews/${courseCode}`);
187-
const snapshot = await get(reviewsRef);
188-
if (!snapshot.exists()) return [];
189-
190-
const reviews = [];
191-
snapshot.forEach(childSnapshot => {
192-
reviews.push({
193-
id: childSnapshot.key, // Firebase-generated unique key
194-
userName: childSnapshot.val().userName,
195-
text: childSnapshot.val().text
196-
});
197-
});
198-
return reviews;
186+
const reviewsRef = ref(db, `reviews/${courseCode}`);
187+
const snapshot = await get(reviewsRef);
188+
if (!snapshot.exists()) return [];
189+
190+
const reviews = [];
191+
snapshot.forEach(childSnapshot => {
192+
reviews.push({
193+
id: childSnapshot.key,
194+
...childSnapshot.val()
195+
});
196+
});
197+
return reviews;
199198
}
200199

201200

202201

203202

203+

my-app/src/presenters/ReviewPresenter.jsx

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,19 @@ import React, { useEffect, useState } from 'react';
22
import { observer } from 'mobx-react-lite';
33
import { ReviewView } from '../views/ReviewView.jsx';
44

5-
65
export const ReviewPresenter = observer(({ model, course }) => {
76
const [reviews, setReviews] = useState([]);
8-
const [newReview, setNewReview] = useState("");
7+
const [formData, setFormData] = useState({
8+
text: "",
9+
overallRating: 0,
10+
difficultyRating: 0,
11+
professorName: "",
12+
professorRating: 0,
13+
grade: "",
14+
recommend: false,
15+
avgRating: 0,
16+
});
917

10-
//fetch reviews when the course code changes
1118
useEffect(() => {
1219
async function fetchReviews() {
1320
const data = await model.getReviews(course.code);
@@ -16,31 +23,37 @@ export const ReviewPresenter = observer(({ model, course }) => {
1623
fetchReviews();
1724
}, [course.code, model]);
1825

19-
2026
const handleReviewSubmit = async () => {
21-
if (newReview.trim()) {
27+
if (formData.text.trim()) {
2228
const review = {
2329
userName: model.user?.displayName || "Anonymous",
24-
text: newReview,
25-
timestamp: Date.now(), //timestamp
30+
timestamp: Date.now(),
31+
...formData,
2632
};
2733
await model.addReview(course.code, review);
28-
//fetch and update the reviews after submitting
2934
const updatedReviews = await model.getReviews(course.code);
3035
setReviews(updatedReviews);
31-
setNewReview(""); //clear text bar
36+
setFormData({
37+
text: "",
38+
overallRating: 0,
39+
difficultyRating: 0,
40+
professor: "",
41+
grade: "",
42+
recommended: false,
43+
avgRating: 0,
44+
});
3245
}
3346
};
34-
47+
3548

3649
return (
3750
<ReviewView
3851
course={course}
3952
reviews={reviews}
40-
newReview={newReview}
41-
setNewReview={setNewReview}
53+
formData={formData}
54+
setFormData={setFormData}
4255
handleReviewSubmit={handleReviewSubmit}
4356
/>
57+
4458
);
4559
});
46-

my-app/src/views/Components/RatingComponent.jsx

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
1-
import React, {useState} from 'react';
1+
import React from 'react';
22
import StarComponent from "./StarComponent.jsx";
33

4-
const RatingComponent = () => {
5-
const [rating, setRating] = useState(0);
6-
4+
const RatingComponent = ({ value = 0, onChange, readOnly = false }) => {
75
const handleRating = (starIndex, isLeftHalf) => {
6+
if (readOnly) return; // if readOnly, do nothing
87
const newRating = isLeftHalf ? starIndex + 0.5 : starIndex + 1;
9-
setRating(newRating);
8+
onChange(newRating);
109
}
1110

1211
return (
13-
<div className="font-kanit flex justify-center items-center bg-transparent ">
14-
<div className="flex justify-center mb-4 gap-1 sm:gap-2">
15-
{Array.from({length: 5}, (_, index) => (
16-
<StarComponent key={index} index={index} rating={rating} onRatingChange={handleRating}/>))}
17-
</div>
12+
<div className="font-kanit flex justify-center items-center bg-transparent">
13+
<div className="flex justify-center mb-4 gap-1 sm:gap-2">
14+
{Array.from({length: 5}, (_, index) => (
15+
<StarComponent
16+
key={index}
17+
index={index}
18+
rating={value}
19+
onRatingChange={handleRating}
20+
readOnly={readOnly}
21+
/>
22+
))}
23+
</div>
1824
</div>
1925
);
2026
}

my-app/src/views/Components/StarComponent.jsx

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,39 @@
11
import React from 'react';
22

3-
export const StarComponent = ({ index, rating, onRatingChange, onHover }) => {
4-
const handleLeftClick = () => onRatingChange(index, false);
5-
const handleRightClick = () => onRatingChange(index, true);
3+
const StarComponent = ({ index, rating, onRatingChange, onHover, readOnly = false }) => {
4+
const handleLeftClick = () => {
5+
if (!readOnly) onRatingChange(index, true);
6+
};
7+
8+
const handleRightClick = () => {
9+
if (!readOnly) onRatingChange(index, false);
10+
};
611

712
const isFullStar = rating >= index + 1;
813
const isHalfStar = rating >= index + 0.5 && rating < index + 1;
914
const starClass = isFullStar ? "bxs-star" : isHalfStar ? "bxs-star-half" : "bx-star";
1015

1116
return (
1217
<div
13-
className="relative group"
14-
onMouseEnter={() => onHover(index + 1)}
15-
onMouseLeave={() => onHover(0)}
18+
className={`relative group ${readOnly ? 'cursor-default' : 'cursor-pointer'}`}
19+
onMouseEnter={() => !readOnly && onHover && onHover(index + 1)}
20+
onMouseLeave={() => !readOnly && onHover && onHover(0)}
1621
>
1722
<i
18-
className={`bx ${starClass} text-5xl text-violet-500 t-500 transition-transform duration-200 group-hover:scale-110`}
23+
className={`bx ${starClass} text-5xl text-violet-500 t-500 transition-transform duration-200 ${!readOnly && 'group-hover:scale-110'}`}
1924
></i>
20-
<button
21-
className="absolute top-0 left-1/2 w-1/2 h-full cursor-pointer"
22-
onClick={handleLeftClick}
23-
/>
24-
<button
25-
className="absolute top-0 right-1/2 w-1/2 h-full cursor-pointer"
26-
onClick={handleRightClick}
27-
/>
25+
{!readOnly && (
26+
<>
27+
<button
28+
className="absolute top-0 left-1/2 w-1/2 h-full cursor-pointer"
29+
onClick={handleLeftClick}
30+
/>
31+
<button
32+
className="absolute top-0 right-1/2 w-1/2 h-full cursor-pointer"
33+
onClick={handleRightClick}
34+
/>
35+
</>
36+
)}
2837
</div>
2938
);
3039
};

0 commit comments

Comments
 (0)