mirror of
https://git.vectorsigma.ru/public/AdGuardHome.git
synced 2026-07-28 23:49:09 +00:00
Merge in DNS/adguard-home from feature/hmr to master
Squashed commit of the following:
commit 952ed1955c2a7a32446d99489f137f02eb47c99e
Merge: 83484931 de92c852
Author: ArtemBaskal <a.baskal@adguard.com>
Date: Thu Aug 13 11:02:10 2020 +0300
Merge branch 'master' into feature/hmr
commit 8348493105d7d63d8b0836a5c272df2b17a6b142
Author: ArtemBaskal <a.baskal@adguard.com>
Date: Wed Aug 5 15:07:31 2020 +0300
Remove empty prop types, remove Services empty container
commit b2fe4a30b79d91e482318ee5deea8e49c7038f7e
Author: ArtemBaskal <a.baskal@adguard.com>
Date: Wed Aug 5 13:56:35 2020 +0300
Move constants
commit f8be4c18c35193ad77bf5e25f311ad834c1d6870
Author: ArtemBaskal <a.baskal@adguard.com>
Date: Wed Aug 5 13:19:02 2020 +0300
Fix Setup bug, update webpack.dev
commit 1d9cc4ddf8af2c979eb707a7f0fc06744eec186c
Author: ArtemBaskal <a.baskal@adguard.com>
Date: Wed Aug 5 12:10:38 2020 +0300
Review changes
commit a1edb21358def21ed1808b081ffc2f0b6755e3da
Author: ArtemBaskal <a.baskal@adguard.com>
Date: Wed Aug 5 11:46:58 2020 +0300
Remove lazy loading, fix updated components
commit 0aa2cf55f8d4206ac9e2f99fc1b990ed8a9c7825
Author: ArtemBaskal <a.baskal@adguard.com>
Date: Tue Aug 4 20:32:19 2020 +0300
Refactor App component, add lazy loading
commit 3c2ba4772a91ff7b06641dba6c6bf3fdcd2fdf7f
Author: ArtemBaskal <a.baskal@adguard.com>
Date: Tue Aug 4 17:12:41 2020 +0300
Simplify App hot loading boilerplate, setup lazy loading, update Header
commit 8df3221f315372b066f2ac0c9a1687f1677b8415
Author: ArtemBaskal <a.baskal@adguard.com>
Date: Tue Aug 4 15:16:06 2020 +0300
+ client: Add Hot Module Replacement
182 lines
5.1 KiB
JavaScript
182 lines
5.1 KiB
JavaScript
import React, { useEffect } from 'react';
|
|
import { HashRouter, Route } from 'react-router-dom';
|
|
import LoadingBar from 'react-redux-loading-bar';
|
|
import { hot } from 'react-hot-loader/root';
|
|
|
|
import 'react-table/react-table.css';
|
|
import '../ui/Tabler.css';
|
|
import '../ui/ReactTable.css';
|
|
import './index.css';
|
|
|
|
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
|
|
|
|
import propTypes from 'prop-types';
|
|
import Toasts from '../Toasts';
|
|
import Footer from '../ui/Footer';
|
|
import Status from '../ui/Status';
|
|
import UpdateTopline from '../ui/UpdateTopline';
|
|
import UpdateOverlay from '../ui/UpdateOverlay';
|
|
import EncryptionTopline from '../ui/EncryptionTopline';
|
|
import Icons from '../ui/Icons';
|
|
import i18n from '../../i18n';
|
|
import Loading from '../ui/Loading';
|
|
import { FILTERS_URLS, MENU_URLS, SETTINGS_URLS } from '../../helpers/constants';
|
|
import { getLogsUrlParams, setHtmlLangAttr } from '../../helpers/helpers';
|
|
import Header from '../Header';
|
|
import { changeLanguage, getDnsStatus } from '../../actions';
|
|
|
|
import Dashboard from '../../containers/Dashboard';
|
|
import Logs from '../../containers/Logs';
|
|
import SetupGuide from '../../containers/SetupGuide';
|
|
import Settings from '../../containers/Settings';
|
|
import Dns from '../../containers/Dns';
|
|
import Encryption from '../../containers/Encryption';
|
|
import Dhcp from '../../containers/Dhcp';
|
|
import Clients from '../../containers/Clients';
|
|
import DnsBlocklist from '../../containers/DnsBlocklist';
|
|
import DnsAllowlist from '../../containers/DnsAllowlist';
|
|
import DnsRewrites from '../../containers/DnsRewrites';
|
|
import CustomRules from '../../containers/CustomRules';
|
|
import Services from '../Filters/Services';
|
|
|
|
const ROUTES = [
|
|
{
|
|
path: MENU_URLS.root,
|
|
component: Dashboard,
|
|
exact: true,
|
|
},
|
|
{
|
|
path: [`${MENU_URLS.logs}${getLogsUrlParams(':search?', ':response_status?')}`, MENU_URLS.logs],
|
|
component: Logs,
|
|
},
|
|
{
|
|
path: MENU_URLS.guide,
|
|
component: SetupGuide,
|
|
},
|
|
{
|
|
path: SETTINGS_URLS.settings,
|
|
component: Settings,
|
|
},
|
|
{
|
|
path: SETTINGS_URLS.dns,
|
|
component: Dns,
|
|
},
|
|
{
|
|
path: SETTINGS_URLS.encryption,
|
|
component: Encryption,
|
|
},
|
|
{
|
|
path: SETTINGS_URLS.dhcp,
|
|
component: Dhcp,
|
|
},
|
|
{
|
|
path: SETTINGS_URLS.clients,
|
|
component: Clients,
|
|
},
|
|
{
|
|
path: FILTERS_URLS.dns_blocklists,
|
|
component: DnsBlocklist,
|
|
},
|
|
{
|
|
path: FILTERS_URLS.dns_allowlists,
|
|
component: DnsAllowlist,
|
|
},
|
|
{
|
|
path: FILTERS_URLS.dns_rewrites,
|
|
component: DnsRewrites,
|
|
},
|
|
{
|
|
path: FILTERS_URLS.custom_rules,
|
|
component: CustomRules,
|
|
},
|
|
{
|
|
path: FILTERS_URLS.blocked_services,
|
|
component: Services,
|
|
},
|
|
];
|
|
|
|
const renderRoute = ({ path, component, exact }, idx) => <Route
|
|
key={idx}
|
|
exact={exact}
|
|
path={path}
|
|
component={component}
|
|
/>;
|
|
|
|
const App = () => {
|
|
const dispatch = useDispatch();
|
|
const {
|
|
language,
|
|
isCoreRunning,
|
|
isUpdateAvailable,
|
|
processing,
|
|
} = useSelector((state) => state.dashboard, shallowEqual);
|
|
|
|
const { processing: processingEncryption } = useSelector((
|
|
state,
|
|
) => state.encryption, shallowEqual);
|
|
|
|
const updateAvailable = isCoreRunning && isUpdateAvailable;
|
|
|
|
useEffect(() => {
|
|
dispatch(getDnsStatus());
|
|
}, []);
|
|
|
|
const setLanguage = () => {
|
|
if (!processing) {
|
|
if (language) {
|
|
i18n.changeLanguage(language);
|
|
setHtmlLangAttr(language);
|
|
}
|
|
}
|
|
|
|
i18n.on('languageChanged', (lang) => {
|
|
dispatch(changeLanguage(lang));
|
|
});
|
|
};
|
|
|
|
useEffect(() => {
|
|
setLanguage();
|
|
}, [language]);
|
|
|
|
const reloadPage = () => {
|
|
window.location.reload();
|
|
};
|
|
|
|
return (
|
|
<HashRouter hashType="noslash">
|
|
<>
|
|
{updateAvailable && <>
|
|
<UpdateTopline />
|
|
<UpdateOverlay />
|
|
</>}
|
|
{!processingEncryption && <EncryptionTopline />}
|
|
<LoadingBar className="loading-bar" updateTime={1000} />
|
|
<Header />
|
|
<div className="container container--wrap pb-5">
|
|
{processing && <Loading />}
|
|
{!isCoreRunning && (
|
|
<div className="row row-cards">
|
|
<div className="col-lg-12">
|
|
<Status reloadPage={reloadPage} message="dns_start" />
|
|
<Loading />
|
|
</div>
|
|
</div>
|
|
)}
|
|
{!processing && isCoreRunning && ROUTES.map(renderRoute)}
|
|
</div>
|
|
<Footer />
|
|
<Toasts />
|
|
<Icons />
|
|
</>
|
|
</HashRouter>
|
|
);
|
|
};
|
|
|
|
renderRoute.propTypes = {
|
|
path: propTypes.oneOfType([propTypes.string, propTypes.arrayOf(propTypes.string)]).isRequired,
|
|
component: propTypes.element.isRequired,
|
|
exact: propTypes.bool,
|
|
};
|
|
|
|
export default hot(App);
|