| @ -0,0 +1,33 @@ | |||||
| import React, {PropTypes} from "react"; | |||||
| import {reduxForm} from "redux-form"; | |||||
| import { STATE_CLOSED } from "../constants/socket"; | |||||
| const ConnectForm = (props) => { | |||||
| const { fields: { url }, handleSubmit, socket, socketActions } = props; | |||||
| const submit = (values, dispatch) => { | |||||
| dispatch(socketActions.open(values.url)); | |||||
| }; | |||||
| return ( | |||||
| <form onSubmit={handleSubmit(submit)}> | |||||
| <input type="url" defaultValue="ws://localhost:2244" {...url} | |||||
| required pattern="wss?://.+"/> | |||||
| <button type="submit" disabled={socket.state !== STATE_CLOSED}> | |||||
| Connect | |||||
| </button> | |||||
| </form> | |||||
| ); | |||||
| }; | |||||
| ConnectForm.propTypes = { | |||||
| fields: PropTypes.object.isRequired, | |||||
| handleSubmit: PropTypes.func.isRequired, | |||||
| socket: PropTypes.object.isRequired, | |||||
| socketActions: PropTypes.object.isRequired | |||||
| }; | |||||
| export default reduxForm({ | |||||
| form: "connect", | |||||
| fields: ["url"] | |||||
| })(ConnectForm); | |||||
| @ -1,21 +1,27 @@ | |||||
| import React, {PropTypes} from 'react'; | |||||
| import React, {PropTypes} from "react"; | |||||
| const App = (props) => { | |||||
| const { onClick, socket } = props; | |||||
| import ConnectForm from "../components/ConnectForm"; | |||||
| import { STATE_OPEN } from "../constants/socket"; | |||||
| const SolsticeApp = (props) => { | |||||
| const { socket, actions } = props; | |||||
| if (socket.state !== STATE_OPEN ) { | |||||
| return ( | |||||
| <ConnectForm socket={socket} | |||||
| socketActions={actions.socketActions}/> | |||||
| ); | |||||
| } | |||||
| return ( | return ( | ||||
| <div> | <div> | ||||
| <h1>Solstice web UI</h1> | <h1>Solstice web UI</h1> | ||||
| <div>Socket state: {socket.state}</div> | |||||
| <button onClick={onClick}> | |||||
| Connect | |||||
| </button> | |||||
| <div>Socket open</div> | |||||
| </div> | </div> | ||||
| ); | ); | ||||
| }; | }; | ||||
| App.propTypes = { | |||||
| onClick: PropTypes.func.isRequired, | |||||
| socket: PropTypes.object.isRequired | |||||
| SolsticeApp.propTypes = { | |||||
| socket: PropTypes.object.isRequired, | |||||
| actions: PropTypes.object.isRequired | |||||
| }; | }; | ||||
| export default App; | |||||
| export default SolsticeApp; | |||||
| @ -0,0 +1,4 @@ | |||||
| export const STATE_OPENING = 0; | |||||
| export const STATE_OPEN = 1; | |||||
| export const STATE_CLOSING = 2; | |||||
| export const STATE_CLOSED = 3; | |||||
| @ -1,8 +1,11 @@ | |||||
| import { combineReducers } from 'redux'; | |||||
| import { combineReducers } from "redux"; | |||||
| import { reducer as form } from "redux-form"; | |||||
| import socket from "./socket"; | import socket from "./socket"; | ||||
| const rootReducer = combineReducers({ | const rootReducer = combineReducers({ | ||||
| socket | |||||
| socket, | |||||
| form | |||||
| }); | }); | ||||
| export default rootReducer; | export default rootReducer; | ||||