Skip to content

Commit

Permalink
Change dynamic handler rendering API
Browse files Browse the repository at this point in the history
  • Loading branch information
awetzel committed Feb 3, 2015
1 parent a3cd9a3 commit f3a9929
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 27 deletions.
28 changes: 14 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,14 +124,14 @@ server and the client side : this is done by attaching `reaxt_server_render`
and/or `reaxt_client_render` to the module or object referenced by the first
argument of `Reaxt.render!(`.

- `reaxt_server_render(arg,callback)` will take `arg` from the second
argument of `Reaxt.render`, and have to execute
`callback(handler,props,param)` when the wanting handler and props
are determined. `param` is any stringifyable object.
- `reaxt_client_render(props,elemid,param)` have to render the
- `reaxt_server_render(arg,render)` will
- take `arg` from the second argument of `Reaxt.render`,
- have to execute `render(component,param)` when the wanting handler and props
are determined. `param` is any stringifyable object passed to client rendering
- `reaxt_client_render(props,render,param)` have to render the
good selected component on the client side.
- `props` is the initial props used in server rendering,
- `elemid` is the element id choosen as parameter of `renderobj.js_render` on server
- `render` is function you have to call to make the client react rendering
- `param` is the deserialized version of the third parameter of the callback in `reaxt_server_render`

To understand how they work, let's look at the default implementation
Expand All @@ -140,13 +140,13 @@ of these functions (what happened when they are not implemented).
```javascript
// default server rendering only take the exported module as the
// handler to render and the argument as the props
default_reaxt_server_render = function(arg,callback){
callback(this,arg,null)
default_reaxt_server_render = function(arg,render){
render(<this {...arg}/>,null)
}
// default client rendering only take the exported module as the
// handler to render, the param is ignored
default_reaxt_client_render = function(props,elemid,param){
React.render(React.createElement(this,props),document.getElementById(elemid))
default_reaxt_client_render = function(props,render,param){
render(<this {...props}/>)
}
```

Expand All @@ -163,14 +163,14 @@ var App = require("./app")
var Router = require("react-router")
var Routes = require("./routes")
module.exports = {
reaxt_server_render: function(path,callback){
reaxt_server_render: function(path,render){
Router.run(Routes, path,function (Handler, state) {
callback(Handler,{})
render(<Handler/>)
})
},
reaxt_client_render: function(props,elemid){
reaxt_client_render: function(props,render){
Router.run(Routes,Router.HistoryLocation,function(Handler,state){
React.render(React.createElement(Handler,props),document.getElementById(elemid))
render(<Handler {...props}/>)
})
}
}
Expand Down
8 changes: 7 additions & 1 deletion lib/tasks.ex
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,14 @@ end

defmodule Mix.Tasks.Compile.Reaxt_webpack do
def run(args) do
if !File.exists?("web/node_modules"), do:
if !File.exists?("web/node_modules") do
Mix.Task.run("npm.install", args)
else
installed_version = Poison.decode!(File.read!("web/node_modules/reaxt/package.json"))["version"]
current_version = Poison.decode!(File.read!("#{:code.priv_dir(:reaxt)}/commonjs_reaxt/package.json"))["version"]
if installed_version !== current_version, do:
Mix.Task.run("npm.install", args)
end

if !Application.get_env(:reaxt,:hot), do:
Mix.Task.run("webpack.compile", args)
Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ defmodule Reaxt.Mixfile do

def project do
[app: :reaxt,
version: "0.2.1",
version: "0.2.2",
description: description,
package: package,
elixir: "~> 1.0",
Expand Down
8 changes: 5 additions & 3 deletions priv/commonjs_reaxt/client_entry_addition.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
var React = require("react")

function default_client_render(props,elemid,param){
React.render(React.createElement(this,props),document.getElementById(elemid))
function default_client_render(props,render,param){
render(React.createElement(this,props))
}

window.reaxt_render = function(module,submodule,props,param){
module = require("./../../components/"+module)
submodule = (submodule) ? module[submodule] :module
submodule.reaxt_client_render = submodule.reaxt_client_render || default_client_render
return function(elemid){
submodule.reaxt_client_render(props,elemid,param)
submodule.reaxt_client_render(props,function(comp){
React.render(comp,document.getElementById(elemid))
},param)
}
}
2 changes: 1 addition & 1 deletion priv/commonjs_reaxt/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "reaxt",
"version": "0.0.3",
"version": "0.0.5",
"description": "A react templating server for erlang/elixir",
"dependencies": {
"webpack": "^1.4.13",
Expand Down
14 changes: 7 additions & 7 deletions priv/commonjs_reaxt/react_server.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ function safe_stringify(props){
.replace(/<!--/g, '<\\!--')
}

function rendering(handler,props,module,submodule,param){
var render_params = safe_stringify([module,submodule,props,param])
function rendering(component,module,submodule,param){
var render_params = safe_stringify([module,submodule,component.props,param])
var js_render = "(window.reaxt_render.apply(window,"+render_params+"))"
try{
var html
var css = styleCollector.collect(function() {
html = React.renderToString(React.createElement(handler,props))
html = React.renderToString(component)
})
return Bert.tuple(Bert.atom("ok"),{
html: html,
Expand All @@ -34,8 +34,8 @@ function rendering(handler,props,module,submodule,param){
}
}

function default_server_render(arg,callback){
callback(this,arg)
function default_server_render(arg,render){
render(React.createElement(this,arg))
}

// protocol :
Expand All @@ -50,8 +50,8 @@ Server(function(term,from,state,done){
submodule = (submodule == "nil") ? undefined : submodule
handler = (!submodule) ? handler : handler[submodule]
handler.reaxt_server_render = handler.reaxt_server_render || default_server_render
handler.reaxt_server_render(args,function(dynhandler,props,param){
done("reply",rendering(dynhandler,props,module,submodule,param))
handler.reaxt_server_render(args,function(component,param){
done("reply",rendering(component,module,submodule,param))
})
}catch(error){
done("reply",
Expand Down

0 comments on commit f3a9929

Please sign in to comment.