A set of functions that makes caching using the Storage interface (localStorage, sessionStorage) easy. It's extremely lightweight, well tested, and comes with top-notch TypeScript definitions out of the box. Documentation generated from source found here.
getHighlyAvailable
allows using a function that will optionally resolve twice. Once with the cached data, and then with the fetched data (if the cache has expired).getOrAdd(
localStorage,
"someUniqueKey",
fetchItems,
convertMinutesToMilliseconds(5) // considered valid for 5 minutes
).then((items) => {
// data here is either coming from the cache or the fetch we provided
console.log(items);
});
import React from "react";
import { useCache, convertMinutesToMilliseconds } from "storage-utils";
import { get } from "./RestClient"; // not in this library
const url = "/api/name";
const fetchName = () => get<string>(url);
export function Name() {
let name = useCache(
localStorage, // localStorage will save across browser sessions
url, // using the url as a cache key, but this depends on the use
fetchName, // can be anything that returns a promise of something
0, // immediately consider this value dirty
true // use an expired value from the cache if it exists
);
// loading will only ever be shown the very first time
// since we are using the option to use the expired
// value from cache while the fetch processes in the
// background and eventually causes a re-render
if (name === undefined) return <div>Loading</div>;
return <div>{name}</div>;
}
storage to use. i.e. localStorage, sessionStorage
unique string used as cache key to storage
returns a promise used to fetch the data
Max time to live in milliseconds
function called with the value from the fetch if expired
The data from the cache, whether it's expired or not. undefined if it wasn't in the cache at all
storage to use. i.e. localStorage, sessionStorage
unique string used as cache key to storage
returns a promise used to fetch the data from if it's not in cache
Max time to live in milliseconds
If true, will return expired items from cache while updating in the background.
Hook to easily enable caching to an async call. Implemented in a way such that when reading from cache, there is no 'bad' value initially acted on as that bit of state. This means when reading from the cache, you won't have a double render
storage to use. i.e. localStorage, sessionStorage
unique string used as cache key to storage
returns a promise used to fetch the data
Time until expired in milliseconds
if true, the data will be set to the expired value from the cache until getData completes
State that is populated from cache, fetch or both
Generated using TypeDoc