lbry-desktop/ui/component/searchOptions/view.jsx

124 lines
4 KiB
React
Raw Permalink Normal View History

2019-02-18 18:24:56 +01:00
// @flow
2020-07-27 22:04:12 +02:00
import { SEARCH_OPTIONS } from 'constants/search';
2019-02-18 18:24:56 +01:00
import * as ICONS from 'constants/icons';
import React, { useMemo } from 'react';
2019-02-18 18:24:56 +01:00
import { Form, FormField } from 'component/common/form';
import Button from 'component/button';
type Props = {
setSearchOption: (string, boolean | string | number) => void,
options: {},
expanded: boolean,
toggleSearchExpanded: () => void,
2019-02-18 18:24:56 +01:00
};
const SearchOptions = (props: Props) => {
2019-06-11 20:10:58 +02:00
const { options, setSearchOption, expanded, toggleSearchExpanded } = props;
const stringifiedOptions = JSON.stringify(options);
2019-02-18 18:24:56 +01:00
const resultCount = options[SEARCH_OPTIONS.RESULT_COUNT];
const isFilteringByChannel = useMemo(() => {
const jsonOptions = JSON.parse(stringifiedOptions);
const claimType = String(jsonOptions[SEARCH_OPTIONS.CLAIM_TYPE] || '');
return claimType.includes(SEARCH_OPTIONS.INCLUDE_CHANNELS);
}, [stringifiedOptions]);
2019-02-18 18:24:56 +01:00
return (
2019-06-11 20:10:58 +02:00
<div>
<Button
button="alt"
2019-06-28 09:33:07 +02:00
label={__('Filter')}
2019-06-11 20:10:58 +02:00
iconRight={expanded ? ICONS.UP : ICONS.DOWN}
onClick={toggleSearchExpanded}
/>
2019-09-26 18:07:11 +02:00
{expanded && (
<Form className="search__options">
<fieldset>
2019-11-22 22:13:00 +01:00
<legend className="search__legend">{__('Search For')}</legend>
2019-09-26 18:07:11 +02:00
{[
{
option: SEARCH_OPTIONS.INCLUDE_FILES,
label: __('Files'),
},
{
option: SEARCH_OPTIONS.INCLUDE_CHANNELS,
label: __('Channels'),
},
{
option: SEARCH_OPTIONS.INCLUDE_FILES_AND_CHANNELS,
label: __('Everything'),
},
].map(({ option, label }) => (
<FormField
key={option}
name={option}
type="radio"
blockWrap={false}
label={label}
checked={options[SEARCH_OPTIONS.CLAIM_TYPE] === option}
onChange={() => setSearchOption(SEARCH_OPTIONS.CLAIM_TYPE, option)}
/>
))}
</fieldset>
2019-02-18 18:24:56 +01:00
<fieldset disabled={isFilteringByChannel}>
2020-10-05 20:24:57 +02:00
<legend className="search__legend">{__('Type')}</legend>
2019-09-26 18:07:11 +02:00
{[
{
option: SEARCH_OPTIONS.MEDIA_VIDEO,
2020-10-05 20:24:57 +02:00
label: __('Video'),
2019-09-26 18:07:11 +02:00
},
{
option: SEARCH_OPTIONS.MEDIA_AUDIO,
label: __('Audio'),
},
{
option: SEARCH_OPTIONS.MEDIA_IMAGE,
2020-10-05 20:24:57 +02:00
label: __('Image'),
2019-09-26 18:07:11 +02:00
},
{
option: SEARCH_OPTIONS.MEDIA_TEXT,
label: __('Text'),
},
{
option: SEARCH_OPTIONS.MEDIA_APPLICATION,
2020-10-05 20:24:57 +02:00
label: __('Other'),
2019-09-26 18:07:11 +02:00
},
].map(({ option, label }) => (
2019-02-18 18:24:56 +01:00
<FormField
2019-09-26 18:07:11 +02:00
key={option}
name={option}
type="checkbox"
2019-02-18 18:24:56 +01:00
blockWrap={false}
2019-09-26 18:07:11 +02:00
disabled={options[SEARCH_OPTIONS.CLAIM_TYPE] === SEARCH_OPTIONS.INCLUDE_CHANNELS}
label={label}
checked={!isFilteringByChannel && options[option]}
2019-09-26 18:07:11 +02:00
onChange={() => setSearchOption(option, !options[option])}
/>
))}
</fieldset>
<fieldset>
2019-11-22 22:13:00 +01:00
<legend className="search__legend">{__('Other Options')}</legend>
2019-09-26 18:07:11 +02:00
<FormField
type="select"
name="result-count"
value={resultCount}
onChange={(e) => setSearchOption(SEARCH_OPTIONS.RESULT_COUNT, e.target.value)}
2019-09-26 18:07:11 +02:00
blockWrap={false}
label={__('Returned Results')}
>
<option value={10}>10</option>
<option value={30}>30</option>
<option value={50}>50</option>
<option value={100}>100</option>
</FormField>
</fieldset>
</Form>
)}
2019-02-18 18:24:56 +01:00
</div>
);
};
export default SearchOptions;