Skip to content

Commit

Permalink
Add search feature
Browse files Browse the repository at this point in the history
  • Loading branch information
chemicstry committed Jan 22, 2018
1 parent bea82b4 commit d045c5c
Show file tree
Hide file tree
Showing 13 changed files with 289 additions and 57 deletions.
35 changes: 23 additions & 12 deletions client/App.jsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import React from 'react';
import FixedContainer from './FixedContainer.jsx';
import GraphMap from './GraphMap.jsx';
import ObjectInfo from './ObjectInfo.jsx';
import NodeInfo from './NodeInfo.jsx';
import ChannelInfo from './ChannelInfo.jsx';
import NetworkInfo from './NetworkInfo.jsx';
import Credits from './Credits.jsx';
import Warning from './Warning.jsx';
import Search from './Search.jsx';
import Title from './Title.jsx';
import { ObjectTypes } from './DataStore.js';
import { observer } from 'mobx-react';
Expand All @@ -31,18 +33,27 @@ export default class App extends React.Component {
<GraphMap store={store}/>
</div>

{selectedObject ? (
<ObjectInfo>
{selectedObject.type == ObjectTypes.NODE ? (
<NodeInfo data={selectedObject} />
) : (
<ChannelInfo data={selectedObject} />
)}
</ObjectInfo>
) : ''}
<NetworkInfo store={store} />
<Title>#recksplorer</Title>
<Credits />
<FixedContainer position='bottom-left' border='top-right'>
{selectedObject ? (
<ObjectInfo>
{selectedObject.type == ObjectTypes.NODE ? (
<NodeInfo data={selectedObject} />
) : (
<ChannelInfo data={selectedObject} />
)}
</ObjectInfo>
) : ''}
</FixedContainer>
<FixedContainer position='top-left' border='bottom-right'>
<NetworkInfo store={store} />
<Search store={store} />
</FixedContainer>
<FixedContainer position='top-right'>
<Title>#recksplorer</Title>
</FixedContainer>
<FixedContainer position='bottom-right' border='top-left'>
<Credits />
</FixedContainer>
<Warning />
</div>
);
Expand Down
7 changes: 1 addition & 6 deletions client/Credits.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,9 @@ import LNTips from './LNTips.jsx';

var styles = {
container:{
position: 'fixed',
bottom: 0,
right: 0,
padding: '5px',
fontSize: '11px',
backgroundColor: '#FFFFFF',
borderTop: '1px solid #891AFF',
borderLeft: '1px solid #891AFF'
backgroundColor: '#FFFFFF'
},
}

Expand Down
42 changes: 42 additions & 0 deletions client/FixedContainer.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import React from 'react';

var styles = {
container:{
position: 'fixed'
},
}

const border = '1px solid #891AFF';

// Capitalizes first letter
function jsUcfirst(string)
{
return string.charAt(0).toUpperCase() + string.slice(1);
}

export default class FixedContainer extends React.Component {
render() {
var customStyle = {};

// Transforms "top-left" into {top: 0, left: 0}
if (this.props.position) {
customStyle = this.props.position.split('-').reduce((style, position) => {
style[position] = 0;
return style;
}, customStyle);
}

if (this.props.border) {
customStyle = this.props.border.split('-').reduce((style, position) => {
style['border' + jsUcfirst(position)] = border;
return style;
}, customStyle);
}

return (
<div style={{...styles.container,...customStyle}}>
{this.props.children}
</div>
);
}
}
38 changes: 35 additions & 3 deletions client/GraphMap.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React from 'react';
import Graph from 'vis-react';
import { computed } from 'mobx';
import { ObjectTypes } from './DataStore.js';
import { computed, autorun } from 'mobx';
import { observer } from 'mobx-react';

@observer
Expand Down Expand Up @@ -58,7 +59,10 @@ export default class App extends React.Component {
id: data.nodes[i].pub_key,
label: label,
color: {
border: data.nodes[i].color
border: data.nodes[i].color,
highlight: {
border: data.nodes[i].color
}
}
});
}
Expand All @@ -70,7 +74,9 @@ export default class App extends React.Component {
to: data.edges[i].node1_pub,
from: data.edges[i].node2_pub,
width: Math.log(data.edges[i].capacity)/6,
color: {inherit:'both'}
color: {
inherit:'both'
}
});
}

Expand All @@ -82,6 +88,32 @@ export default class App extends React.Component {
this.network = network;
}

componentDidMount()
{
this.selectObserver = autorun(() => {
var object = this.props.store.selectedObjectData;

if (!this.network || !object)
return;

console.log(object);

if (object.type == ObjectTypes.NODE)
{
this.network.selectNodes([object.pub_key]);
}
else
{
this.network.setSelection({
nodes: [object.node1_pub, object.node2_pub],
edges: [object.channel_id]
}, {
highlightEdges: false
});
}
});
}

componentDidUpdate(prevProps, prevState) {
if (this.network)
{
Expand Down
2 changes: 0 additions & 2 deletions client/LNTips.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import React from 'react';
import AppStyles from './App.css';
import { observer } from 'mobx-react';
import Axios from 'axios';
import { RHashArrayToHexString, ParseAxiosError } from './Utils.js';

Expand Down Expand Up @@ -32,7 +31,6 @@ var styles = {
}
}

@observer
export default class LNTips extends React.Component {
state = {
paymentState: PaymentState.PAYMENT_STATE_WAITING_FOR_INPUT,
Expand Down
7 changes: 1 addition & 6 deletions client/NetworkInfo.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,9 @@ import { observer } from 'mobx-react';

var styles = {
container:{
position: 'fixed',
top: 0,
left: 0,
padding: '5px',
fontSize: '11px',
backgroundColor: '#FFFFFF',
borderBottom: '1px solid #891AFF',
borderRight: '1px solid #891AFF'
backgroundColor: '#FFFFFF'
},
tiny: {
fontSize: '9px'
Expand Down
2 changes: 1 addition & 1 deletion client/NodeInfo.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export default class NodeInfo extends React.Component {
</tr>
<tr>
<td>Alias</td>
<td>{node.alias.replace(/\0/g, '')}</td>
<td>{node.alias.replace(/\0/g, '').substring(0, 18)}</td>
</tr>
<tr>
<td>URI</td>
Expand Down
13 changes: 13 additions & 0 deletions client/NodeItem.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import React from 'react';
import FontAwesome from 'react-fontawesome';

export default class NodeItem extends React.Component {
render() {
return (
<li>
<FontAwesome name='circle' />
<a href="javascript:void(0)" onClick={this.props.onClick}>{this.props.data.pub_key.substring(0,18)}</a>
</li>
);
}
}
7 changes: 1 addition & 6 deletions client/ObjectInfo.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,9 @@ import AppStyles from './App.css';

var styles = {
container:{
position: 'fixed',
bottom: 0,
left: 0,
padding: '5px',
fontSize: '11px',
backgroundColor: '#FFFFFF',
borderTop: '1px solid #891AFF',
borderRight: '1px solid #891AFF'
backgroundColor: '#FFFFFF'
}
}

Expand Down
124 changes: 124 additions & 0 deletions client/Search.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
import React from 'react';
import FontAwesome from 'react-fontawesome';
import FA from 'font-awesome/css/font-awesome.css';

var styles = {
container:{
padding: '5px',
fontSize: '11px',
backgroundColor: '#FFFFFF',
borderTop: '1px solid #891AFF'
},
input: {
width: '100%',
boxSizing: 'border-box'
},
results: {
maxHeight: '400px',
overflowY: 'scroll'
},
ul: {
listStyleType: 'none',
padding: 0
},
li: {
padding: '5px',
cursor: 'pointer',
':hover': {
backgroundColor: '#EEE'
}
},
text: {
paddingLeft: '10px'
}
}

class NodeItem extends React.Component {
render() {
return (
<li style={styles.li} onClick={this.props.onClick}>
<FontAwesome name='circle' cssModule={FA} />
<span style={styles.text}>{this.props.data.alias.replace(/\0/g, '').substring(0, 18)}</span>
</li>
);
}
}

class ChannelItem extends React.Component {
render() {
return (
<li style={styles.li} onClick={this.props.onClick}>
<FontAwesome name='link' cssModule={FA} />
<span style={styles.text}>{this.props.data.channel_id}</span>
</li>
);
}
}

export default class Search extends React.Component {
state = {
searchText: '',
results: []
}

onSearchTextChange(event)
{
const store = this.props.store;
const value = event.target.value.toUpperCase();

if (!value.length)
{
this.setState({
searchText: value,
results: []
});

return;
}

var nodes = store.networkData.nodes.filter(node => {
return node.pub_key.toUpperCase().includes(value) || node.alias.toUpperCase().includes(value) || (node.addresses.length && node.addresses[0].addr.toUpperCase().includes(value));
});

var channels = store.networkData.edges.filter(edge => {
return edge.channel_id.toUpperCase().includes(value) || edge.chan_point.toUpperCase().includes(value);
});

var results = [
...nodes,
...channels
];

this.setState({
searchText: value,
results: results
});
}

onClickItem(item)
{
this.props.store.selectObject(item);
}

render() {
const results = this.state.results.map((item) => {
if (item.pub_key)
return <NodeItem key={item.pub_key} data={item} onClick={event => this.onClickItem(item.pub_key)} />;
else
return <ChannelItem key={item.channel_id} data={item} onClick={event => this.onClickItem(item.channel_id)} />;
});

return (
<div style={styles.container}>
<input type="text" placeholder="Search" onChange={event => this.onSearchTextChange(event)} style={styles.input} />
{ results.length ? (
<div style={styles.results}>
<ul style={styles.ul}>
{results}
</ul>
</div>
) : ('')}
</div>
);
}
}
Loading

0 comments on commit d045c5c

Please sign in to comment.