Skip to content

Commit

Permalink
copy controllers code to here - a start of something beautiful
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielZlotin committed Sep 7, 2016
1 parent 55696c5 commit 18b1e8f
Showing 60 changed files with 8,853 additions and 0 deletions.
10 changes: 10 additions & 0 deletions controllers/Constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

export const MMDRAWER_DOOR = 'door';
export const MMDRAWER_PARALLAX = 'parallax';
export const MMDRAWER_SLIDE = 'slide';
export const MMDRAWER_SLIDE_AND_SCALE = 'slide-and-scale';

export const THE_SIDEBAR_AIRBNB = 'airbnb';
export const THE_SIDEBAR_FACEBOOK = 'facebook';
export const THE_SIDEBAR_LUVOCRACY = 'luvocracy';
export const THE_SIDEBAR_WUNDER_LIST = 'wunder-list';
309 changes: 309 additions & 0 deletions controllers/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,309 @@
var OriginalReactNative = require('react-native');
var RCCManager = OriginalReactNative.NativeModules.RCCManager;
var NativeAppEventEmitter = OriginalReactNative.NativeAppEventEmitter;
var utils = require('./utils');
var Constants = require('./Constants');
var resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource');
var processColor = OriginalReactNative.processColor;

var _controllerRegistry = {};

function _getRandomId() {
return (Math.random()*1e20).toString(36);
}

function _processProperties(properties) {
for (var property in properties) {
if (properties.hasOwnProperty(property)) {
if (property === 'icon' || property.endsWith('Icon') || property.endsWith('Image')) {
properties[property] = resolveAssetSource(properties[property]);
}
if (property === 'color' || property.endsWith('Color')) {
properties[property] = processColor(properties[property]);
}
if (property === 'buttons' || property.endsWith('Buttons')) {
_processButtons(properties[property]);
}
}
}
}

function _setListener(callbackId, func) {
return NativeAppEventEmitter.addListener(callbackId, (...args) => func(...args));
}

function _processButtons(buttons) {
if (!buttons) return;
var unsubscribes = [];
for (var i = 0 ; i < buttons.length ; i++) {
buttons[i] = Object.assign({}, buttons[i]);
var button = buttons[i];
_processProperties(button);
if (typeof button.onPress === "function") {
var onPressId = _getRandomId();
var onPressFunc = button.onPress;
button.onPress = onPressId;
var unsubscribe = _setListener(onPressId, onPressFunc);
unsubscribes.push(unsubscribe);
}
}
return function () {
for (var i = 0 ; i < unsubscribes.length ; i++) {
if (unsubscribes[i]) { unsubscribes[i](); }
}
};
}

function _validateDrawerProps(layout) {
if (layout.type === "DrawerControllerIOS") {
let shouldSetToDefault = true;

const drawerProps = layout.props;
if (drawerProps.type === "MMDrawer") {
[ Constants.MMDRAWER_DOOR, Constants.MMDRAWER_PARALLAX, Constants.MMDRAWER_SLIDE, Constants.MMDRAWER_SLIDE_AND_SCALE].forEach(function(type) {
if (type === drawerProps.animationType){
shouldSetToDefault = false;
}
})
}
else if (drawerProps.type === "TheSideBar") {
[Constants.THE_SIDEBAR_AIRBNB, Constants.THE_SIDEBAR_FACEBOOK, Constants.THE_SIDEBAR_LUVOCRACY, Constants.THE_SIDEBAR_WUNDER_LIST].forEach(function(type) {
if (type === drawerProps.animationType){
shouldSetToDefault = false;
}
})
}

if (shouldSetToDefault) {
console.warn("Set to default type=MMDrawer animationType=slide");
drawerProps.type = "MMDrawer";
drawerProps.animationType = "slide";
}
}
}


var Controllers = {

createClass: function (app) {
return app;
},

hijackReact: function () {
return {
createElement: function(type, props) {
var children = Array.prototype.slice.call(arguments, 2);
var flatChildren = utils.flattenDeep(children);
props = Object.assign({}, props);
_processProperties(props);
if (props['style']) {
props['style'] = Object.assign({}, props['style']);
_processProperties(props['style']);
}
return {
'type': type.name,
'props': props,
'children': flatChildren
};
},

ControllerRegistry: Controllers.ControllerRegistry,
TabBarControllerIOS: {name: 'TabBarControllerIOS', Item: {name: 'TabBarControllerIOS.Item'}},
NavigationControllerIOS: {name: 'NavigationControllerIOS'},
ViewControllerIOS: {name: 'ViewControllerIOS'},
DrawerControllerIOS: {name: 'DrawerControllerIOS'},
};
},

ControllerRegistry: {
registerController: function (appKey, getControllerFunc) {
_controllerRegistry[appKey] = getControllerFunc();
},
setRootController: function (appKey, animationType = 'none', passProps = {}) {
var controller = _controllerRegistry[appKey];
if (controller === undefined) return;
var layout = controller.render();
_validateDrawerProps(layout);
RCCManager.setRootController(layout, animationType, passProps);
}
},

NavigationControllerIOS: function (id) {
return {
push: function (params) {
var unsubscribes = [];
if (params['style']) {
params['style'] = Object.assign({}, params['style']);
_processProperties(params['style']);
}
if (params['titleImage']) {
params['titleImage'] = resolveAssetSource(params['titleImage']);
}
if (params['leftButtons']) {
var unsubscribe = _processButtons(params['leftButtons']);
unsubscribes.push(unsubscribe);
}
if (params['rightButtons']) {
var unsubscribe = _processButtons(params['rightButtons']);
unsubscribes.push(unsubscribe);
}
RCCManager.NavigationControllerIOS(id, "push", params);
return function() {
for (var i = 0 ; i < unsubscribes.length ; i++) {
if (unsubscribes[i]) { unsubscribes[i](); }
}
};
},
pop: function (params) {
RCCManager.NavigationControllerIOS(id, "pop", params);
},
popToRoot: function (params) {
RCCManager.NavigationControllerIOS(id, "popToRoot", params);
},
setTitle: function (params) {
if (params['style']) {
params['style'] = Object.assign({}, params['style']);
_processProperties(params['style']);
}
if (params['titleImage']) {
params['titleImage'] = resolveAssetSource(params['titleImage']);
}
RCCManager.NavigationControllerIOS(id, "setTitle", params);
},
resetTo: function (params) {
var unsubscribes = [];
if (params['style']) {
params['style'] = Object.assign({}, params['style']);
_processProperties(params['style']);
}
if (params['leftButtons']) {
var unsubscribe = _processButtons(params['leftButtons']);
unsubscribes.push(unsubscribe);
}
if (params['rightButtons']) {
var unsubscribe = _processButtons(params['rightButtons']);
unsubscribes.push(unsubscribe);
}
RCCManager.NavigationControllerIOS(id, "resetTo", params);
return function() {
for (var i = 0 ; i < unsubscribes.length ; i++) {
if (unsubscribes[i]) { unsubscribes[i](); }
}
};
},
setLeftButton: function () {
console.error('setLeftButton is deprecated, see setLeftButtons');
},
setLeftButtons: function (buttons, animated = false) {
var unsubscribe = _processButtons(buttons);
RCCManager.NavigationControllerIOS(id, "setButtons", {buttons: buttons, side: "left", animated: animated});
return unsubscribe;
},
setRightButtons: function (buttons, animated = false) {
var unsubscribe = _processButtons(buttons);
RCCManager.NavigationControllerIOS(id, "setButtons", {buttons: buttons, side: "right", animated: animated});
return unsubscribe;
},
setHidden: function(params = {}) {
RCCManager.NavigationControllerIOS(id, "setHidden", params);
}
};
},

DrawerControllerIOS: function (id) {
return {
open: function (params) {
return RCCManager.DrawerControllerIOS(id, "open", params);
},
close: function (params) {
return RCCManager.DrawerControllerIOS(id, "close", params);
},
toggle: function (params) {
return RCCManager.DrawerControllerIOS(id, "toggle", params);
},
setStyle: function (params) {
return RCCManager.DrawerControllerIOS(id, "setStyle", params);
}
};
},

TabBarControllerIOS: function (id) {
return {
setHidden: function (params) {
return RCCManager.TabBarControllerIOS(id, "setTabBarHidden", params);
},
setBadge: function (params) {
return RCCManager.TabBarControllerIOS(id, "setBadge", params);
},
switchTo: function (params) {
return RCCManager.TabBarControllerIOS(id, "switchTo", params);
}
};
},

Modal: {
showLightBox: function(params) {
params['style'] = Object.assign({}, params['style']);
_processProperties(params['style']);
RCCManager.modalShowLightBox(params);
},
dismissLightBox: function() {
RCCManager.modalDismissLightBox();
},
showController: function(appKey, animationType = 'slide-up', passProps = {}) {
var controller = _controllerRegistry[appKey];
if (controller === undefined) return;
var layout = controller.render();
_validateDrawerProps(layout);
RCCManager.showController(layout, animationType, passProps);
},
dismissController: function(animationType = 'slide-down') {
RCCManager.dismissController(animationType);
},
dismissAllControllers: function(animationType = 'slide-down') {
RCCManager.dismissAllControllers(animationType);
}
},

Notification: {
show: async function(params = {}) {
await RCCManager.showNotification(params);
},
dismiss: async function(params = {}) {
await RCCManager.dismissNotification(params);
},
AnimationPresets: {
default: {
animated: true,
duration: 0.5,
damping: 0.65,
type: 'slide-down',
fade: true
},
simple: {
animated: true,
duration: 0.3,
type: 'slide-down',
fade: true
},
swing: {
animated: true,
duration: 0.65,
damping: 0.6,
type: 'swing'
},
fade: {
animated: true,
duration: 0.3,
fade: true
}
}
},

NavigationToolBarIOS: OriginalReactNative.requireNativeComponent('RCCToolBar', null),

Constants: Constants
};

module.exports = Controllers;

Loading

0 comments on commit 18b1e8f

Please sign in to comment.