forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			63 lines
		
	
	
		
			No EOL
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			No EOL
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {UIEventSource} from "../UIEventSource";
 | 
						|
import {Utils} from "../../Utils";
 | 
						|
 | 
						|
/**
 | 
						|
 * Wrapper around the hash to create an UIEventSource from it
 | 
						|
 */
 | 
						|
export default class Hash {
 | 
						|
 | 
						|
    public static hash: UIEventSource<string> = Hash.Get();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the current string, including the pound sign if there is any
 | 
						|
     * @constructor
 | 
						|
     */
 | 
						|
    public static Current(): string {
 | 
						|
        if (Hash.hash.data === undefined || Hash.hash.data === "") {
 | 
						|
            return ""
 | 
						|
        } else {
 | 
						|
            return "#" + Hash.hash.data;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    private static Get(): UIEventSource<string> {
 | 
						|
        if (Utils.runningFromConsole) {
 | 
						|
            return new UIEventSource<string>(undefined);
 | 
						|
        }
 | 
						|
        const hash = new UIEventSource<string>(window.location.hash.substr(1));
 | 
						|
        hash.addCallback(h => {
 | 
						|
            if (h === "undefined") {
 | 
						|
                console.warn("Got a literal 'undefined' as hash, ignoring")
 | 
						|
                h = undefined;
 | 
						|
            }
 | 
						|
 | 
						|
            if (h === undefined || h === "") {
 | 
						|
                window.location.hash = "";
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            history.pushState({}, "")
 | 
						|
            window.location.hash = "#" + h;
 | 
						|
        });
 | 
						|
 | 
						|
 | 
						|
        window.onhashchange = () => {
 | 
						|
            let newValue = window.location.hash.substr(1);
 | 
						|
            if (newValue === "") {
 | 
						|
                newValue = undefined;
 | 
						|
            }
 | 
						|
            hash.setData(newValue)
 | 
						|
        }
 | 
						|
 | 
						|
        window.addEventListener('popstate', _ => {
 | 
						|
            let newValue = window.location.hash.substr(1);
 | 
						|
            if (newValue === "") {
 | 
						|
                newValue = undefined;
 | 
						|
            }
 | 
						|
            hash.setData(newValue)
 | 
						|
        })
 | 
						|
 | 
						|
        return hash;
 | 
						|
    }
 | 
						|
 | 
						|
} |