1
0
Fork 0
mirror of https://github.com/pawelmalak/flame.git synced 2025-07-27 06:49:37 +02:00
flame/client/src/components/Settings/SearchSettings/SearchSettings.tsx

160 lines
4.3 KiB
TypeScript
Raw Normal View History

2021-10-04 17:07:02 +02:00
// React
import { useState, useEffect, FormEvent, ChangeEvent, Fragment } from 'react';
2021-10-04 17:07:02 +02:00
import { connect } from 'react-redux';
// State
import { createNotification, updateConfig } from '../../../store/actions';
// Typescript
import {
2021-10-22 13:31:02 +02:00
Config,
2021-10-04 17:07:02 +02:00
GlobalState,
NewNotification,
Query,
SearchForm,
} from '../../../interfaces';
// Components
import CustomQueries from './CustomQueries/CustomQueries';
// UI
import Button from '../../UI/Buttons/Button/Button';
import SettingsHeadline from '../../UI/Headlines/SettingsHeadline/SettingsHeadline';
import InputGroup from '../../UI/Forms/InputGroup/InputGroup';
2021-10-04 17:07:02 +02:00
// Utils
2021-10-22 13:31:02 +02:00
import { inputHandler, searchSettingsTemplate } from '../../../utility';
2021-10-04 17:07:02 +02:00
// Data
import { queries } from '../../../utility/searchQueries.json';
interface Props {
createNotification: (notification: NewNotification) => void;
updateConfig: (formData: SearchForm) => void;
loading: boolean;
2021-10-06 14:15:05 +02:00
customQueries: Query[];
2021-10-22 13:31:02 +02:00
config: Config;
2021-10-04 17:07:02 +02:00
}
const SearchSettings = (props: Props): JSX.Element => {
// Initial state
2021-10-22 13:31:02 +02:00
const [formData, setFormData] = useState<SearchForm>(searchSettingsTemplate);
2021-10-04 17:07:02 +02:00
// Get config
useEffect(() => {
setFormData({
2021-10-22 13:31:02 +02:00
...props.config,
2021-10-04 17:07:02 +02:00
});
}, [props.loading]);
// Form handler
const formSubmitHandler = async (e: FormEvent) => {
e.preventDefault();
// Save settings
await props.updateConfig(formData);
};
// Input handler
const inputChangeHandler = (
e: ChangeEvent<HTMLInputElement | HTMLSelectElement>,
2021-10-22 13:31:02 +02:00
options?: { isNumber?: boolean; isBool?: boolean }
2021-10-04 17:07:02 +02:00
) => {
2021-10-22 13:31:02 +02:00
inputHandler<SearchForm>({
e,
options,
setStateHandler: setFormData,
state: formData,
2021-10-04 17:07:02 +02:00
});
};
return (
<Fragment>
{/* GENERAL SETTINGS */}
<form
onSubmit={(e) => formSubmitHandler(e)}
style={{ marginBottom: '30px' }}
>
<SettingsHeadline text="General" />
<InputGroup>
<label htmlFor="defaultSearchProvider">Default Search Provider</label>
<select
id="defaultSearchProvider"
name="defaultSearchProvider"
value={formData.defaultSearchProvider}
onChange={(e) => inputChangeHandler(e)}
>
{[...queries, ...props.customQueries].map((query: Query, idx) => {
const isCustom = idx >= queries.length;
return (
<option key={idx} value={query.prefix}>
{isCustom && '+'} {query.name}
</option>
);
})}
</select>
</InputGroup>
<InputGroup>
<label htmlFor="searchSameTab">
Open search results in the same tab
</label>
<select
id="searchSameTab"
name="searchSameTab"
2021-10-22 13:31:02 +02:00
value={formData.searchSameTab ? 1 : 0}
onChange={(e) => inputChangeHandler(e, { isBool: true })}
>
<option value={1}>True</option>
<option value={0}>False</option>
</select>
</InputGroup>
<InputGroup>
<label htmlFor="hideSearch">Hide search bar</label>
<select
id="hideSearch"
name="hideSearch"
2021-10-22 13:31:02 +02:00
value={formData.hideSearch ? 1 : 0}
onChange={(e) => inputChangeHandler(e, { isBool: true })}
>
<option value={1}>True</option>
<option value={0}>False</option>
</select>
</InputGroup>
<InputGroup>
<label htmlFor="disableAutofocus">Disable search bar autofocus</label>
<select
id="disableAutofocus"
name="disableAutofocus"
value={formData.disableAutofocus ? 1 : 0}
onChange={(e) => inputChangeHandler(e, { isBool: true })}
>
<option value={1}>True</option>
<option value={0}>False</option>
</select>
</InputGroup>
<Button>Save changes</Button>
</form>
{/* CUSTOM QUERIES */}
<SettingsHeadline text="Custom search providers" />
<CustomQueries />
</Fragment>
2021-10-04 17:07:02 +02:00
);
};
const mapStateToProps = (state: GlobalState) => {
return {
loading: state.config.loading,
2021-10-06 14:15:05 +02:00
customQueries: state.config.customQueries,
2021-10-22 13:31:02 +02:00
config: state.config.config,
2021-10-04 17:07:02 +02:00
};
};
const actions = {
createNotification,
updateConfig,
};
export default connect(mapStateToProps, actions)(SearchSettings);