2024-10-04 13:17:40 +03:00

220 lines
6.3 KiB
JavaScript

import React from 'react';
import { ApiUrlContext } from '../utils/contexts/';
import { PageStore, SearchFieldStore } from '../utils/stores/';
import { FiltersToggleButton } from '../components/_shared/';
import { MediaListWrapper } from '../components/MediaListWrapper';
import { LazyLoadItemListAsync } from '../components/item-list/LazyLoadItemListAsync';
import { SearchMediaFiltersRow } from '../components/search-filters/SearchMediaFiltersRow';
import { SearchResultsFilters } from '../components/search-filters/SearchResultsFilters';
import { Page } from './_Page';
import { translateString } from '../utils/helpers/';
export class SearchPage extends Page {
constructor(props) {
super(props, 'search-results');
this.state = {
validQuery: false,
requestUrl: null,
filterArgs: '',
resultsTitle: null,
resultsCount: null,
searchQuery: SearchFieldStore.get('search-query'),
searchCategories: SearchFieldStore.get('search-categories'),
searchTags: SearchFieldStore.get('search-tags'),
hiddenFilters: true,
};
this.getCountFunc = this.getCountFunc.bind(this);
this.updateRequestUrl = this.updateRequestUrl.bind(this);
this.onFilterArgsUpdate = this.onFilterArgsUpdate.bind(this);
this.onToggleFiltersClick = this.onToggleFiltersClick.bind(this);
this.onFiltersUpdate = this.onFiltersUpdate.bind(this);
this.didMount = false;
this.updateRequestUrl();
}
componentDidMount() {
this.didMount = true;
}
onToggleFiltersClick() {
this.setState({
hiddenFilters: !this.state.hiddenFilters,
});
}
onFiltersUpdate(updatedArgs) {
const args = {
media_type: null,
upload_date: null,
sort_by: null,
ordering: null,
};
switch (updatedArgs.media_type) {
case 'video':
case 'audio':
case 'image':
case 'pdf':
args.media_type = updatedArgs.media_type;
break;
}
switch (updatedArgs.upload_date) {
case 'today':
case 'this_week':
case 'this_month':
case 'this_year':
args.upload_date = updatedArgs.upload_date;
break;
}
switch (updatedArgs.sort_by) {
case 'most_views':
args.sort_by = 'views';
break;
case 'most_likes':
args.sort_by = 'likes';
break;
case 'date_added_asc':
args.ordering = 'asc';
break;
}
const newArgs = [];
for (let arg in args) {
if (null !== args[arg]) {
newArgs.push(arg + '=' + args[arg]);
}
}
this.setState(
{
filterArgs: newArgs.length ? '&' + newArgs.join('&') : '',
},
function () {
this.updateRequestUrl();
}
);
}
updateRequestUrl() {
const validQuery = this.state.searchQuery || this.state.searchCategories || this.state.searchTags;
let title = null;
if (null !== this.state.resultsCount) {
if (!validQuery) {
title = 'No results for "' + this.state.searchQuery + '"';
} else {
if (this.state.searchCategories) {
title = null === this.state.resultsCount || 0 === this.state.resultsCount ? 'No' : this.state.resultsCount;
title += ' ' + translateString('media in category') + ' "' + this.state.searchCategories + '"';
} else if (this.state.searchTags) {
title = null === this.state.resultsCount || 0 === this.state.resultsCount ? 'No' : this.state.resultsCount;
title += ' ' + translateString('media in tag') + ' "' + this.state.searchTags + '"';
} else {
if (null === this.state.resultsCount || 0 === this.state.resultsCount) {
title = translateString('No results for') + ' "' + this.state.searchQuery + '"';
} else {
title =
this.state.resultsCount +
' result' +
(1 < this.state.resultsCount ? 's' : '') +
' for "' +
this.state.searchQuery +
'"';
}
}
}
}
const api_url_postfix =
(this.state.searchQuery || '') +
(this.state.searchTags ? '&t=' + this.state.searchTags : '') +
(this.state.searchCategories ? '&c=' + this.state.searchCategories : '');
const url = ApiUrlContext._currentValue.search.query + api_url_postfix + this.state.filterArgs;
if (this.didMount) {
this.setState({
validQuery: validQuery,
requestUrl: url,
resultsTitle: title,
});
} else {
this.state.validQuery = validQuery;
this.state.requestUrl = url;
this.state.resultsTitle = title;
}
}
onFilterArgsUpdate(updatedArgs) {
const newArgs = [];
for (let arg in updatedArgs) {
if (null !== updatedArgs[arg]) {
newArgs.push(arg + '=' + updatedArgs[arg]);
}
}
this.setState(
{
filterArgs: newArgs.length ? '&' + newArgs.join('&') : '',
},
function () {
this.updateRequestUrl();
}
);
}
getCountFunc(resultsCount) {
this.setState(
{
resultsCount: resultsCount,
},
function () {
this.updateRequestUrl();
}
);
}
pageContent() {
const advancedFilters = PageStore.get('config-options').pages.search.advancedFilters;
return (
<MediaListWrapper
className="search-results-wrap items-list-hor"
title={null === this.state.resultsTitle ? null : this.state.resultsTitle}
>
{advancedFilters ? <FiltersToggleButton onClick={this.onToggleFiltersClick} /> : null}
{advancedFilters ? (
<SearchResultsFilters hidden={this.state.hiddenFilters} onFiltersUpdate={this.onFiltersUpdate} />
) : null}
{advancedFilters ? null : <SearchMediaFiltersRow onFiltersUpdate={this.onFilterArgsUpdate} />}
{!this.state.validQuery ? null : (
<LazyLoadItemListAsync
key={this.state.requestUrl}
singleLinkContent={false}
horizontalItemsOrientation={true}
itemsCountCallback={this.getCountFunc}
requestUrl={this.state.requestUrl}
preferSummary={true}
hideViews={!PageStore.get('config-media-item').displayViews}
hideAuthor={!PageStore.get('config-media-item').displayAuthor}
hideDate={!PageStore.get('config-media-item').displayPublishDate}
/>
)}
</MediaListWrapper>
);
}
}