{"ast":null,"code":"import * as React from 'react';\nimport NavigationBuilderContext from \"./NavigationBuilderContext\";\nimport useOnPreventRemove, { shouldPreventRemove } from \"./useOnPreventRemove\";\nexport default function useOnAction(_ref) {\n  var router = _ref.router,\n    getState = _ref.getState,\n    setState = _ref.setState,\n    key = _ref.key,\n    actionListeners = _ref.actionListeners,\n    beforeRemoveListeners = _ref.beforeRemoveListeners,\n    routerConfigOptions = _ref.routerConfigOptions,\n    emitter = _ref.emitter;\n  var _React$useContext = React.useContext(NavigationBuilderContext),\n    onActionParent = _React$useContext.onAction,\n    onRouteFocusParent = _React$useContext.onRouteFocus,\n    addListenerParent = _React$useContext.addListener,\n    onDispatchAction = _React$useContext.onDispatchAction;\n  var routerConfigOptionsRef = React.useRef(routerConfigOptions);\n  React.useEffect(function () {\n    routerConfigOptionsRef.current = routerConfigOptions;\n  });\n  var onAction = React.useCallback(function (action) {\n    var visitedNavigators = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set();\n    var state = getState();\n    if (visitedNavigators.has(state.key)) {\n      return false;\n    }\n    visitedNavigators.add(state.key);\n    if (typeof action.target !== 'string' || action.target === state.key) {\n      var result = router.getStateForAction(state, action, routerConfigOptionsRef.current);\n      result = result === null && action.target === state.key ? state : result;\n      if (result !== null) {\n        onDispatchAction(action, state === result);\n        if (state !== result) {\n          var isPrevented = shouldPreventRemove(emitter, beforeRemoveListeners, state.routes, result.routes, action);\n          if (isPrevented) {\n            return true;\n          }\n          setState(result);\n        }\n        if (onRouteFocusParent !== undefined) {\n          var shouldFocus = router.shouldActionChangeFocus(action);\n          if (shouldFocus && key !== undefined) {\n            onRouteFocusParent(key);\n          }\n        }\n        return true;\n      }\n    }\n    if (onActionParent !== undefined) {\n      if (onActionParent(action, visitedNavigators)) {\n        return true;\n      }\n    }\n    for (var i = actionListeners.length - 1; i >= 0; i--) {\n      var listener = actionListeners[i];\n      if (listener(action, visitedNavigators)) {\n        return true;\n      }\n    }\n    return false;\n  }, [actionListeners, beforeRemoveListeners, emitter, getState, key, onActionParent, onDispatchAction, onRouteFocusParent, router, setState]);\n  useOnPreventRemove({\n    getState: getState,\n    emitter: emitter,\n    beforeRemoveListeners: beforeRemoveListeners\n  });\n  React.useEffect(function () {\n    return addListenerParent === null || addListenerParent === void 0 ? void 0 : addListenerParent('action', onAction);\n  }, [addListenerParent, onAction]);\n  return onAction;\n}","map":{"version":3,"sources":["useOnAction.tsx"],"names":["React","NavigationBuilderContext","useOnPreventRemove","shouldPreventRemove","useOnAction","router","getState","setState","key","actionListeners","beforeRemoveListeners","routerConfigOptions","emitter","onAction","onActionParent","onRouteFocus","onRouteFocusParent","addListener","addListenerParent","onDispatchAction","useContext","routerConfigOptionsRef","useRef","useEffect","current","useCallback","action","visitedNavigators","Set","state","has","add","target","result","getStateForAction","isPrevented","routes","undefined","shouldFocus","shouldActionChangeFocus","i","length","listener"],"mappings":"AAOA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,OAAOC,wBAAwB;AAM/B,OAAOC,kBAAkB,IAAIC,mBAAmB;AAsBhD,eAAe,SAASC,WAAW,CAAA,IAAA,EASvB;EATwB,IAClCC,MAAM,GAQE,IAAA,CARRA,MAAM;IACNC,QAAQ,GAOA,IAAA,CAPRA,QAAQ;IACRC,QAAQ,GAMA,IAAA,CANRA,QAAQ;IACRC,GAAG,GAKK,IAAA,CALRA,GAAG;IACHC,eAAe,GAIP,IAAA,CAJRA,eAAe;IACfC,qBAAqB,GAGb,IAAA,CAHRA,qBAAqB;IACrBC,mBAAmB,GAEX,IAAA,CAFRA,mBAAmB;IACnBC,OAAAA,GACQ,IAAA,CADRA,OAAAA;EAEA,IAAA,iBAAA,GAKIZ,KAAK,CAACoB,UAAU,CAACnB,wBAAwB,CAAC;IAJlCa,cAAc,GAAA,iBAAA,CAAxBD,QAAQ;IACMG,kBAAkB,GAAA,iBAAA,CAAhCD,YAAY;IACCG,iBAAiB,GAAA,iBAAA,CAA9BD,WAAW;IACXE,gBAAAA,GAAAA,iBAAAA,CAAAA,gBAAAA;EAGF,IAAME,sBAAsB,GAC1BrB,KAAK,CAACsB,MAAM,CAAsBX,mBAAmB,CAAC;EAExDX,KAAK,CAACuB,SAAS,CAAC,YAAM;IACpBF,sBAAsB,CAACG,OAAO,GAAGb,mBAAmB;EACtD,CAAC,CAAC;EAEF,IAAME,QAAQ,GAAGb,KAAK,CAACyB,WAAW,CAChC,UACEC,MAAwB,EAErB;IAAA,IADHC,iBAA8B,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAG,IAAIC,GAAG,CAAA,CAAU;IAElD,IAAMC,KAAK,GAAGvB,QAAQ,CAAA,CAAE;IAIxB,IAAIqB,iBAAiB,CAACG,GAAG,CAACD,KAAK,CAACrB,GAAG,CAAC,EAAE;MACpC,OAAO,KAAK;IACd;IAEAmB,iBAAiB,CAACI,GAAG,CAACF,KAAK,CAACrB,GAAG,CAAC;IAEhC,IAAI,OAAOkB,MAAM,CAACM,MAAM,KAAK,QAAQ,IAAIN,MAAM,CAACM,MAAM,KAAKH,KAAK,CAACrB,GAAG,EAAE;MACpE,IAAIyB,MAAM,GAAG5B,MAAM,CAAC6B,iBAAiB,CACnCL,KAAK,EACLH,MAAM,EACNL,sBAAsB,CAACG,OAAO,CAC/B;MAIDS,MAAM,GACJA,MAAM,KAAK,IAAI,IAAIP,MAAM,CAACM,MAAM,KAAKH,KAAK,CAACrB,GAAG,GAAGqB,KAAK,GAAGI,MAAM;MAEjE,IAAIA,MAAM,KAAK,IAAI,EAAE;QACnBd,gBAAgB,CAACO,MAAM,EAAEG,KAAK,KAAKI,MAAM,CAAC;QAE1C,IAAIJ,KAAK,KAAKI,MAAM,EAAE;UACpB,IAAME,WAAW,GAAGhC,mBAAmB,CACrCS,OAAO,EACPF,qBAAqB,EACrBmB,KAAK,CAACO,MAAM,EACZH,MAAM,CAACG,MAAM,EACbV,MAAM,CACP;UAED,IAAIS,WAAW,EAAE;YACf,OAAO,IAAI;UACb;UAEA5B,QAAQ,CAAC0B,MAAM,CAAC;QAClB;QAEA,IAAIjB,kBAAkB,KAAKqB,SAAS,EAAE;UAGpC,IAAMC,WAAW,GAAGjC,MAAM,CAACkC,uBAAuB,CAACb,MAAM,CAAC;UAE1D,IAAIY,WAAW,IAAI9B,GAAG,KAAK6B,SAAS,EAAE;YACpCrB,kBAAkB,CAACR,GAAG,CAAC;UACzB;QACF;QAEA,OAAO,IAAI;MACb;IACF;IAEA,IAAIM,cAAc,KAAKuB,SAAS,EAAE;MAEhC,IAAIvB,cAAc,CAACY,MAAM,EAAEC,iBAAiB,CAAC,EAAE;QAC7C,OAAO,IAAI;MACb;IACF;IAGA,KAAK,IAAIa,CAAC,GAAG/B,eAAe,CAACgC,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;MACpD,IAAME,QAAQ,GAAGjC,eAAe,CAAC+B,CAAC,CAAC;MAEnC,IAAIE,QAAQ,CAAChB,MAAM,EAAEC,iBAAiB,CAAC,EAAE;QACvC,OAAO,IAAI;MACb;IACF;IAEA,OAAO,KAAK;EACd,CAAC,EACD,CACElB,eAAe,EACfC,qBAAqB,EACrBE,OAAO,EACPN,QAAQ,EACRE,GAAG,EACHM,cAAc,EACdK,gBAAgB,EAChBH,kBAAkB,EAClBX,MAAM,EACNE,QAAQ,CACT,CACF;EAEDL,kBAAkB,CAAC;IACjBI,QAAQ,EAARA,QAAQ;IACRM,OAAO,EAAPA,OAAO;IACPF,qBAAAA,EAAAA;EACF,CAAC,CAAC;EAEFV,KAAK,CAACuB,SAAS,CACb;IAAA,OAAML,iBAAiB,KAAA,IAAA,IAAjBA,iBAAiB,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAjBA,iBAAiB,CAAG,QAAQ,EAAEL,QAAQ,CAAC;EAAA,GAC7C,CAACK,iBAAiB,EAAEL,QAAQ,CAAC,CAC9B;EAED,OAAOA,QAAQ;AACjB","sourceRoot":"../../src","sourcesContent":["import * as React from 'react';\nimport NavigationBuilderContext from './NavigationBuilderContext';\nimport useOnPreventRemove, { shouldPreventRemove } from './useOnPreventRemove';\n/**\n * Hook to handle actions for a navigator, including state updates and bubbling.\n *\n * Bubbling an action is achieved in 2 ways:\n * 1. To bubble action to parent, we expose the action handler in context and then access the parent context\n * 2. To bubble action to child, child adds event listeners subscribing to actions from parent\n *\n * When the action handler handles as action, it returns `true`, otherwise `false`.\n */\nexport default function useOnAction(_ref) {\n  let {\n    router,\n    getState,\n    setState,\n    key,\n    actionListeners,\n    beforeRemoveListeners,\n    routerConfigOptions,\n    emitter\n  } = _ref;\n  const {\n    onAction: onActionParent,\n    onRouteFocus: onRouteFocusParent,\n    addListener: addListenerParent,\n    onDispatchAction\n  } = React.useContext(NavigationBuilderContext);\n  const routerConfigOptionsRef = React.useRef(routerConfigOptions);\n  React.useEffect(() => {\n    routerConfigOptionsRef.current = routerConfigOptions;\n  });\n  const onAction = React.useCallback(function (action) {\n    let visitedNavigators = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set();\n    const state = getState();\n\n    // Since actions can bubble both up and down, they could come to the same navigator again\n    // We keep track of navigators which have already tried to handle the action and return if it's already visited\n    if (visitedNavigators.has(state.key)) {\n      return false;\n    }\n    visitedNavigators.add(state.key);\n    if (typeof action.target !== 'string' || action.target === state.key) {\n      let result = router.getStateForAction(state, action, routerConfigOptionsRef.current);\n\n      // If a target is specified and set to current navigator, the action shouldn't bubble\n      // So instead of `null`, we use the state object for such cases to signal that action was handled\n      result = result === null && action.target === state.key ? state : result;\n      if (result !== null) {\n        onDispatchAction(action, state === result);\n        if (state !== result) {\n          const isPrevented = shouldPreventRemove(emitter, beforeRemoveListeners, state.routes, result.routes, action);\n          if (isPrevented) {\n            return true;\n          }\n          setState(result);\n        }\n        if (onRouteFocusParent !== undefined) {\n          // Some actions such as `NAVIGATE` also want to bring the navigated route to focus in the whole tree\n          // This means we need to focus all of the parent navigators of this navigator as well\n          const shouldFocus = router.shouldActionChangeFocus(action);\n          if (shouldFocus && key !== undefined) {\n            onRouteFocusParent(key);\n          }\n        }\n        return true;\n      }\n    }\n    if (onActionParent !== undefined) {\n      // Bubble action to the parent if the current navigator didn't handle it\n      if (onActionParent(action, visitedNavigators)) {\n        return true;\n      }\n    }\n\n    // If the action wasn't handled by current navigator or a parent navigator, let children handle it\n    for (let i = actionListeners.length - 1; i >= 0; i--) {\n      const listener = actionListeners[i];\n      if (listener(action, visitedNavigators)) {\n        return true;\n      }\n    }\n    return false;\n  }, [actionListeners, beforeRemoveListeners, emitter, getState, key, onActionParent, onDispatchAction, onRouteFocusParent, router, setState]);\n  useOnPreventRemove({\n    getState,\n    emitter,\n    beforeRemoveListeners\n  });\n  React.useEffect(() => addListenerParent === null || addListenerParent === void 0 ? void 0 : addListenerParent('action', onAction), [addListenerParent, onAction]);\n  return onAction;\n}\n//# sourceMappingURL=useOnAction.js.map"]},"metadata":{},"sourceType":"module"}