summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-plugin-search/src/components/Results.js
blob: 647528a2b58e7e22f0c323e422c3e345c94dadea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
const GitBook = require('gitbook-core');
const { React } = GitBook;

const Result = React.createClass({
    propTypes: {
        result: React.PropTypes.object
    },

    render() {
        const { result } = this.props;

        return (
            <div className="Search-ResultContainer">
                <GitBook.InjectedComponent matching={{ role: 'search:result' }} props={{ result }}>
                    <div className="Search-Result">
                        <h3>
                            <GitBook.Link to={result.url}>{result.title}</GitBook.Link>
                        </h3>
                        <p>{result.body}</p>
                    </div>
                </GitBook.InjectedComponent>
            </div>
        );
    }
});

const SearchResults = React.createClass({
    propTypes: {
        i18n:     GitBook.Shapes.I18n,
        results:  GitBook.Shapes.list,
        query:    React.PropTypes.string,
        children: React.PropTypes.node
    },

    render() {
        const { i18n, query, results, children } = this.props;

        if (!query) {
            return React.Children.only(children);
        }

        return (
            <div className="Search-ResultsContainer">
                <GitBook.InjectedComponent matching={{ role: 'search:results' }} props={{ results, query }}>
                    <div className="Search-Results">
                        <h1>{i18n.t('SEARCH_RESULTS_TITLE', { query, count: results.size })}</h1>
                        <div className="Search-Results">
                            {results.map((result, i) => {
                                return <Result key={i} result={result} />;
                            })}
                        </div>
                    </div>
                </GitBook.InjectedComponent>
            </div>
        );
    }
});

const mapStateToProps = (state) => {
    const { results, query } = state.search;
    return { results, query };
};

module.exports = GitBook.connect(SearchResults, mapStateToProps);