Skip to content
This repository was archived by the owner on Jun 28, 2021. It is now read-only.

Commit 8e30594

Browse files
naveed-ahmadmmahalwy
authored andcommitted
search improvement (#712)
* search improvement * lint breaks
1 parent 66b8a2e commit 8e30594

File tree

6 files changed

+56
-75
lines changed

6 files changed

+56
-75
lines changed

src/components/Translation/index.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@ class Translation extends Component {
2525
}
2626

2727
componentWillUnmount() {
28-
const { index } = this.props;
29-
let trans;
28+
// TODO: this is breaking for search! Need to figure out why
29+
// const { index } = this.props;
30+
// let trans;
3031

31-
if (__CLIENT__) {
32-
trans = document.getElementById(`trans${index}`).children[1]; // eslint-disable-line no-undef
33-
trans.removeEventListener('click', this.fetchFootNote, true);
34-
}
32+
// if (__CLIENT__) {
33+
// trans = document.getElementById(`trans${index}`).children[1]; // eslint-disable-line
34+
// trans.removeEventListener('click', this.fetchFootNote, true);
35+
// }
3536
}
3637

3738
fetchFootNote = (event) => {

src/components/Verse/index.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -244,13 +244,13 @@ class Verse extends Component {
244244
}
245245

246246
renderAyahBadge() {
247-
const { isSearched } = this.props;
247+
const { isSearched, verse } = this.props;
248248
let metric;
249249

250250
const content = (
251251
<h4>
252252
<span className={`label label-default ${styles.label}`}>
253-
{this.props.verse.verseKey}
253+
{verse.verseKey}
254254
</span>
255255
</h4>
256256
);
@@ -263,31 +263,37 @@ class Verse extends Component {
263263

264264
return (
265265
<Link
266-
to={`/${this.props.verse.chapterId}/${this.props.verse.verseNumber}`}
266+
to={`/${verse.chapterId}/${verse.verseNumber}`}
267267
data-metrics-event-name={metric}
268268
>
269269
{content}
270270
</Link>
271271
);
272272
}
273273

274-
renderControls() {
275-
const { chapter, verse } = this.props;
274+
renderShare() {
275+
const { isSearched, verse, chapter } = this.props;
276+
277+
if (isSearched) return false;
276278

279+
return <Share chapter={chapter} verseKey={verse.verseKey} />;
280+
}
281+
282+
renderControls() {
277283
return (
278284
<div className={`col-md-1 col-sm-1 ${styles.controls}`}>
279285
{this.renderAyahBadge()}
280286
{this.renderPlayLink()}
281287
{this.renderCopyLink()}
282288
{this.renderBookmark()}
283-
<Share chapter={chapter} verseKey={verse.verseKey} />
289+
{this.renderShare()}
284290
</div>
285291
);
286292
}
287293

288294
render() {
289295
const { verse, iscurrentVerse } = this.props;
290-
debug('component:Verse', `Render ${this.props.verse.verseKey}`);
296+
debug('component:Verse', `Render ${verse.verseKey}`);
291297

292298
return (
293299
<Element

src/containers/Search/Header/index.js

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/containers/Search/index.js

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { push } from 'react-router-redux';
77
import Helmet from 'react-helmet';
88
import ReactPaginate from 'react-paginate';
99
import { FormattedHTMLMessage } from 'react-intl';
10+
import IndexHeader from 'components/IndexHeader';
1011

1112
import Verse from 'components/Verse';
1213
import Loader from 'quran-components/lib/Loader';
@@ -17,23 +18,20 @@ import LocaleFormattedMessage from 'components/LocaleFormattedMessage';
1718

1819
import { verseType, optionsType } from 'types';
1920

20-
import Header from './Header';
21-
2221
const style = require('./style.scss');
2322

2423
class Search extends Component {
2524
static propTypes = {
2625
isErrored: PropTypes.bool,
2726
isLoading: PropTypes.bool,
28-
total: PropTypes.number,
29-
page: PropTypes.number,
30-
size: PropTypes.number,
31-
from: PropTypes.number,
27+
totalCount: PropTypes.number,
28+
totalPages: PropTypes.number,
29+
currentPage: PropTypes.number,
30+
perPage: PropTypes.number,
3231
query: PropTypes.string,
33-
results: PropTypes.array, // eslint-disable-line
34-
verses: PropTypes.objectOf(verseType),
32+
results: PropTypes.arrayOf(verseType), // eslint-disable-line
3533
push: PropTypes.func.isRequired,
36-
location: PropTypes.shape({
34+
location: PropTypes.shape({ // eslint-disable-line
3735
q: PropTypes.string,
3836
p: PropTypes.string
3937
}),
@@ -49,10 +47,10 @@ class Search extends Component {
4947
};
5048

5149
handlePageChange = (payload) => {
52-
const { push, query, page } = this.props; // eslint-disable-line no-shadow
50+
const { push, query, currentPage } = this.props; // eslint-disable-line no-shadow
5351
const selectedPage = payload.selected + 1;
5452

55-
if (page !== selectedPage) {
53+
if (currentPage !== selectedPage) {
5654
this.context.metrics.track(
5755
'Search',
5856
{ action: 'paginate', label: `${query} - ${selectedPage}` }
@@ -68,13 +66,12 @@ class Search extends Component {
6866
}
6967

7068
renderStatsBar() {
71-
const { total, size, page, from, query } = this.props;
72-
const values = { from: 2, to: (from + size) - 1, total: 10, query };
73-
74-
75-
if (total) {
76-
const pageNum = Math.ceil(total / size);
69+
const { totalCount, totalPages, currentPage, query, perPage } = this.props;
70+
const from = Math.max(...[(currentPage - 1) * perPage, 1]);
71+
const to = Math.min(...[currentPage * perPage, totalCount]);
72+
const values = { from, to, query, total: totalCount };
7773

74+
if (totalPages) {
7875
return (
7976
<div className={style.header}>
8077
<div className="container">
@@ -99,16 +96,17 @@ class Search extends Component {
9996
</span>
10097
}
10198
breakLabel={<a href="">...</a>}
102-
pageNum={pageNum}
99+
pageNum={currentPage}
103100
marginPagesDisplayed={2}
104101
pageRangeDisplayed={5}
105-
initialSelected={page - 1}
106-
forceSelected={page - 1}
102+
initialSelected={currentPage}
103+
forceSelected={currentPage}
107104
onPageChange={this.handlePageChange}
108105
containerClassName="pagination"
109106
subContainerClassName="pages pagination"
110-
pageLinkClassName="pointer:"
107+
pageLinkClassName="pointer"
111108
activeClass={style.active}
109+
pageCount={totalPages}
112110
/>
113111
</div>
114112
</div>
@@ -121,9 +119,9 @@ class Search extends Component {
121119
}
122120

123121
renderBody() {
124-
const { location, isErrored, isLoading, results, options, verses } = this.props;
122+
const { isErrored, isLoading, results, options, query } = this.props;
125123

126-
if (!location.q) {
124+
if (!query) {
127125
return (
128126
<h3 className="text-center" style={{ padding: '15%' }}>
129127
<LocaleFormattedMessage id="search.nothing" defaultMessage="No search query." />
@@ -153,9 +151,9 @@ class Search extends Component {
153151

154152
return results.map(result => (
155153
<Verse
156-
verse={verses[result.verse]}
154+
verse={result}
157155
match={result.match}
158-
key={result.verse}
156+
key={result.verseKey}
159157
tooltip={options.tooltip}
160158
isSearched
161159
/>
@@ -174,7 +172,7 @@ class Search extends Component {
174172
.text-translation{font-size: ${options.fontSize.translation}rem;}`
175173
}]}
176174
/>
177-
<Header />
175+
<IndexHeader />
178176
{this.renderStatsBar()}
179177
<div className="container surah-list">
180178
<div className="row">
@@ -191,26 +189,25 @@ class Search extends Component {
191189
const AsyncSearch = asyncConnect([{
192190
promise({ store: { dispatch }, location }) {
193191
if (__CLIENT__) {
194-
dispatch(search(location.query));
192+
dispatch(search(location.query || location.q));
195193
return false;
196194
}
197195

198-
return dispatch(search(location.query));
196+
return dispatch(search(location.query || location.q));
199197
}
200198
}])(Search);
201199

202200
function mapStateToProps(state) {
203201
return {
204202
isErrored: state.searchResults.errored,
205203
isLoading: state.searchResults.loading,
206-
total: state.searchResults.total,
207-
page: state.searchResults.page,
208-
size: state.searchResults.size,
209-
from: state.searchResults.from,
204+
totalCount: state.searchResults.totalCount,
205+
currentPage: state.searchResults.currentPage,
206+
totalPages: state.searchResults.totalPages,
207+
perPage: state.searchResults.perPage,
210208
took: state.searchResults.took,
211209
query: state.searchResults.query,
212210
results: state.searchResults.results,
213-
verses: state.searchResults.entities,
214211
options: state.options
215212
};
216213
}

src/redux/actions/search.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
export function search(params) {
1010
return {
1111
types: [SEARCH, SEARCH_SUCCESS, SEARCH_FAIL],
12-
schema: { results: [{ ayah: versesSchema }] },
12+
schema: { results: [versesSchema] },
1313
// TODO: We are doing this because of a weird obj.hasOwnProperty method missing on `params`
1414
promise: client => client.get('/api/v3/search', { params: { q: params.q, p: params.p } }),
1515
params

src/redux/modules/searchResults.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
const initialState = {
88
errored: false,
99
loaded: false,
10-
entities: {},
1110
results: []
1211
};
1312

@@ -27,14 +26,13 @@ export default function reducer(state = initialState, action = {}) {
2726
loaded: true,
2827
loading: false,
2928
errored: false,
30-
total: action.result.result.total,
31-
page: action.result.result.page,
32-
size: action.result.result.size,
33-
from: action.result.result.from,
29+
totalCount: action.result.result.totalCount,
30+
totalPages: action.result.result.totalPages,
31+
currentPage: action.result.result.currentPage,
32+
perPage: action.result.result.perPage,
3433
took: action.result.result.took,
3534
query: action.result.result.query,
36-
results: action.result.result.results,
37-
entities: Object.assign({}, state.entities, action.result.entities.verses)
35+
results: action.result.result.results
3836
};
3937
case SEARCH_FAIL:
4038
return {

0 commit comments

Comments
 (0)