summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-plugin-search/src/components/Results.js
blob: 16a8cbdd6dccdb9c84fdc89fe9fae10beb78c92b (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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
const GitBook = require('gitbook-core');
const { React } = GitBook;
const Highlight = require('react-highlighter');

const MAX_DESCRIPTION_SIZE = 500;

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

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

        let summary = result.body.trim();
        if (summary.length > MAX_DESCRIPTION_SIZE) {
            summary = summary.slice(0, MAX_DESCRIPTION_SIZE).trim() + '...';
        }

        return (
            <div className="Search-ResultContainer">
                <GitBook.InjectedComponent matching={{ role: 'search:result' }} props={{ result, query }}>
                    <div className="Search-Result">
                        <h3>
                            <GitBook.Link to={result.url}>{result.title}</GitBook.Link>
                        </h3>
                        <p>
                            <Highlight
                            matchElement="span"
                            matchClass="Search-MatchSpan"
                            search={query}>
                                {summary}
                            </Highlight>
                        </p>
                    </div>
                </GitBook.InjectedComponent>
            </div>
        );
    }
});

const SearchResults = React.createClass({
    propTypes: {
        i18n:     GitBook.PropTypes.I18n,
        results:  GitBook.PropTypes.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} query={query} />;
                            })}
                        </div>
                    </div>
                </GitBook.InjectedComponent>
            </div>
        );
    }
});

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

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