Skip to content

Commit 1ca3c64

Browse files
authored
Merge branch 'main' into improved-burger-menu-2
2 parents 8494613 + 7e5a5c5 commit 1ca3c64

5 files changed

Lines changed: 113 additions & 17 deletions

File tree

my-app/src/index.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { configure, makeAutoObservable } from "mobx";
2-
import { createBrowserRouter, RouterProvider } from "react-router-dom";
2+
import { createHashRouter, RouterProvider } from "react-router-dom";
33
import { createRoot } from "react-dom/client";
44
import { connectToFirebase } from "../firebase";
55
import { model } from "./model";
@@ -17,7 +17,7 @@ const reactiveModel = makeAutoObservable(model);
1717
connectToFirebase(reactiveModel);
1818

1919
export function makeRouter(reactiveModel) {
20-
return createBrowserRouter([
20+
return createHashRouter([
2121
{
2222
path: "/",
2323
element: <App model={reactiveModel} />,

my-app/src/model.js

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ export const model = {
4949
isPopupOpen: false,
5050
selectedCourse: null,
5151

52+
_coursesListeners: [], // internal list of listeners
53+
54+
onCoursesSet(callback) {
55+
this._coursesListeners.push(callback);
56+
},
57+
5258
setUser(user) {
5359
if (!this.user)
5460
this.user = user;
@@ -68,6 +74,7 @@ export const model = {
6874

6975
setCourses(courses){
7076
this.courses = courses;
77+
this._coursesListeners.forEach(cb => cb(courses));
7178
},
7279

7380
async addCourse(course) {
@@ -252,19 +259,65 @@ export const model = {
252259
},
253260

254261
setPopupOpen(isOpen) {
255-
console.log("OPENING/CLOSING A POPUP");
256-
// if (isOpen && this.selectedCourse) {
257-
// // this.addHistoryItem(this.selectedCourse.code);
258-
// console.log("user path history:")
259-
// for (let index = 0; index < this.searchHistory.length; index++) {
260-
// console.log(this.searchHistory[index]);
261-
// }
262-
// }
262+
if (isOpen) {
263+
window.history.pushState({}, '', '/' + this.selectedCourse.code);
264+
}
265+
console.log("POPOPOOPOPOOOOOOP")
266+
if (!isOpen) {
267+
let current_url = window.location.href;
268+
console.log(current_url);
269+
let end_idx = indexOfNth(current_url, '/', 3);
270+
if (end_idx >= 0 && end_idx < current_url.length - 1 && current_url.indexOf("#") == -1) {
271+
window.history.back();
272+
}
273+
}
274+
263275
this.isPopupOpen = isOpen;
264276
},
265277

266278
setSelectedCourse(course) {
267279
this.selectedCourse = course;
268280
},
269281

282+
283+
toggleSidebarIsOpen() {
284+
this.sidebarIsOpen = !this.sidebarIsOpen;
285+
},
286+
287+
handleUrlChange() {
288+
let current_url = window.location.href;
289+
let start_idx = indexOfNth(current_url, '/', 3) + 1;
290+
console.log(current_url)
291+
292+
if (start_idx > 0 && start_idx < current_url.length && current_url.indexOf("#") == -1) {
293+
let course_code = current_url.slice(start_idx);
294+
let course = this.getCourse(course_code);
295+
console.log(course_code)
296+
if (course) {
297+
console.log("ACTIVE")
298+
this.setSelectedCourse(course);
299+
this.setPopupOpen(true);
300+
}
301+
console.log("Forward");
302+
} else {
303+
console.log("Back")
304+
this.setPopupOpen(false);
305+
}
306+
//console.log("back");
307+
}
308+
270309
};
310+
311+
312+
function indexOfNth(string, char, n) {
313+
let count = 0;
314+
for (let i = 0; i < string.length; i++) {
315+
if (string[i] == char) {
316+
count++;
317+
}
318+
if (count == n) {
319+
return i;
320+
}
321+
}
322+
return -1;
323+
}

my-app/src/presenters/ListViewPresenter.jsx

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,39 @@ const ListViewPresenter = observer(({ model }) => {
103103
setSortedCourses(sorted);
104104
}, [model.currentSearch, sortBy, sortDirection]);
105105

106+
107+
window.addEventListener('popstate', () => {
108+
model.handleUrlChange();
109+
});
110+
111+
function indexOfNth(string, char, n) {
112+
let count = 0;
113+
for (let i = 0; i < string.length; i++) {
114+
if (string[i] == char) {
115+
count++;
116+
}
117+
if (count == n) {
118+
return i;
119+
}
120+
}
121+
return -1;
122+
}
123+
124+
model.onCoursesSet((courses) => {
125+
let current_url = window.location.href;
126+
if (indexOfNth(current_url, '/', 3) != current_url.length - 1) {
127+
window.history.replaceState({}, '', '/');
128+
/*
129+
setTimeout(() => {
130+
const newPath = '/' + current_url.slice(indexOfNth(current_url, '/', 3) + 1);
131+
window.history.pushState({}, '', newPath);
132+
}, 50);
133+
}
134+
*/
135+
model.handleUrlChange();
136+
}
137+
})
138+
106139
const preP = <PrerequisitePresenter
107140
model={model}
108141
isPopupOpen={model.isPopupOpen}
@@ -132,7 +165,7 @@ const ListViewPresenter = observer(({ model }) => {
132165
handleFavouriteClick={handleFavouriteClick}
133166

134167
isPopupOpen={model.isPopupOpen}
135-
handlePopupOpen={(isOpen) => model.setPopupOpen(isOpen)}
168+
setPopupOpen={(isOpen) => model.setPopupOpen(isOpen)}
136169
setSelectedCourse={(course) => model.setSelectedCourse(course)}
137170
popup={popup}
138171

@@ -150,4 +183,4 @@ const ListViewPresenter = observer(({ model }) => {
150183
/>;
151184
});
152185

153-
export { ListViewPresenter };
186+
export { ListViewPresenter };

my-app/src/presenters/SearchbarPresenter.jsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,19 @@ const SearchbarPresenter = observer(({ model }) => {
2828
model.setCurrentSearch(model.filteredCourses);
2929
} else {
3030
const fuse = new Fuse(model.filteredCourses, fuseOptions);
31-
const results = fuse.search(query).map((r) => r.item);
32-
model.setCurrentSearch(results);
31+
const results = fuse.search(query);
32+
33+
const sortedResults = results.sort((a, b) => {
34+
const aStartsWith = a.item.code.toLowerCase().startsWith(query.toLowerCase());
35+
const bStartsWith = b.item.code.toLowerCase().startsWith(query.toLowerCase());
36+
37+
//sort by prefix match as a primary sorting
38+
if (aStartsWith && !bStartsWith) return -1;
39+
if (!aStartsWith && bStartsWith) return 1;
40+
return a.score - b.score; //Fuse.js score sorting otherwise
41+
});
42+
43+
model.setCurrentSearch(sortedResults.map(r => r.item));
3344
}
3445
}, 500), []);
3546

my-app/src/views/ListView.jsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,11 @@ function ListView(props) {
158158
initialScrollY={0}
159159
>
160160
{displayedCourses.map(course => (
161-
<Link to={'/?' + course.code}>
162161
<div
163162
onClick={() => {
164163
props.setSelectedCourse(course);
165-
props.handlePopupOpen(true);
164+
props.setPopupOpen(true);
165+
//window.history.pushState({}, '', '/' + course.code);
166166
}}
167167
key={course.code}
168168
className="p-5 mb-3 hover:bg-blue-100 flex items-center border border-b-black border-solid w-full rounded-lg cursor-pointer"
@@ -245,7 +245,6 @@ function ListView(props) {
245245
</div>
246246
</div>
247247
</div>
248-
</Link>
249248
))}
250249
</InfiniteScroll>
251250
</div>

0 commit comments

Comments
 (0)