react-crossroads
Version:
Client side router for web applications built with React and utilizing the Flux architecture. The backing routing engine is CrossroadsJs.
55 lines (38 loc) • 1.72 kB
text/coffeescript
React = require 'react'
RouterConstants = require '../constants/RouterConstants'
Logger = require '../utils/logger'
LocationAttempt =
contextTypes:
router: React.PropTypes.object.isRequired
getInitialState: ->
LocationAttempt:
attemptDispatchToken: @context.router.dispatcher.register @locationAttemptDispatcherHandler
componentWillUnmount: ->
if @state.LocationAttempt.attemptDispatchToken?
@context.router.dispatcher.unregister @state.LocationAttempt.attemptDispatchToken
locationAttemptDispatcherHandler: (payload) ->
return unless @isMounted()
@context.router.dispatcher.waitFor [
@context.router.stores.location.dispatchToken
]
@dismissLocationAttempt() unless @context.router.stores.location.isBlocked() or payload?.action?.actionType == RouterConstants.LOCATION_UNBLOCK
return unless payload?.action?.actionType == RouterConstants.LOCATION_ATTEMPT
lastAttempt = payload.action.originalAction
lastAttempt.fromLocationEvent = false
@setState
LocationAttempt:
lastAttempt: lastAttempt
@handleLocationAttempt() if @handleLocationAttempt
dismissLocationAttempt: ->
@setState
LocationAttempt:
lastAttempt: null
@handleLocationAttemptDismissed() if @handleLocationAttemptDismissed
# Ensure responsible blocks are removed first
continueLocationAttempt: ->
return unless @state.LocationAttempt.lastAttempt?
if @context.router.stores.location.isBlocked()
Logger.development.warn 'Continuing transition when the location store is still blocked!'
@dismissLocationAttempt()
@context.router.actions._dispatch @state.LocationAttempt.lastAttempt
module.exports = LocationAttempt