Skip to content

Commit 17a668d

Browse files
nfebeskjnldsv
authored andcommitted
feat(viewer): Add file overwrite confirmation dialog
Implemented a confirmation dialog when saving an image with an existing filename [skip ci]
1 parent f5f6cc5 commit 17a668d

File tree

1 file changed

+63
-2
lines changed

1 file changed

+63
-2
lines changed

src/components/ImageEditor.vue

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import { basename, dirname, extname, join } from 'path'
66
import { emit } from '@nextcloud/event-bus'
77
import { Node } from '@nextcloud/files'
8-
import { showError, showSuccess } from '@nextcloud/dialogs'
8+
import { showError, showSuccess, DialogBuilder } from '@nextcloud/dialogs'
99
import axios from '@nextcloud/axios'
1010
1111
import logger from '../services/logger.js'
@@ -149,7 +149,23 @@ export default {
149149
window.removeEventListener('keydown', this.handleKeydown, true)
150150
this.$emit('close')
151151
},
152-
152+
/**
153+
* Check if a file exists at the given URL
154+
* @param {string} url The URL to check
155+
* @return {Promise<boolean>} True if the file exists, false otherwise
156+
*/
157+
async fileExists(url) {
158+
try {
159+
await axios.head(url, { validateStatus: status => status === 200 || status === 404 })
160+
const response = await axios.head(url)
161+
return response.status === 200
162+
} catch (error) {
163+
if (error.response?.status === 404) {
164+
return false
165+
}
166+
throw error
167+
}
168+
},
153169
/**
154170
* User saved the image
155171
*
@@ -165,6 +181,51 @@ export default {
165181
const putUrl = origin + join(dirname(pathname), fullName)
166182
logger.debug('Saving image...', { putUrl, src: this.src, fullName })
167183
184+
const fileExists = await this.fileExists(putUrl)
185+
logger.debug('File exists', { fileExists })
186+
if (fileExists) {
187+
logger.debug('File exists, showing confirmation dialog')
188+
try {
189+
const isOriginal = fullName === basename(this.src)
190+
const message = isOriginal
191+
? t('viewer', 'You are about to overwrite the original file. Are you sure you want to continue?')
192+
: t('viewer', 'A file with this name already exists. Do you want to overwrite it?')
193+
194+
let confirmed = false
195+
const dialog = (new DialogBuilder())
196+
.setName(t('viewer', 'Confirm overwrite'))
197+
.setText(message)
198+
.setButtons([
199+
{
200+
label: t('viewer', 'Cancel'),
201+
type: 'secondary',
202+
callback: () => {
203+
confirmed = false
204+
},
205+
},
206+
{
207+
label: t('viewer', 'Overwrite'),
208+
type: 'error',
209+
callback: () => {
210+
confirmed = true
211+
},
212+
},
213+
])
214+
.build()
215+
216+
await dialog.show()
217+
218+
if (!confirmed) {
219+
logger.debug('User cancelled overwrite')
220+
return
221+
}
222+
} catch (error) {
223+
logger.error('Error showing confirmation dialog', { error })
224+
showError(t('viewer', 'An error occurred while trying to confirm the file overwrite.'))
225+
return
226+
}
227+
}
228+
168229
// toBlob is not very smart...
169230
mimeType = mimeType.replace('jpg', 'jpeg')
170231

0 commit comments

Comments
 (0)