93
93
<span v-if =" fieldError.country" class =" error message" v-html =" errorMessage" />
94
94
</div >
95
95
96
- <ButtonCtaWithLoader
97
- :class =" ['submit-button', { submitted: !loading && formSubmitted }]"
98
- theme =" primary"
99
- loader =" signup-card-form"
100
- @clicked =" submitForm" >
101
- <template #button-content >
102
- <span class =" button-label" > {{ submitButtonLabel }} </span >
103
- </template >
104
- </ButtonCtaWithLoader >
96
+ <div class =" button-row" >
97
+ <div v-if =" submitError" class =" submit-error" >
98
+ Uh oh, we were not able to send that data due to an error — please try again, or reach out to us via Slack
99
+ </div >
100
+
101
+ <ButtonCtaWithLoader
102
+ :class =" ['submit-button', { submitted: formSubmitted }]"
103
+ theme =" primary"
104
+ loader =" signup-card-form"
105
+ @clicked =" submitForm" >
106
+ <template #button-content >
107
+ <span class =" button-label" > {{ submitButtonLabel }} </span >
108
+ </template >
109
+ </ButtonCtaWithLoader >
110
+ </div >
105
111
106
112
</div >
107
113
@@ -123,6 +129,7 @@ const props = defineProps({
123
129
124
130
// ======================================================================== Data
125
131
const formSubmitted = ref (false )
132
+ const submitError = ref (false )
126
133
const errorMessage = ' [ Field is required ]'
127
134
const fieldError = ref ({
128
135
firstName: false ,
@@ -222,16 +229,21 @@ const submitForm = async () => {
222
229
' Content-Type' : ' application/json' ,
223
230
' Authorization' : ` Bearer ${ config .public .airtableToken } `
224
231
}
225
- const res = await $fetch (' https://api.airtable.com/v0/apphbQmrNLNNXiaqG/tblDUSr66nczukX9Y' , {
232
+
233
+ await $fetch (' https://api.airtable.com/v0/apphbQmrNLNNXiaqG/tblDUSr66nczukX9Y' , {
226
234
method: ' POST' ,
227
235
body,
228
236
headers
237
+ }).then (() => {
238
+ buttonStore .set ({id: ' signup-card-form' , loading: false })
239
+ formSubmitted .value = true
240
+ return
241
+
229
242
})
230
- if (res) {
231
- buttonStore .set ({id: ' signup-card-form' , loading: false })
232
- formSubmitted .value = true
233
- return
234
- }
243
+ .catch (() => {
244
+ submitError .value = true
245
+ buttonStore .set ({id: ' signup-card-form' , loading: false })
246
+ })
235
247
}
236
248
if (! firstName .value ) { fieldError .value .firstName = true }
237
249
if (! lastName .value ) { fieldError .value .lastName = true }
@@ -314,8 +326,28 @@ const submitForm = async () => {
314
326
color : var (--error );
315
327
}
316
328
329
+
330
+ .button-row {
331
+ display : flex ;
332
+ justify-content : flex-end ;
333
+ align-items : center ;
334
+ @include mini {
335
+ flex-direction : column ;
336
+ }
337
+ }
338
+ .submit-error {
339
+ @include formFieldErrorMessage ;
340
+ color : var (--error );
341
+ margin : 0 toRem (94 ) 0 toRem (5 );
342
+ @include mini {
343
+ margin : 0 toRem (10 ) 1rem ;
344
+ }
345
+ }
317
346
.submit-button {
318
- align-self : flex-end ;
347
+ height : fit-content ;
348
+ @include mini {
349
+ align-self : flex-end ;
350
+ }
319
351
& .submitted ,
320
352
& .submitted :hover {
321
353
cursor : default ;
@@ -341,6 +373,9 @@ const submitForm = async () => {
341
373
.name-fields {
342
374
display : flex ;
343
375
justify-content : space-between ;
376
+ .field-wrapper :is (:last-of-type ) {
377
+ margin-bottom : toRem (24 );
378
+ }
344
379
@include medium {
345
380
flex-flow : row wrap ;
346
381
.field-wrapper {
0 commit comments