@@ -53,7 +53,7 @@ interface Cloudinary {
5353 createUploadWidget: CloudinaryCreateUploadWidget;
5454}
5555
56- window.addEventListener('load', async () => {
56+ async function initCldUploadWidgets() {
5757 const widgets = document.querySelectorAll('.astro-cloudinary-clduploadwidget') as NodeListOf<HTMLSpanElement>;
5858
5959 if ( widgets.length === 0 ) return;
@@ -76,7 +76,7 @@ window.addEventListener('load', async () => {
7676 const cloudinary = window.cloudinary as Cloudinary;
7777
7878 widgets.forEach(widget => {
79- let widgetInstance: CloudinaryUploadWidget;
79+ let widgetInstance: CloudinaryUploadWidget | undefined ;
8080
8181 // Primary user interaction point for the upload widget, create
8282 // an instance if it doesnt already exist (someone triggering before idle)
@@ -98,6 +98,15 @@ window.addEventListener('load', async () => {
9898 widgetInstance .open ();
9999 } );
100100
101+ // Cleanup
102+ document.addEventListener('astro:before-swap', async () => {
103+ if (widgetInstance ) {
104+ widgetInstance .destroy ().finally (() => {
105+ widgetInstance = undefined ;
106+ });
107+ }
108+ } , { once : true } );
109+
101110 // Parse the upload options from the DOM and configure the
102111 // remaining options that couldn't be serialized
103112
@@ -155,5 +164,39 @@ window.addEventListener('load', async () => {
155164 }, resultsCallback );
156165 }
157166 });
158- })
159- </script >
167+ }
168+
169+ function useState() {
170+ let isInitialising = false ;
171+ let isInitialised = false ;
172+
173+ return {
174+ async initialise() {
175+ if (! isInitialising && ! isInitialised ) {
176+ isInitialising = true ;
177+ await initCldUploadWidgets ()
178+ .then (() => {
179+ isInitialised = true ;
180+ })
181+ .finally (() => {
182+ isInitialising = false ;
183+ });
184+ }
185+ },
186+
187+ reset() {
188+ isInitialising = false ;
189+ isInitialised = false ;
190+ },
191+ };
192+ }
193+
194+ const state = useState();
195+
196+ window.addEventListener('load', state.initialise);
197+
198+ // Lifecycle events, requires <ClientRouter />
199+ // https://docs.astro.build/en/guides/view-transitions/#lifecycle-events
200+ document.addEventListener('astro:after-swap', state.reset);
201+ document.addEventListener('astro:page-load', state.initialise);
202+ </script >
0 commit comments