From 279ada061d540832626d289cc77ec021eab2ee26 Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Tue, 9 Jun 2026 16:16:22 -0400 Subject: [PATCH 1/3] feat(hotfix): Do not sent delete request to the BE for deleting preprint drafts --- .../models/preprint-draft-deletion.model.ts | 1 - .../create-new-version.component.spec.ts | 12 ++---------- .../create-new-version.component.ts | 11 +---------- .../submit-preprint-stepper.component.spec.ts | 7 ++----- .../submit-preprint-stepper.component.ts | 6 +----- .../update-preprint-stepper.component.ts | 8 +------- .../services/preprint-draft-deletion.service.ts | 7 ------- .../store/preprint-stepper/preprint-stepper.state.ts | 11 ----------- .../preprint-draft-deletion-provider.mock.ts | 6 ------ 9 files changed, 7 insertions(+), 62 deletions(-) diff --git a/src/app/features/preprints/models/preprint-draft-deletion.model.ts b/src/app/features/preprints/models/preprint-draft-deletion.model.ts index 48e7fc501..ebe76593c 100644 --- a/src/app/features/preprints/models/preprint-draft-deletion.model.ts +++ b/src/app/features/preprints/models/preprint-draft-deletion.model.ts @@ -1,5 +1,4 @@ export interface ConfirmDeleteDraftOptions { - onDelete: () => void; onReset: () => void; redirectUrl: string; } diff --git a/src/app/features/preprints/pages/create-new-version/create-new-version.component.spec.ts b/src/app/features/preprints/pages/create-new-version/create-new-version.component.spec.ts index c194b51ea..95a9070ad 100644 --- a/src/app/features/preprints/pages/create-new-version/create-new-version.component.spec.ts +++ b/src/app/features/preprints/pages/create-new-version/create-new-version.component.spec.ts @@ -33,12 +33,7 @@ import { PreprintSteps } from '../../enums'; import { PreprintProviderDetails } from '../../models'; import { PreprintDraftDeletionService } from '../../services/preprint-draft-deletion.service'; import { GetPreprintProviderById, PreprintProvidersSelectors } from '../../store/preprint-providers'; -import { - DeletePreprint, - FetchPreprintById, - PreprintStepperSelectors, - ResetPreprintStepperState, -} from '../../store/preprint-stepper'; +import { FetchPreprintById, PreprintStepperSelectors, ResetPreprintStepperState } from '../../store/preprint-stepper'; import { CreateNewVersionComponent } from './create-new-version.component'; @@ -130,7 +125,7 @@ describe('CreateNewVersionComponent', () => { expect(browserTabMock.updateTabStyles).toHaveBeenCalledWith(mockProvider.faviconUrl, mockProvider.name); }); - it('should reset services, delegate destroy delete, and reset stepper state', () => { + it('should reset services and reset stepper state on destroy', () => { setup(); component.ngOnDestroy(); @@ -138,8 +133,6 @@ describe('CreateNewVersionComponent', () => { expect(headerStyleMock.resetToDefaults).toHaveBeenCalled(); expect(brandServiceMock.resetBranding).toHaveBeenCalled(); expect(browserTabMock.resetToDefaults).toHaveBeenCalled(); - expect(draftDeletionMock.deleteOnDestroyIfNeeded).toHaveBeenCalledWith(expect.any(Function)); - expect(store.dispatch).toHaveBeenCalledWith(new DeletePreprint()); expect(store.dispatch).toHaveBeenCalledWith(new ResetPreprintStepperState()); }); @@ -227,7 +220,6 @@ describe('CreateNewVersionComponent', () => { expect(draftDeletionMock.confirmDeleteDraft).toHaveBeenCalledWith( expect.objectContaining({ redirectUrl: '/my-preprints', - onDelete: expect.any(Function), onReset: expect.any(Function), }) ); diff --git a/src/app/features/preprints/pages/create-new-version/create-new-version.component.ts b/src/app/features/preprints/pages/create-new-version/create-new-version.component.ts index e789129a8..c4c950897 100644 --- a/src/app/features/preprints/pages/create-new-version/create-new-version.component.ts +++ b/src/app/features/preprints/pages/create-new-version/create-new-version.component.ts @@ -33,12 +33,7 @@ import { createNewVersionStepsConst } from '../../constants'; import { PreprintSteps } from '../../enums'; import { PreprintDraftDeletionService } from '../../services/preprint-draft-deletion.service'; import { GetPreprintProviderById, PreprintProvidersSelectors } from '../../store/preprint-providers'; -import { - DeletePreprint, - FetchPreprintById, - PreprintStepperSelectors, - ResetPreprintStepperState, -} from '../../store/preprint-stepper'; +import { FetchPreprintById, PreprintStepperSelectors, ResetPreprintStepperState } from '../../store/preprint-stepper'; @Component({ selector: 'osf-create-new-version', @@ -65,7 +60,6 @@ export class CreateNewVersionComponent implements OnDestroy, CanDeactivateCompon getPreprintProviderById: GetPreprintProviderById, fetchPreprint: FetchPreprintById, resetState: ResetPreprintStepperState, - deletePreprint: DeletePreprint, }); readonly preprintProvider = select(PreprintProvidersSelectors.getPreprintProviderDetails(this.providerId())); @@ -109,8 +103,6 @@ export class CreateNewVersionComponent implements OnDestroy, CanDeactivateCompon this.brandService.resetBranding(); this.browserTabHelper.resetToDefaults(); - this.draftDeletionService.deleteOnDestroyIfNeeded(() => this.actions.deletePreprint()); - this.actions.resetState(); } @@ -144,7 +136,6 @@ export class CreateNewVersionComponent implements OnDestroy, CanDeactivateCompon requestDeletePreprint(): void { this.draftDeletionService.confirmDeleteDraft({ - onDelete: () => this.actions.deletePreprint(), onReset: () => this.actions.resetState(), redirectUrl: '/my-preprints', }); diff --git a/src/app/features/preprints/pages/submit-preprint-stepper/submit-preprint-stepper.component.spec.ts b/src/app/features/preprints/pages/submit-preprint-stepper/submit-preprint-stepper.component.spec.ts index cbb33a9d0..cb16d3bc0 100644 --- a/src/app/features/preprints/pages/submit-preprint-stepper/submit-preprint-stepper.component.spec.ts +++ b/src/app/features/preprints/pages/submit-preprint-stepper/submit-preprint-stepper.component.spec.ts @@ -36,7 +36,7 @@ import { PreprintSteps } from '../../enums'; import { PreprintProviderDetails } from '../../models'; import { PreprintDraftDeletionService } from '../../services/preprint-draft-deletion.service'; import { GetPreprintProviderById, PreprintProvidersSelectors } from '../../store/preprint-providers'; -import { DeletePreprint, PreprintStepperSelectors, ResetPreprintStepperState } from '../../store/preprint-stepper'; +import { PreprintStepperSelectors, ResetPreprintStepperState } from '../../store/preprint-stepper'; import { SubmitPreprintStepperComponent } from './submit-preprint-stepper.component'; @@ -130,7 +130,7 @@ describe('SubmitPreprintStepperComponent', () => { expect(browserTabMock.updateTabStyles).toHaveBeenCalledWith(mockProvider.faviconUrl, mockProvider.name); }); - it('should reset services, delegate destroy delete, and reset stepper state', () => { + it('should reset services and reset stepper state on destroy', () => { setup(); component.ngOnDestroy(); @@ -138,8 +138,6 @@ describe('SubmitPreprintStepperComponent', () => { expect(headerStyleMock.resetToDefaults).toHaveBeenCalled(); expect(brandServiceMock.resetBranding).toHaveBeenCalled(); expect(browserTabMock.resetToDefaults).toHaveBeenCalled(); - expect(draftDeletionMock.deleteOnDestroyIfNeeded).toHaveBeenCalledWith(expect.any(Function)); - expect(store.dispatch).toHaveBeenCalledWith(new DeletePreprint()); expect(store.dispatch).toHaveBeenCalledWith(new ResetPreprintStepperState()); }); @@ -287,7 +285,6 @@ describe('SubmitPreprintStepperComponent', () => { expect(draftDeletionMock.confirmDeleteDraft).toHaveBeenCalledWith( expect.objectContaining({ redirectUrl: '/preprints', - onDelete: expect.any(Function), onReset: expect.any(Function), }) ); diff --git a/src/app/features/preprints/pages/submit-preprint-stepper/submit-preprint-stepper.component.ts b/src/app/features/preprints/pages/submit-preprint-stepper/submit-preprint-stepper.component.ts index 59bd3bb4a..65a608c74 100644 --- a/src/app/features/preprints/pages/submit-preprint-stepper/submit-preprint-stepper.component.ts +++ b/src/app/features/preprints/pages/submit-preprint-stepper/submit-preprint-stepper.component.ts @@ -39,7 +39,7 @@ import { submitPreprintSteps } from '../../constants'; import { PreprintSteps } from '../../enums'; import { PreprintDraftDeletionService } from '../../services/preprint-draft-deletion.service'; import { GetPreprintProviderById, PreprintProvidersSelectors } from '../../store/preprint-providers'; -import { DeletePreprint, PreprintStepperSelectors, ResetPreprintStepperState } from '../../store/preprint-stepper'; +import { PreprintStepperSelectors, ResetPreprintStepperState } from '../../store/preprint-stepper'; @Component({ selector: 'osf-submit-preprint-stepper', @@ -74,7 +74,6 @@ export class SubmitPreprintStepperComponent implements OnDestroy, CanDeactivateC private actions = createDispatchMap({ getPreprintProviderById: GetPreprintProviderById, resetState: ResetPreprintStepperState, - deletePreprint: DeletePreprint, }); preprintProvider = select(PreprintProvidersSelectors.getPreprintProviderDetails(this.providerId())); @@ -133,14 +132,11 @@ export class SubmitPreprintStepperComponent implements OnDestroy, CanDeactivateC this.brandService.resetBranding(); this.browserTabHelper.resetToDefaults(); - this.draftDeletionService.deleteOnDestroyIfNeeded(() => this.actions.deletePreprint()); - this.actions.resetState(); } requestDeletePreprint(): void { this.draftDeletionService.confirmDeleteDraft({ - onDelete: () => this.actions.deletePreprint(), onReset: () => this.actions.resetState(), redirectUrl: '/preprints', }); diff --git a/src/app/features/preprints/pages/update-preprint-stepper/update-preprint-stepper.component.ts b/src/app/features/preprints/pages/update-preprint-stepper/update-preprint-stepper.component.ts index 3ea582ae1..c288af3f4 100644 --- a/src/app/features/preprints/pages/update-preprint-stepper/update-preprint-stepper.component.ts +++ b/src/app/features/preprints/pages/update-preprint-stepper/update-preprint-stepper.component.ts @@ -37,12 +37,7 @@ import { TitleAndAbstractStepComponent } from '../../components/stepper/title-an import { submitPreprintSteps } from '../../constants'; import { PreprintSteps, ProviderReviewsWorkflow, ReviewsState } from '../../enums'; import { GetPreprintProviderById, PreprintProvidersSelectors } from '../../store/preprint-providers'; -import { - DeletePreprint, - FetchPreprintById, - PreprintStepperSelectors, - ResetPreprintStepperState, -} from '../../store/preprint-stepper'; +import { FetchPreprintById, PreprintStepperSelectors, ResetPreprintStepperState } from '../../store/preprint-stepper'; @Component({ selector: 'osf-update-preprint-stepper', @@ -76,7 +71,6 @@ export class UpdatePreprintStepperComponent implements OnDestroy, CanDeactivateC getPreprintProviderById: GetPreprintProviderById, resetState: ResetPreprintStepperState, fetchPreprint: FetchPreprintById, - deletePreprint: DeletePreprint, }); readonly preprintProvider = select(PreprintProvidersSelectors.getPreprintProviderDetails(this.providerId())); diff --git a/src/app/features/preprints/services/preprint-draft-deletion.service.ts b/src/app/features/preprints/services/preprint-draft-deletion.service.ts index 1843e742b..1f30a2315 100644 --- a/src/app/features/preprints/services/preprint-draft-deletion.service.ts +++ b/src/app/features/preprints/services/preprint-draft-deletion.service.ts @@ -18,19 +18,12 @@ export class PreprintDraftDeletionService { return hasBeenSubmitted || this.preprintDeleted; } - deleteOnDestroyIfNeeded(onDelete: () => void): void { - if (!this.preprintDeleted) { - onDelete(); - } - } - confirmDeleteDraft(options: ConfirmDeleteDraftOptions): void { this.customConfirmationService.confirmDelete({ headerKey: 'preprints.preprintStepper.deleteDraft.header', messageKey: 'preprints.preprintStepper.deleteDraft.message', onConfirm: () => { this.preprintDeleted = true; - options.onDelete(); options.onReset(); this.toastService.showSuccess('preprints.preprintStepper.deleteDraft.success'); this.router.navigateByUrl(options.redirectUrl); diff --git a/src/app/features/preprints/store/preprint-stepper/preprint-stepper.state.ts b/src/app/features/preprints/store/preprint-stepper/preprint-stepper.state.ts index 36438d257..ff1e17cc7 100644 --- a/src/app/features/preprints/store/preprint-stepper/preprint-stepper.state.ts +++ b/src/app/features/preprints/store/preprint-stepper/preprint-stepper.state.ts @@ -24,7 +24,6 @@ import { CreateNewProject, CreateNewVersion, CreatePreprint, - DeletePreprint, DisconnectProject, FetchAvailableProjects, FetchLicenses, @@ -479,16 +478,6 @@ export class PreprintStepperState { return EMPTY; } - @Action(DeletePreprint) - deletePreprint(ctx: StateContext) { - const state = ctx.getState(); - const createdPreprintId = state.preprint.data?.id; - if (createdPreprintId && !state.hasBeenSubmitted) { - return this.preprintsService.deletePreprint(createdPreprintId); - } - return EMPTY; - } - @Action(SetPreprintStepperCurrentFolder) setCurrentFolder(ctx: StateContext, action: SetPreprintStepperCurrentFolder) { ctx.setState( diff --git a/src/testing/providers/preprint-draft-deletion-provider.mock.ts b/src/testing/providers/preprint-draft-deletion-provider.mock.ts index d9b769f54..02e55581f 100644 --- a/src/testing/providers/preprint-draft-deletion-provider.mock.ts +++ b/src/testing/providers/preprint-draft-deletion-provider.mock.ts @@ -6,7 +6,6 @@ export type PreprintDraftDeletionServiceMockType = Partial submitted || service.deleted), - deleteOnDestroyIfNeeded: vi.fn((onDelete: () => void) => { - if (!service.deleted) { - onDelete(); - } - }), }; return service; }, From c4db0e929718f3d07ce39af099542a1ab7a08c2b Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Tue, 9 Jun 2026 16:18:23 -0400 Subject: [PATCH 2/3] feat(hotfix): Remove dead code --- src/app/features/preprints/services/preprints.service.ts | 4 ---- .../store/preprint-stepper/preprint-stepper.actions.ts | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/app/features/preprints/services/preprints.service.ts b/src/app/features/preprints/services/preprints.service.ts index fad44bbdd..5216bf12d 100644 --- a/src/app/features/preprints/services/preprints.service.ts +++ b/src/app/features/preprints/services/preprints.service.ts @@ -123,10 +123,6 @@ export class PreprintsService { ); } - deletePreprint(id: string) { - return this.jsonApiService.delete(`${this.apiUrl}/preprints/${id}/`); - } - updatePreprint(id: string, payload: Partial): Observable { const apiPayload = this.mapPreprintDomainToApiPayload(payload); diff --git a/src/app/features/preprints/store/preprint-stepper/preprint-stepper.actions.ts b/src/app/features/preprints/store/preprint-stepper/preprint-stepper.actions.ts index 4e35cfd0c..9edce748b 100644 --- a/src/app/features/preprints/store/preprint-stepper/preprint-stepper.actions.ts +++ b/src/app/features/preprints/store/preprint-stepper/preprint-stepper.actions.ts @@ -145,10 +145,6 @@ export class ResetPreprintStepperState { static readonly type = '[Preprint Stepper] Reset State'; } -export class DeletePreprint { - static readonly type = '[Preprint Stepper] Delete Preprint'; -} - export class SetPreprintStepperCurrentFolder { static readonly type = '[Preprint Stepper] Set Preprint Stepper Current Folder'; From 40cf2a95485868ca14aaaf7ae1ec17b6103847de Mon Sep 17 00:00:00 2001 From: Yuhuai Liu Date: Tue, 9 Jun 2026 16:30:55 -0400 Subject: [PATCH 3/3] feat(hotfix): Fix tests --- .../preprint-draft-deletion.service.spec.ts | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/app/features/preprints/services/preprint-draft-deletion.service.spec.ts b/src/app/features/preprints/services/preprint-draft-deletion.service.spec.ts index dd2205ee8..35cf349e8 100644 --- a/src/app/features/preprints/services/preprint-draft-deletion.service.spec.ts +++ b/src/app/features/preprints/services/preprint-draft-deletion.service.spec.ts @@ -44,12 +44,10 @@ describe('PreprintDraftDeletionService', () => { expect(service).toBeTruthy(); }); - it('should open confirm delete and run delete, reset, toast, navigate on confirm', () => { - const onDelete = vi.fn(); + it('should open confirm delete and run reset, toast, navigate on confirm', () => { const onReset = vi.fn(); service.confirmDeleteDraft({ - onDelete, onReset, redirectUrl: '/preprints', }); @@ -63,34 +61,22 @@ describe('PreprintDraftDeletionService', () => { const { onConfirm } = confirmationMock.confirmDelete.mock.calls[0][0]; onConfirm(); - expect(onDelete).toHaveBeenCalled(); expect(onReset).toHaveBeenCalled(); expect(toastMock.showSuccess).toHaveBeenCalledWith('preprints.preprintStepper.deleteDraft.success'); expect(routerMock.navigateByUrl).toHaveBeenCalledWith('/preprints'); }); - it('should allow canDeactivate and skip deleteOnDestroy after confirmed delete', () => { - const onDelete = vi.fn(); + it('should allow canDeactivate after confirmed delete', () => { const onReset = vi.fn(); - service.confirmDeleteDraft({ onDelete, onReset, redirectUrl: '/x' }); + service.confirmDeleteDraft({ onReset, redirectUrl: '/x' }); const { onConfirm } = confirmationMock.confirmDelete.mock.calls[0][0]; onConfirm(); expect(service.canDeactivate(false)).toBe(true); - - const destroyDelete = vi.fn(); - service.deleteOnDestroyIfNeeded(destroyDelete); - expect(destroyDelete).not.toHaveBeenCalled(); }); it('should return canDeactivate true when submitted', () => { expect(service.canDeactivate(true)).toBe(true); }); - - it('should call deleteOnDestroy when not yet deleted', () => { - const destroyDelete = vi.fn(); - service.deleteOnDestroyIfNeeded(destroyDelete); - expect(destroyDelete).toHaveBeenCalled(); - }); });