From d14071f3503f768c9c0e040dee549be6a6b40e5f Mon Sep 17 00:00:00 2001 From: vantezzen Date: Tue, 17 Sep 2019 12:14:48 +0200 Subject: Implement #41 --- src/containers/auth/LockedScreen.js | 72 +++++++++++++++++++++++++++ src/containers/settings/EditSettingsScreen.js | 25 +++++++++- 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/containers/auth/LockedScreen.js (limited to 'src/containers') diff --git a/src/containers/auth/LockedScreen.js b/src/containers/auth/LockedScreen.js new file mode 100644 index 000000000..94285fb06 --- /dev/null +++ b/src/containers/auth/LockedScreen.js @@ -0,0 +1,72 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { inject, observer } from 'mobx-react'; +import Locked from '../../components/auth/Locked'; +import SettingsStore from '../../stores/SettingsStore'; +import { DEFAULT_LOCK_PASSWORD } from '../../config'; + +import { globalError as globalErrorPropType } from '../../prop-types'; + +export default @inject('stores', 'actions') @observer class LockedScreen extends Component { + static propTypes = { + error: globalErrorPropType.isRequired, + }; + + state = { + error: false, + } + + constructor(props) { + super(props); + + this.onSubmit = this.onSubmit.bind(this); + } + + onSubmit(values) { + const { password } = values; + + let correctPassword = this.props.stores.settings.all.app.lockedPassword; + if (!correctPassword) { + // Lock feature was enabled but no password was set + // Use default lock password so user can exit + correctPassword = DEFAULT_LOCK_PASSWORD; + } + + if (String(password) === String(correctPassword)) { + this.props.actions.settings.update({ + type: 'app', + data: { + locked: false, + }, + }); + } else { + this.setState({ + error: { + code: 'invalid-credentials', + }, + }); + } + } + + render() { + const { stores, error } = this.props; + return ( + + ); + } +} + +LockedScreen.wrappedComponent.propTypes = { + actions: PropTypes.shape({ + settings: PropTypes.shape({ + update: PropTypes.func.isRequired, + }).isRequired, + }).isRequired, + stores: PropTypes.shape({ + settings: PropTypes.instanceOf(SettingsStore).isRequired, + }).isRequired, +}; diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js index 778b70ad9..1b134622a 100644 --- a/src/containers/settings/EditSettingsScreen.js +++ b/src/containers/settings/EditSettingsScreen.js @@ -9,7 +9,7 @@ import UserStore from '../../stores/UserStore'; import TodosStore from '../../features/todos/store'; import Form from '../../lib/Form'; import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages'; -import { DEFAULT_APP_SETTINGS } from '../../config'; +import { DEFAULT_APP_SETTINGS, DEFAULT_LOCK_PASSWORD } from '../../config'; import { config as spellcheckerConfig } from '../../features/spellchecker'; import { getSelectOptions } from '../../helpers/i18n-helpers'; @@ -57,6 +57,14 @@ const messages = defineMessages({ id: 'settings.app.form.todoServer', defaultMessage: '!!!Todo Server', }, + enableLock: { + id: 'settings.app.form.enableLock', + defaultMessage: '!!!Enable Ferdi password lock', + }, + lockPassword: { + id: 'settings.app.form.lockPassword', + defaultMessage: '!!!Ferdi Lock password', + }, language: { id: 'settings.app.form.language', defaultMessage: '!!!Language', @@ -124,6 +132,8 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e privateNotifications: settingsData.privateNotifications, server: settingsData.server, todoServer: settingsData.todoServer, + lockingFeatureEnabled: settingsData.lockingFeatureEnabled, + lockedPassword: settingsData.lockedPassword, enableGPUAcceleration: settingsData.enableGPUAcceleration, showDisabledServices: settingsData.showDisabledServices, darkMode: settingsData.darkMode, @@ -214,6 +224,17 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e value: settings.all.app.todoServer || TODOS_FRONTEND, default: TODOS_FRONTEND, }, + lockingFeatureEnabled: { + label: intl.formatMessage(messages.enableLock), + value: settings.all.app.lockingFeatureEnabled || false, + default: false, + }, + lockedPassword: { + label: intl.formatMessage(messages.lockPassword), + value: settings.all.app.lockedPassword || DEFAULT_LOCK_PASSWORD, + default: DEFAULT_LOCK_PASSWORD, + type: 'password', + }, showDisabledServices: { label: intl.formatMessage(messages.showDisabledServices), value: settings.all.app.showDisabledServices, @@ -290,6 +311,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e updateStatusTypes, isClearingAllCache, server, + lockingFeatureEnabled, } = app; const { checkForUpdates, @@ -316,6 +338,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e isTodosEnabled={todos.isFeatureActive} isWorkspaceEnabled={workspaces.isFeatureActive} server={server || 'https://api.franzinfra.com'} + lockingFeatureEnabled={lockingFeatureEnabled} /> ); -- cgit v1.2.3-70-g09d2