import {UIEventSource} from "../UIEventSource"; import {OsmConnection} from "../Osm/OsmConnection"; import {Utils} from "../../Utils"; import LZString from "lz-string"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; export default class InstalledThemes { public installedThemes: UIEventSource<{ layout: LayoutConfig; definition: string }[]>; constructor(osmConnection: OsmConnection) { this.installedThemes = osmConnection.preferencesHandler.preferences.map<{ layout: LayoutConfig, definition: string }[]>(allPreferences => { const installedThemes: { layout: LayoutConfig, definition: string }[] = []; if (allPreferences === undefined) { console.log("All prefs is 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 = osmConnection.GetLongPreference("installed-theme-" + themename[1]); if (customLayout.data === undefined) { console.log("No data defined for ", themename[1]); continue; } try { let layoutJson; try { layoutJson = JSON.parse(atob(customLayout.data)) } catch (e) { layoutJson = JSON.parse(Utils.UnMinify(LZString.decompressFromBase64(customLayout.data))) } const layout = new LayoutConfig(layoutJson, false); 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; }); } 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); } } }