V16: Retry requests after timeout (#19495)

* feat: fix a small-ish nitpick where extensions would reload after login

this could potentially try to re-register all private extensions after each auth signal, which is being prevented anyway because of duplicate aliases, but still nice to remove and not have to listen to

* feat: align login UI extension load with backoffice, i.e. wait for external load before registering core extensions

* build(deps): bump @hey-api to newest and re-generate client

* chore: adds extra error logging

* feat: adds retry logic to the api interceptor

* feat: warn about incomplete actions

* fix: the body was already plain text, but we need to ensure the headers say so as well

* feat: warns the user when actions could not be completed

* build(deps): update @hey-api/client-fetch

* chore: generate new api

* feat: simplify error handling to just UmbApiError and UmbCancelError

* feat: moves error notifications from interceptors into tryExecute, so you more easily can opt out of it and everything is gathered in one place

* feat: recreate responses with correct 'status' and 'statusText'

* build: stop dotnet processes after debug session

* feat: extrapolate common logic into helper method to create responses

* feat: returns a UmbProblemDetails like object on interceptors to be handled by tryExecute

* chore: deprecates duplicate, outdated UmbProblemDetails interface and type guard

* feat: uses the 'title' of the problem details object to convey the main message

* chore: 401 and 403 uses their own interceptors

* feat: show no notification if 401

* feat: uses the real request method and url (instead of the template placeholders) to tell the user what did not succeed

* feat: retry requests with no timeout/race

* feat: throttle and delay signals and disallow them from being updated from the outside

* chore: adds more logging to timeouts

* chore: optimise imports

* test: ignores any test files left in node_modules folder

* feat: uses auditTime to wait a bit before showing the timeout screen

* feat: adds 404 handling to error interceptor

* chore: cleans up after response modification

* feat: preserve only a few headers

this mimicks the v15 behavior

* feat: lets the UI handle 404 errors instead of notifying directly

* test: uses create action menu option instead to find the correct locator, and skips a seemingly unnecessary timeout
This commit is contained in:
Jacob Overgaard
2025-06-12 13:24:11 +02:00
committed by GitHub
parent e89e18f5ba
commit cd72dbe4ea
22 changed files with 1158 additions and 947 deletions

View File

@@ -131,13 +131,13 @@ test('can create a folder in a folder', async ({umbracoApi, umbracoUi}) => {
// Act
await umbracoUi.media.clickActionsMenuForName(parentFolderName);
await umbracoUi.media.clickCreateModalButton();
await umbracoUi.media.clickCreateActionMenuOption();
await umbracoUi.media.clickMediaTypeName('Folder');
await umbracoUi.media.enterMediaItemName(folderName);
await umbracoUi.media.clickSaveButton();
// Assert
await umbracoUi.media.waitForMediaItemToBeCreated();
//await umbracoUi.media.waitForMediaItemToBeCreated(); // This is flaky, and Playwright seems to succeed even with its default timeout
await umbracoUi.media.isMediaTreeItemVisible(parentFolderName);
await umbracoUi.media.isMediaTreeItemVisible(folderName, false);
await umbracoUi.media.clickMediaCaretButtonForName(parentFolderName);