diff --git a/app/assets/javascripts/discourse/components/url.js b/app/assets/javascripts/discourse/components/url.js index b4ff5b4e6..6526bcf64 100644 --- a/app/assets/javascripts/discourse/components/url.js +++ b/app/assets/javascripts/discourse/components/url.js @@ -7,6 +7,12 @@ **/ Discourse.URL = { + // Used for matching a topic + TOPIC_REGEXP: /\/t\/([^\/]+)\/(\d+)\/?(\d+)?/, + + // Used for matching a /more URL + MORE_REGEXP: /\/more$/, + /** Browser aware replaceState. Will only be invoked if the browser supports it. @@ -37,31 +43,41 @@ Discourse.URL = { @param {String} path The path we are routing to. **/ routeTo: function(path) { - var newMatches, newTopicId, oldMatches, oldTopicId, opts, router, topicController, topicRegexp; + var oldPath = window.location.pathname; path = path.replace(/https?\:\/\/[^\/]+/, ''); - console.log("route to: " + path); - - // If we're in the same topic, don't push the state - topicRegexp = /\/t\/([^\/]+)\/(\d+)\/?(\d+)?/; - newMatches = topicRegexp.exec(path); - newTopicId = newMatches ? newMatches[2] : null; + /* + If the URL is in the topic form, /t/something/:topic_id/:post_number + then we want to apply some special logic. If the post_number changes within the + same topic, use replaceState and instruct our controller to load more posts. + */ + var newMatches = this.TOPIC_REGEXP.exec(path); + var newTopicId = newMatches ? newMatches[2] : null; if (newTopicId) { - oldMatches = topicRegexp.exec(window.location.pathname); - if ((oldTopicId = oldMatches ? oldMatches[2] : void 0) && (oldTopicId === newTopicId)) { + var oldMatches = this.TOPIC_REGEXP.exec(oldPath); + var oldTopicId = oldMatches ? oldMatches[2] : null; + + // If the topic_id is the same + if (oldTopicId === newTopicId) { Discourse.URL.replaceState(path); - topicController = Discourse.__container__.lookup('controller:topic'); - opts = { trackVisit: false }; - if (newMatches[3]) { - opts.nearPost = newMatches[3]; - } + var topicController = Discourse.__container__.lookup('controller:topic'); + var opts = { trackVisit: false }; + if (newMatches[3]) opts.nearPost = newMatches[3]; topicController.get('content').loadPosts(opts); + + // Abort routing, we have replaced our state. return; } } + + // If we transition from a /more path, scroll to the top + if (this.MORE_REGEXP.exec(oldPath) && (!this.MORE_REGEXP.exec(path))) { + window.scrollTo(0, 0); + } + // Be wary of looking up the router. In this case, we have links in our // HTML, say form compiled markdown posts, that need to be routed. - router = Discourse.__container__.lookup('router:main'); + var router = Discourse.__container__.lookup('router:main'); router.router.updateURL(path); return router.handleURL(path); }