mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-30 01:15:25 -05:00
Merge pull request #7481 from overleaf/ta-leave-modal-no-password
[DeleteAccount] Handle Password-Less Users GitOrigin-RevId: b7d03d26d43b9ab7f50a199d9aabd226ac79972d
This commit is contained in:
parent
cef7adc711
commit
a8fdf6269e
4 changed files with 76 additions and 8 deletions
|
@ -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}
|
||||||
|
|
|
@ -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>>
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue