diff --git a/src/vector/index.js b/src/vector/index.js index 05346888e7..892d9086ea 100644 --- a/src/vector/index.js +++ b/src/vector/index.js @@ -101,15 +101,24 @@ var validBrowser = checkBrowserFeatures([ "objectfit" ]); +// Parse the given window.location and return parameters that can be used when calling +// MatrixChat.showScreen(screen, params) +function getScreenFromLocation(location) { + const fragparts = parseQsFromFragment(location); + return { + screen: fragparts.location.substring(1), + params: fragparts.params, + } +} + // Here, we do some crude URL analysis to allow // deep-linking. function routeUrl(location) { if (!window.matrixChat) return; - console.log("Routing URL "+location); - var fragparts = parseQsFromFragment(location); - window.matrixChat.showScreen(fragparts.location.substring(1), - fragparts.params); + console.log("Routing URL ", location.href); + const s = getScreenFromLocation(location); + window.matrixChat.showScreen(s.screen, s.params); } function onHashChange(ev) { @@ -120,22 +129,13 @@ function onHashChange(ev) { routeUrl(window.location); } -var loaded = false; -var lastLoadedScreen = null; - // This will be called whenever the SDK changes screens, // so a web page can update the URL bar appropriately. var onNewScreen = function(screen) { console.log("newscreen "+screen); - // just remember the most recent screen while we are loading, so that the - // user doesn't see the URL bar doing a dance - if (!loaded) { - lastLoadedScreen = screen; - } else { - var hash = '#/' + screen; - lastLocationHashSet = hash; - window.location.hash = hash; - } + var hash = '#/' + screen; + lastLocationHashSet = hash; + window.location.hash = hash; } // We use this to work out what URL the SDK should @@ -255,6 +255,11 @@ async function loadApp() { var MatrixChat = sdk.getComponent('structures.MatrixChat'); + // Clone the current location before MatrixChat gets a chance to change it. This + // can be used to go to the correct screen after login + const entryLocation = {}; + Object.keys(window.location).forEach((k) => {entryLocation[k] = window.location[k]}); + window.matrixChat = ReactDOM.render( , document.getElementById('matrixchat') ); - - routeUrl(window.location); - - // we didn't propagate screen changes to the URL bar while we were loading; do it now. - loaded = true; - if (lastLoadedScreen) { - onNewScreen(lastLoadedScreen); - lastLoadedScreen = null; - } } else { console.error("Browser is missing required features.");