import { computed } from "@vue/reactivity"; import { ref, watch } from "vue"; export const substitutionFilter = ref( localStorage.getItem("substitutionFilter") || "all" ); export const timetableClass = ref( localStorage.getItem("timetableClass") || "none" ); watch(substitutionFilter, (newValue) => { if (newValue == "other") { newValue = prompt("Please enter a class to filter (e.g. 9C)"); } localStorage.setItem("substitutionFilter", newValue); fetchData(); }); watch(timetableClass, (newValue) => { localStorage.setItem("timetableClass", newValue); fetchData(); }); export const timetable = ref([]); export const substitutions = ref([]); export const history = ref([]); export const classList = ref([]); export const historyOfDate = computed(() => { const dates = {}; for (const entry of history.value) { const date = entry.date; if (!dates[date]) dates[date] = []; dates[entry.date].push(entry); } return dates; }); export const substitutionsForDate = computed(() => { const dates = {}; for (const substitution of substitutions.value) { const date = substitution.date; if (!dates[date]) dates[date] = []; dates[substitution.date].push(substitution); } return sortObject(dates); }); export const parsedTimetable = computed(() => { return timetable.value.map((day) => { const newDay = []; for (const lesson of day) { const lessonLength = lesson.length || 1; delete lesson.length; for (var i = 0; i < lessonLength; i++) newDay.push(lesson); } return newDay; }); }); export async function fetchData() { const baseUrl = "http://localhost:3000/api"; const timetableResponse = await fetch( `${baseUrl}/timetable?class=${timetableClass.value}` ); const timetableData = await timetableResponse.json(); if (timetableData.error) { console.warn("API Error: " + timetableData.error); timetable.value = []; } else timetable.value = timetableData; const substitutionResponse = await fetch( substitutionFilter.value == "all" ? `${baseUrl}/substitutions` : `${baseUrl}/substitutions?class=${substitutionFilter.value}` ); const substitutionData = await substitutionResponse.json(); substitutions.value = substitutionData; const historyResponse = await fetch( substitutionFilter.value == "all" ? `${baseUrl}/history` : `${baseUrl}/history?class=${substitutionFilter.value}` ); const historyData = await historyResponse.json(); if (historyData.error) console.warn("API Error: " + historyData.error); else history.value = historyData; const classListResponse = await fetch(`${baseUrl}/classes`); const classListData = await classListResponse.json(); classList.value = classListData; } fetchData(); function sortObject(obj) { return Object.keys(obj) .sort() .reduce(function (result, key) { result[key] = obj[key]; return result; }, {}); }