react-crossroads
Version:
Client side router for web applications built with React and utilizing the Flux architecture. The backing routing engine is CrossroadsJs.
61 lines (45 loc) • 1.54 kB
text/coffeescript
invariant = require 'react/lib/invariant'
getWindowPath = require './getWindowPath'
ExecutionEnvironment = require 'react/lib/ExecutionEnvironment'
_onChange = null
_ensureChangeFires = (func) ->
original = HashLocation.getCurrentPath()
func()
_onChange() if original == HashLocation.getCurrentPath()
# Location handler that uses `window.location.hash`.
HashLocation =
setup: (onChange) ->
invariant(
ExecutionEnvironment.canUseDOM,
'You cannot use HashLocation in an environment with no DOM'
)
_onChange = onChange
# Make sure the hash is at least / to begin with.
if window.location.hash == ''
window.location.replace "#{getWindowPath()}#/"
if window.addEventListener
window.addEventListener 'hashchange', _onChange, false
else
window.attachEvent 'onhashchange', _onChange
teardown: ->
if window.removeEventListener
window.removeEventListener 'hashchange', _onChange, false
else
window.detachEvent 'onhashchange', _onChange
push: (path) ->
_ensureChangeFires ->
window.location.hash = path
replace: (path) ->
_ensureChangeFires ->
window.location.replace "#{getWindowPath()}##{path}"
pop: ->
_ensureChangeFires ->
window.history.back()
getCurrentPath: ->
window.location.hash.substr 1
isSupportedOrFallback: ->
if ExecutionEnvironment.canUseDOM then true else 'memory'
pathToHref: (path) -> "##{path}"
toString: ->
'<HashLocation>'
module.exports = HashLocation