Skip to content

Commit cca3771

Browse files
committed
Extract a Spinner component and use for login_user loading state.
1 parent e90d7ab commit cca3771

File tree

4 files changed

+36
-22
lines changed

4 files changed

+36
-22
lines changed

src/components/App.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from containers.FormPanelContainer import FormPanelContainer
66
from containers.ButtonPanelContainer import ButtonPanelContainer
77
from containers.TodoListContainer import TodoListContainer
8+
from components.Spinner import Spinner
89

910
React = require("react")
1011
PropTypes = require("prop-types")
@@ -44,7 +45,8 @@ def render_todo_panel(self):
4445
); """)
4546

4647
def render(self):
47-
logged_in, error = destruct(self.props, "logged_in", "error")
48+
logged_in, loading, error = destruct(self.props,
49+
"logged_in", "loading", "error")
4850
visible_component = self.render_todo_panel() if logged_in else self.render_login_panel()
4951

5052
return __pragma__("xtrans", None, "{}", """ (
@@ -61,6 +63,7 @@ def render(self):
6163
<h2>My Todos</h2>
6264
</div>
6365
{visible_component}
66+
<Spinner loading={loading} />
6467
<span className="text-danger">{error}</span>
6568
</div>
6669
</Jumbotron>

src/components/Spinner.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from Component_py.stubs import require, __pragma__ # __:skip
2+
React = require("react")
3+
PropTypes = require("prop-types")
4+
RingLoader = require("react-spinners").RingLoader
5+
6+
def Spinner(props):
7+
loading = props["loading"]
8+
if not loading:
9+
return None
10+
11+
loading = True
12+
return __pragma__("xtrans", None, "{}", """ (
13+
<div className="d-flex justify-content-center align-items-center">
14+
<RingLoader
15+
color="#999"
16+
size={42}
17+
loading={loading} />
18+
Loading..
19+
</div>
20+
); """)
21+
22+
Spinner.propTypes = {
23+
"loading": PropTypes.bool.isRequired
24+
}

src/components/TodoList.py

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from Component_py.component import Component, destruct
22
from Component_py.stubs import require, __pragma__, window # __:skip
3+
from components.Spinner import Spinner
34

45
React = require("react")
56
PropTypes = require("prop-types")
67
ListGroup, ListGroupItem, Button = destruct(
78
require("reactstrap"), "ListGroup", "ListGroupItem", "Button")
8-
RingLoader = require("react-spinners").RingLoader
99
FontAwesomeIcon = require("react-fontawesome")
1010

1111

@@ -39,21 +39,6 @@ def closure():
3939
delete_todo(todo["id"], token)
4040
return closure
4141

42-
def render_spinner(self):
43-
if not self.props["loading"]:
44-
return None
45-
46-
loading = True
47-
return __pragma__("xtrans", None, "{}", """ (
48-
<div className="d-flex justify-content-center align-items-center">
49-
<RingLoader
50-
color="#999"
51-
size={42}
52-
loading={loading} />
53-
Loading..
54-
</div>
55-
); """)
56-
5742
def render_checkmark(self, todo):
5843
if not todo["complete"]:
5944
return None
@@ -92,7 +77,7 @@ def render_list_item(self, todo):
9277
); """)
9378

9479
def render(self):
95-
todos, error = destruct(self.props, "todos", "error")
80+
todos, error, loading = destruct(self.props, "todos", "error", "loading")
9681
list_items = map(self.render_list_item, todos)
9782

9883
return __pragma__("xtrans", None, "{}", """ (
@@ -101,6 +86,6 @@ def render(self):
10186
{list_items}
10287
</ListGroup>
10388
<span className="text-danger">{error}</span>
104-
{self.render_spinner()}
89+
<Spinner loading={loading} />
10590
</div>
10691
); """)

src/containers/AppContainer.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55

66

77
def mapStateToProps(state):
8-
text, logged_in = destruct(state["login_user"], "text", "logged_in")
8+
logged_in, loading, error = destruct(state["login_user"],
9+
"logged_in", "loading", "error")
910
return {
10-
"text": text,
11-
"logged_in": logged_in
11+
"logged_in": logged_in,
12+
"loading": loading,
13+
"error": error
1214
}
1315

1416

0 commit comments

Comments
 (0)