Skip to content
Snippets Groups Projects
Commit e3d96073 authored by Alexandru Munteanu's avatar Alexandru Munteanu
Browse files

feat(email-subscriptions): subscribe and unsubscribe from emails

parent 71ce91f4
No related branches found
No related tags found
1 merge request!14Sprint #15
Showing with 120 additions and 17 deletions
......@@ -125,6 +125,39 @@ const Users = app => {
require('./routes/users/changePassword')(app.locals.models),
)
/**
* @api {patch} /api/users/subscriptions Change user's email subscription flag
* @apiGroup Users
* @apiParamExample {json} Body
* {
* "isUnsubscribed": true,
* }
* @apiSuccessExample {json} Success
* HTTP/1.1 200 OK
* {
* "id": "a6184463-b17a-42f8-b02b-ae1d755cdc6b",
* "type": "user",
* "admin": false,
* "email": "email@example.com",
* "teams": [],
* "username": "email@example.com",
* "fragments": [],
* "collections": [],
* "isConfirmed": true,
* "editorInChief": false,
* "handlingEditor": false,
* "isUnsubscribed": true
* }
* @apiErrorExample {json} Reset password errors
* HTTP/1.1 400 Bad Request
* HTTP/1.1 404 Not Found
*/
app.patch(
'/api/users/subscriptions',
authBearer,
require('./routes/users/subscriptions')(app.locals.models),
)
// register ORCID authentication strategy
orcidRoutes(app)
}
......
const { services } = require('pubsweet-component-helper-service')
module.exports = models => async (req, res) => {
const { isUnsubscribed } = req.body
if (!services.checkForUndefinedParams(isUnsubscribed))
return res.status(400).json({ error: 'Missing required params.' })
let user
try {
user = await models.User.find(req.user)
user.isUnsubscribed = isUnsubscribed
user = await user.save()
return res.status(200).json({ user })
} catch (e) {
const notFoundError = await services.handleNotFoundError(e, 'User')
return res.status(notFoundError.status).json({
error: notFoundError.message,
})
}
}
......@@ -29,7 +29,7 @@ export default compose(
withJournal,
withState('isEdit', 'setEdit', false),
withHandlers({
setEditMode: ({ setEdit }) => value => setEdit(value),
setEditMode: ({ setEdit }) => value => () => setEdit(value),
}),
)(AccountDetails)
......
......@@ -3,10 +3,10 @@ import React, { Fragment } from 'react'
import {
Row,
RowItem,
LabelHeader,
LinkText,
LabelTitle,
LabelHeader,
DefaultText,
LinkText,
} from '../UIComponents/FormItems'
import { getUserTitle } from '../utils'
......@@ -48,7 +48,7 @@ const AccountDetailsCard = ({
</Row>
<Row noMargin>
<RowItem>
<LinkText onClick={() => setEditMode(true)}>Edit details</LinkText>
<LinkText onClick={setEditMode(true)}>Edit details</LinkText>
<LinkText onClick={() => history.push('/profile/change-password')}>
Change Password
</LinkText>
......
......@@ -11,7 +11,7 @@ const AccountDetailsEdit = ({ journal, user, setEditMode, handleSubmit }) => (
<Root onSubmit={handleSubmit}>
<EditUserForm journal={journal} title="Edit account details" user={user} />
<Row>
<Button onClick={() => setEditMode(false)}>Cancel</Button>
<Button onClick={setEditMode(false)}>Cancel</Button>
<Button primary type="submit">
Save
</Button>
......
import React from 'react'
import styled from 'styled-components'
import { compose, withHandlers } from 'recompose'
import {
withModal,
ConfirmationModal,
} from 'pubsweet-component-modal/src/components'
import { Row, RowItem, LabelHeader, LinkText } from '../UIComponents/FormItems'
const EmailNotifications = ({ subscribed = '' }) => (
const EmailNotifications = ({ subscribed = '', subscribe, unsubscribe }) => (
<Root>
<Row noMargin>
<RowItem>
......@@ -13,20 +18,48 @@ const EmailNotifications = ({ subscribed = '' }) => (
{!subscribed ? (
<Row noMargin>
<RowItem>
<LinkText>Re-subscribe</LinkText>
<LinkText onClick={subscribe}>Re-subscribe</LinkText>
</RowItem>
</Row>
) : (
<Row noMargin>
<RowItem>
<LinkText>Unsubscribe</LinkText>
<LinkText onClick={unsubscribe}>Unsubscribe</LinkText>
</RowItem>
</Row>
)}
</Root>
)
export default EmailNotifications
export default compose(
withModal(props => ({
modalComponent: ConfirmationModal,
})),
withHandlers({
subscribe: ({ showModal, hideModal, changeEmailSubscription }) => () => {
showModal({
title: 'Subscribe to emails',
subtitle: 'Are you sure you want to subscribe to emails?',
onConfirm: () => {
changeEmailSubscription(false)
hideModal()
},
onCancel: hideModal,
})
},
unsubscribe: ({ showModal, hideModal, changeEmailSubscription }) => () => {
showModal({
title: 'Unsubscribe from emails',
subtitle: 'Are you sure you want to unsubscribe from emails?',
onConfirm: () => {
changeEmailSubscription(true)
hideModal()
},
onCancel: hideModal,
})
},
}),
)(EmailNotifications)
// #region styles
const Root = styled.div`
......
......@@ -6,11 +6,12 @@ import styled from 'styled-components'
import { selectCurrentUser } from 'xpub-selectors'
import { BreadcrumbsHeader } from 'pubsweet-components-faraday/src/components'
import AccountDetails from './AccountDetails'
import LinkOrcID from './LinkOrcID'
import AccountDetails from './AccountDetails'
import EmailNotifications from './EmailNotifications'
import { changeEmailSubscription } from '../../redux/users'
const UserProfilePage = ({ history, user }) => (
const UserProfilePage = ({ history, user, changeEmailSubscription }) => (
<Root>
<BreadcrumbsHeader
history={history}
......@@ -20,15 +21,21 @@ const UserProfilePage = ({ history, user }) => (
underlined
/>
<AccountDetails history={history} user={user} />
<EmailNotifications subscribed={get(user, 'subscription')} />
<EmailNotifications
changeEmailSubscription={changeEmailSubscription}
subscribed={!get(user, 'isUnsubscribed')}
/>
<LinkOrcID id={get(user, 'id')} orcid={get(user, 'orcid')} />
</Root>
)
export default compose(
connect(state => ({
user: selectCurrentUser(state),
})),
connect(
state => ({
user: selectCurrentUser(state),
}),
{ changeEmailSubscription },
),
)(UserProfilePage)
// #region styles
......
import { get } from 'lodash'
import { create } from 'pubsweet-client/src/helpers/api'
import { actions } from 'pubsweet-client'
import { create, update } from 'pubsweet-client/src/helpers/api'
const LOGIN_SUCCESS = 'LOGIN_SUCCESS'
......@@ -20,3 +21,9 @@ export const confirmUser = (userId, confirmationToken) => dispatch =>
localStorage.setItem('token', user.token)
return dispatch(loginSuccess(user))
})
export const changeEmailSubscription = isUnsubscribed => dispatch => {
update(`/users/subscriptions`, {
isUnsubscribed,
}).then(() => dispatch(actions.getCurrentUser()))
}
......@@ -46,7 +46,7 @@ module.exports = {
API_ENDPOINT: '/api',
baseUrl: process.env.CLIENT_BASE_URL || 'http://localhost:3000',
'login-redirect': '/',
'redux-log': false,
'redux-log': true,
theme: process.env.PUBSWEET_THEME,
},
orcid: {
......
......@@ -131,6 +131,7 @@ module.exports = {
confirmationToken: Joi.string().allow(''),
agreeTC: Joi.boolean(),
isActive: Joi.boolean().default(true),
isUnsubscribed: Joi.boolean(),
},
team: {
group: Joi.string(),
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment