Browse Source

feature(peers search + modal): enable search/modal on new route

renovate/lint-staged-8.x
Jack Mallers 7 years ago
parent
commit
e3d2fdd985
  1. 22
      app/reducers/peers.js
  2. 23
      app/routes/peers/components/Peers.js
  3. 4
      app/routes/peers/components/Peers.scss
  4. 14
      app/routes/peers/containers/PeersContainer.js

22
app/reducers/peers.js

@ -16,6 +16,8 @@ export const SET_PEER_FORM = 'SET_PEER_FORM'
export const SET_PEER = 'SET_PEER' export const SET_PEER = 'SET_PEER'
export const UPDATE_SEARCH_QUERY = 'UPDATE_SEARCH_QUERY'
export const GET_PEERS = 'GET_PEERS' export const GET_PEERS = 'GET_PEERS'
export const RECEIVE_PEERS = 'RECEIVE_PEERS' export const RECEIVE_PEERS = 'RECEIVE_PEERS'
@ -60,6 +62,13 @@ export function getPeers() {
} }
} }
export function updateSearchQuery(searchQuery) {
return {
type: UPDATE_SEARCH_QUERY,
searchQuery
}
}
// Send IPC event for peers // Send IPC event for peers
export const fetchPeers = () => async (dispatch) => { export const fetchPeers = () => async (dispatch) => {
dispatch(getPeers()) dispatch(getPeers())
@ -114,17 +123,27 @@ const ACTION_HANDLERS = {
[SET_PEER]: (state, { peer }) => ({ ...state, peer }), [SET_PEER]: (state, { peer }) => ({ ...state, peer }),
[GET_PEERS]: state => ({ ...state, peersLoading: true }), [GET_PEERS]: state => ({ ...state, peersLoading: true }),
[RECEIVE_PEERS]: (state, { peers }) => ({ ...state, peersLoading: false, peers }) [RECEIVE_PEERS]: (state, { peers }) => ({ ...state, peersLoading: false, peers }),
[UPDATE_SEARCH_QUERY]: (state, { searchQuery }) => ({ ...state, searchQuery })
} }
const peersSelectors = {} const peersSelectors = {}
const peerSelector = state => state.peers.peer const peerSelector = state => state.peers.peer
const peersSelector = state => state.peers.peers
const peersSearchQuerySelector = state => state.peers.searchQuery
peersSelectors.peerModalOpen = createSelector( peersSelectors.peerModalOpen = createSelector(
peerSelector, peerSelector,
peer => (!!peer) peer => (!!peer)
) )
peersSelectors.filteredPeers = createSelector(
peersSelector,
peersSearchQuerySelector,
(peers, query) => peers.filter(peer => peer.pub_key.includes(query) || peer.address.includes(query))
)
export { peersSelectors } export { peersSelectors }
// ------------------------------------ // ------------------------------------
@ -139,6 +158,7 @@ const initialState = {
pubkey: '', pubkey: '',
host: '' host: ''
}, },
searchQuery: '',
connecting: false, connecting: false,
disconnecting: false disconnecting: false
} }

23
app/routes/peers/components/Peers.js

@ -4,6 +4,7 @@ import PropTypes from 'prop-types'
import { MdSearch } from 'react-icons/lib/md' import { MdSearch } from 'react-icons/lib/md'
import PeerForm from 'components/Peers/PeerForm' import PeerForm from 'components/Peers/PeerForm'
import PeerModal from 'components/Peers/PeerModal'
import Peer from 'components/Peers/Peer' import Peer from 'components/Peers/Peer'
import styles from './Peers.scss' import styles from './Peers.scss'
@ -18,24 +19,29 @@ class Peers extends Component {
peerFormProps, peerFormProps,
setPeerForm, setPeerForm,
setPeer, setPeer,
peers: { peers } updateSearchQuery,
} = this.props disconnectRequest,
console.log('props: ', this.props) peerModalOpen,
filteredPeers,
peers: { peer, searchQuery }
} = this.props
return ( return (
<div> <div>
<div className={styles.search}> <div className={styles.search}>
<PeerForm {...peerFormProps} /> <PeerForm {...peerFormProps} />
<PeerModal isOpen={peerModalOpen} resetPeer={setPeer} peer={peer} disconnect={disconnectRequest} />
<label className={`${styles.label} ${styles.input}`} htmlFor='channelSearch'> <label className={`${styles.label} ${styles.input}`} htmlFor='channelSearch'>
<MdSearch /> <MdSearch />
</label> </label>
<input <input
value={''} value={searchQuery}
onChange={event => console.log('event: ', event)} onChange={event => updateSearchQuery(event.target.value)}
className={`${styles.text} ${styles.input}`} className={`${styles.text} ${styles.input}`}
placeholder='Search peers by their node public key' placeholder='Search peers by their node public key or IP address'
type='text' type='text'
id='peersSearch' id='peersSearch'
/> />
@ -51,10 +57,7 @@ class Peers extends Component {
<div className={styles.peers}> <div className={styles.peers}>
{ {
peers.map(peer => { filteredPeers.map(filteredPeer => <Peer key={filteredPeer.peer_id} peer={filteredPeer} setPeer={setPeer} />)
console.log('peer: ', peer)
return (<Peer key={peer.peer_id} peer={peer} setPeer={setPeer} />)
})
} }
</div> </div>
</div> </div>

4
app/routes/peers/components/Peers.scss

@ -38,6 +38,10 @@
.addPeerContainer { .addPeerContainer {
padding: 40px; padding: 40px;
.newPeerButton {
font-size: 14px;
}
} }
} }

14
app/routes/peers/containers/PeersContainer.js

@ -4,10 +4,12 @@ import { connect } from 'react-redux'
import { import {
fetchPeers, fetchPeers,
setPeer, setPeer,
peersSelectors,
setPeerForm, setPeerForm,
connectRequest, connectRequest,
disconnectRequest disconnectRequest,
updateSearchQuery,
peersSelectors
} from 'reducers/peers' } from 'reducers/peers'
import Peers from '../components/Peers' import Peers from '../components/Peers'
@ -18,11 +20,15 @@ const mapDispatchToProps = {
peersSelectors, peersSelectors,
setPeerForm, setPeerForm,
connectRequest, connectRequest,
disconnectRequest disconnectRequest,
updateSearchQuery
} }
const mapStateToProps = state => ({ const mapStateToProps = state => ({
peers: state.peers peers: state.peers,
peerModalOpen: peersSelectors.peerModalOpen(state),
filteredPeers: peersSelectors.filteredPeers(state)
}) })
const mergeProps = (stateProps, dispatchProps, ownProps) => { const mergeProps = (stateProps, dispatchProps, ownProps) => {

Loading…
Cancel
Save