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);
 | |
|         }
 | |
|     }
 | |
| 
 | |
| } |