appirio-tech-react-components-test10
Version:
Topcoder UI Kit library of components for our React apps.
139 lines (128 loc) • 3.91 kB
JSX
require('./NavbarExample.scss')
import Navbar from './Navbar'
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import fetch from 'isomorphic-fetch'
import _ from 'lodash'
const suggest = (searchTerm) => {
return fetch('https://internal-api.topcoder-dev.com/v3/tags/_suggest/?q=' + searchTerm)
.then(response => {
if (response.status >= 200 && response.status < 400) {
return Promise.resolve(response)
} else {
return Promise.reject(new Error(response.statusText))
}
})
.then(response => {
return response.json()
})
.then(data => {
const tags = _.get(data, 'result.content')
return tags.map(tag => {
return tag.text
})
})
}
class SearchResults extends Component {
constructor(props) {
super(props)
}
render() {
const memberRender = (member) => {
const style = {color : member.color}
return (
<div className="member" key={member.handle}>
<p>Handle: <span style={style}>{member.handle}</span></p>
<p>Rank: <span>{member.rank}</span></p>
</div>
)
}
const challengeRender = (challenge) => {
return (
<div className="challenge" key={challenge.name}>
<p>Name: <span>{challenge.name}</span></p>
<p>Starte Date: <span>{challenge.startDate}</span></p>
<p>End Date: <span>{challenge.endDate}</span></p>
</div>
)
}
const searchResults = this.props.results
let exactMatch = null
if (searchResults.member) {
exactMatch = <div className="exact-match"><h2>Member</h2>{ memberRender(searchResults.member) }</div>
}
let matchedMembers = null
if (searchResults.members) {
matchedMembers = <div className="members"><h2>Members</h2>{ searchResults.members.map(memberRender) }</div>
}
let matchedChallenges = null
if (searchResults.challenges) {
matchedChallenges = <div className="challenges"><h2>Challenges</h2>{ searchResults.challenges.map(challengeRender) }</div>
}
return (
<div className="SearchResults">
{ exactMatch }
{ matchedMembers }
{ matchedChallenges }
</div>
)
}
}
SearchResults.propTypes = {
memberMatch : PropTypes.object,
membersMatch : PropTypes.array,
challengesMatch : PropTypes.array
}
class NavbarExample extends Component {
constructor(props) {
super(props)
this.state = {searchResults: {}}
this.search = this.search.bind(this)
}
search(searchTerm) {
let results = {}
if (searchTerm === 'Java') {
results = {
hasResults: true,
member: {
handle : 'Java',
color : 'blue',
rank : 1423
},
members: [{
handle : 'Javaone',
color : 'red',
rank : 2045
}, {
handle : 'ExpertJava',
color : 'yellow',
rank : 1608
}],
challenges: [{
name : 'Tags Lambda Service',
startDate : 'April 4, 2016',
endDate : 'April 20, 2016'
}, {
name : 'Member Search Service',
startDate : 'March 14, 2016',
endDate : 'March 27, 2016'
}]
}
}
this.setState({searchResults: results})
}
render() {
return (
<div>
<p>Logged In Example</p>
<Navbar username="vic-tor" userImage="https://topcoder-prod-media.s3.amazonaws.com/member/profile/vic-tor-1446848838388.jpeg" domain="topcoder-dev.com" searchSuggestionsFunc={ suggest } onSearch={ this.search } />
<p>Non Logged In Example</p>
<Navbar domain="topcoder-dev.com" searchSuggestionsFunc={ suggest } onSearch={ this.search } />
<div className="search-results">
<SearchResults results={ this.state.searchResults } />
</div>
</div>
)
}
}
module.exports = NavbarExample