@@ -35,6 +35,8 @@ const prplInteractiveTaskFormListener = {
3535 formElement . addEventListener ( 'submit' , ( event ) => {
3636 event . preventDefault ( ) ;
3737
38+ prplInteractiveTaskFormListener . showLoading ( formElement ) ;
39+
3840 // Get the form data.
3941 const formData = new FormData ( formElement ) ;
4042 const settingsToPass = { } ;
@@ -56,6 +58,8 @@ const prplInteractiveTaskFormListener = {
5658 return response ;
5759 }
5860
61+ prplInteractiveTaskFormListener . hideLoading ( formElement ) ;
62+
5963 // This will trigger the celebration event (confetti) as well.
6064 prplSuggestedTask . maybeComplete ( postId ) . then ( ( ) => {
6165 // Close popover.
@@ -76,6 +80,8 @@ const prplInteractiveTaskFormListener = {
7680 const formSubmitHandler = ( event ) => {
7781 event . preventDefault ( ) ;
7882
83+ prplInteractiveTaskFormListener . showLoading ( formElement ) ;
84+
7985 callback ( )
8086 . then ( ( response ) => {
8187 if ( true !== response . success ) {
@@ -110,6 +116,9 @@ const prplInteractiveTaskFormListener = {
110116 ) ;
111117 } )
112118 . finally ( ( ) => {
119+ // Hide loading state.
120+ prplInteractiveTaskFormListener . hideLoading ( formElement ) ;
121+
113122 // Remove the form listener once the callback is executed.
114123 formElement . removeEventListener (
115124 'submit' ,
@@ -139,6 +148,8 @@ const prplInteractiveTaskFormListener = {
139148 formElement . addEventListener ( 'submit' , ( event ) => {
140149 event . preventDefault ( ) ;
141150
151+ prplInteractiveTaskFormListener . showLoading ( formElement ) ;
152+
142153 const formData = new FormData ( formElement ) ;
143154 const settingsToPass = { } ;
144155 settingsToPass [ setting ] = settingCallbackValue (
@@ -157,7 +168,6 @@ const prplInteractiveTaskFormListener = {
157168 } ,
158169 } )
159170 . then ( ( response ) => {
160- console . log ( response ) ;
161171 if ( true !== response . success ) {
162172 // Show error to the user.
163173 prplInteractiveTaskFormListener . showError (
@@ -193,6 +203,10 @@ const prplInteractiveTaskFormListener = {
193203 error ,
194204 popoverId
195205 ) ;
206+ } )
207+ . finally ( ( ) => {
208+ // Hide loading state.
209+ prplInteractiveTaskFormListener . hideLoading ( formElement ) ;
196210 } ) ;
197211 } ) ;
198212 } ,
@@ -241,4 +255,35 @@ const prplInteractiveTaskFormListener = {
241255 ) ;
242256 }
243257 } ,
258+
259+ /**
260+ * Show loading state.
261+ *
262+ * @param {HTMLFormElement } formElement - The form element.
263+ * @return {void }
264+ */
265+ showLoading : ( formElement ) => {
266+ // data-action="completeTask"
267+ formElement . querySelector ( 'button[type="submit"]' ) . disabled = true ;
268+
269+ // Add spinner.
270+ const spinner = document . createElement ( 'span' ) ;
271+ spinner . classList . add ( 'prpl-spinner' ) ;
272+ spinner . innerHTML =
273+ '<span class="spinner" style="visibility: visible;"></span>' ; // WP spinner.
274+
275+ // Append spinner after submit button.
276+ formElement . querySelector ( 'button[type="submit"]' ) . after ( spinner ) ;
277+ } ,
278+
279+ /**
280+ * Hide loading state.
281+ *
282+ * @param {HTMLFormElement } formElement - The form element.
283+ * @return {void }
284+ */
285+ hideLoading : ( formElement ) => {
286+ formElement . querySelector ( 'button[type="submit"]' ) . disabled = false ;
287+ formElement . querySelector ( 'span.prpl-spinner' ) ?. remove ( ) ;
288+ } ,
244289} ;
0 commit comments