From b24fab0be947a676ec3964e3a14cfc4bea40fbe7 Mon Sep 17 00:00:00 2001 From: Florian Schade Date: Fri, 15 Oct 2021 14:30:20 +0200 Subject: [PATCH 1/2] fix(view rendering): cancel overlapping resource requests introduce iterable generators using vue-concurrency to cancel resource request that no longer needed. Fixes wrong view rendering for long running requests --- .../bugfix-overlapping-view-requests | 10 ++ packages/web-app-external/src/store/index.ts | 17 +++- .../web-app-files/src/views/Favorites.vue | 33 +++---- .../src/views/LocationPicker.vue | 56 ++++++----- packages/web-app-files/src/views/Personal.vue | 84 ++++++++--------- .../web-app-files/src/views/PublicFiles.vue | 93 +++++++++---------- .../web-app-files/src/views/SharedViaLink.vue | 63 ++++++------- .../web-app-files/src/views/SharedWithMe.vue | 63 ++++++------- .../src/views/SharedWithOthers.vue | 63 +++++++------ packages/web-app-files/src/views/Trashbin.vue | 39 ++++---- .../tests/unit/views/Favorites.spec.js | 7 +- .../tests/unit/views/Personal.spec.js | 12 ++- .../tests/unit/views/SharedWithMe.spec.js | 7 +- .../tests/unit/views/views.setup.js | 2 + packages/web-runtime/package.json | 2 + packages/web-runtime/src/defaults/vue.js | 2 + yarn.lock | 47 +++++++++- 17 files changed, 331 insertions(+), 269 deletions(-) create mode 100644 changelog/unreleased/bugfix-overlapping-view-requests diff --git a/changelog/unreleased/bugfix-overlapping-view-requests b/changelog/unreleased/bugfix-overlapping-view-requests new file mode 100644 index 00000000000..93d19ba290f --- /dev/null +++ b/changelog/unreleased/bugfix-overlapping-view-requests @@ -0,0 +1,10 @@ +Bugfix: Fix overlapping requests in files app + +In some cases the files app tended to display the wrong resources when navigating quickly through the views. This happened because the resource provisioning step wasn't canceled. +This is now fixed by using vue-concurrency which on a high level wraps iterable generators which are cancelable. We're using it to wrap the resource loading and cancel it as soon as the resource set is not needed anymore. + +It also improves the overall performance for the files app. + +https://github.com/owncloud/web/pull/5917 +https://github.com/owncloud/web/issues/5085 +https://github.com/owncloud/web/issues/5875 diff --git a/packages/web-app-external/src/store/index.ts b/packages/web-app-external/src/store/index.ts index 9149fceee38..65c510679c7 100644 --- a/packages/web-app-external/src/store/index.ts +++ b/packages/web-app-external/src/store/index.ts @@ -1,9 +1,16 @@ -const state = { +import { Commit } from 'vuex' +const State = { mimeTypes: {} } const actions = { - async fetchMimeTypes({ rootGetters, commit }): Promise { + async fetchMimeTypes({ + rootGetters, + commit + }: { + rootGetters: any + commit: Commit + }): Promise { if (!rootGetters.capabilities.files.app_providers[0]?.enabled) { return } @@ -23,20 +30,20 @@ const actions = { } const getters = { - getMimeTypes: (state) => { + getMimeTypes: (state: typeof State): { [key: string]: string } => { return state.mimeTypes } } const mutations = { - SET_MIME_TYPES(state, mimeTypes): void { + SET_MIME_TYPES(state: typeof State, mimeTypes: { [key: string]: string }): void { state.mimeTypes = mimeTypes } } export default { namespaced: true, - state, + state: State, actions, mutations, getters diff --git a/packages/web-app-files/src/views/Favorites.vue b/packages/web-app-files/src/views/Favorites.vue index 9c3d764db41..e9ea12e4b0b 100644 --- a/packages/web-app-files/src/views/Favorites.vue +++ b/packages/web-app-files/src/views/Favorites.vue @@ -1,6 +1,6 @@