Fix loading of previously visited unofficial themes
This commit is contained in:
parent
70fb6f5303
commit
21b5fbd8cd
3 changed files with 63 additions and 41 deletions
60
Logic/InstalledThemes.ts
Normal file
60
Logic/InstalledThemes.ts
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
import LayoutConfig from "../Customizations/JSON/LayoutConfig";
|
||||||
|
import {OsmPreferences} from "./Osm/OsmPreferences";
|
||||||
|
import {UIEventSource} from "./UIEventSource";
|
||||||
|
import {OsmConnection} from "./Osm/OsmConnection";
|
||||||
|
|
||||||
|
export default class InstalledThemes {
|
||||||
|
|
||||||
|
private static DeleteInvalid(osmConnection: OsmConnection, invalidThemes: any[]){
|
||||||
|
// for (const invalid of invalidThemes) {
|
||||||
|
// console.error("Attempting to remove ", invalid)
|
||||||
|
// osmConnection.GetLongPreference(
|
||||||
|
// "installed-theme-" + invalid
|
||||||
|
// ).setData(null);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
static InstalledThemes(osmConnection: OsmConnection) : UIEventSource<{ layout: LayoutConfig; definition: string }[]>{
|
||||||
|
return osmConnection.preferencesHandler.preferences.map<{ layout: LayoutConfig, definition: string }[]>(allPreferences => {
|
||||||
|
const installedThemes: { layout: LayoutConfig, definition: string }[] = [];
|
||||||
|
console.log("UPdating the installed themes")
|
||||||
|
console.log("All preferences are ",allPreferences)
|
||||||
|
if (allPreferences === undefined) {
|
||||||
|
console.log("All prefs is undefined");
|
||||||
|
return installedThemes;
|
||||||
|
}
|
||||||
|
const invalidThemes = []
|
||||||
|
for (var allPreferencesKey in allPreferences) {
|
||||||
|
const themename = allPreferencesKey.match(/^mapcomplete-installed-theme-(.*)-combined-length$/);
|
||||||
|
console.log("Preference key match:",themename," for key ",allPreferencesKey);
|
||||||
|
if (themename && themename[1] !== "") {
|
||||||
|
const customLayout = osmConnection.GetLongPreference("installed-theme-" + themename[1]);
|
||||||
|
if (customLayout.data === undefined) {
|
||||||
|
console.log("No data defined for ", themename[1]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
var json = atob(customLayout.data);
|
||||||
|
console.log(json);
|
||||||
|
const layout = new LayoutConfig(
|
||||||
|
JSON.parse(json));
|
||||||
|
installedThemes.push({
|
||||||
|
layout: layout,
|
||||||
|
definition: customLayout.data
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.warn("Could not parse custom layout from preferences - deleting: ", allPreferencesKey, e, customLayout.data);
|
||||||
|
invalidThemes.push(themename[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
InstalledThemes.DeleteInvalid(osmConnection, invalidThemes);
|
||||||
|
|
||||||
|
return installedThemes;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
43
State.ts
43
State.ts
|
@ -14,6 +14,7 @@ import {BaseLayer} from "./Logic/BaseLayer";
|
||||||
import LayoutConfig from "./Customizations/JSON/LayoutConfig";
|
import LayoutConfig from "./Customizations/JSON/LayoutConfig";
|
||||||
import Hash from "./Logic/Web/Hash";
|
import Hash from "./Logic/Web/Hash";
|
||||||
import {MangroveIdentity} from "./Logic/Web/MangroveReviews";
|
import {MangroveIdentity} from "./Logic/Web/MangroveReviews";
|
||||||
|
import InstalledThemes from "./Logic/InstalledThemes";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains the global state: a bunch of UI-event sources
|
* Contains the global state: a bunch of UI-event sources
|
||||||
|
@ -233,47 +234,7 @@ export default class State {
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
this.installedThemes = this.osmConnection.preferencesHandler.preferences.map<{ layout: LayoutConfig, definition: string }[]>(allPreferences => {
|
this.installedThemes = InstalledThemes.InstalledThemes(this.osmConnection );
|
||||||
const installedThemes: { layout: LayoutConfig, definition: string }[] = [];
|
|
||||||
if (allPreferences === undefined) {
|
|
||||||
return installedThemes;
|
|
||||||
}
|
|
||||||
const invalidThemes = []
|
|
||||||
for (const allPreferencesKey in allPreferences) {
|
|
||||||
const themename = allPreferencesKey.match(/^mapcomplete-installed-theme-(.*)-combined-length$/);
|
|
||||||
if (themename && themename[1] !== "") {
|
|
||||||
const customLayout = self.osmConnection.GetLongPreference("installed-theme-" + themename[1]);
|
|
||||||
if (customLayout.data === undefined) {
|
|
||||||
console.log("No data defined for ", themename[1]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const json = btoa(customLayout.data);
|
|
||||||
console.log(json);
|
|
||||||
const layout = new LayoutConfig(
|
|
||||||
JSON.parse(json));
|
|
||||||
installedThemes.push({
|
|
||||||
layout: layout,
|
|
||||||
definition: customLayout.data
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
console.warn("Could not parse custom layout from preferences - deleting: ", allPreferencesKey, e, customLayout.data);
|
|
||||||
invalidThemes.push(themename[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const invalid of invalidThemes) {
|
|
||||||
console.error("Attempting to remove ", invalid)
|
|
||||||
this.osmConnection.GetLongPreference(
|
|
||||||
"installed-theme-" + invalid
|
|
||||||
).setData(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
return installedThemes;
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// IMportant: the favourite layers are initiliazed _after_ the installed themes, as these might contain an installedTheme
|
// IMportant: the favourite layers are initiliazed _after_ the installed themes, as these might contain an installedTheme
|
||||||
this.favouriteLayers = this.osmConnection.GetLongPreference("favouriteLayers").map(
|
this.favouriteLayers = this.osmConnection.GetLongPreference("favouriteLayers").map(
|
||||||
|
|
|
@ -100,6 +100,7 @@ export class MoreScreen extends UIElement {
|
||||||
|
|
||||||
|
|
||||||
const customThemesNames = State.state.installedThemes.data ?? [];
|
const customThemesNames = State.state.installedThemes.data ?? [];
|
||||||
|
|
||||||
if (customThemesNames.length > 0) {
|
if (customThemesNames.length > 0) {
|
||||||
els.push(Translations.t.general.customThemeIntro)
|
els.push(Translations.t.general.customThemeIntro)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue