From 308d07785f811ff470d0e90b11680926a823027b Mon Sep 17 00:00:00 2001 From: piotrruss Date: Sun, 29 May 2022 17:45:54 +0100 Subject: add change password option --- apps/ChangePassword/api.js | 9 ++ apps/ChangePassword/components/App.js | 113 +++++++++++++++++++++ apps/ChangePassword/index.js | 3 + .../styles/ChangePassword.module.scss | 27 +++++ apps/Settings/api.js | 4 +- apps/index.js | 1 + components/Header.js | 28 +++-- configs/appList.js | 3 +- configs/sendMail.js | 2 +- configs/translations.js | 44 ++++++++ helpers/email.js | 20 +++- models/User.js | 23 +++++ pages/api/password.js | 35 +++++++ pages/api/register.js | 4 +- pages/api/settings.js | 1 - pages/api/verify.js | 4 +- 16 files changed, 300 insertions(+), 21 deletions(-) create mode 100644 apps/ChangePassword/api.js create mode 100644 apps/ChangePassword/components/App.js create mode 100644 apps/ChangePassword/index.js create mode 100644 apps/ChangePassword/styles/ChangePassword.module.scss create mode 100644 pages/api/password.js diff --git a/apps/ChangePassword/api.js b/apps/ChangePassword/api.js new file mode 100644 index 0000000..ef609a7 --- /dev/null +++ b/apps/ChangePassword/api.js @@ -0,0 +1,9 @@ +import fetchJson from 'helpers/fetchJson' + +export const changePassword = async (data) => ( + await fetchJson('/api/password', { + method: 'POST', + headers: { 'Content-Type': 'plain/text; charset=utf-8' }, + body: JSON.stringify(data) + }) +) diff --git a/apps/ChangePassword/components/App.js b/apps/ChangePassword/components/App.js new file mode 100644 index 0000000..ce32ffb --- /dev/null +++ b/apps/ChangePassword/components/App.js @@ -0,0 +1,113 @@ +import styles from '../styles/ChangePassword.module.scss' +import { useState } from 'react' +import useSettings from 'hooks/useSettings' +import usePopup from 'hooks/usePopup' +import useApps from 'hooks/useApps' +import useUser from 'hooks/useUser' +import { close } from 'helpers/windowActions' +import { changePassword } from '../api' + +const App = () => { + const { t } = useSettings() + const { user } = useUser() + const { setApps } = useApps() + const { setPopup } = usePopup() + const [currPassError, setCurrPassError] = useState(false) + const [newPassError, setNewPassError] = useState(false) + + const onSubmit = async (e) => { + e.preventDefault() + + const { + current_password: {value: currentPassword}, + new_password: { value: newPassword}, + confirm_password: {value: confirmPassword} + } = e.currentTarget + + if (newPassword !== confirmPassword) { + setPopup({ + content: t('change_password_wrong_new'), + time: 2000, + error: true + }) + setNewPassError(true) + + } else if (newPassword === currentPassword) { + setPopup({ + content: t('change_password_same_password'), + time: 2000, + error: true + }) + setNewPassError(true) + } else { + try { + await changePassword({_id: user._id, currentPassword, newPassword}) + setPopup({ + content: t('change_password_changed'), + time: 2000, + }) + close('ChangePassword', setApps) + } catch(e) { + if (e?.data?.error === 'Wrong password') { + setPopup({ + content: t('change_password_wrong_current'), + time: 2000, + error: true + }) + setCurrPassError(true) + } else { + setPopup({ + content: t('change_password_error'), + time: 2000, + error: true + }) + } + } + } + } + + return ( +
+ + { currPassError && setCurrPassError(false) }} + required + /> + + { newPassError && setNewPassError(false) }} + required + /> + { newPassError && setNewPassError(false) }} + required + /> + +
+ ) +} + +export default App diff --git a/apps/ChangePassword/index.js b/apps/ChangePassword/index.js new file mode 100644 index 0000000..cd1d5e2 --- /dev/null +++ b/apps/ChangePassword/index.js @@ -0,0 +1,3 @@ +import ChangePassword from './components/App' + +export default ChangePassword diff --git a/apps/ChangePassword/styles/ChangePassword.module.scss b/apps/ChangePassword/styles/ChangePassword.module.scss new file mode 100644 index 0000000..cb4e876 --- /dev/null +++ b/apps/ChangePassword/styles/ChangePassword.module.scss @@ -0,0 +1,27 @@ +.password { + padding: 1em; + text-align: center; +} + +.input { + color: var(--color-text-alt); + background: var(--color-window-content); + padding: .5em; + margin: .75em 0; + border: 1px dashed var(--color-decor); + border-radius: .5px; + width: 100%; +} + +.label { + font-size: .9em; + display: block; + text-align: left; + color: var(--color-text-alt); + margin-top: .75em; +} + +.error { + border: 1px solid var(--color-error); + color: var(--color-error); +} diff --git a/apps/Settings/api.js b/apps/Settings/api.js index f538368..142afc1 100644 --- a/apps/Settings/api.js +++ b/apps/Settings/api.js @@ -1,9 +1,9 @@ import fetchJson from 'helpers/fetchJson' -export const saveSettings = async (data) => { +export const saveSettings = async (data) => ( fetchJson('/api/settings', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) -} +) diff --git a/apps/index.js b/apps/index.js index eccedac..05ad5e4 100644 --- a/apps/index.js +++ b/apps/index.js @@ -2,4 +2,5 @@ export { default as Calculator } from './Calculator' export { default as Notes } from './Notes' export { default as Player } from './Player' export { default as Settings } from './Settings' +export { default as ChangePassword } from './ChangePassword' export { default as Youtube } from './Youtube' diff --git a/components/Header.js b/components/Header.js index 2db8178..60bf1bd 100644 --- a/components/Header.js +++ b/components/Header.js @@ -98,15 +98,25 @@ const Header = () => {
setUserMenu(false)} />