mirror of
https://github.com/dnote/dnote
synced 2026-03-14 14:35:50 +01:00
* Allow to change endpoints in settings * Allow to reset default settings * Fix auth * Release browser extension 2.0.0
163 lines
4.4 KiB
TypeScript
163 lines
4.4 KiB
TypeScript
/* Copyright (C) 2019 Monomax Software Pty Ltd
|
|
*
|
|
* This file is part of Dnote.
|
|
*
|
|
* Dnote is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Dnote is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Dnote. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import React, { useState } from 'react';
|
|
import { connect } from 'react-redux';
|
|
import { findDOMNode } from 'react-dom';
|
|
|
|
import Link from './Link';
|
|
import Flash from './Flash';
|
|
import config from '../utils/config';
|
|
import { updateSettings, resetSettings } from '../store/settings/actions';
|
|
import { useDispatch, useSelector, useStore } from '../store/hooks';
|
|
import services from '../utils/services';
|
|
|
|
interface Props {}
|
|
|
|
// isValidURL checks if the given string is a valid URL
|
|
function isValidURL(url: string): boolean {
|
|
var a = document.createElement('a');
|
|
a.href = url;
|
|
return a.host && a.host != window.location.host;
|
|
}
|
|
|
|
// validateFormState validates the given form state. If any input is
|
|
// invalid, it throws an error.
|
|
function validateFormState({ apiUrl, webUrl }) {
|
|
if (!isValidURL(apiUrl)) {
|
|
throw new Error('Invalid URL for the API URL');
|
|
}
|
|
|
|
if (!isValidURL(webUrl)) {
|
|
throw new Error('Invalid URL for the web URL');
|
|
}
|
|
}
|
|
|
|
const Settings: React.FunctionComponent<Props> = () => {
|
|
const { settings } = useSelector(state => {
|
|
return {
|
|
settings: state.settings
|
|
};
|
|
});
|
|
const store = useStore();
|
|
|
|
const [apiUrl, setAPIUrl] = useState(settings.apiUrl);
|
|
const [webUrl, setWebUrl] = useState(settings.webUrl);
|
|
const [errMsg, setErrMsg] = useState('');
|
|
const [successMsg, setSuccessMsg] = useState('');
|
|
const dispatch = useDispatch();
|
|
|
|
function handleRestore() {
|
|
dispatch(resetSettings());
|
|
setSuccessMsg('Restored the default settings');
|
|
|
|
const { settings } = store.getState();
|
|
|
|
setAPIUrl(settings.apiUrl);
|
|
setWebUrl(settings.webUrl);
|
|
}
|
|
|
|
function handleSubmit(e) {
|
|
e.preventDefault();
|
|
setSuccessMsg('');
|
|
setErrMsg('');
|
|
|
|
try {
|
|
validateFormState({ apiUrl, webUrl });
|
|
} catch (err) {
|
|
setErrMsg(err.message);
|
|
return;
|
|
}
|
|
|
|
dispatch(
|
|
updateSettings({
|
|
apiUrl,
|
|
webUrl
|
|
})
|
|
);
|
|
setSuccessMsg('Succesfully updated the settings.');
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
<Flash kind="error" when={errMsg !== ''} message={errMsg} />
|
|
<Flash kind="info" when={successMsg !== ''} message={successMsg} />
|
|
|
|
<div className="settings page">
|
|
<h1 className="heading">Settings</h1>
|
|
|
|
<p className="lead">Customize your Dnote extension</p>
|
|
|
|
<form id="settings-form" onSubmit={handleSubmit}>
|
|
<div className="input-row">
|
|
<label htmlFor="api-url-input" className="label">
|
|
API URL
|
|
</label>
|
|
|
|
<input
|
|
type="api-url"
|
|
placeholder="https://api.getdnote.com"
|
|
className="input"
|
|
id="api-url-input"
|
|
value={apiUrl}
|
|
onChange={e => {
|
|
setAPIUrl(e.target.value);
|
|
}}
|
|
/>
|
|
</div>
|
|
|
|
<div className="input-row">
|
|
<label htmlFor="web-url-input" className="label">
|
|
Web URL
|
|
</label>
|
|
|
|
<input
|
|
type="web-url"
|
|
placeholder="https://app.getdnote.com"
|
|
className="input"
|
|
id="web-url-input"
|
|
value={webUrl}
|
|
onChange={e => {
|
|
setWebUrl(e.target.value);
|
|
}}
|
|
/>
|
|
</div>
|
|
|
|
<div className="actions">
|
|
<button
|
|
type="submit"
|
|
className="button button-first button-small button-stretch"
|
|
>
|
|
Save
|
|
</button>
|
|
|
|
<button
|
|
type="button"
|
|
onClick={handleRestore}
|
|
className="restore button-no-ui"
|
|
>
|
|
Restore default
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default Settings;
|