Skip to content
This repository was archived by the owner on Oct 19, 2018. It is now read-only.

Commit b3840c4

Browse files
committed
Fix todos bug
1 parent 2392095 commit b3840c4

File tree

4 files changed

+27
-25
lines changed

4 files changed

+27
-25
lines changed

example/todos/app/application.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
require "components/app.react"
1111

1212
Document.ready? do
13-
# Render the top-level React.rb component, it will take care the rest
14-
React.render React.create_element(TodoAppView), Element.find('#todoapp').get(0)
13+
element = React.create_element(TodoAppView, filter: "all")
14+
component = React.render(element, Element.find('#todoapp').get(0))
15+
16+
Vienna::Router.new.tap do |router|
17+
router.route('/:filter') do |params|
18+
component.set_props(filter: params[:filter].empty? ? "all" : params[:filter])
19+
end
20+
end.update
21+
1522
end

example/todos/app/components/app.react.rb

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,27 @@ class TodoAppView
77

88
KEY_ENTER = 13
99

10-
define_state(:todos) { [] }
11-
define_state(:current_filter) { "all" }
10+
params do
11+
requires :filter, values: ["all", "active", "completed"]
12+
end
1213

13-
before_mount :set_up
14+
define_state(:todos) { [] }
1415

15-
def set_up
16-
Todo.on(:create) { Todo.adapter.sync_models(Todo); reload_current }
17-
Todo.on(:update) { Todo.adapter.sync_models(Todo); reload_current }
18-
Todo.on(:destroy) { Todo.adapter.sync_models(Todo); reload_current }
19-
router.update
16+
before_mount do
17+
Todo.on(:create) { Todo.adapter.sync_models(Todo); reload_current_filter }
18+
Todo.on(:update) { Todo.adapter.sync_models(Todo); reload_current_filter }
19+
Todo.on(:destroy) { Todo.adapter.sync_models(Todo); reload_current_filter }
2020
end
2121

22-
def router
23-
@router ||= Vienna::Router.new.tap do |router|
24-
router.route('/:filter') do |params|
25-
apply_filter(params[:filter].empty? ? "all" : params[:filter])
26-
end
27-
end
22+
before_receive_props do |next_props|
23+
apply_filter next_props[:filter]
2824
end
2925

30-
def reload_current
31-
apply_filter(current_filter)
26+
def reload_current_filter
27+
apply_filter(params[:filter])
3228
end
3329

3430
def apply_filter(filter)
35-
self.current_filter = filter
3631
Todo.adapter.find_all(Todo) do |models|
3732
case filter
3833
when "all"
@@ -60,7 +55,7 @@ def render
6055
input(id: "new-todo", placeholder: "What needs to be done?").on(:key_down) { |e| handle_keydown(e) }
6156
end
6257
present TodoList, todos: self.todos
63-
present Footer, selected_filter: self.current_filter
58+
present Footer, selected_filter: params[:filter]
6459
end
6560
end
6661
end

example/todos/app/components/footer.react.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def render
1717
{href: "#/active", filter: "active"},
1818
{href: "#/completed", filter: "completed"}]
1919
filters.map do |item|
20-
li { a(href: item[:href], class_name: {selected: params[:selectedFilter] == item[:filter]}) { item[:filter].capitalize } }
20+
li { a(href: item[:href], class_name: {selected: params[:selected_filter] == item[:filter]}) { item[:filter].capitalize } }
2121
end
2222
end
2323

lib/react/component.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,19 @@ def component_did_mount
5050
end
5151

5252
def component_will_receive_props(next_props)
53-
self.run_callback(:before_receive_props, next_props)
53+
self.run_callback(:before_receive_props, Hash.new(next_props))
5454
end
5555

5656
def should_component_update?(next_props, next_state)
57-
self.respond_to?(:needs_update?) ? self.needs_update? : true
57+
self.respond_to?(:needs_update?) ? self.needs_update?(Hash.new(next_props), Hash.new(next_state)) : true
5858
end
5959

6060
def component_will_update(next_props, next_state)
61-
self.run_callback(:before_update, next_props, next_state)
61+
self.run_callback(:before_update, Hash.new(next_props), Hash.new(next_state))
6262
end
6363

6464
def component_did_update(prev_props, prev_state)
65-
self.run_callback(:after_update, prev_props, prev_state)
65+
self.run_callback(:after_update, Hash.new(prev_props), Hash.new(prev_state))
6666
end
6767

6868
def component_will_unmount

0 commit comments

Comments
 (0)