* Status WIP * feat: Status * fix: Status tests * feat: status redirect * chore: Status tests * chore: Status tests * feat: Status tests * chore: Status playwright tests * fix: PR feedback, mostly Vue and copyright dates * fix: Status model migration tidy up * chore: Status - one migration * feat: status on doc/html pages * chore: Resetting Status migration * chore: removing unused FieldError * fix: Update Status test to remove 'by' * chore: fixing API test to exclude 'status' * chore: fixing status_page test * feat: Site Status PR feedback. URL coverage debugging * Adding ietf.status to Tastypie omitted apps * feat: Site Status PR feedback * chore: correct copyright year on newly created files * chore: repair merge damage * chore: repair more merge damage * fix: reconcile the api init refactor with ignoring apps --------- Co-authored-by: Matthew Holloway <Matthew Holloway> Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
43 lines
1,001 B
JavaScript
43 lines
1,001 B
JavaScript
|
|
/*
|
|
* DEVELOPER NOTE
|
|
*
|
|
* Some browsers can block storage (localStorage, sessionStorage)
|
|
* access for privacy reasons, and all browsers can have storage
|
|
* that's full, and then they throw exceptions.
|
|
*
|
|
* See https://michalzalecki.com/why-using-localStorage-directly-is-a-bad-idea/
|
|
*
|
|
* Exceptions can even be thrown when testing if localStorage
|
|
* even exists. This can throw:
|
|
*
|
|
* if (window.localStorage)
|
|
*
|
|
* Also localStorage/sessionStorage can be enabled after DOMContentLoaded
|
|
* so we handle it gracefully.
|
|
*
|
|
* 1) we need to wrap all usage in try/catch
|
|
* 2) we need to defer actual usage of these until
|
|
* necessary,
|
|
*
|
|
*/
|
|
|
|
export const localStorageWrapper = {
|
|
getItem: (key) => {
|
|
try {
|
|
return localStorage.getItem(key)
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
return null;
|
|
},
|
|
setItem: (key, value) => {
|
|
try {
|
|
return localStorage.setItem(key, value)
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
return;
|
|
},
|
|
}
|