Skip to content

Commit 52dc7e9

Browse files
jklugeemyemy89
andauthored
Reviews work (#47)
* added functions for creating reviews for each course * Reviews work! * lint * lint II? * Remove synching the search... --------- Co-authored-by: emyemy89 <emiparaschiv345@gmail.com>
1 parent 2b7aaed commit 52dc7e9

File tree

8 files changed

+264
-185
lines changed

8 files changed

+264
-185
lines changed

my-app/firebase.js

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { initializeApp } from "firebase/app";
22
import { getAuth, GoogleAuthProvider, onAuthStateChanged } from "firebase/auth";
3-
import { get, getDatabase, ref, set, onValue } from "firebase/database";
3+
import { get, getDatabase, ref, set, onValue, push } from "firebase/database";
44
import { reaction, toJS } from "mobx";
5-
// foo
65
// Your web app's Firebase configuration
76
const firebaseConfig = {
87
apiKey: "AIzaSyCBckVI9nhAP62u5jZJW3F4SLulUv7znis",
@@ -49,8 +48,8 @@ async function firebaseToModel(model) {
4948
noUpload = true;
5049
if (data.favourites)
5150
model.setFavourite(data.favourites);
52-
if (data.currentSearch)
53-
model.setCurrentSearch(data.currentSearch);
51+
// if (data.currentSearch)
52+
// model.setCurrentSearch(data.currentSearch);
5453
noUpload = false;
5554
});
5655
}
@@ -61,16 +60,17 @@ export function syncModelToFirebase(model) {
6160
() => ({
6261
userId: model?.user,
6362
favourites: toJS(model.favourites),
64-
currentSearch: toJS(model.currentSearch),
63+
// currentSearch: toJS(model.currentSearch),
6564
// Add more per-user attributes here
6665
}),
66+
// eslint-disable-next-line no-unused-vars
6767
({ userId, favourites, currentSearch }) => {
6868
if (noUpload || !userId)
6969
return;
7070
const userRef = ref(db, `users/${userId}`);
7171
const dataToSync = {
7272
favourites,
73-
currentSearch,
73+
//currentSearch,
7474
};
7575

7676
set(userRef, dataToSync)
@@ -169,3 +169,35 @@ export async function saveJSONCoursesToFirebase(model, data) {
169169
model.addCourse(course);
170170
});
171171
}
172+
173+
174+
export async function addReviewForCourse(courseCode, review) {
175+
try {
176+
const reviewsRef = ref(db, `reviews/${courseCode}`);
177+
const newReviewRef = push(reviewsRef);
178+
await set(newReviewRef, review);
179+
} catch (error) {
180+
console.error("Error when adding a course to firebase:", error);
181+
}
182+
}
183+
184+
185+
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;
199+
}
200+
201+
202+
203+

my-app/src/model.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { addCourse } from "../firebase";
1+
import { addCourse, addReviewForCourse, getReviewsForCourse } from "../firebase"; // for reviews
2+
23

34
export const model = {
45
user: undefined,
@@ -65,4 +66,23 @@ export const model = {
6566
this.addCourse(course);
6667
});
6768
},
69+
70+
//for reviews
71+
async addReview(courseCode, review) {
72+
try {
73+
await addReviewForCourse(courseCode, review);
74+
75+
} catch (error) {
76+
console.error("Error adding review:", error);
77+
}
78+
},
79+
80+
async getReviews(courseCode) {
81+
try {
82+
return await getReviewsForCourse(courseCode);
83+
} catch (error) {
84+
console.error("Error fetching reviews:", error);
85+
return [];
86+
}
87+
},
6888
};

my-app/src/presenters/CourseViewPresenter.jsx

Lines changed: 0 additions & 9 deletions
This file was deleted.

my-app/src/presenters/ListViewPresenter.jsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useState } from 'react';
44
import ListView from "../views/ListView.jsx";
55
import CoursePagePopup from '../views/Components/CoursePagePopup.jsx';
66
import PrerequisitePresenter from './PrerequisitePresenter.jsx';
7+
import {ReviewPresenter} from "../presenters/ReviewPresenter.jsx"
78

89
const ListViewPresenter = observer(({ model }) => {
910
const addFavourite = (course) => {
@@ -22,15 +23,18 @@ const ListViewPresenter = observer(({ model }) => {
2223

2324
const [isPopupOpen, setIsPopupOpen] = useState(false);
2425
const [selectedCourse, setSelectedCourse] = useState(null);
25-
const preP = <PrerequisitePresenter model={model} selectedCourse={selectedCourse} />
26+
const preP = <PrerequisitePresenter model={model} selectedCourse={selectedCourse} />;
27+
const reviewPresenter = <ReviewPresenter model={model} course={selectedCourse}/>;
2628

2729
const popup = <CoursePagePopup
2830
favouriteCourses={model.favourites}
2931
addFavourite={addFavourite}
3032
removeFavourite={removeFavourite}
3133
isOpen={isPopupOpen} onClose={() => setIsPopupOpen(false)}
3234
course={selectedCourse}
33-
prerequisiteTree={preP} />
35+
prerequisiteTree={preP}
36+
reviewPresenter={reviewPresenter}/>
37+
3438

3539

3640
return <ListView
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import React, { useEffect, useState } from 'react';
2+
import { observer } from 'mobx-react-lite';
3+
import { ReviewView } from '../views/ReviewView.jsx';
4+
5+
6+
export const ReviewPresenter = observer(({ model, course }) => {
7+
const [reviews, setReviews] = useState([]);
8+
const [newReview, setNewReview] = useState("");
9+
10+
//fetch reviews when the course code changes
11+
useEffect(() => {
12+
async function fetchReviews() {
13+
const data = await model.getReviews(course.code);
14+
setReviews(data);
15+
}
16+
fetchReviews();
17+
}, [course.code, model]);
18+
19+
20+
const handleReviewSubmit = async () => {
21+
if (newReview.trim()) {
22+
const review = {
23+
userName: model.user?.name || "Anonymous",
24+
text: newReview,
25+
timestamp: Date.now(), //timestamp
26+
};
27+
await model.addReview(course.code, review);
28+
//fetch and update the reviews after submitting
29+
const updatedReviews = await model.getReviews(course.code);
30+
setReviews(updatedReviews);
31+
setNewReview(""); //clear text bar
32+
}
33+
};
34+
35+
36+
return (
37+
<ReviewView
38+
course={course}
39+
reviews={reviews}
40+
newReview={newReview}
41+
setNewReview={setNewReview}
42+
handleReviewSubmit={handleReviewSubmit}
43+
/>
44+
);
45+
});
46+

0 commit comments

Comments
 (0)