From 992890c5d03226a1075138c8cc44101e5b04db18 Mon Sep 17 00:00:00 2001 From: Guy Carmeli Date: Mon, 20 Nov 2017 08:21:46 +0200 Subject: [PATCH] Support passing unserializable props to custom button This commit applies the save props mechanism used when pushing screen to navigator buttons as well, enabling us to pass unserializable props to buttons. --- .../platformSpecificDeprecated.ios.js | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/deprecated/platformSpecificDeprecated.ios.js b/src/deprecated/platformSpecificDeprecated.ios.js index ff9eabff48b..ff95dfb0717 100644 --- a/src/deprecated/platformSpecificDeprecated.ios.js +++ b/src/deprecated/platformSpecificDeprecated.ios.js @@ -31,6 +31,7 @@ function startTabBasedApp(params) { navigatorButtons, navigatorEventID } = _mergeScreenSpecificSettings(tab.screen, screenInstanceID, tab); + _processNavigatorButtons(navigatorButtons); tab.navigationParams = { screenInstanceID, navigatorStyle, @@ -138,6 +139,7 @@ function startSingleScreenApp(params) { navigatorButtons, navigatorEventID } = _mergeScreenSpecificSettings(screen.screen, screenInstanceID, screen); + _processNavigatorButtons(navigatorButtons); params.navigationParams = { screenInstanceID, navigatorStyle, @@ -236,6 +238,7 @@ function navigatorPush(navigator, params) { navigatorButtons, navigatorEventID } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params); + _processNavigatorButtons(navigatorButtons); const passProps = Object.assign({}, params.passProps); passProps.navigatorID = navigator.navigatorID; passProps.screenInstanceID = screenInstanceID; @@ -294,6 +297,7 @@ function navigatorResetTo(navigator, params) { navigatorButtons, navigatorEventID } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params); + _processNavigatorButtons(navigatorButtons); const passProps = Object.assign({}, params.passProps); passProps.navigatorID = navigator.navigatorID; passProps.screenInstanceID = screenInstanceID; @@ -443,6 +447,7 @@ function navigatorSwitchToTab(navigator, params) { } function navigatorSetButtons(navigator, navigatorEventID, params) { + _processNavigatorButtons(params); if (params.leftButtons) { const buttons = params.leftButtons.slice(); // clone for (let i = 0; i < buttons.length; i++) { @@ -472,6 +477,7 @@ function showModal(params) { navigatorButtons, navigatorEventID } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params); + _processNavigatorButtons(navigatorButtons); const passProps = Object.assign({}, params.passProps); passProps.navigatorID = navigatorID; passProps.screenInstanceID = screenInstanceID; @@ -640,6 +646,21 @@ async function getCurrentlyVisibleScreenId() { return await ScreenUtils.getCurrentlyVisibleScreenId(); } +function _processNavigatorButtons({rightButtons, leftButtons}) { + _saveNavigatorButtonsPassProps(rightButtons); + _saveNavigatorButtonsPassProps(leftButtons); +} + +function _saveNavigatorButtonsPassProps(buttons = []) { + buttons.forEach((button) => { + if (button.component) { + const passPropsKey = _.uniqueId('customButtonComponent'); + PropRegistry.save(passPropsKey, button.passProps); + button.passProps = {passPropsKey}; + } + }) +} + export default { startTabBasedApp, startSingleScreenApp,