From a6077d7750c4b631c260e85bdcea20c7219f1234 Mon Sep 17 00:00:00 2001 From: Michael Fatemi Date: Sat, 26 Jun 2021 20:40:00 -0400 Subject: [PATCH] add local storage/lru cache --- src/components/NewUI/Event.tsx | 13 +++++--- src/components/NewUI/localstorage.ts | 45 +++++++++++++++++++++++++++ src/components/NewUI/wslrucache.ts | 46 ++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 src/components/NewUI/localstorage.ts create mode 100644 src/components/NewUI/wslrucache.ts diff --git a/src/components/NewUI/Event.tsx b/src/components/NewUI/Event.tsx index 84a9cd4..67ad5be 100644 --- a/src/components/NewUI/Event.tsx +++ b/src/components/NewUI/Event.tsx @@ -1,5 +1,4 @@ import { useState } from 'react'; -import Availability, { AvailabilityKind } from './Availability'; import UIButton from './UIButton'; import UIPlacesAutocomplete from './UIPlacesAutocomplete'; import UISecondaryBox from './UISecondaryBox'; @@ -108,16 +107,20 @@ export default function Event({ const [rideTherePickupPlaceID, setRideTherePickupPlaceID] = useState(''); const [rideBackDropoffPlaceID, setRideBackDropoffPlaceID] = useState(''); const [confirmed, setConfirmed] = useState(false); - const [availability, setAvailability] = - useState('not-interested'); + const [interested, setInterested] = useState(false); return ( {name}
- - {availability === 'interested' && ( + setInterested((i) => !i)} + style={{ backgroundColor: '#e0e0e0' }} + > + {interested ? 'Interested' : 'Not interested'} + + {interested && ( <>
; + +function load(): AddressBook { + const string = localStorage.getItem(KEY); + if (string) { + const object = JSON.parse(string); + const map = new Map(Object.entries(object)); + return map; + } + localStorage.setItem(KEY, '{}'); + return new Map(); +} + +function save(map: AddressBook) { + const object = Object.fromEntries(map); + const string = JSON.stringify(object); + localStorage.setItem(KEY, string); +} + +class LocalStorageManager { + private internalValue: AddressBook; + constructor(capacity = 5) { + this.internalValue = load(); + } + addAddress(address: Address) { + this.internalValue.set(address.placeId, address); + save(this.internalValue); + } + getAddresses() { + return Object.values(this.internalValue); + } +} + +const WheelshareLocalStorage = new LocalStorageManager(); + +export default WheelshareLocalStorage; diff --git a/src/components/NewUI/wslrucache.ts b/src/components/NewUI/wslrucache.ts new file mode 100644 index 0000000..1e95e99 --- /dev/null +++ b/src/components/NewUI/wslrucache.ts @@ -0,0 +1,46 @@ +class LRUCache { + private cap: number; + private map: Map; + constructor(capacity: number) { + this.cap = capacity; + this.map = new Map(); + } + set(key: K, value: V) { + this.map.delete(key); + this.map.set(key, value); + + if (this.map.size > this.cap) { + const next = this.map.keys().next(); + if (!next.done) this.map.delete(next.value); + } + } + get(key: K) { + var value = this.map.get(key); + + if (value != null) { + this.map.delete(key); + this.map.set(key, value); + } + + return value; + } + has(key: K) { + return this.map.has(key); + } + delete(key: K) { + this.map.delete(key); + } + size() { + return this.map.size; + } + capacity() { + return this.cap - this.map.size; + } + clear() { + this.map.clear(); + } +} + +export function create(capacity: number) { + return new LRUCache(capacity); +}