Skip to content

Commit 8da75a7

Browse files
committed
Some linting, fixes and funky stuff
1 parent 7162a6d commit 8da75a7

8 files changed

Lines changed: 69 additions & 137 deletions

File tree

my-app/firebase.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ googleProvider.addScope("email");
4747
* This function sets up the Firebase connection, fetches initial data and starts listener for syncing data.
4848
* @param {object} model The reactive model
4949
*/
50-
export function connectToFirebase(model) {
51-
loadCoursesFromCacheOrFirebase(model);
50+
export async function connectToFirebase(model) {
51+
await loadCoursesFromCacheOrFirebase(model);
5252
fetchDepartmentsAndLocations(model);
5353
startAverageRatingListener(model);
5454
// setting missing
@@ -62,7 +62,6 @@ export function connectToFirebase(model) {
6262
// automaticaly save filter options to local storage whenever they change
6363
reaction(
6464
() => ({ filterOptions: JSON.stringify(model.filterOptions) }),
65-
// eslint-disable-next-line no-unused-vars
6665
({ filterOptions }) => {
6766
localStorage.setItem("filterOptions", filterOptions);
6867
}
@@ -382,15 +381,14 @@ async function loadCoursesFromCacheOrFirebase(model) {
382381
* @param {string} review.professorName The name of the professor
383382
* @param {string} review.grade The grade received
384383
* @param {boolean} review.recommended Whether the course is recommended
385-
* @returns {Promise<void>} A promise that resolves when the review is added
386384
* @throws {Error} If there is an error adding the review or updating the average rating
387385
*/
388386
export async function addReviewForCourse(courseCode, review) {
389387
try {
390388
const reviewsRef = ref(db, `reviews/${courseCode}/${review.uid}`);
391389
await set(reviewsRef, review);
392390
const updateCourseAvgRating = httpsCallable(functions, 'updateCourseAvgRating');
393-
const result = await updateCourseAvgRating({ courseCode });
391+
await updateCourseAvgRating({ courseCode });
394392

395393
} catch (error) {
396394
console.error(

my-app/src/index.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { JsonToDatabase } from "./presenters/Tests/JsonToDatabase";
1111
import { AllCoursesPresenter } from "./presenters/Tests/AllCoursesPresenter.jsx";
1212

1313

14-
configure({ enforceActions: "never" });
14+
configure({ enforceActions: "observed", reactionScheduler: (f) => setTimeout(f, 0),});
1515

1616
const reactiveModel = makeAutoObservable(model);
1717
connectToFirebase(reactiveModel);

my-app/src/model.js

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { query } from "firebase/database";
21
import {
32
addCourse,
43
addReviewForCourse,
@@ -73,13 +72,8 @@ export const model = {
7372
this._coursesListeners.push(callback);
7473
},
7574

76-
_coursesListeners: [], // internal list of listeners
7775
urlStackPointer: 0,
7876

79-
onCoursesSet(callback) {
80-
this._coursesListeners.push(callback);
81-
},
82-
8377
setUser(user) {
8478
if (!this.user) this.user = user;
8579
},
@@ -233,21 +227,10 @@ export const model = {
233227
this.setFiltersChange();
234228
},
235229

236-
setApplyRemoveNullCourses() {
237-
this.filterOptions.applyRemoveNullCourses =
238-
!this.filterOptions.applyRemoveNullCourses;
239-
this.setFiltersChange();
240-
},
241-
242230
updateLevelFilter(level) {
243231
this.filterOptions.level = level;
244232
console.log(level);
245233
},
246-
247-
updateLevelFilter(level) {
248-
this.filterOptions.level = level;
249-
},
250-
251234
updateLanguageFilter(languages) {
252235
this.filterOptions.language = languages;
253236
},
@@ -262,10 +245,6 @@ export const model = {
262245
this.filterOptions.eligibility = eligibility;
263246
},
264247

265-
updateDepartmentFilter(department) {
266-
this.filterOptions.department = department;
267-
},
268-
269248
updatePeriodFilter(period) {
270249
this.filterOptions.period = period;
271250
},
@@ -316,50 +295,6 @@ export const model = {
316295
);
317296
return fields;
318297
},
319-
setApplyTranscriptFilter(transcriptFilterState) {
320-
this.filterOptions.applyTranscriptFilter = transcriptFilterState;
321-
},
322-
setApplyLevelFilter(levelFilterState) {
323-
this.filterOptions.applyLevelFilter = levelFilterState;
324-
},
325-
setApplyLanguageFilter(languageFilterState) {
326-
this.filterOptions.applyLanguageFilter = languageFilterState;
327-
},
328-
setApplyLocationFilter(locationFilterState) {
329-
this.filterOptions.applyLocationFilter = locationFilterState;
330-
},
331-
setApplyCreditsFilter(creditsFilterState) {
332-
this.filterOptions.applyCreditsFilter = creditsFilterState;
333-
},
334-
setApplyDepartmentFilter(departmentFilterState) {
335-
this.filterOptions.applyDepartmentFilter = departmentFilterState;
336-
},
337-
setApplyPeriodFilter(periodfilterState) {
338-
this.filterOptions.applyPeriodFilter = periodfilterState;
339-
},
340-
//for better display we would like the departments in a structured format based on school
341-
formatDepartments() {
342-
const grouped = this?.departments.reduce((acc, item) => {
343-
const [school, department] = item.split("/");
344-
if (!acc[school]) {
345-
acc[school] = [];
346-
}
347-
acc[school].push(department?.trim());
348-
return acc;
349-
}, {});
350-
const sortedGrouped = Object.keys(grouped)
351-
.sort()
352-
.reduce((acc, key) => {
353-
acc[key] = grouped[key].sort();
354-
return acc;
355-
}, {});
356-
const fields = Object.entries(sortedGrouped).map(([school, departments], index) => ({
357-
id: index + 1,
358-
label: school,
359-
subItems: departments,
360-
}));
361-
return fields;
362-
},
363298
async getAverageRating(courseCode, option) {
364299
const reviews = await getReviewsForCourse(courseCode);
365300
if (!reviews || reviews.length === 0) return null;

my-app/src/pages/App.jsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,11 @@ import { SearchbarPresenter } from '../presenters/SearchbarPresenter.jsx';
44
import { ListViewPresenter } from '../presenters/ListViewPresenter.jsx';
55
import { FilterPresenter } from "../presenters/FilterPresenter.jsx";
66
import { slide as Menu } from 'react-burger-menu';
7-
import { observer } from 'mobx-react-lite';
87

98

109

1110
function App({ model }) {
1211
const [sidebarIsOpen, setSidebarIsOpen] = useState(model.sidebarIsOpen);
13-
const toggleSidebar = () => {
14-
setSidebarIsOpen(!sidebarIsOpen);
15-
}
1612

1713
return (
1814
/* The sidebar styling(under the menu)*/

my-app/src/presenters/FilterPresenter.jsx

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,56 @@
1-
import React from 'react';
21
import { observer } from "mobx-react-lite";
2+
import { useMemo, useEffect } from "react";
33
import eligibility from "../scripts/eligibility_refined.js";
4-
import { SearchbarPresenter } from './SearchbarPresenter.jsx';
54

65
/* FilterPresenter is responsible for applying the logic necessary to filter out the courses from the overall list */
76
const FilterPresenter = observer(({ model }) => {
7+
88
/* global variable for the scope of this presenter, all the smaller functions depend on it instead of passing it back and forth as params */
9-
var localFilteredCourses = [];
9+
var localFilteredCourses = [...model?.courses];
10+
11+
const filteredCourses = useMemo(() => {
12+
if (model.courses.length === 0 || !model.filtersChange) {
13+
return model.filteredCourses;
14+
}
15+
16+
if (model.filterOptions.applyRemoveNullCourses) {
17+
updateNoNullcourses();
18+
}
19+
if(model.filterOptions.applyPeriodFilter){
20+
updatePeriods();
21+
}
22+
if (model.filterOptions.applyLocationFilter) {
23+
updateLocations();
24+
}
25+
if (model.filterOptions.applyLevelFilter) {
26+
updateLevels();
27+
}
28+
if (model.filterOptions.applyLanguageFilter) {
29+
updateLanguages();
30+
}
31+
if (model.filterOptions.applyCreditsFilter) {
32+
updateCredits();
33+
}
34+
if (model.filterOptions.applyTranscriptFilter) {
35+
applyTranscriptEligibility();
36+
}
37+
if (model.filterOptions.applyDepartmentFilter) {
38+
updateDepartments();
39+
}
40+
model.filtersChange = false;
41+
model.setFiltersCalculated();
42+
return localFilteredCourses;
43+
44+
}, [model.courses,
45+
model.filtersChange,
46+
model.filterOptions
47+
]);
48+
49+
useEffect(() => {
50+
model.filteredCourses = filteredCourses;
51+
}, [filteredCourses]);
52+
53+
1054

1155
/* functions declared here are generally things the main function of this observer takes and runs if the given filters are enabled,
1256
* this is determined through model.filterOptions.apply*Insert filter name* flags.
@@ -370,49 +414,12 @@ const FilterPresenter = observer(({ model }) => {
370414
}
371415

372416
/* function that should run every single time the model changes (see note below) */
373-
async function run() {
374-
if (model.courses.length == 0) {
375-
return;
376-
}
377-
if (model.filtersChange) {
378-
localFilteredCourses = [...model.courses];
379-
380-
if (model.filterOptions.applyRemoveNullCourses) {
381-
updateNoNullcourses();
382-
}
383-
if(model.filterOptions.applyPeriodFilter){
384-
updatePeriods();
385-
}
386-
if (model.filterOptions.applyLocationFilter) {
387-
updateLocations();
388-
}
389-
if (model.filterOptions.applyLevelFilter) {
390-
updateLevels();
391-
}
392-
if (model.filterOptions.applyLanguageFilter) {
393-
updateLanguages();
394-
}
395-
if (model.filterOptions.applyCreditsFilter) {
396-
updateCredits();
397-
}
398-
if (model.filterOptions.applyTranscriptFilter) {
399-
applyTranscriptEligibility();
400-
}
401-
if (model.filterOptions.applyDepartmentFilter) {
402-
updateDepartments();
403-
}
404-
405-
model.filteredCourses = [...localFilteredCourses];
406-
model.filtersChange = false;
407-
model.setFiltersCalculated();
408-
}
409-
}
410417

411418
/* the problem is that unless using sideeffects, the run() not being async and/or it setting the filterschange = false very early can mean
412419
* that 0 courses will get put into the model.filtered courses (which is the list of courses getting passed to search, and then listview)
413420
* therefore TODO: rework it to stop using this dumb flags we started before learning anything about react,observers,js
414421
*/
415-
run();
422+
// run();
416423

417424
});
418425

my-app/src/presenters/ListViewPresenter.jsx

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import React from 'react';
22
import { observer } from "mobx-react-lite";
3-
import { useState, useEffect, useRef } from 'react';
3+
import { useState, useEffect, useRef, useMemo } from 'react';
44
import ListView from "../views/ListView.jsx";
55
import CoursePagePopup from '../views/Components/CoursePagePopup.jsx';
66
import PrerequisitePresenter from './PrerequisitePresenter.jsx';
77
import {ReviewPresenter} from "./ReviewPresenter.jsx"
88
import {syncScrollPositionToFirebase} from "../../firebase.js"
9-
import { model } from '../model.js';
9+
import { useCallback } from 'react';
1010

1111
const ListViewPresenter = observer(({ model }) => {
1212
const scrollContainerRef = useRef(null);
@@ -50,12 +50,12 @@ const ListViewPresenter = observer(({ model }) => {
5050
if (savedPosition) {
5151
model.setScrollPosition(parseInt(savedPosition, 10));
5252
}
53-
}, [model.user]);
53+
}, [model, model.user]);
5454

5555
useEffect(() => {
5656
const cleanup = syncScrollPositionToFirebase(model, scrollContainerRef);
5757
return () => cleanup;
58-
}, [model.user, model.currentSearch, scrollContainerRef]);
58+
}, [model, model.user, model.currentSearch, scrollContainerRef]);
5959

6060
const addFavourite = (course) => {
6161
model.addFavourite(course);
@@ -77,9 +77,8 @@ const ListViewPresenter = observer(({ model }) => {
7777

7878
const [sortBy, setSortBy] = useState('relevance');
7979
const [sortDirection, setSortDirection] = useState('desc');
80-
const [sortedCourses, setSortedCourses] = useState([]);
8180

82-
const sortCourses = (courses, sortType) => {
81+
const sortCourses = useCallback((courses, sortType) => {
8382
if (!courses) return [];
8483

8584
const sortedCourses = [...courses];
@@ -143,12 +142,12 @@ const ListViewPresenter = observer(({ model }) => {
143142
default:
144143
return direction === 1 ? sortedCourses : sortedCourses.reverse();
145144
}
146-
};
145+
}, [sortDirection, model.avgRatings]);
147146

148-
useEffect(() => {
149-
const sorted = sortCourses(model.currentSearch, sortBy);
150-
setSortedCourses(sorted);
151-
}, [model.currentSearch, sortBy, sortDirection]);
147+
const sortedCourses = useMemo(() => {
148+
if (!model.currentSearch) return [];
149+
return sortCourses(model.currentSearch, sortBy);
150+
}, [model.currentSearch, sortBy,sortCourses]);
152151

153152

154153
function indexOfNth(string, char, n) {
@@ -167,8 +166,8 @@ const ListViewPresenter = observer(({ model }) => {
167166
window.addEventListener('popstate', () => {
168167
model.handleUrlChange();
169168
});
170-
171-
model.onCoursesSet((courses) => {
169+
170+
model.onCoursesSet((courses) => { // eslint-disable-line no-unused-vars
172171
let current_url = window.location.href;
173172
if (current_url.indexOf("#") != -1) {return;}
174173
let course_code = "";

my-app/src/presenters/PrerequisitePresenter.jsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,6 @@ export const PrerequisitePresenter = observer((props) => {
3535
hover_popup.style.padding = "5px";
3636
document.body.appendChild(hover_popup);
3737

38-
39-
let code_to_name;
40-
4138
let input_text_obj = {};
4239

4340
const position = { x: 0, y: 0 };
@@ -153,7 +150,8 @@ export const PrerequisitePresenter = observer((props) => {
153150

154151
}
155152

156-
function handleMouseLeave(event, node) {
153+
154+
function handleMouseLeave(event, node) { // eslint-disable-line no-unused-vars
157155
hover_popup.style.display = "none";
158156
}
159157

@@ -467,7 +465,7 @@ export const PrerequisitePresenter = observer((props) => {
467465
if (localStorage.getItem("completedCourses") != null) {
468466
courses_taken = localStorage.getItem("completedCourses");
469467
}
470-
code_to_name = model.getCourseNames(courses_taken);
468+
//code_to_name = model.getCourseNames(courses_taken);
471469

472470
let eligible = generateTree(courses_taken, copy);
473471
if (eligible) {

my-app/src/views/SearchbarView.jsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import React, { useState, useEffect } from "react";
22
import { getAuth, signInWithPopup, signOut, GoogleAuthProvider } from "firebase/auth";
3-
import { observer } from "mobx-react-lite";
43
import project_logo from "../assets/project_icon.png";
54
import FavouritesDropdown from "./Components/FavouriteDropdown.jsx";
65

7-
function SearchbarView(props) {
6+
export function SearchbarView(props) {
87
// const [searchQuery, setSearchQuery] = useState("");
98
const [user, setUser] = useState(null);
109
const [showFavourites, setShowFavourites] = useState(false);
@@ -126,4 +125,4 @@ function SearchbarView(props) {
126125
);
127126
}
128127

129-
export default observer(SearchbarView);
128+
export default SearchbarView;

0 commit comments

Comments
 (0)