aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/src/services/Files.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files/src/services/Files.ts')
-rw-r--r--apps/files/src/services/Files.ts54
1 files changed, 32 insertions, 22 deletions
diff --git a/apps/files/src/services/Files.ts b/apps/files/src/services/Files.ts
index 93325decc9c..d392dbb7751 100644
--- a/apps/files/src/services/Files.ts
+++ b/apps/files/src/services/Files.ts
@@ -22,6 +22,7 @@
import type { ContentsWithRoot } from '@nextcloud/files'
import type { FileStat, ResponseDataDetailed, DAVResultResponseProps } from 'webdav'
+import { cancelable, CancelablePromise } from 'cancelable-promise'
import { File, Folder, davParsePermissions } from '@nextcloud/files'
import { generateRemoteUrl } from '@nextcloud/router'
import { getCurrentUser } from '@nextcloud/auth'
@@ -73,30 +74,39 @@ const resultToNode = function(node: FileStat): File | Folder {
: new Folder(nodeData)
}
-export const getContents = async (path = '/'): Promise<ContentsWithRoot> => {
+export const getContents = (path = '/'): Promise<ContentsWithRoot> => {
+ const controller = new AbortController()
const propfindPayload = getDefaultPropfind()
- const contentsResponse = await client.getDirectoryContents(path, {
- details: true,
- data: propfindPayload,
- includeSelf: true,
- }) as ResponseDataDetailed<FileStat[]>
+ return new CancelablePromise(async (resolve, reject, onCancel) => {
+ onCancel(() => controller.abort())
+ try {
+ const contentsResponse = await client.getDirectoryContents(path, {
+ details: true,
+ data: propfindPayload,
+ includeSelf: true,
+ signal: controller.signal,
+ }) as ResponseDataDetailed<FileStat[]>
- const root = contentsResponse.data[0]
- const contents = contentsResponse.data.slice(1)
- if (root.filename !== path) {
- throw new Error('Root node does not match requested path')
- }
-
- return {
- folder: resultToNode(root) as Folder,
- contents: contents.map(result => {
- try {
- return resultToNode(result)
- } catch (error) {
- logger.error(`Invalid node detected '${result.basename}'`, { error })
- return null
+ const root = contentsResponse.data[0]
+ const contents = contentsResponse.data.slice(1)
+ if (root.filename !== path) {
+ throw new Error('Root node does not match requested path')
}
- }).filter(Boolean) as File[],
- }
+
+ resolve({
+ folder: resultToNode(root) as Folder,
+ contents: contents.map(result => {
+ try {
+ return resultToNode(result)
+ } catch (error) {
+ logger.error(`Invalid node detected '${result.basename}'`, { error })
+ return null
+ }
+ }).filter(Boolean) as File[],
+ })
+ } catch (error) {
+ reject(error)
+ }
+ })
}