Skip to content

Commit

Permalink
make compilation errors and other problems appear in simulator screen #8
Browse files Browse the repository at this point in the history


- do not use AppRegistry.registerRunnable for mounting component to id 1, this prevents warning to be shown in yellow box. Instead use AppRegistry.registerComponent
- shim some document functions so that enabled figwheel heads-up-display works without errors and logs warnings to console (that will be shown on screen in yellow box)
- figwheel splash component now loads real app and renders root component. That has to be done to avoid using AppRegistry.registerRunnable to render real app
  • Loading branch information
drapanjanas committed Jan 9, 2016
1 parent 253f23f commit a1d875f
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 39 deletions.
9 changes: 3 additions & 6 deletions resources/cljs/core.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
(defn alert [title]
(.alert (.-Alert js/React) title))

(defn widget []
(defn app-root []
(let [greeting (subscribe [:get-greeting])]
(fn []
[view {:style {:flex-direction "column" :margin 40 :align-items "center"}}
Expand All @@ -29,9 +29,6 @@
:on-press #(alert "HELLO!")}
[text {:style {:color "white" :text-align "center" :font-weight "bold"}} "press me"]]])))

(defn mount-root []
(r/render [widget] 1))

(defn ^:export init []
(defn init []
(dispatch-sync [:initialize-db])
(.registerRunnable app-registry "$PROJECT_NAME$" #(mount-root)))
(.registerComponent app-registry "$PROJECT_NAME$" #(r/reactify-component app-root)))
16 changes: 9 additions & 7 deletions resources/cljs/main_dev.cljs
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
(ns ^:figwheel-no-load env.$PLATFORM$.main
(:require [$PROJECT_NAME_HYPHENATED$.$PLATFORM$.core :as core]
(:require [reagent.core :as r]
[$PROJECT_NAME_HYPHENATED$.$PLATFORM$.core :as core]
[figwheel.client :as figwheel :include-macros true]))

(enable-console-print!)

(def cnt (r/atom 0))
(defn reloader [] @cnt [core/app-root])
(def root-el (r/as-element [reloader]))

(figwheel/watch-and-reload
:websocket-url "ws://$DEV_HOST$:3449/figwheel-ws"
:heads-up-display false
:jsload-callback core/mount-root)

(core/init)
(core/mount-root)

:heads-up-display true
:jsload-callback #(swap! cnt inc))

(core/init)
89 changes: 63 additions & 26 deletions resources/figwheel-bridge.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,46 @@

var CLOSURE_UNCOMPILED_DEFINES = null;

var React = require('react-native');

var config = {
basePath: "target/",
googBasePath: 'goog/',
splash: React.createClass({
render: function () {
var plainStyle = {flex: 1, alignItems: 'center', justifyContent: 'center'};
return (
<React.View style={plainStyle}>
<React.Text>Waiting for Figwheel to load files.</React.Text>
</React.View>
);
}
})
googBasePath: 'goog/'
};

var React = require('react-native');
var self;
var scriptQueue = [];
var server = null; // will be set dynamically
var fileBasePath = null; // will be set dynamically
var evaluate = eval; // This is needed, direct calls to eval does not work (RN packager???)
var externalModules = {};
var evalListeners = []; // functions to be called when a script is evaluated

var figwheelApp = function (platform, devHost) {
return React.createClass({
getInitialState: function () {
return {loaded: false}
},
render: function () {
if (!this.state.loaded) {
var plainStyle = {flex: 1, alignItems: 'center', justifyContent: 'center'};
return (
<React.View style={plainStyle}>
<React.Text>Waiting for Figwheel to load files.</React.Text>
</React.View>
);
}
return this.state.root;
},
componentDidMount: function () {
var app = this;
if (typeof goog === "undefined") {
loadApp(platform, devHost, function(appRoot) {
app.setState({root: appRoot, loaded: true})
});
}
}
})
};

// evaluates js code ensuring proper ordering
function customEval(url, javascript, success, error) {
Expand All @@ -38,9 +55,9 @@ function customEval(url, javascript, success, error) {
evaluate(javascript);
console.info('Evaluated: ' + url);
scriptQueue.shift();
if (url.indexOf('jsloader') > -1) {
shimJsLoader();
}
evalListeners.forEach(function (listener) {
listener(url)
});
success();
} catch (e) {
console.error('Evaluation error in: ' + url);
Expand Down Expand Up @@ -93,7 +110,6 @@ function importJs(src, success, error) {
asyncImportScripts(filePath, success, error);
}


function interceptRequire() {
var oldRequire = window.require;
console.info("Shimming require");
Expand All @@ -106,10 +122,29 @@ function interceptRequire() {
};
}

function loadApp(platform, devHost) {
// do not show debug messages in yellow box
function debugToLog() {
console.debug = console.log;
}

function loadApp(platform, devHost, onLoadCb) {
server = "http://" + devHost + ":8081";
fileBasePath = config.basePath + platform;

evalListeners.push(function (url) {
if (url.indexOf('jsloader') > -1) {
shimJsLoader();
}
});

// callback when app is ready to get the reloadable component
evalListeners.push(function (url) {
if (url.indexOf('main.js') > -1) {
onLoadCb(env[platform].main.root_el);
console.log('Done loading Clojure app');
}
});

if (typeof goog === "undefined") {
console.log('Loading Closure base.');
interceptRequire();
Expand All @@ -118,25 +153,20 @@ function loadApp(platform, devHost) {
fakeLocalStorageAndDocument();
importJs('cljs_deps.js');
importJs('goog/deps.js', function () {

debugToLog();
// This is needed because of RN packager
// seriously React packager? why.
var googreq = goog.require;

googreq('figwheel.connect');
googreq('env.' + platform + '.main');

console.log('Done loading Clojure app');
});
});
}
}

function startApp(appName, platform, devHost) {
React.AppRegistry.registerComponent(appName, () => config.splash);
if (typeof goog === "undefined") {
loadApp(platform, devHost);
}
React.AppRegistry.registerComponent(
appName, () => figwheelApp(platform, devHost));
}

function withModules(moduleById) {
Expand Down Expand Up @@ -179,6 +209,13 @@ function fakeLocalStorageAndDocument() {
console.debug = console.warn;
window.addEventListener = function () {
};
// make figwheel think that heads-up-display divs are there
window.document.querySelector = function (selector) {
return {};
};
window.document.getElementById = function (id) {
return {style:{}};
};
}

// Figwheel fixes
Expand Down

0 comments on commit a1d875f

Please sign in to comment.