Skip to content

Commit

Permalink
Don't require JavaScript modules dynamically
Browse files Browse the repository at this point in the history
In release mode, React Native's packager replaces the module name passed
to `require` with an ID. This means that requiring a dynamic module name
won't work in release mode, because the module name can't be found.
  • Loading branch information
jsteiner committed Dec 8, 2016
1 parent 545421a commit 2a40e86
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 45 deletions.
5 changes: 2 additions & 3 deletions generator/elm-transformer.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,8 @@ class ElmTransformer {
return ejs.render(this.elementTemplate, { elementName: elementName, elementFuncName: elementFuncName });
}

elementCustom(elementName, elementFuncName, moduleName, exportedName) {
return ejs.render(this.elementCustomTemplate, { elementName: elementName, elementFuncName: elementFuncName,
moduleName: moduleName, exportedName: exportedName });
elementCustom(elementName, elementFuncName) {
return ejs.render(this.elementCustomTemplate, { elementName: elementName, elementFuncName: elementFuncName });
}

property(propName, propType) {
Expand Down
26 changes: 8 additions & 18 deletions generator/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,20 +123,11 @@ const allowedPropTypes = [
"func"
];

const customElements = {
"NavigationCardStack": {
moduleName: "NavigationCardStack",
exportedName: "Nothing"
},
"NavigationHeader": {
moduleName: "NavigationHeader",
exportedName: "Nothing"
},
"NavigationHeaderTitle": {
moduleName: "NavigationHeaderTitle",
exportedName: "Nothing"
}
};
const customElements = [
"NavigationCardStack",
"NavigationHeader",
"NavigationHeaderTitle"
];


const elmTransformer = new ElmTransformer();
Expand Down Expand Up @@ -169,11 +160,10 @@ function generateElm(moduleJson) {

let elementFuncName = decapitalize(moduleName);

if (customElements[moduleName]) {
elements[elementFuncName] = elmTransformer.elementCustom(moduleName, elementFuncName,
customElements[moduleName].moduleName, customElements[moduleName].exportedName);
} else {
if (customElements.indexOf(moduleName) == -1) {
elements[elementFuncName] = elmTransformer.element(moduleName, elementFuncName);
} else {
elements[elementFuncName] = elmTransformer.elementCustom(moduleName, elementFuncName);
}

propNames.forEach(function(propName) {
Expand Down
2 changes: 1 addition & 1 deletion generator/templates/element-custom.ejs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{-| -}
<%- elementFuncName %> : List (Property msg) -> List (Node msg) -> Node msg
<%- elementFuncName %> =
customNode "<%- elementName %>" "<%- moduleName %>" <%- exportedName %>
customNode "<%- elementName %>" Native.NativeUi.Elements.<%- elementFuncName %>
3 changes: 2 additions & 1 deletion generator/templates/elements-module.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module NativeUi.Elements exposing (<%- moduleExports %>)
-}

import NativeUi exposing (Property, Node, customNode, node)
import Native.NativeUi.Elements


<%- content %>
<%- content %>
23 changes: 5 additions & 18 deletions src/Native/NativeUi.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,21 +93,14 @@ var _elm_native_ui$elm_native_ui$Native_NativeUi = (function () {
/**
* A non-standard node that renders a React Native component with props and children
*/
function customNode(tagName, moduleName, maybeExportedName) {
var exportedName = null;

if (maybeExportedName.ctor !== 'Nothing') {
exportedName = maybeExportedName._0;
}

function customNode(tagName, nativeComponent) {
return F2(function(factList, childList) {
return {
type: 'component',
tagName: tagName,
facts: toArray(factList),
children: toArray(childList),
moduleName: moduleName,
exportedName: exportedName
nativeComponent: nativeComponent
};
});
}
Expand Down Expand Up @@ -261,17 +254,11 @@ var _elm_native_ui$elm_native_ui$Native_NativeUi = (function () {
if (ReactNative[node.tagName]) {
return React.createElement(ReactNative[node.tagName], finalProps);
} else {
if (!node.moduleName) {
if (!node.nativeComponent) {
throw Error('Unable to find a node called ' + node.tagName + ' in ReactNative. Try defining it as a customNode');
}

var customComponent = require(node.moduleName);

if(node.exportedName) {
return React.createElement(customComponent[node.exportedName], finalProps);
} else {
return React.createElement(customComponent, finalProps);
}
return React.createElement(node.nativeComponent, finalProps);
}
}

Expand Down Expand Up @@ -383,7 +370,7 @@ var _elm_native_ui$elm_native_ui$Native_NativeUi = (function () {
program: program,
node: node,
voidNode: voidNode,
customNode: F3(customNode),
customNode: F2(customNode),
string: string,
map: F2(map),
on: F2(on),
Expand Down
7 changes: 7 additions & 0 deletions src/Native/NativeUi/Elements.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const _elm_native_ui$elm_native_ui$Native_NativeUi_Elements = function () {
return {
navigationCardStack: require("NavigationCardStack"),
navigationHeader: require("NavigationHeader"),
navigationHeaderTitle: require("NavigationHeaderTitle"),
};
}();
11 changes: 10 additions & 1 deletion src/NativeUi.elm
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,23 @@ type Property msg
= Property


{-| This type represents a reference to a React component.
You should not use this type from Elm. It only exists to keep track of
JavaScript components that are passed through Elm to Native modules.
-}
type NativeComponent
= NativeComponent


{-| -}
node : String -> List (Property msg) -> List (Node msg) -> Node msg
node =
Native.NativeUi.node


{-| -}
customNode : String -> String -> Maybe String -> List (Property msg) -> List (Node msg) -> Node msg
customNode : String -> NativeComponent -> List (Property msg) -> List (Node msg) -> Node msg
customNode =
Native.NativeUi.customNode

Expand Down
7 changes: 4 additions & 3 deletions src/NativeUi/Elements.elm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module NativeUi.Elements exposing (text, image, activityIndicator, mapView, pick
-}

import NativeUi exposing (Property, Node, customNode, node)
import Native.NativeUi.Elements


{-| -}
Expand Down Expand Up @@ -125,16 +126,16 @@ view =
{-| -}
navigationCardStack : List (Property msg) -> List (Node msg) -> Node msg
navigationCardStack =
customNode "NavigationCardStack" "NavigationCardStack" Nothing
customNode "NavigationCardStack" Native.NativeUi.Elements.navigationCardStack


{-| -}
navigationHeader : List (Property msg) -> List (Node msg) -> Node msg
navigationHeader =
customNode "NavigationHeader" "NavigationHeader" Nothing
customNode "NavigationHeader" Native.NativeUi.Elements.navigationHeader


{-| -}
navigationHeaderTitle : List (Property msg) -> List (Node msg) -> Node msg
navigationHeaderTitle =
customNode "NavigationHeaderTitle" "NavigationHeaderTitle" Nothing
customNode "NavigationHeaderTitle" Native.NativeUi.Elements.navigationHeaderTitle

0 comments on commit 2a40e86

Please sign in to comment.