e3c2919373
language and API consts improve customization custom homepages get config from .env.default custom title and logo small changes add pinned item to sidebar rebase?
126 lines
3.7 KiB
JavaScript
126 lines
3.7 KiB
JavaScript
// @flow
|
|
import * as ICONS from 'constants/icons';
|
|
import * as PAGES from 'constants/pages';
|
|
import React, { useEffect, Fragment } from 'react';
|
|
import { regexInvalidURI, parseURI } from 'lbry-redux';
|
|
import ClaimPreview from 'component/claimPreview';
|
|
import ClaimList from 'component/claimList';
|
|
import Page from 'component/page';
|
|
import SearchOptions from 'component/searchOptions';
|
|
import Button from 'component/button';
|
|
import ClaimUri from 'component/claimUri';
|
|
import Ads from 'web/component/ads';
|
|
|
|
type AdditionalOptions = {
|
|
isBackgroundSearch: boolean,
|
|
nsfw?: boolean,
|
|
};
|
|
|
|
type Props = {
|
|
search: (string, AdditionalOptions) => void,
|
|
isSearching: boolean,
|
|
location: UrlLocation,
|
|
uris: Array<string>,
|
|
onFeedbackNegative: string => void,
|
|
onFeedbackPositive: string => void,
|
|
showNsfw: boolean,
|
|
isAuthenticated: boolean,
|
|
};
|
|
|
|
export default function SearchPage(props: Props) {
|
|
const {
|
|
search,
|
|
uris,
|
|
onFeedbackPositive,
|
|
onFeedbackNegative,
|
|
location,
|
|
isSearching,
|
|
showNsfw,
|
|
isAuthenticated,
|
|
} = props;
|
|
const urlParams = new URLSearchParams(location.search);
|
|
const urlQuery = urlParams.get('q') || '';
|
|
const additionalOptions: AdditionalOptions = { isBackgroundSearch: false };
|
|
if (!showNsfw) {
|
|
additionalOptions['nsfw'] = false;
|
|
}
|
|
|
|
const INVALID_URI_CHARS = new RegExp(regexInvalidURI, 'gu');
|
|
let isValid = false;
|
|
let path;
|
|
try {
|
|
({ path } = parseURI(urlQuery.replace(/ /g, '-').replace(/:/g, '#')));
|
|
isValid = true;
|
|
} catch (e) {
|
|
isValid = false;
|
|
}
|
|
|
|
const modifiedUrlQuery =
|
|
isValid && path
|
|
? path
|
|
: urlQuery
|
|
.trim()
|
|
.replace(/\s+/g, '-')
|
|
.replace(INVALID_URI_CHARS, '');
|
|
const uriFromQuery = `lbry://${modifiedUrlQuery}`;
|
|
|
|
useEffect(() => {
|
|
if (urlQuery) {
|
|
search(urlQuery, additionalOptions);
|
|
}
|
|
}, [search, urlQuery]);
|
|
|
|
return (
|
|
<Page>
|
|
<section className="search">
|
|
{urlQuery && (
|
|
<Fragment>
|
|
<header className="search__header">
|
|
<div className="claim-preview__actions--header">
|
|
<ClaimUri uri={uriFromQuery} noShortUrl />
|
|
<Button
|
|
button="link"
|
|
className="media__uri--right"
|
|
label={__('View top claims for %normalized_uri%', {
|
|
normalized_uri: uriFromQuery,
|
|
})}
|
|
navigate={`/$/${PAGES.TOP}?name=${modifiedUrlQuery}`}
|
|
icon={ICONS.TOP}
|
|
/>
|
|
</div>
|
|
<div className="card">
|
|
<ClaimPreview uri={uriFromQuery} type="large" placeholder="publish" />
|
|
</div>
|
|
</header>
|
|
|
|
<ClaimList
|
|
uris={uris}
|
|
loading={isSearching}
|
|
header={<SearchOptions additionalOptions={additionalOptions} />}
|
|
injectedItem={!isAuthenticated && IS_WEB && <Ads type="video" />}
|
|
headerAltControls={
|
|
<Fragment>
|
|
<span>{__('Find what you were looking for?')}</span>
|
|
<Button
|
|
button="alt"
|
|
description={__('Yes')}
|
|
onClick={() => onFeedbackPositive(urlQuery)}
|
|
icon={ICONS.YES}
|
|
/>
|
|
<Button
|
|
button="alt"
|
|
description={__('No')}
|
|
onClick={() => onFeedbackNegative(urlQuery)}
|
|
icon={ICONS.NO}
|
|
/>
|
|
</Fragment>
|
|
}
|
|
/>
|
|
|
|
<div className="help">{__('These search results are provided by LBRY, Inc.')}</div>
|
|
</Fragment>
|
|
)}
|
|
</section>
|
|
</Page>
|
|
);
|
|
}
|