You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.1 KiB
103 lines
3.1 KiB
/** |
|
* Copyright 2014-2015, Facebook, Inc. |
|
* All rights reserved. |
|
* |
|
* This source code is licensed under the BSD-style license found in the |
|
* LICENSE file in the root directory of this source tree. An additional grant |
|
* of patent rights can be found in the PATENTS file in the same directory. |
|
* |
|
* @providesModule ReactNativeComponent |
|
*/ |
|
|
|
'use strict'; |
|
|
|
var assign = require("./Object.assign"); |
|
var invariant = require("./invariant"); |
|
|
|
var autoGenerateWrapperClass = null; |
|
var genericComponentClass = null; |
|
// This registry keeps track of wrapper classes around native tags |
|
var tagToComponentClass = {}; |
|
var textComponentClass = null; |
|
|
|
var ReactNativeComponentInjection = { |
|
// This accepts a class that receives the tag string. This is a catch all |
|
// that can render any kind of tag. |
|
injectGenericComponentClass: function(componentClass) { |
|
genericComponentClass = componentClass; |
|
}, |
|
// This accepts a text component class that takes the text string to be |
|
// rendered as props. |
|
injectTextComponentClass: function(componentClass) { |
|
textComponentClass = componentClass; |
|
}, |
|
// This accepts a keyed object with classes as values. Each key represents a |
|
// tag. That particular tag will use this class instead of the generic one. |
|
injectComponentClasses: function(componentClasses) { |
|
assign(tagToComponentClass, componentClasses); |
|
}, |
|
// Temporary hack since we expect DOM refs to behave like composites, |
|
// for this release. |
|
injectAutoWrapper: function(wrapperFactory) { |
|
autoGenerateWrapperClass = wrapperFactory; |
|
} |
|
}; |
|
|
|
/** |
|
* Get a composite component wrapper class for a specific tag. |
|
* |
|
* @param {ReactElement} element The tag for which to get the class. |
|
* @return {function} The React class constructor function. |
|
*/ |
|
function getComponentClassForElement(element) { |
|
if (typeof element.type === 'function') { |
|
return element.type; |
|
} |
|
var tag = element.type; |
|
var componentClass = tagToComponentClass[tag]; |
|
if (componentClass == null) { |
|
tagToComponentClass[tag] = componentClass = autoGenerateWrapperClass(tag); |
|
} |
|
return componentClass; |
|
} |
|
|
|
/** |
|
* Get a native internal component class for a specific tag. |
|
* |
|
* @param {ReactElement} element The element to create. |
|
* @return {function} The internal class constructor function. |
|
*/ |
|
function createInternalComponent(element) { |
|
("production" !== process.env.NODE_ENV ? invariant( |
|
genericComponentClass, |
|
'There is no registered component for the tag %s', |
|
element.type |
|
) : invariant(genericComponentClass)); |
|
return new genericComponentClass(element.type, element.props); |
|
} |
|
|
|
/** |
|
* @param {ReactText} text |
|
* @return {ReactComponent} |
|
*/ |
|
function createInstanceForText(text) { |
|
return new textComponentClass(text); |
|
} |
|
|
|
/** |
|
* @param {ReactComponent} component |
|
* @return {boolean} |
|
*/ |
|
function isTextComponent(component) { |
|
return component instanceof textComponentClass; |
|
} |
|
|
|
var ReactNativeComponent = { |
|
getComponentClassForElement: getComponentClassForElement, |
|
createInternalComponent: createInternalComponent, |
|
createInstanceForText: createInstanceForText, |
|
isTextComponent: isTextComponent, |
|
injection: ReactNativeComponentInjection |
|
}; |
|
|
|
module.exports = ReactNativeComponent;
|
|
|