Skip to content

Commit 1ce181a

Browse files
committed
add redux and server api
1 parent 53c21d6 commit 1ce181a

File tree

10 files changed

+121
-70
lines changed

10 files changed

+121
-70
lines changed

index.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const app = express()
33
const cors = require('cors')
44
const path = require('path')
55
const PORT = process.env.PORT || 3000
6+
const favicon = require('serve-favicon')
67

78

89

@@ -15,10 +16,10 @@ const PORT = process.env.PORT || 3000
1516

1617

1718

19+
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
1820

1921
app.use(express.static(path.join(__dirname, 'public')))
2022

21-
2223
app.use(cors())
2324

2425
app.get('*', (req, res) => {

package-lock.json

+12-24
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"redux-logger": "^3.0.6",
7777
"redux-promise-middleware": "^5.0.0",
7878
"redux-thunk": "^2.2.0",
79+
"serve-favicon": "^2.4.5",
7980
"smoothscroll-polyfill": "^0.4.0",
8081
"sugarss": "^1.0.0",
8182
"webpack-bundle-analyzer": "^2.9.1"

public/favicon.ico

1.12 KB
Binary file not shown.

src/actions/table.action.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import * as API from "../api/api";
2+
3+
export const GET_TABLE = "GET_TABLE"
4+
export const SAVE_TABLE = "SAVE_TABLE"
5+
6+
export const getTable = () => ({
7+
type: GET_TABLE,
8+
payload: API.get('/table')
9+
})
10+
11+
export const saveTable = (data) => ({
12+
type: SAVE_TABLE,
13+
payload: API.post('/table', data)
14+
})

src/api/api.js

+1-34
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import axios from 'axios'
22
import urlencodeForm from "../services/urlencodeForm";
33

4-
export const API_URL = 'https://transfer-api.herokuapp.com'
4+
export const API_URL = 'http://localhost:8080'
55

66

77
export async function get(url) {
@@ -13,36 +13,3 @@ export async function post(url, data) {
1313
const response = await axios.post(API_URL + url, data)
1414
return response.data
1515
}
16-
17-
export function registerUser(form) {
18-
19-
form = urlencodeForm(form)
20-
21-
return new Promise((resolve, reject) => {
22-
axios.post(API_URL + '/register', form)
23-
.then(response => {
24-
resolve(response.data.token)
25-
26-
}).catch(error => {
27-
reject(error.response.data)
28-
})
29-
})
30-
}
31-
32-
export async function loginUser(form) {
33-
34-
form = urlencodeForm(form)
35-
36-
// const data = await post('/login', form)
37-
//
38-
// return data.token
39-
return new Promise((resolve, reject) => {
40-
axios.post(API_URL + '/login', form)
41-
.then(response => {
42-
resolve(response.data.token)
43-
44-
}).catch(error => {
45-
reject(error.response.data)
46-
})
47-
})
48-
}

src/components/DinamicTable.jsx

+11-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ export default class DinamicTable extends React.Component {
1212
componentDidMount() {
1313
const dataSource = this.props.data
1414
const columns = this.props.columns
15-
1615
dataSource.forEach((item) => {
1716
while (item.length < columns.length) {
1817
item.push("")
@@ -35,10 +34,15 @@ export default class DinamicTable extends React.Component {
3534
items: JSON.parse(target.dataset.select)
3635
}
3736
} else {
38-
dataSource[rowIndex][columnIndex] = fieldValue;
39-
}
37+
if (!isNaN(parseFloat(fieldValue)) && isFinite(fieldValue)) {
38+
dataSource[rowIndex][columnIndex] = parseFloat(fieldValue);
4039

40+
} else {
41+
dataSource[rowIndex][columnIndex] = fieldValue;
42+
}
43+
}
4144

45+
this.props.onChange(this.state.dataSource, this.state.columns)
4246
this.setState({dataSource})
4347
}
4448

@@ -50,7 +54,7 @@ export default class DinamicTable extends React.Component {
5054
const {columns} = this.state
5155

5256
columns[rowIndex] = fieldValue;
53-
57+
this.props.onChange(this.state.dataSource, this.state.columns)
5458
this.setState({columns})
5559
}
5660

@@ -64,12 +68,14 @@ export default class DinamicTable extends React.Component {
6468
return item
6569
})
6670

71+
this.props.onChange(this.state.dataSource, this.state.columns)
6772
this.setState({columns, dataSource})
6873
}
6974

7075
handleAddRow() {
7176
const {columns, dataSource} = this.state
7277
dataSource.push(Array(columns.length).fill(""))
78+
this.props.onChange(this.state.dataSource, this.state.columns)
7379
this.setState({dataSource})
7480
}
7581

@@ -80,7 +86,7 @@ export default class DinamicTable extends React.Component {
8086
<thead>
8187
<tr>
8288
{columns.map((column, key) =>
83-
<HeaderCell value={column} onEdit={this.handleAddColumn.bind(this)} key={key} data={{key}}/>
89+
<HeaderCell value={column} onEdit={this.editColumn.bind(this)} key={key} data={{key}}/>
8490
)}
8591
<th>
8692
<i className='fa fa-plus' onClick={this.handleAddColumn.bind(this)}/>
@@ -102,4 +108,3 @@ export default class DinamicTable extends React.Component {
102108
</Table>
103109
}
104110
}
105-

src/pages/Index.jsx

+41-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, {Component} from 'react'
2-
2+
import {getTable, saveTable} from "../actions/table.action";
3+
import {connect} from "react-redux";
34
import Layout from "../components/Layout";
45
import DinamicTable from "../components/DinamicTable";
56

@@ -39,15 +40,51 @@ const table = {
3940
'DROPDOWN',
4041
]
4142
}
42-
43+
@connect((store) => store.table)
4344
export default class Index extends Component {
4445

46+
timer = null
47+
48+
componentDidMount() {
49+
this.props.dispatch(getTable())
50+
}
51+
52+
getUpdatedTable(dataSource, columns) {
53+
54+
clearTimeout(this.timer)
55+
const data = dataSource.map(item => ({
56+
text: item[0],
57+
number1: item[1],
58+
number2: item[2],
59+
dropdown: item[4]
60+
}))
61+
62+
const table = {
63+
data,
64+
columns
65+
}
66+
67+
this.timer = setTimeout(() => {
68+
this.props.dispatch(saveTable(table))
69+
}, 1000);
70+
}
4571

4672
render() {
73+
const {data,columns} = this.props
74+
75+
if (!data) return null
4776
return <Layout>
4877
<DinamicTable
49-
data={table.dataSource}
50-
columns={table.columns}
78+
columns={columns}
79+
data={data.map(item => [
80+
item.text,
81+
item.number1,
82+
item.number2,
83+
item.number1 + item.number2,
84+
item.dropdown
85+
])}
86+
onChange={this.getUpdatedTable.bind(this)}
87+
5188
/>
5289
</Layout>
5390
}

src/reducers/table.reducer.js

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import {GET_TABLE} from "../actions/table.action";
2+
3+
const initialState = {
4+
token: null,
5+
loading: false,
6+
errors: [],
7+
};
8+
9+
export default (state = initialState, {type, payload}) => {
10+
switch (type) {
11+
case GET_TABLE + "_PENDING":
12+
return {
13+
...state,
14+
loading: true,
15+
}
16+
17+
case GET_TABLE + "_FULFILLED":
18+
return {
19+
...state,
20+
data: payload.data,
21+
columns: payload.columns,
22+
loading: false
23+
}
24+
25+
case GET_TABLE + "_REJECTED":
26+
return {
27+
...state,
28+
errors: payload,
29+
loading: false
30+
}
31+
32+
33+
default: {
34+
return state;
35+
}
36+
}
37+
};

src/store.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import {createBrowserHistory} from 'history'
44
import {routerMiddleware, routerReducer} from 'react-router-redux'
55
import {composeWithDevTools} from 'redux-devtools-extension'
66
import promiseMiddleware from 'redux-promise-middleware'
7-
7+
import tableReducer from './reducers/table.reducer.js'
88
const reducers = combineReducers({
99
router: routerReducer,
10+
table: tableReducer
1011
})
1112

1213

0 commit comments

Comments
 (0)