diff --git a/web/datastore.js b/web/datastore.js index 35234e5..822a48d 100644 --- a/web/datastore.js +++ b/web/datastore.js @@ -1,89 +1,109 @@ export class LocationsDataStore { - static rememberAll(location_list) { - let locations = LocationsDataStore.get(); - for (let location of location_list) { - locations[location.id] = location; - } - LocationsDataStore.set(locations); + constructor() { + this.data = {}; + this.read(); } - static rememberAllIfNotExist(location_list) { - let locations = LocationsDataStore.get(); + read() { + this.data = DataStore.get("locations") || {}; + } + + write() { + DataStore.set("locations", this.data); + } + + rememberAll(location_list) { for (let location of location_list) { - if (!(location.id in locations)) { - locations[location.id] = location; + this.data[location.id] = location; + } + + this.write(); + } + + rememberAllIfNotExist(location_list) { + for (let location of location_list) { + if (!(location.id in this.data)) { + this.data[location.id] = location; } } - LocationsDataStore.set(locations); - } - static get() { - return DataStore.get("locations") || {}; - } - - static set(value) { - DataStore.set("locations", value); + this.write(); } } export class RecentLocationsDataStore { - static remember(location_id) { - let recent_locations = RecentLocationsDataStore.get(); - recent_locations = recent_locations.filter((item) => { + constructor() { + this.data = []; + this.read(); + } + + read() { + this.data = DataStore.get("recent-locations") || []; + } + + write() { + DataStore.set("recent-locations", this.data); + } + + remember(location_id) { + this.data = this.data.filter((item) => { return item != location_id; }); - recent_locations.push(location_id); - RecentLocationsDataStore.set(recent_locations); - } + this.data.push(location_id); - static get() { - return DataStore.get("recent-locations") || []; - } - - static set(value) { - DataStore.set("recent-locations", value); + this.write(); } } export class TrackedTripsDataStore { - static remember(trip_id, origin_id, destination_id) { - let tracked_trips = TrackedTripsDataStore.get(); - tracked_trips.push({ + constructor() { + this.data = []; + this.read(); + } + + read() { + this.data = DataStore.get("tracked-trips") || []; + } + + write() { + DataStore.set("tracked-trips", this.data); + } + + remember(trip_id, origin_id, destination_id) { + this.data.push({ trip: trip_id, origin: origin_id, destination: destination_id, }); - TrackedTripsDataStore.set(tracked_trips); - } - static get() { - return DataStore.get("tracked-trips") || []; - } - - static set(value) { - DataStore.set("tracked-trips", value); + this.write(); } } export class TripsDataStore { - static remember(trip) { - TripsDataStore.rememberAll([trip]); + constructor() { + this.data = {}; + this.read(); } - static rememberAll(trip_list) { - let tracked_trips = TripsDataStore.get(); + read() { + this.data = DataStore.get("trips") || {}; + } + + write() { + DataStore.set("trips", this.data); + } + + remember(trip) { + this.rememberAll([trip]); + } + + rememberAll(trip_list) { for (let trip of trip_list) { - tracked_trips[trip.id] = trip; + this.data[trip.id] = trip; } - TripsDataStore.set(tracked_trips); - } - static get() { - return DataStore.get("trips") || {}; - } - - static set(value) { - DataStore.set("trips", value); + this.write(); } } @@ -96,8 +116,10 @@ export class DataStore { window.localStorage.setItem(key, JSON.stringify(value)); } - static locations = LocationsDataStore; - static recent_locations = RecentLocationsDataStore; - static tracked_trips = TrackedTripsDataStore; - static trips = TripsDataStore; + constructor() { + this.locations = new LocationsDataStore(); + this.recent_locations = new RecentLocationsDataStore(); + this.tracked_trips = new TrackedTripsDataStore(); + this.trips = new TripsDataStore(); + } } diff --git a/web/drafting-board.js b/web/drafting-board.js index b6d8671..1513a63 100644 --- a/web/drafting-board.js +++ b/web/drafting-board.js @@ -1,15 +1,14 @@ import { EL } from "./dom.js"; import { displayTripDetails } from "./trip-details.js"; import { fetchTrip } from './api.js'; -import { DataStore } from './datastore.js'; let element_board = document.querySelector("#drafting-board-content"); export function addJourneyToDraftingBoard(journey) { for (let leg of journey.legs.filter(item => !("walking" in item))) { - DataStore.tracked_trips.remember(leg.tripId, leg.origin.id, leg.destination.id); + window.dataStore.tracked_trips.remember(leg.tripId, leg.origin.id, leg.destination.id); fetchTrip(leg.tripId).then(result => { - DataStore.trips.remember(result.trip); + window.dataStore.trips.remember(result.trip); }); } @@ -20,7 +19,7 @@ export function drawDraftingBoard() { element_board.innerText = ""; let sorted_locations = trackedTripsLocationsSorted(); - let display_locations = sorted_locations.map(item => DataStore.locations.get()[item]); + let display_locations = sorted_locations.map(item => window.dataStore.locations.data[item]); let grid_location_indexes = {}; @@ -39,7 +38,7 @@ export function drawDraftingBoard() { } - let trip_data = DataStore.trips.get(); + let trip_data = window.dataStore.trips.data; console.log(trip_data); function getStopFromTrip(tripId, location_id) { @@ -54,7 +53,7 @@ export function drawDraftingBoard() { } - let display_trips = DataStore.tracked_trips.get().map(item => { + let display_trips = window.dataStore.tracked_trips.data.map(item => { item["trip_data"] = trip_data[item.trip]; item.originStop = getStopFromTrip(item.trip, item.origin); @@ -187,7 +186,7 @@ export function sortLocations(sorted_locations, unsorted_locations, trips) { } export function trackedTripsLocationsSorted() { - let tracked_trips = DataStore.tracked_trips.get(); + let tracked_trips = window.dataStore.tracked_trips.data; let tracked_locations = Array.from(new Set(tracked_trips.map(trip => trip.origin).concat(tracked_trips.map(trip => trip.destination)))); console.log(tracked_trips); @@ -197,7 +196,7 @@ export function trackedTripsLocationsSorted() { console.log(sorted_locations); - console.log(sorted_locations.map(item => DataStore.locations.get()[item]?.name)); + console.log(sorted_locations.map(item => window.dataStore.locations.data[item]?.name)); return sorted_locations; } diff --git a/web/journeys-search.js b/web/journeys-search.js index 5572f3f..3c7b70d 100644 --- a/web/journeys-search.js +++ b/web/journeys-search.js @@ -1,7 +1,6 @@ import { fetchJourneys } from './api.js'; import { attachLocationsSearch } from './locations-search.js'; import { addJourneyToDraftingBoard } from './drafting-board.js'; -import { DataStore } from './datastore.js'; let element_journeys_search = document.querySelector("#journeys-search"); let element_from = document.querySelector("#journey-search-from"); @@ -27,7 +26,7 @@ function createJourneyElement(journey) { let el = document.createElement("div"); for (let leg of journey.legs) { - DataStore.locations.rememberAllIfNotExist([leg.origin, leg.destination]); + window.dataStore.locations.rememberAllIfNotExist([leg.origin, leg.destination]); el.appendChild(createJourneyLegElement(leg)); } diff --git a/web/locations-search.js b/web/locations-search.js index d55472d..be13b7a 100644 --- a/web/locations-search.js +++ b/web/locations-search.js @@ -1,5 +1,4 @@ import { fetchLocations } from './api.js'; -import { DataStore } from './datastore.js'; let element_locations_search = document.querySelector("#locations-search"); let element_query = document.querySelector("#locations-search-query"); @@ -9,7 +8,7 @@ export function setupLocationsSearch() { element_query.addEventListener("change", (event) => { element_response.innerText = "Loading…"; fetchLocations(event.target.value).then(result => { - DataStore.locations.rememberAll(result); + window.dataStore.locations.rememberAll(result); element_response.innerText = ""; result.forEach(location => { let location_element = createLocationElement(location); @@ -25,7 +24,7 @@ function createLocationElement(location) { location_element.dataset.locationId = location.id; location_element.addEventListener("click", event => { - DataStore.recent_locations.remember(event.target.dataset.locationId); + window.dataStore.recent_locations.remember(event.target.dataset.locationId); element_locations_search.locationSelectedCallback(event.target.innerText, event.target.dataset.locationId); element_locations_search.style.display = "none"; }); @@ -41,8 +40,8 @@ export function attachLocationsSearch(search_element) { }; element_query.value = ""; element_response.innerText = ""; - let locations = DataStore.locations.get(); - for (let location_id of DataStore.recent_locations.get()) { + let locations = window.dataStore.locations.data; + for (let location_id of window.dataStore.recent_locations.data) { let location = locations[location_id]; let el = createLocationElement(location); element_response.appendChild(el); diff --git a/web/traveldrafter.js b/web/traveldrafter.js index 7f9e143..ba26041 100644 --- a/web/traveldrafter.js +++ b/web/traveldrafter.js @@ -6,7 +6,7 @@ import { drawDraftingBoard } from './drafting-board.js'; import { DataStore } from './datastore.js'; window.Api = Api; -window.DataStore = DataStore; +window.dataStore = new DataStore(); setupPopups(); setupLocationsSearch();