forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { UIEventSource } from "../UIEventSource"
 | |
| 
 | |
| /**
 | |
|  * UIEventsource-wrapper around localStorage
 | |
|  */
 | |
| export class LocalStorageSource {
 | |
|     static GetParsed<T>(key: string, defaultValue: T): UIEventSource<T> {
 | |
|         return LocalStorageSource.Get(key).sync(
 | |
|             (str) => {
 | |
|                 if (str === undefined) {
 | |
|                     return defaultValue
 | |
|                 }
 | |
|                 try {
 | |
|                     return JSON.parse(str)
 | |
|                 } catch {
 | |
|                     return defaultValue
 | |
|                 }
 | |
|             },
 | |
|             [],
 | |
|             (value) => JSON.stringify(value)
 | |
|         )
 | |
|     }
 | |
| 
 | |
|     static Get(key: string, defaultValue: string = undefined): UIEventSource<string> {
 | |
|         try {
 | |
|             const saved = localStorage.getItem(key)
 | |
|             const source = new UIEventSource<string>(saved ?? defaultValue, "localstorage:" + key)
 | |
| 
 | |
|             source.addCallback((data) => {
 | |
|                 try {
 | |
|                     localStorage.setItem(key, data)
 | |
|                 } catch (e) {
 | |
|                     // Probably exceeded the quota with this item!
 | |
|                     // Lets nuke everything
 | |
|                     localStorage.clear()
 | |
|                 }
 | |
|             })
 | |
|             return source
 | |
|         } catch (e) {
 | |
|             return new UIEventSource<string>(defaultValue)
 | |
|         }
 | |
|     }
 | |
| }
 |