From 9172d1eba044c24d1f12305d3a91edf77f202af5 Mon Sep 17 00:00:00 2001 From: Justus Kluge Date: Fri, 4 Apr 2025 09:04:44 +0200 Subject: [PATCH 1/7] Small Fixes and Caching --- my-app/firebase.js | 42 +++++++++++++++++++ .../SideBarComponents/SliderField.jsx | 2 +- .../SideBarComponents/ToggleField.jsx | 14 +++---- .../SideBarComponents/UploadField.jsx | 4 +- my-app/src/views/SidebarView.jsx | 4 +- 5 files changed, 54 insertions(+), 12 deletions(-) diff --git a/my-app/firebase.js b/my-app/firebase.js index 161896cb..666de8b9 100644 --- a/my-app/firebase.js +++ b/my-app/firebase.js @@ -24,8 +24,49 @@ googleProvider.addScope("email"); // fetches all relevant information to create the model async function firebaseToModel(model) { + // Load metadata from localStorage + const cachedMetadata = JSON.parse(localStorage.getItem("coursesMetadata")); + const firebaseTimestamp = await fetchLastUpdatedTimestamp(); + // check if up to date + if (cachedMetadata && cachedMetadata.timestamp === firebaseTimestamp) { + console.log("Using cached courses..."); + let mergedCourses = []; + for (let i = 0; i < cachedMetadata.parts; i++) { + const part = JSON.parse(localStorage.getItem(`coursesPart${i}`)); + if (part) + mergedCourses = mergedCourses.concat(part); + } + model.setCourses(mergedCourses); + return; + } + + // Fetch if outdated or missing + console.log("Fetching courses from Firebase..."); const courses = await fetchAllCourses(); model.setCourses(courses); + saveCoursesInChunks(courses, firebaseTimestamp); +} + +function saveCoursesInChunks(courses, timestamp) { + const parts = 3; // Adjust this based on course size + const chunkSize = Math.ceil(courses.length / parts); + + for (let i = 0; i < parts; i++) { + const chunk = courses.slice(i * chunkSize, (i + 1) * chunkSize); + localStorage.setItem(`coursesPart${i}`, JSON.stringify(chunk)); + } + localStorage.setItem("coursesMetadata", JSON.stringify({ parts, timestamp })); +} + +async function updateLastUpdatedTimestamp() { + const timestampRef = ref(db, "metadata/lastUpdated"); + await set(timestampRef, Date.now()); +} + +async function fetchLastUpdatedTimestamp() { + const timestampRef = ref(db, "metadata/lastUpdated"); + const snapshot = await get(timestampRef); + return snapshot.exists() ? snapshot.val() : 0; } export function connectToFirebase(model) { @@ -40,6 +81,7 @@ export async function addCourse(course){ return; const myRef = ref(db, `courses/${course.code}`); await set(myRef, course); + updateLastUpdatedTimestamp(); } export async function fetchAllCourses() { diff --git a/my-app/src/views/Components/SideBarComponents/SliderField.jsx b/my-app/src/views/Components/SideBarComponents/SliderField.jsx index 165e1936..37eb5ec5 100644 --- a/my-app/src/views/Components/SideBarComponents/SliderField.jsx +++ b/my-app/src/views/Components/SideBarComponents/SliderField.jsx @@ -45,7 +45,7 @@ export default function UploadField(props) {

- filter description

-
- filter description

-
-