@@ -13,6 +13,9 @@ function loadImages() {
1313 renderGallery ( ) ;
1414 } ) ;
1515}
16+ function refreshGallery ( ) {
17+ loadImages ( ) ;
18+ }
1619function saveImages ( ) {
1720 chrome . storage . local . set ( { chaosGallery : images } ) ;
1821}
@@ -86,9 +89,6 @@ function renderGallery() {
8689 <i data-lucide="download"></i>
8790 </button>
8891 <div class="gallery-overlay">
89- <button class="gallery-action-btn gallery-copy-btn" data-image-url="${ escapeHtml ( image . url ) } ">
90- <i data-lucide="copy"></i>
91- </button>
9292 <button class="gallery-action-btn gallery-delete-btn delete" data-image-id="${ image . id } ">
9393 <i data-lucide="trash-2"></i>
9494 </button>
@@ -123,13 +123,6 @@ function attachGalleryEventListeners() {
123123 downloadImage ( imageUrl , imageId ) ;
124124 } ) ;
125125 } ) ;
126- document . querySelectorAll ( '.gallery-copy-btn' ) . forEach ( btn => {
127- btn . addEventListener ( 'click' , ( e ) => {
128- e . stopPropagation ( ) ;
129- const imageUrl = btn . dataset . imageUrl ;
130- copyImageUrl ( imageUrl ) ;
131- } ) ;
132- } ) ;
133126 document . querySelectorAll ( '.gallery-delete-btn' ) . forEach ( btn => {
134127 btn . addEventListener ( 'click' , ( e ) => {
135128 e . stopPropagation ( ) ;
@@ -185,6 +178,7 @@ function isThisYear(date) {
185178 return date . getFullYear ( ) === new Date ( ) . getFullYear ( ) ;
186179}
187180let currentCarouselIndex = 0 ;
181+ let carouselKeyHandler = null ;
188182function openCarousel ( imageId ) {
189183 currentCarouselIndex = images . findIndex ( img => img . id === imageId ) ;
190184 if ( currentCarouselIndex === - 1 ) currentCarouselIndex = 0 ;
@@ -195,52 +189,45 @@ function showCarousel() {
195189 if ( ! image ) return ;
196190 const existing = document . querySelector ( '.gallery-carousel' ) ;
197191 if ( existing ) existing . remove ( ) ;
192+ if ( carouselKeyHandler ) {
193+ document . removeEventListener ( 'keydown' , carouselKeyHandler ) ;
194+ }
198195 const carousel = document . createElement ( 'div' ) ;
199196 carousel . className = 'gallery-carousel' ;
200197 carousel . innerHTML = `
201198 <div class="gallery-carousel-content">
202199 <button class="gallery-carousel-close">
203200 <i data-lucide="x"></i>
204201 </button>
202+
205203 ${ currentCarouselIndex > 0 ? `
206204 <button class="gallery-carousel-nav gallery-carousel-prev">
207205 <i data-lucide="chevron-left"></i>
208206 </button>
209207 ` : '' }
208+
210209 ${ currentCarouselIndex < images . length - 1 ? `
211210 <button class="gallery-carousel-nav gallery-carousel-next">
212211 <i data-lucide="chevron-right"></i>
213212 </button>
214213 ` : '' }
215- <div class="gallery-carousel-image-container">
214+
215+ <div class="gallery-carousel-image-wrapper">
216216 <img src="${ escapeHtml ( image . url ) } " alt="Gallery image" class="gallery-carousel-image">
217+ <button class="gallery-carousel-download-btn" data-image-url="${ escapeHtml ( image . url ) } " data-image-id="${ image . id } " title="Download image">
218+ <i data-lucide="download"></i>
219+ </button>
217220 </div>
218- <div class="gallery-carousel-info">
219- <div class="gallery-carousel-counter">${ currentCarouselIndex + 1 } / ${ images . length } </div>
220- <div class="gallery-carousel-title">${ escapeHtml ( image . pageTitle || 'Untitled' ) } </div>
221- <div class="gallery-carousel-actions">
222- ${ image . pageUrl ? `<a href="${ escapeHtml ( image . pageUrl ) } " target="_blank" class="gallery-carousel-btn">
223- <i data-lucide="external-link"></i> Source
224- </a>` : '' }
225- <button class="gallery-carousel-btn gallery-carousel-download" data-image-url="${ escapeHtml ( image . url ) } " data-image-id="${ image . id } ">
226- <i data-lucide="download"></i> Download
227- </button>
228- <button class="gallery-carousel-btn gallery-carousel-copy" data-image-url="${ escapeHtml ( image . url ) } ">
229- <i data-lucide="copy"></i> Copy URL
230- </button>
231- <button class="gallery-carousel-btn gallery-carousel-delete delete" data-image-id="${ image . id } ">
232- <i data-lucide="trash-2"></i> Delete
233- </button>
234- </div>
235- </div>
221+
222+ <div class="gallery-carousel-counter">${ currentCarouselIndex + 1 } / ${ images . length } </div>
236223 </div>
237224 ` ;
238225 carousel . addEventListener ( 'click' , ( e ) => {
239226 if ( e . target === carousel ) {
240227 closeCarousel ( ) ;
241228 }
242229 } ) ;
243- const handleKeyPress = ( e ) => {
230+ carouselKeyHandler = ( e ) => {
244231 if ( e . key === 'Escape' ) {
245232 closeCarousel ( ) ;
246233 } else if ( e . key === 'ArrowLeft' && currentCarouselIndex > 0 ) {
@@ -249,52 +236,50 @@ function showCarousel() {
249236 nextImage ( ) ;
250237 }
251238 } ;
252- document . addEventListener ( 'keydown' , handleKeyPress ) ;
253- carousel . dataset . keyHandler = 'attached' ;
239+ document . addEventListener ( 'keydown' , carouselKeyHandler ) ;
254240 document . body . appendChild ( carousel ) ;
255241 lucide . createIcons ( ) ;
256242 attachCarouselEventListeners ( ) ;
257243}
258244function attachCarouselEventListeners ( ) {
259245 const closeBtn = document . querySelector ( '.gallery-carousel-close' ) ;
260246 if ( closeBtn ) {
261- closeBtn . addEventListener ( 'click' , closeCarousel ) ;
247+ closeBtn . addEventListener ( 'click' , ( e ) => {
248+ e . stopPropagation ( ) ;
249+ closeCarousel ( ) ;
250+ } ) ;
262251 }
263252 const prevBtn = document . querySelector ( '.gallery-carousel-prev' ) ;
264253 if ( prevBtn ) {
265- prevBtn . addEventListener ( 'click' , prevImage ) ;
254+ prevBtn . addEventListener ( 'click' , ( e ) => {
255+ e . stopPropagation ( ) ;
256+ prevImage ( ) ;
257+ } ) ;
266258 }
267259 const nextBtn = document . querySelector ( '.gallery-carousel-next' ) ;
268260 if ( nextBtn ) {
269- nextBtn . addEventListener ( 'click' , nextImage ) ;
261+ nextBtn . addEventListener ( 'click' , ( e ) => {
262+ e . stopPropagation ( ) ;
263+ nextImage ( ) ;
264+ } ) ;
270265 }
271- const downloadBtn = document . querySelector ( '.gallery-carousel-download' ) ;
266+ const downloadBtn = document . querySelector ( '.gallery-carousel-download-btn ' ) ;
272267 if ( downloadBtn ) {
273- downloadBtn . addEventListener ( 'click' , ( ) => {
268+ downloadBtn . addEventListener ( 'click' , ( e ) => {
269+ e . stopPropagation ( ) ;
274270 const imageUrl = downloadBtn . dataset . imageUrl ;
275271 const imageId = parseInt ( downloadBtn . dataset . imageId ) ;
276272 downloadImage ( imageUrl , imageId ) ;
277273 } ) ;
278274 }
279- const copyBtn = document . querySelector ( '.gallery-carousel-copy' ) ;
280- if ( copyBtn ) {
281- copyBtn . addEventListener ( 'click' , ( ) => {
282- const imageUrl = copyBtn . dataset . imageUrl ;
283- copyImageUrl ( imageUrl ) ;
284- } ) ;
285- }
286- const deleteBtn = document . querySelector ( '.gallery-carousel-delete' ) ;
287- if ( deleteBtn ) {
288- deleteBtn . addEventListener ( 'click' , ( ) => {
289- const imageId = parseInt ( deleteBtn . dataset . imageId ) ;
290- deleteImageFromCarousel ( imageId ) ;
291- } ) ;
292- }
293275}
294276function closeCarousel ( ) {
295277 const carousel = document . querySelector ( '.gallery-carousel' ) ;
296278 if ( carousel ) {
297- document . removeEventListener ( 'keydown' , handleKeyPress ) ;
279+ if ( carouselKeyHandler ) {
280+ document . removeEventListener ( 'keydown' , carouselKeyHandler ) ;
281+ carouselKeyHandler = null ;
282+ }
298283 carousel . remove ( ) ;
299284 }
300285}
@@ -412,7 +397,8 @@ window.galleryFunctions = {
412397 prevImage,
413398 deleteImageFromCarousel,
414399 downloadImage,
415- downloadDateImages
400+ downloadDateImages,
401+ refreshGallery
416402} ;
417403chrome . runtime . onMessage . addListener ( ( request , sender , sendResponse ) => {
418404 if ( request . action === 'addToGallery' ) {
0 commit comments