22
33chrome . runtime . onMessage . addListener ( onMessage )
44document . addEventListener ( 'DOMContentLoaded' , initPopup )
5+ document
6+ . getElementById ( 'confirm-delete' )
7+ . addEventListener ( 'click' , deleteConfirm )
58document
69 . querySelectorAll ( 'a[href]' )
710 . forEach ( ( el ) => el . addEventListener ( 'click' , popupLinks ) )
@@ -18,10 +21,12 @@ document
1821const filesTable = document . getElementById ( 'files-table' )
1922const errorAlert = document . getElementById ( 'error-alert' )
2023const authButton = document . getElementById ( 'auth-button' )
21- const mediaImage = document . getElementById ( 'media-image' )
22- const mediaOuter = document . getElementById ( 'media-outer' )
2324const alwaysAuth = document . getElementById ( 'always-auth' )
25+ const mediaOuter = document . getElementById ( 'media-outer' )
26+ const mediaImage = document . getElementById ( 'media-image' )
2427const mediaError = document . getElementById ( 'media-error' )
28+ const deleteName = document . getElementById ( 'delete-name' )
29+ const deleteModal = bootstrap . Modal . getOrCreateInstance ( '#delete-modal' )
2530
2631const loadingImage = '../media/loading.gif'
2732let authError = false
@@ -291,11 +296,10 @@ function updateTable(data) {
291296 const copy = document . createElement ( 'a' )
292297 copy . title = 'Copy'
293298 copy . setAttribute ( 'role' , 'button' )
294- copy . classList . add ( 'clip' )
295- copy . dataset . clipboardText = value
299+ copy . classList . add ( 'link-body-emphasis' , 'clip' )
296300 copy . innerHTML = '<i class="fa-regular fa-clipboard"></i>'
297- copy . classList . add ( 'link-body-emphasis' )
298- copy . onclick = clipClick
301+ copy . dataset . clipboardText = value
302+ copy . addEventListener ( 'click' , clipClick )
299303 const cell0 = row . cells [ 0 ]
300304 cell0 . classList . add ( 'align-middle' )
301305 cell0 . style . width = '20px'
@@ -310,9 +314,11 @@ function updateTable(data) {
310314 link . classList . add (
311315 'link-underline' ,
312316 'link-underline-opacity-0' ,
313- 'link-underline-opacity-75-hover'
317+ 'link-underline-opacity-75-hover' ,
318+ 'file-link'
314319 )
315320 link . target = '_blank'
321+ link . dataset . name = name
316322 link . dataset . raw =
317323 url . origin +
318324 url . pathname . replace ( / ^ \/ u \/ / , '/raw/' ) +
@@ -321,7 +327,84 @@ function updateTable(data) {
321327 cell1 . classList . add ( 'text-break' )
322328 cell1 . innerHTML = ''
323329 cell1 . appendChild ( link )
330+
331+ const del = document . createElement ( 'a' )
332+ del . title = 'Delete'
333+ del . setAttribute ( 'role' , 'button' )
334+ del . classList . add ( 'link-danger' )
335+ del . innerHTML = '<i class="fa-regular fa-trash-can"></i>'
336+ del . addEventListener ( 'click' , deleteClick )
337+ const cell2 = row . cells [ 2 ]
338+ cell2 . classList . add ( 'align-middle' )
339+ cell2 . style . width = '20px'
340+ cell2 . innerHTML = ''
341+ cell2 . appendChild ( del )
342+ }
343+ }
344+
345+ /**
346+ * Delete Click Callback
347+ * @function deleteClick
348+ * @param {MouseEvent } event
349+ */
350+ async function deleteClick ( event ) {
351+ console . log ( 'deleteClick:' , event )
352+ const closest = event . target ?. closest ( 'tr' ) . querySelector ( '.file-link' )
353+ const name = closest . dataset ?. name
354+ console . log ( 'name:' , name )
355+ if ( ! name ) {
356+ return console . error ( 'No name for: event, closest' , event , closest )
357+ }
358+ deleteName . textContent = name
359+ const { options } = await chrome . storage . sync . get ( [ 'options' ] )
360+ if ( options . deleteConfirm ) {
361+ deleteModal . show ( )
362+ } else {
363+ await deleteConfirm ( event )
364+ }
365+ }
366+
367+ /**
368+ * Confirm Delete Click Callback
369+ * @function deleteConfirm
370+ * @param {MouseEvent } event
371+ */
372+ async function deleteConfirm ( event ) {
373+ console . log ( 'deleteConfirm:' , event )
374+ const name = deleteName . textContent
375+ console . log ( `Deleting File: ${ name } ` )
376+ // TODO: Catch Error...
377+ const response = await deleteFile ( name )
378+ console . log ( 'response:' , response )
379+ if ( response . ok ) {
380+ mediaOuter . classList . add ( 'd-none' )
381+ deleteModal . hide ( )
382+ await initPopup ( )
383+ } else {
384+ // TODO: Handle Error...
385+ console . error ( 'Error Deleting File: name, response:' , name , response )
386+ }
387+ }
388+
389+ /**
390+ * Post URL to endpoint
391+ * @function deleteFile
392+ * @param {String } name
393+ * @return {Response }
394+ */
395+ async function deleteFile ( name ) {
396+ console . log ( `deleteFile: ${ name } ` )
397+ const { options } = await chrome . storage . sync . get ( [ 'options' ] )
398+ console . log ( 'options:' , options )
399+ const headers = { Authorization : options . authToken }
400+ const opts = {
401+ method : 'DELETE' ,
402+ headers : headers ,
324403 }
404+ const apiUrl = `${ options . siteUrl } /api/delete/${ name } `
405+ const response = await fetch ( apiUrl , opts )
406+ console . log ( 'response:' , response )
407+ return response
325408}
326409
327410/**
@@ -389,7 +472,7 @@ function initPopupMouseover() {
389472 mediaError . classList . remove ( 'd-none' )
390473 mediaImage . src = '../media/loading.gif'
391474 } )
392- document . querySelectorAll ( '.link-underline ' ) . forEach ( ( el ) => {
475+ document . querySelectorAll ( '.file-link ' ) . forEach ( ( el ) => {
393476 el . addEventListener ( 'mouseover' , onMouseOver )
394477 el . addEventListener ( 'mouseout' , onMouseOut )
395478 } )
0 commit comments