Added topline component and fixed string interpolation

This commit is contained in:
Ildar Kamalov 2019-01-25 15:18:05 +03:00 committed by Eugene Bujak
parent 7451eb1346
commit ab11c912db
8 changed files with 59 additions and 35 deletions

View File

@ -223,13 +223,14 @@
"encryption_dot": "DNS-over-TLS port", "encryption_dot": "DNS-over-TLS port",
"encryption_dot_desc": "If this port is configured, AdGuard Home will run a DNS-over-TLS server on this port.", "encryption_dot_desc": "If this port is configured, AdGuard Home will run a DNS-over-TLS server on this port.",
"encryption_certificates": "Certificates", "encryption_certificates": "Certificates",
"encryption_certificates_desc": "In order to use encryption, you need to provide a valid SSL certificates chain for your domain. You can get a free certificate on letsencrypt.org or you can buy it from one of the trusted Certificate Authorities.", "encryption_certificates_desc": "In order to use encryption, you need to provide a valid SSL certificates chain for your domain. You can get a free certificate on <0>{{link}}</0> or you can buy it from one of the trusted Certificate Authorities.",
"encryption_certificates_input": "Copy/paste your PEM-encoded cerificates here.", "encryption_certificates_input": "Copy/paste your PEM-encoded cerificates here.",
"encryption_status": "Status", "encryption_status": "Status",
"encryption_certificates_for": "Certificates for {{domains}}", "encryption_certificates_for": "Certificates for {{domains}}",
"encryption_expire": "Expire on {{date}}", "encryption_expire": "Expire on {{date}}",
"encryption_key": "Private key", "encryption_key": "Private key",
"encryption_key_input": "Copy/paste your PEM-encoded private key for your cerficate here.", "encryption_key_input": "Copy/paste your PEM-encoded private key for your cerficate here.",
"topline_expiring_certificate": "Your SSL certificate is about to expire. Update <0>Encryption settings</0>.",
"form_error_port_range": "Enter port value in the range of 80-65535", "form_error_port_range": "Enter port value in the range of 80-65535",
"form_error_equal": "Shouldn't be equal", "form_error_equal": "Shouldn't be equal",
"form_error_password": "Password mismatched" "form_error_password": "Password mismatched"

View File

@ -659,6 +659,9 @@ export const getTlsStatus = () => async (dispatch) => {
dispatch(getTlsStatusRequest()); dispatch(getTlsStatusRequest());
try { try {
const status = await apiClient.getTlsStatus(); const status = await apiClient.getTlsStatus();
status.certificate_chain = decodeURIComponent(status.certificate_chain);
status.private_key = decodeURIComponent(status.private_key);
dispatch(getTlsStatusSuccess(status)); dispatch(getTlsStatusSuccess(status));
} catch (error) { } catch (error) {
dispatch(addErrorToast({ error })); dispatch(addErrorToast({ error }));
@ -673,7 +676,11 @@ export const setTlsConfigSuccess = createAction('SET_TLS_CONFIG_SUCCESS');
export const setTlsConfig = config => async (dispatch) => { export const setTlsConfig = config => async (dispatch) => {
dispatch(setTlsConfigRequest()); dispatch(setTlsConfigRequest());
try { try {
await apiClient.setTlsConfig(config); const values = { ...config };
values.certificate_chain = encodeURIComponent(values.certificate_chain);
values.private_key = encodeURIComponent(values.private_key);
await apiClient.setTlsConfig(values);
dispatch(setTlsConfigSuccess(config)); dispatch(setTlsConfigSuccess(config));
dispatch(addSuccessToast('encryption_config_saved')); dispatch(addSuccessToast('encryption_config_saved'));
} catch (error) { } catch (error) {

View File

@ -1,6 +1,7 @@
import React, { Component, Fragment } from 'react'; import React, { Component, Fragment } from 'react';
import { HashRouter, Route } from 'react-router-dom'; import { HashRouter, Route } from 'react-router-dom';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import LoadingBar from 'react-redux-loading-bar'; import LoadingBar from 'react-redux-loading-bar';
import 'react-table/react-table.css'; import 'react-table/react-table.css';
@ -16,7 +17,7 @@ import Logs from '../../containers/Logs';
import Footer from '../ui/Footer'; import Footer from '../ui/Footer';
import Toasts from '../Toasts'; import Toasts from '../Toasts';
import Status from '../ui/Status'; import Status from '../ui/Status';
import Update from '../ui/Update'; import Topline from '../ui/Topline';
import i18n from '../../i18n'; import i18n from '../../i18n';
class App extends Component { class App extends Component {
@ -55,15 +56,22 @@ class App extends Component {
!dashboard.processingVersions && !dashboard.processingVersions &&
dashboard.isCoreRunning && dashboard.isCoreRunning &&
dashboard.isUpdateAvailable; dashboard.isUpdateAvailable;
const isExpiringCertificate = false;
return ( return (
<HashRouter hashType='noslash'> <HashRouter hashType='noslash'>
<Fragment> <Fragment>
{updateAvailable && {updateAvailable &&
<Update <Topline type="info">
announcement={dashboard.announcement} {dashboard.announcement} <a href={dashboard.announcementUrl} target="_blank" rel="noopener noreferrer">Click here</a> for more info.
announcementUrl={dashboard.announcementUrl} </Topline>
/> }
{isExpiringCertificate &&
<Topline type="warning">
<Trans components={[<a href="#settings" key="0">link</a>]}>
topline_expiring_certificate
</Trans>
</Topline>
} }
<LoadingBar className="loading-bar" updateTime={1000} /> <LoadingBar className="loading-bar" updateTime={1000} />
<Route component={Header} /> <Route component={Header} />
@ -100,6 +108,7 @@ App.propTypes = {
error: PropTypes.string, error: PropTypes.string,
getVersion: PropTypes.func, getVersion: PropTypes.func,
changeLanguage: PropTypes.func, changeLanguage: PropTypes.func,
encryption: PropTypes.object,
}; };
export default App; export default withNamespaces()(App);

View File

@ -114,7 +114,12 @@ const Form = (props) => {
<Trans>encryption_certificates</Trans> <Trans>encryption_certificates</Trans>
</label> </label>
<div className="form__desc form__desc--top"> <div className="form__desc form__desc--top">
<Trans>encryption_certificates_desc</Trans> <Trans
values={{ link: 'letsencrypt.org' }}
components={[<a href="https://letsencrypt.org/" key="0">link</a>]}
>
encryption_certificates_desc
</Trans>
</div> </div>
<Field <Field
id="certificate_chain" id="certificate_chain"
@ -130,12 +135,14 @@ const Form = (props) => {
<Trans>encryption_status</Trans>: <Trans>encryption_status</Trans>:
</div> </div>
<div> <div>
<Trans>encryption_certificates_for</Trans> <Trans values={{ domains: '*.example.org, example.org' }}>
*.example.org, example.org encryption_certificates_for
</Trans>
</div> </div>
<div> <div>
<Trans>encryption_expire</Trans> <Trans values={{ date: '2022-01-01' }}>
2022-01-01 encryption_expire
</Trans>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,4 +1,4 @@
.update { .topline {
position: relative; position: relative;
z-index: 102; z-index: 102;
margin-bottom: 0; margin-bottom: 0;

View File

@ -0,0 +1,19 @@
import React from 'react';
import PropTypes from 'prop-types';
import './Topline.css';
const Topline = props => (
<div className={`alert alert-${props.type} topline`}>
<div className="container">
{props.children}
</div>
</div>
);
Topline.propTypes = {
children: PropTypes.node.isRequired,
type: PropTypes.string.isRequired,
};
export default Topline;

View File

@ -1,19 +0,0 @@
import React from 'react';
import PropTypes from 'prop-types';
import './Update.css';
const Update = props => (
<div className="alert alert-info update">
<div className="container">
{props.announcement} <a href={props.announcementUrl} target="_blank" rel="noopener noreferrer">Click here</a> for more info.
</div>
</div>
);
Update.propTypes = {
announcement: PropTypes.string.isRequired,
announcementUrl: PropTypes.string.isRequired,
};
export default Update;

View File

@ -3,8 +3,8 @@ import * as actionCreators from '../actions';
import App from '../components/App'; import App from '../components/App';
const mapStateToProps = (state) => { const mapStateToProps = (state) => {
const { dashboard } = state; const { dashboard, encryption } = state;
const props = { dashboard }; const props = { dashboard, encryption };
return props; return props;
}; };