1 line
6.4 KiB
Plaintext
1 line
6.4 KiB
Plaintext
{"version":3,"file":"FetchFilesMixin-Dh0XuSuT.chunk.mjs","sources":["../src/mixins/FetchFilesMixin.ts"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { File } from '@nextcloud/files'\n\nimport { showError } from '@nextcloud/dialogs'\nimport { defaultRootPath } from '@nextcloud/files/dav'\nimport { t } from '@nextcloud/l10n'\nimport { joinPaths } from '@nextcloud/paths'\nimport { defineComponent } from 'vue'\nimport { davClient } from '../services/DavClient.ts'\nimport logger from '../services/logger.js'\nimport getPhotos, { type PhotoSearchOptions } from '../services/PhotoSearch.js'\nimport store from '../store/index.js'\nimport SemaphoreWithPriority from '../utils/semaphoreWithPriority.js'\nimport AbortControllerMixin from './AbortControllerMixin.js'\n\nexport default defineComponent({\n\tname: 'FetchFilesMixin',\n\n\tmixins: [AbortControllerMixin],\n\n\tdata() {\n\t\treturn {\n\t\t\terrorFetchingFiles: null as null | number | Error | unknown,\n\t\t\tloadingFiles: false,\n\t\t\tdoneFetchingFiles: false,\n\t\t\tfetchSemaphore: new SemaphoreWithPriority(1),\n\t\t\tfetchedFileIds: [] as number[],\n\t\t}\n\t},\n\n\twatch: {\n\t\t'$route.path': function() {\n\t\t\tthis.resetFetchFilesState()\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * @param options - Options to pass to getPhotos.\n\t\t * @param filter - Function to filter out some files.\n\t\t * @param force - Force fetching even if doneFetchingFiles is true\n\t\t * @return The next batch of data depending on global offset.\n\t\t */\n\t\tasync fetchFiles(options: Partial<PhotoSearchOptions> = {}, filter?: (file: File) => boolean, force: boolean = false): Promise<number[]> {\n\t\t\tif ((this.doneFetchingFiles && !force) || this.loadingFiles) {\n\t\t\t\treturn []\n\t\t\t}\n\n\t\t\tconst signal = this.abortController.signal\n\t\t\tconst fetchSemaphoreSymbol = await this.fetchSemaphore.acquire()\n\n\t\t\ttry {\n\t\t\t\tthis.errorFetchingFiles = null\n\t\t\t\tthis.loadingFiles = true\n\n\t\t\t\tconst numberOfImagesPerBatch = 200\n\n\t\t\t\t// Load next batch of images\n\t\t\t\tlet fetchedFiles = await getPhotos({\n\t\t\t\t\tfirstResult: this.fetchedFileIds.length,\n\t\t\t\t\tnbResults: numberOfImagesPerBatch,\n\t\t\t\t\t...options,\n\t\t\t\t\tsignal,\n\t\t\t\t})\n\n\t\t\t\t// If we get less files than requested that means we got to the end\n\t\t\t\tif (fetchedFiles.length !== numberOfImagesPerBatch) {\n\t\t\t\t\tthis.doneFetchingFiles = true\n\t\t\t\t}\n\n\t\t\t\tif (filter !== undefined) {\n\t\t\t\t\tfetchedFiles = fetchedFiles.filter(filter)\n\t\t\t\t}\n\n\t\t\t\tconst fileIds = fetchedFiles\n\t\t\t\t\t.map((file) => file.fileid as number)\n\t\t\t\t\t.filter((fileId) => !this.fetchedFileIds.includes(fileId)) // Filter to prevent duplicate fileIds.\n\n\t\t\t\tthis.fetchedFileIds.push(...fileIds)\n\n\t\t\t\tthis.$store.dispatch('appendFiles', fetchedFiles)\n\n\t\t\t\tlogger.debug(`[FetchFilesMixin] Fetched ${fileIds.length} new files: `, { fileIds })\n\n\t\t\t\treturn fileIds\n\t\t\t} catch (error) {\n\t\t\t\tif (error.response?.status === 404) {\n\t\t\t\t\tconst sources = store.state.userConfig.photosSourceFolders\n\t\t\t\t\tfor (const source of sources) {\n\t\t\t\t\t\tif (error.response?.data?.match(`File with name /${source} could not be located`) === null) {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlogger.debug(`The ${source} folder does not exist, creating it.`)\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait davClient.createDirectory(joinPaths(defaultRootPath, source))\n\t\t\t\t\t\t\tthis.resetFetchFilesState()\n\t\t\t\t\t\t\treturn []\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tthis.errorFetchingFiles = 404\n\t\t\t\t\t\t\tlogger.error('Fail to create source directory', { error })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (error instanceof DOMException && error.code === error.ABORT_ERR) {\n\t\t\t\t\treturn []\n\t\t\t\t} else {\n\t\t\t\t\tthis.errorFetchingFiles = error\n\t\t\t\t}\n\n\t\t\t\t// cancelled request, moving on...\n\t\t\t\tshowError(t('photos', 'Error fetching files'))\n\t\t\t\tlogger.error(t('photos', 'Error fetching files'), { error })\n\t\t\t} finally {\n\t\t\t\tthis.loadingFiles = false\n\t\t\t\tthis.fetchSemaphore.release(fetchSemaphoreSymbol)\n\t\t\t}\n\n\t\t\treturn []\n\t\t},\n\n\t\tresetFetchFilesState() {\n\t\t\tthis.abortPendingRequest()\n\t\t\tthis.doneFetchingFiles = false\n\t\t\tthis.errorFetchingFiles = null\n\t\t\tthis.loadingFiles = false\n\t\t\tthis.fetchedFileIds = []\n\t\t},\n\t},\n})\n"],"names":["FetchFilesMixin","defineComponent","AbortControllerMixin","SemaphoreWithPriority","options","filter","force","signal","fetchSemaphoreSymbol","numberOfImagesPerBatch","fetchedFiles","getPhotos","fileIds","file","fileId","logger","error","sources","store","source","davClient","joinPaths","defaultRootPath","showError","t"],"mappings":"+QAmBA,MAAAA,EAAeC,EAAgB,CAC9B,KAAM,kBAEN,OAAQ,CAACC,CAAoB,EAE7B,MAAO,CACC,MAAA,CACN,mBAAoB,KACpB,aAAc,GACd,kBAAmB,GACnB,eAAgB,IAAIC,EAAsB,CAAC,EAC3C,eAAgB,CAAA,CACjB,CACD,EAEA,MAAO,CACN,cAAe,UAAW,CACzB,KAAK,qBAAqB,CAAA,CAE5B,EAEA,QAAS,CAOR,MAAM,WAAWC,EAAuC,CAAA,EAAIC,EAAkCC,EAAiB,GAA0B,CACxI,GAAK,KAAK,mBAAqB,CAACA,GAAU,KAAK,aAC9C,MAAO,CAAC,EAGH,MAAAC,EAAS,KAAK,gBAAgB,OAC9BC,EAAuB,MAAM,KAAK,eAAe,QAAQ,EAE3D,GAAA,CACH,KAAK,mBAAqB,KAC1B,KAAK,aAAe,GAEpB,MAAMC,EAAyB,IAG3B,IAAAC,EAAe,MAAMC,EAAU,CAClC,YAAa,KAAK,eAAe,OACjC,UAAWF,EACX,GAAGL,EACH,OAAAG,CAAA,CACA,EAGGG,EAAa,SAAWD,IAC3B,KAAK,kBAAoB,IAGtBJ,IAAW,SACCK,EAAAA,EAAa,OAAOL,CAAM,GAG1C,MAAMO,EAAUF,EACd,IAAKG,GAASA,EAAK,MAAgB,EACnC,OAAQC,GAAW,CAAC,KAAK,eAAe,SAASA,CAAM,CAAC,EAErD,OAAA,KAAA,eAAe,KAAK,GAAGF,CAAO,EAE9B,KAAA,OAAO,SAAS,cAAeF,CAAY,EAEhDK,EAAO,MAAM,6BAA6BH,EAAQ,MAAM,eAAgB,CAAE,QAAAA,EAAS,EAE5EA,QACCI,EAAO,CACX,GAAAA,EAAM,UAAU,SAAW,IAAK,CAC7B,MAAAC,EAAUC,EAAM,MAAM,WAAW,oBACvC,UAAWC,KAAUF,EAChB,GAAAD,EAAM,UAAU,MAAM,MAAM,mBAAmBG,CAAM,uBAAuB,IAAM,KAG/E,CAAAJ,EAAA,MAAM,OAAOI,CAAM,sCAAsC,EAC5D,GAAA,CACH,OAAA,MAAMC,EAAU,gBAAgBC,EAAUC,EAAiBH,CAAM,CAAC,EAClE,KAAK,qBAAqB,EACnB,CAAC,QACAH,EAAO,CACf,KAAK,mBAAqB,IAC1BD,EAAO,MAAM,kCAAmC,CAAE,MAAAC,EAAO,CAAA,CAE3D,CAAA,SACUA,aAAiB,cAAgBA,EAAM,OAASA,EAAM,UAChE,MAAO,CAAC,EAER,KAAK,mBAAqBA,CAAAA,CAIjBO,EAAAC,EAAE,SAAU,sBAAsB,CAAC,EAC7CT,EAAO,MAAMS,EAAE,SAAU,sBAAsB,EAAG,CAAE,MAAAR,EAAO,CAAA,QAAA,CAE3D,KAAK,aAAe,GACf,KAAA,eAAe,QAAQR,CAAoB,CAAA,CAGjD,MAAO,CAAC,CACT,EAEA,sBAAuB,CACtB,KAAK,oBAAoB,EACzB,KAAK,kBAAoB,GACzB,KAAK,mBAAqB,KAC1B,KAAK,aAAe,GACpB,KAAK,eAAiB,CAAC,CAAA,CACxB,CAEF,CAAC"} |