lbry-desktop/ui/page/search/view.jsx
jessop e3c2919373 rename lbrytv to web
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?
2020-05-25 17:21:02 -04:00

127 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>
);
}