import axios, { isAxiosError } from '@nextcloud/axios'
import { emit, subscribe } from '@nextcloud/event-bus'
import { NodeStatus } from '@nextcloud/files'
+import { DialogBuilder } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
-import { basename, dirname } from 'path'
+import { basename, dirname, extname } from 'path'
import { defineStore } from 'pinia'
import logger from '../logger'
import Vue from 'vue'
+import IconCancel from '@mdi/svg/svg/cancel.svg?raw'
+import IconCheck from '@mdi/svg/svg/check.svg?raw'
+
+let isDialogVisible = false
+
+const showWarningDialog = (oldExtension: string, newExtension: string): Promise<boolean> => {
+ if (isDialogVisible) {
+ return Promise.resolve(false)
+ }
+
+ isDialogVisible = true
+
+ let message
+
+ if (!oldExtension && newExtension) {
+ message = t(
+ 'files',
+ 'Adding the file extension "{new}" may render the file unreadable.',
+ { new: newExtension },
+ )
+ } else if (!newExtension) {
+ message = t(
+ 'files',
+ 'Removing the file extension "{old}" may render the file unreadable.',
+ { old: oldExtension },
+ )
+ } else {
+ message = t(
+ 'files',
+ 'Changing the file extension from "{old}" to "{new}" may render the file unreadable.',
+ { old: oldExtension, new: newExtension },
+ )
+ }
+
+ return new Promise((resolve) => {
+ const dialog = new DialogBuilder()
+ .setName(t('files', 'Change file extension'))
+ .setText(message)
+ .setButtons([
+ {
+ label: t('files', 'Keep {oldextension}', { oldextension: oldExtension }),
+ icon: IconCancel,
+ type: 'secondary',
+ callback: () => {
+ isDialogVisible = false
+ resolve(false)
+ },
+ },
+ {
+ label: newExtension.length ? t('files', 'Use {newextension}', { newextension: newExtension }) : t('files', 'Remove extension'),
+ icon: IconCheck,
+ type: 'primary',
+ callback: () => {
+ isDialogVisible = false
+ resolve(true)
+ },
+ },
+ ])
+ .build()
+
+ dialog.show().then(() => {
+ dialog.hide()
+ })
+ })
+}
export const useRenamingStore = function(...args) {
const store = defineStore('renaming', {
const newName = this.newName.trim?.() || ''
const oldName = this.renamingNode.basename
const oldEncodedSource = this.renamingNode.encodedSource
+
+ // Check for extension change
+ const oldExtension = extname(oldName)
+ const newExtension = extname(newName)
+ if (oldExtension !== newExtension) {
+ const proceed = await showWarningDialog(oldExtension, newExtension)
+ if (!proceed) {
+ return false
+ }
+ }
+
if (oldName === newName) {
return false
}