diff --git a/my-app/src/model.js b/my-app/src/model.js index 9a9030f..4590e58 100644 --- a/my-app/src/model.js +++ b/my-app/src/model.js @@ -19,6 +19,7 @@ export const model = { locations: [], // indexes: 0 -> overall rating; 1 -> difficulty; 2->teacher rating avgRatings: [], + // model.avgRatings["IK1203"][0] /* courses the user selected as their favourite */ favourites: [], searchHistory:[], diff --git a/my-app/src/presenters/ListViewPresenter.jsx b/my-app/src/presenters/ListViewPresenter.jsx index a6c0bca..f213fb7 100644 --- a/my-app/src/presenters/ListViewPresenter.jsx +++ b/my-app/src/presenters/ListViewPresenter.jsx @@ -6,6 +6,7 @@ import CoursePagePopup from '../views/Components/CoursePagePopup.jsx'; import PrerequisitePresenter from './PrerequisitePresenter.jsx'; import {ReviewPresenter} from "./ReviewPresenter.jsx" import {syncScrollPositionToFirebase} from "../../firebase.js" +import { model } from '../model.js'; const ListViewPresenter = observer(({ model }) => { const scrollContainerRef = useRef(null); @@ -91,6 +92,52 @@ const ListViewPresenter = observer(({ model }) => { case 'credits': return sortedCourses.sort((a, b) => direction * (parseFloat(a.credits) - parseFloat(b.credits))); + + + // indexes: 0 -> overall rating; 1 -> difficulty; 2->teacher rating + case 'avg_rating': + return sortedCourses.sort((a, b) => { + let aScore = 0; + let bScore = 0; + + if (model.avgRatings[a.code] != null && model.avgRatings[a.code][0] != null) { + aScore = model.avgRatings[a.code][0] + 10; // +10 so courses with no reviews are shown before those with bad reviews (0/5 stars) + } + + if (model.avgRatings[b.code] != null && model.avgRatings[b.code][0] != null) { + bScore = model.avgRatings[b.code][0] + 10; + } + return direction * (aScore - bScore); + }); + case 'diff_rating': + return sortedCourses.sort((a, b) => { + let aScore = 0; + let bScore = 0; + + if (model.avgRatings[a.code] != null && model.avgRatings[a.code][1] != null) { + aScore = model.avgRatings[a.code][1] + 10; // +10 so courses with no reviews are shown before those with bad reviews (0/5 stars) + } + + if (model.avgRatings[b.code] != null && model.avgRatings[b.code][1] != null) { + bScore = model.avgRatings[b.code][1] + 10; + } + + return direction * (aScore - bScore); + }); + case 'teacher_rating': + return sortedCourses.sort((a, b) => { + let aScore = 0; + let bScore = 0; + + if (model.avgRatings[a.code] != null && model.avgRatings[a.code][2] != null) { + aScore = model.avgRatings[a.code][2] + 10; // +10 so courses with no reviews are shown before those with bad reviews (0/5 stars) + } + + if (model.avgRatings[b.code] != null && model.avgRatings[b.code][2] != null) { + bScore = model.avgRatings[b.code][2] + 10; + } + return direction * (aScore - bScore); + }); case 'relevance': return direction === -1 ? sortedCourses : sortedCourses.reverse(); default: @@ -183,4 +230,4 @@ const ListViewPresenter = observer(({ model }) => { />; }); -export { ListViewPresenter }; \ No newline at end of file +export { ListViewPresenter }; \ No newline at end of file diff --git a/my-app/src/views/ListView.jsx b/my-app/src/views/ListView.jsx index 5b78af9..45e09fa 100644 --- a/my-app/src/views/ListView.jsx +++ b/my-app/src/views/ListView.jsx @@ -134,6 +134,9 @@ function ListView(props) { + + +