-
-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Expand file tree
/
Copy pathinlineStorageCheckAction.ts
More file actions
91 lines (75 loc) · 2.68 KB
/
Copy pathinlineStorageCheckAction.ts
File metadata and controls
91 lines (75 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*!
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { AxiosError } from '@nextcloud/axios'
import type { IFileAction } from '@nextcloud/files'
import type { IStorage } from '../types.ts'
import AlertSvg from '@mdi/svg/svg/alert-circle.svg?raw'
import { showWarning } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
import { t } from '@nextcloud/l10n'
import { getStatus } from '../services/externalStorage.ts'
import { StorageStatus } from '../types.ts'
import { isMissingAuthConfig } from '../utils/credentialsUtils.ts'
import { isNodeExternalStorage } from '../utils/externalStorageUtils.ts'
import '../css/fileEntryStatus.scss'
export const action: IFileAction = {
id: 'check-external-storage',
displayName: () => '',
iconSvgInline: () => '',
enabled: ({ nodes }) => {
return nodes.every((node) => isNodeExternalStorage(node) === true)
},
exec: async () => null,
/**
* Use this function to check the storage availability
* We then update the node attributes directly.
*
* @param context - The action context
* @param context.nodes - The node to render inline
*/
async renderInline({ nodes }) {
if (nodes.length !== 1 || !nodes[0]) {
return null
}
const node = nodes[0]
const span = document.createElement('span')
span.className = 'files-list__row-status'
span.innerHTML = t('files_external', 'Checking storage …')
let config: IStorage | undefined
try {
const { data } = await getStatus(node.id, node.attributes.scope === 'system')
config = data
node.attributes.config = config
emit('files:node:updated', node)
if (config.status !== StorageStatus.Success) {
throw new Error(config?.statusMessage || t('files_external', 'There was an error with this external storage.'))
}
span.remove()
} catch (error) {
// If axios failed or if something else prevented
// us from getting the config
if ((error as AxiosError).response && !config) {
showWarning(t('files_external', 'We were unable to check the external storage {basename}', {
basename: node.basename,
}))
}
// Reset inline status
span.innerHTML = ''
// Checking if we really have an error
const isWarning = !config ? false : isMissingAuthConfig(config)
const overlay = document.createElement('span')
overlay.classList.add(`files-list__row-status--${isWarning ? 'warning' : 'error'}`)
// Only show an icon for errors, warning like missing credentials
// have a dedicated inline action button
if (!isWarning) {
span.innerHTML = AlertSvg
span.title = (error as Error).message
}
span.prepend(overlay)
}
return span
},
order: 10,
}