forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			61 lines
		
	
	
		
			No EOL
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			No EOL
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
} |