Merge pull request #7481 from overleaf/ta-leave-modal-no-password

[DeleteAccount] Handle Password-Less Users

GitOrigin-RevId: b7d03d26d43b9ab7f50a199d9aabd226ac79972d
This commit is contained in:
ilkin-overleaf 2022-04-08 14:01:21 +03:00 committed by Copybot
parent cef7adc711
commit a8fdf6269e
4 changed files with 76 additions and 8 deletions

View file

@ -1,7 +1,8 @@
import { useState, Dispatch, SetStateAction } from 'react' import { useState, Dispatch, SetStateAction } from 'react'
import { Modal, Button } from 'react-bootstrap' import { Modal, Button } from 'react-bootstrap'
import { useTranslation, Trans } from 'react-i18next' import { useTranslation, Trans } from 'react-i18next'
import LeaveModalForm from './modal-form' import getMeta from '../../../../utils/meta'
import LeaveModalForm, { LeaveModalFormProps } from './modal-form'
type LeaveModalContentProps = { type LeaveModalContentProps = {
handleHide: () => void handleHide: () => void
@ -9,6 +10,34 @@ type LeaveModalContentProps = {
setInFlight: Dispatch<SetStateAction<boolean>> setInFlight: Dispatch<SetStateAction<boolean>>
} }
function LeaveModalContentBlock({
setInFlight,
isFormValid,
setIsFormValid,
}: LeaveModalFormProps) {
const { t } = useTranslation()
const isSaas = getMeta('ol-isSaas') as boolean
const hasPassword = getMeta('ol-hasPassword') as boolean
if (isSaas && !hasPassword) {
return (
<p>
<b>
<a href="/user/password/reset">{t('delete_acct_no_existing_pw')}</a>
</b>
</p>
)
}
return (
<LeaveModalForm
setInFlight={setInFlight}
isFormValid={isFormValid}
setIsFormValid={setIsFormValid}
/>
)
}
function LeaveModalContent({ function LeaveModalContent({
handleHide, handleHide,
inFlight, inFlight,
@ -30,7 +59,7 @@ function LeaveModalContent({
components={[<strong />]} // eslint-disable-line react/jsx-key components={[<strong />]} // eslint-disable-line react/jsx-key
/> />
</p> </p>
<LeaveModalForm <LeaveModalContentBlock
setInFlight={setInFlight} setInFlight={setInFlight}
isFormValid={isFormValid} isFormValid={isFormValid}
setIsFormValid={setIsFormValid} setIsFormValid={setIsFormValid}

View file

@ -5,7 +5,7 @@ import { postJSON, FetchError } from '../../../../infrastructure/fetch-json'
import getMeta from '../../../../utils/meta' import getMeta from '../../../../utils/meta'
import LeaveModalFormError from './modal-form-error' import LeaveModalFormError from './modal-form-error'
type LeaveModalFormProps = { export type LeaveModalFormProps = {
setInFlight: Dispatch<SetStateAction<boolean>> setInFlight: Dispatch<SetStateAction<boolean>>
isFormValid: boolean isFormValid: boolean
setIsFormValid: Dispatch<SetStateAction<boolean>> setIsFormValid: Dispatch<SetStateAction<boolean>>

View file

@ -11,9 +11,15 @@ function defaultSetupMocks(fetchMock) {
}) })
} }
export const Section = args => { function setDefaultMeta() {
window.metaAttributesCache.set('ol-userDefaultEmail', 'user@primary.com') window.metaAttributesCache.set('ol-userDefaultEmail', 'user@primary.com')
window.metaAttributesCache.set('ol-isSaas', true)
window.metaAttributesCache.set('ol-hasPassword', true)
}
export const Section = args => {
useFetchMock(defaultSetupMocks) useFetchMock(defaultSetupMocks)
setDefaultMeta()
return <LeaveSection {...args} /> return <LeaveSection {...args} />
} }
@ -21,14 +27,22 @@ Section.component = LeaveSection
Section.parameters = { controls: { include: [], hideNoControlsWarning: true } } Section.parameters = { controls: { include: [], hideNoControlsWarning: true } }
export const ModalSuccess = args => { export const ModalSuccess = args => {
window.metaAttributesCache.set('ol-userDefaultEmail', 'user@primary.com') setDefaultMeta()
useFetchMock(defaultSetupMocks)
return <LeaveModal {...args} />
}
export const ModalWithoutPassword = args => {
setDefaultMeta()
window.metaAttributesCache.set('ol-hasPassword', false)
useFetchMock(defaultSetupMocks) useFetchMock(defaultSetupMocks)
return <LeaveModal {...args} /> return <LeaveModal {...args} />
} }
export const ModalAuthError = args => { export const ModalAuthError = args => {
window.metaAttributesCache.set('ol-userDefaultEmail', 'user@primary.com') setDefaultMeta()
useFetchMock(fetchMock => { useFetchMock(fetchMock => {
fetchMock.post(/\/user\/delete/, 403) fetchMock.post(/\/user\/delete/, 403)
}) })
@ -37,7 +51,7 @@ export const ModalAuthError = args => {
} }
export const ModalServerError = args => { export const ModalServerError = args => {
window.metaAttributesCache.set('ol-userDefaultEmail', 'user@primary.com') setDefaultMeta()
useFetchMock(fetchMock => { useFetchMock(fetchMock => {
fetchMock.post(/\/user\/delete/, 500) fetchMock.post(/\/user\/delete/, 500)
}) })
@ -46,7 +60,7 @@ export const ModalServerError = args => {
} }
export const ModalSubscriptionError = args => { export const ModalSubscriptionError = args => {
window.metaAttributesCache.set('ol-userDefaultEmail', 'user@primary.com') setDefaultMeta()
useFetchMock(fetchMock => { useFetchMock(fetchMock => {
fetchMock.post(/\/user\/delete/, { fetchMock.post(/\/user\/delete/, {
status: 422, status: 422,

View file

@ -5,7 +5,14 @@ import fetchMock from 'fetch-mock'
import LeaveModalContent from '../../../../../../frontend/js/features/settings/components/leave/modal-content' import LeaveModalContent from '../../../../../../frontend/js/features/settings/components/leave/modal-content'
describe('<LeaveModalContent />', function () { describe('<LeaveModalContent />', function () {
beforeEach(function () {
window.metaAttributesCache = new Map()
window.metaAttributesCache.set('ol-isSaas', false)
window.metaAttributesCache.set('ol-hasPassword', true)
})
afterEach(function () { afterEach(function () {
window.metaAttributesCache = new Map()
fetchMock.reset() fetchMock.reset()
}) })
@ -17,10 +24,28 @@ describe('<LeaveModalContent />', function () {
setInFlight={() => {}} setInFlight={() => {}}
/> />
) )
screen.getByLabelText('Email')
const deleteButton = screen.getByRole('button', { const deleteButton = screen.getByRole('button', {
name: 'Delete', name: 'Delete',
}) })
expect(deleteButton.hasAttribute('disabled')).to.be.true expect(deleteButton.hasAttribute('disabled')).to.be.true
}) })
it('shows no password message', function () {
window.metaAttributesCache.set('ol-isSaas', true)
window.metaAttributesCache.set('ol-hasPassword', false)
render(
<LeaveModalContent
handleHide={() => {}}
inFlight={false}
setInFlight={() => {}}
/>
)
const link = screen.getByRole('link', {
name: 'Please use the password reset form to set a password before deleting your account',
})
expect(link.getAttribute('href')).to.equal('/user/password/reset')
})
}) })