import { useState, useEffect, ChangeEvent, FormEvent } from 'react'; // Redux import { connect } from 'react-redux'; import { createNotification, updateConfig, sortApps, sortCategories, } from '../../../store/actions'; // Typescript import { GlobalState, NewNotification, SettingsForm, } from '../../../interfaces'; // UI import InputGroup from '../../UI/Forms/InputGroup/InputGroup'; import Button from '../../UI/Buttons/Button/Button'; import SettingsHeadline from '../../UI/Headlines/SettingsHeadline/SettingsHeadline'; // Utils import { searchConfig } from '../../../utility'; interface ComponentProps { createNotification: (notification: NewNotification) => void; updateConfig: (formData: SettingsForm) => void; sortApps: () => void; sortCategories: () => void; loading: boolean; } const OtherSettings = (props: ComponentProps): JSX.Element => { // Initial state const [formData, setFormData] = useState({ customTitle: document.title, pinAppsByDefault: 1, pinCategoriesByDefault: 1, hideHeader: 0, hideApps: 0, hideCategories: 0, useOrdering: 'createdAt', appsSameTab: 0, bookmarksSameTab: 0, dockerApps: 1, dockerHost: 'localhost', kubernetesApps: 1, unpinStoppedApps: 1, }); // Get config useEffect(() => { setFormData({ customTitle: searchConfig('customTitle', 'Flame'), pinAppsByDefault: searchConfig('pinAppsByDefault', 1), pinCategoriesByDefault: searchConfig('pinCategoriesByDefault', 1), hideHeader: searchConfig('hideHeader', 0), hideApps: searchConfig('hideApps', 0), hideCategories: searchConfig('hideCategories', 0), useOrdering: searchConfig('useOrdering', 'createdAt'), appsSameTab: searchConfig('appsSameTab', 0), bookmarksSameTab: searchConfig('bookmarksSameTab', 0), dockerApps: searchConfig('dockerApps', 0), dockerHost: searchConfig('dockerHost', 'localhost'), kubernetesApps: searchConfig('kubernetesApps', 0), unpinStoppedApps: searchConfig('unpinStoppedApps', 0), }); }, [props.loading]); // Form handler const formSubmitHandler = async (e: FormEvent) => { e.preventDefault(); // Save settings await props.updateConfig(formData); // Update local page title document.title = formData.customTitle; // Sort apps and categories with new settings props.sortApps(); props.sortCategories(); }; // Input handler const inputChangeHandler = ( e: ChangeEvent, isNumber?: boolean ) => { let value: string | number = e.target.value; if (isNumber) { value = parseFloat(value); } setFormData({ ...formData, [e.target.name]: value, }); }; return (
formSubmitHandler(e)}> {/* OTHER OPTIONS */} inputChangeHandler(e)} /> {/* BEAHVIOR OPTIONS */} {/* MODULES OPTIONS */} {/* DOCKER SETTINGS */} inputChangeHandler(e)} /> {/* KUBERNETES SETTINGS */} ); }; const mapStateToProps = (state: GlobalState) => { return { loading: state.config.loading, }; }; const actions = { createNotification, updateConfig, sortApps, sortCategories, }; export default connect(mapStateToProps, actions)(OtherSettings);