Vue.js / Nuxt Integration

Integrate Veranta API with Vue 3 Composition API or Nuxt 3

Vue 3 Component

Complete contact form component with validation

<template>
  <form @submit.prevent="handleSubmit" class="space-y-4">
    <div v-if="successMessage" class="alert alert-success">
      {{ successMessage }}
      <p class="text-sm">Reference: {{ referenceNumber }}</p>
    </div>

    <div v-if="errorMessage" class="alert alert-error">
      {{ errorMessage }}
    </div>

    <div class="form-group">
      <label for="firstName">First Name *</label>
      <input
        id="firstName"
        v-model="form.firstName"
        type="text"
        required
        :disabled="isSubmitting"
        class="form-input"
      />
    </div>

    <div class="form-group">
      <label for="lastName">Last Name *</label>
      <input
        id="lastName"
        v-model="form.lastName"
        type="text"
        required
        :disabled="isSubmitting"
        class="form-input"
      />
    </div>

    <div class="form-group">
      <label for="email">Email *</label>
      <input
        id="email"
        v-model="form.email"
        type="email"
        required
        :disabled="isSubmitting"
        class="form-input"
      />
    </div>

    <div class="form-group">
      <label for="phone">Phone</label>
      <input
        id="phone"
        v-model="form.phone"
        type="tel"
        :disabled="isSubmitting"
        class="form-input"
      />
    </div>

    <div class="form-group">
      <label for="message">Message *</label>
      <textarea
        id="message"
        v-model="form.message"
        required
        rows="4"
        :disabled="isSubmitting"
        class="form-textarea"
      ></textarea>
    </div>

    <div class="form-group">
      <label class="checkbox-label">
        <input
          v-model="form.gdprConsent"
          type="checkbox"
          required
          :disabled="isSubmitting"
        />
        I agree to the privacy policy *
      </label>
    </div>

    <div class="form-group">
      <label class="checkbox-label">
        <input
          v-model="form.marketingConsent"
          type="checkbox"
          :disabled="isSubmitting"
        />
        I would like to receive marketing communications
      </label>
    </div>

    <button
      type="submit"
      :disabled="isSubmitting"
      class="btn btn-primary"
    >
      {{ isSubmitting ? 'Sending...' : 'Send Message' }}
    </button>
  </form>
</template>

<script setup>
import { ref, reactive } from 'vue'

// Configuration
const API_KEY = import.meta.env.VITE_CLINIC_API_KEY
const CLINIC_ID = import.meta.env.VITE_CLINIC_ID
const API_URL = import.meta.env.VITE_VERANTA_API_URL || 'https://veranta.app/api/v1'

// Form state
const form = reactive({
  firstName: '',
  lastName: '',
  email: '',
  phone: '',
  message: '',
  gdprConsent: false,
  marketingConsent: false
})

const isSubmitting = ref(false)
const successMessage = ref('')
const errorMessage = ref('')
const referenceNumber = ref('')

// Submit handler
const handleSubmit = async () => {
  isSubmitting.value = true
  successMessage.value = ''
  errorMessage.value = ''

  try {
    const response = await fetch(
      `${API_URL}/clinics/${CLINIC_ID}/forms/contact`,
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'X-API-Key': API_KEY
        },
        body: JSON.stringify({
          firstName: form.firstName,
          lastName: form.lastName,
          email: form.email,
          phone: form.phone,
          message: form.message,
          gdprConsent: form.gdprConsent,
          marketingConsent: form.marketingConsent
        })
      }
    )

    const data = await response.json()

    if (!response.ok) {
      throw new Error(data.error || 'Submission failed')
    }

    // Success
    successMessage.value = 'Thank you for your message. We will contact you soon!'
    referenceNumber.value = data.data.referenceNumber

    // Reset form
    Object.keys(form).forEach(key => {
      form[key] = typeof form[key] === 'boolean' ? false : ''
    })

  } catch (error) {
    console.error('Submission error:', error)
    errorMessage.value = error.message || 'Unable to send message. Please try again.'
  } finally {
    isSubmitting.value = false
  }
}
</script>