FIX: fully rely on keyValueStore to prevent error (#12)
* FIX: fully rely on keyValueStore to prevent error The component was generating errors for some users due to direct access to `localStorage`: ``` TypeError: Cannot convert undefined or null to object at Function.keys (<anonymous>) at Object.expireOldValues (https://d3bpeqsaub0i6y.cloudfront.net/theme-javascripts/33bf35dc19b970a42f8c1e7d57d8cc72d6205bbd.js?__ws=meta.discourse.org:157:14) at Object.initialize (https://d3bpeqsaub0i6y.cloudfront.net/theme-javascripts/33bf35dc19b970a42f8c1e7d57d8cc72d6205bbd.js?__ws=meta.discourse.org:193:12) at o.initialize (https://d11a6trkgmumsb.cloudfront.net/assets/discourse-2bd9a9aa6b5c9cbee990a03159f5bff41fe503fe74814c3b66b3770876913dd5.gz.js:68:38) ``` This commits removes old unnecessary code using cookies and uses latest API from core `removeKeys`. Old discourse instances will just not evict old keys which is a minor annoyance. * linting
This commit is contained in:
parent
faf88c2209
commit
be75773375
|
@ -1,7 +1,6 @@
|
||||||
import showModal from "discourse/lib/show-modal";
|
import showModal from "discourse/lib/show-modal";
|
||||||
import { withPluginApi } from "discourse/lib/plugin-api";
|
import { withPluginApi } from "discourse/lib/plugin-api";
|
||||||
import { debounce, later } from "@ember/runloop";
|
import { debounce, later } from "@ember/runloop";
|
||||||
import cookie, { removeCookie } from "discourse/lib/cookie";
|
|
||||||
|
|
||||||
const VALID_TAGS =
|
const VALID_TAGS =
|
||||||
"h1, h2, h3, h4, h5, h6, p, code, blockquote, .md-table, li p";
|
"h1, h2, h3, h4, h5, h6, p, code, blockquote, .md-table, li p";
|
||||||
|
@ -66,35 +65,14 @@ function buildSelect(key, placeholder) {
|
||||||
export default {
|
export default {
|
||||||
name: "discourse-placeholder-theme-component",
|
name: "discourse-placeholder-theme-component",
|
||||||
|
|
||||||
// TODO: Remove once this change has been live for a few months
|
|
||||||
migrateCookiesToKeyValueStore() {
|
|
||||||
const cookies = document.cookie.split("; ");
|
|
||||||
const oldPlaceholderCookies = [];
|
|
||||||
|
|
||||||
for (let i = 0, l = cookies.length; i < l; i++) {
|
|
||||||
let parts = cookies[i].split("=");
|
|
||||||
if (parts[0].startsWith(STORAGE_PREFIX)) {
|
|
||||||
oldPlaceholderCookies.push(parts[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const key of oldPlaceholderCookies) {
|
|
||||||
const value = cookie(key);
|
|
||||||
|
|
||||||
this.setValue(key, value);
|
|
||||||
removeCookie(key);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
expireOldValues() {
|
expireOldValues() {
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
Object.keys(window.localStorage)
|
this.keyValueStore.removeKeys?.((k, v) => {
|
||||||
.filter((k) => k.startsWith(STORAGE_PREFIX))
|
if (!k.includes(STORAGE_PREFIX)) {
|
||||||
.forEach((k) => {
|
return false;
|
||||||
const data = this.keyValueStore.getObject(k);
|
|
||||||
if (!data?.expires || data.expires < now) {
|
|
||||||
this.removeValue(k);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return !v?.expires || v.expires < now;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -123,8 +101,6 @@ export default {
|
||||||
|
|
||||||
initialize(container) {
|
initialize(container) {
|
||||||
this.keyValueStore = container.lookup("service:key-value-store");
|
this.keyValueStore = container.lookup("service:key-value-store");
|
||||||
|
|
||||||
this.migrateCookiesToKeyValueStore();
|
|
||||||
this.expireOldValues();
|
this.expireOldValues();
|
||||||
|
|
||||||
withPluginApi("0.8.7", (api) => {
|
withPluginApi("0.8.7", (api) => {
|
||||||
|
|
Loading…
Reference in New Issue