<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AinaLuc</title>
    <description>The latest articles on DEV Community by AinaLuc (@ainaluc).</description>
    <link>https://dev.to/ainaluc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F391722%2F61a65301-22cb-42ac-9f48-55e6dbac528a.png</url>
      <title>DEV Community: AinaLuc</title>
      <link>https://dev.to/ainaluc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ainaluc"/>
    <language>en</language>
    <item>
      <title>Vue js : Stripe integration</title>
      <dc:creator>AinaLuc</dc:creator>
      <pubDate>Sun, 01 Sep 2024 04:53:22 +0000</pubDate>
      <link>https://dev.to/ainaluc/vue-js-stripe-integration-3n8m</link>
      <guid>https://dev.to/ainaluc/vue-js-stripe-integration-3n8m</guid>
      <description>&lt;p&gt;Hey guys,&lt;/p&gt;

&lt;p&gt;I keep getting this error with my vue js app and wonder what i got wrong here&lt;/p&gt;

&lt;p&gt;ERROR&lt;br&gt;
Cannot read properties of undefined (reading '&lt;em&gt;c')&lt;br&gt;
TypeError: Cannot read properties of undefined (reading '_c')&lt;br&gt;
    at Proxy.&lt;/em&gt;&lt;em&gt;vue_render&lt;/em&gt;_ (webpack-internal:///./node_modules/@vue-stripe/vue-stripe/dist/index.js:7:9103)&lt;br&gt;
    at renderComponentRoot (webpack-internal:///./node_modules/&lt;a class="mentioned-user" href="https://dev.to/vue"&gt;@vue&lt;/a&gt;/runtime-core/dist/runtime-core.esm-bundler.js:1018:16)&lt;br&gt;
    at ReactiveEffect.componentUpdateFn &lt;a href="//webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:6112:46"&gt;as fn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;with this code &lt;/p&gt;

&lt;p&gt;`&lt;br&gt;
  &lt;br&gt;
    &lt;br&gt;
      &lt;/p&gt;
&lt;h1&gt;Proceed to payment&lt;/h1&gt;
&lt;br&gt;
    
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="fee-summary mb-6"&amp;gt; 
  &amp;lt;p class="text-lg text-gray-700"&amp;gt;State Fee: ${{ stateFee }}&amp;lt;/p&amp;gt;
  &amp;lt;p class="text-lg text-gray-700"&amp;gt;Service Fee: ${{ serviceFee }}&amp;lt;/p&amp;gt;
  &amp;lt;p class="text-lg font-bold text-gray-800"&amp;gt;Total Fee: ${{ totalFee }}&amp;lt;/p&amp;gt; 
&amp;lt;/div&amp;gt;

&amp;lt;!-- Stripe Elements --&amp;gt;
&amp;lt;stripe-element-card
  ref="elementRef"
  :pk="publishableKey"
  @token="tokenCreated"
/&amp;gt;

&amp;lt;button @click="submit" class="deploy-button" :disabled="isProcessing"&amp;gt;
   Pay ${{ totalFee }}
&amp;lt;/button&amp;gt;

&amp;lt;!-- Success Modal --&amp;gt;
&amp;lt;div v-if="showSuccessModal" class="modal-overlay"&amp;gt;
  &amp;lt;div class="modal-content"&amp;gt;
    &amp;lt;h2 class="text-2xl font-bold mb-4"&amp;gt;Deployment Successful!&amp;lt;/h2&amp;gt;
    &amp;lt;p&amp;gt;Your model has been successfully deployed.&amp;lt;/p&amp;gt;
    &amp;lt;button @click="redirectToThankYou" class="modal-button"&amp;gt;
      Continue
    &amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;br&gt;


&lt;p&gt;import { ref, computed } from 'vue';&lt;br&gt;
import { useRouter } from 'vue-router';&lt;br&gt;
import axios from 'axios';&lt;br&gt;
import { StripeElementCard } from '@vue-stripe/vue-stripe';&lt;/p&gt;

&lt;p&gt;export default {&lt;br&gt;
  components: {&lt;br&gt;
    StripeElementCard,&lt;br&gt;
  },&lt;br&gt;
  setup() {&lt;br&gt;
    const publishableKey = 'pk_live_51MnMGrE1uOh1UBiwgHnSC8b8OKZhFEuSGIHjTa88gUmJ82JADCkaadlPd0tOrjc6JfrLkGSOkV714SgnV8QkvlKF00PrqzpBgj'; // Directly use the key here&lt;br&gt;
    const serviceFee = 250;&lt;br&gt;
    const selectedState = ref(localStorage.getItem('selectedState') || '');&lt;br&gt;
    const stateFeesData = ref({&lt;br&gt;
      'California': { fee: 300 },&lt;br&gt;
      'Texas': { fee: 200 },&lt;br&gt;
      'New York': { fee: 350 },&lt;br&gt;
      // Add other states and their fees here&lt;br&gt;
    });&lt;br&gt;
    const showSuccessModal = ref(false);&lt;br&gt;
    const isProcessing = ref(false);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const selectedStateFees = computed(() =&amp;amp;gt; {
  return stateFeesData.value[selectedState.value] || { fee: 0 };
});

const stateFee = computed(() =&amp;amp;gt; selectedStateFees.value.fee);
const totalFee = computed(() =&amp;amp;gt; stateFee.value + serviceFee);

const elementRef = ref(null);

const submit = () =&amp;amp;gt; {
  if (elementRef.value) {
    elementRef.value.submit();
  } else {
    console.error('Element ref is not defined');
  }
};

const tokenCreated = async (token) =&amp;amp;gt; {
  console.log(token);
  isProcessing.value = true;

  try {
    const response = await axios.post('/api/deploy-model', {
      state: selectedState.value,
      stateFee: stateFee.value,
      serviceFee,
      totalFee: totalFee.value,
      paymentMethodId: token.id, // Send token ID to backend
    });

    if (response.data.success) {
      showSuccessModal.value = true;
    } else {
      console.error('Deployment failed:', response.data.message);
    }
  } catch (error) {
    console.error('Error during deployment:', error);
  } finally {
    isProcessing.value = false;
  }
};

const redirectToThankYou = () =&amp;amp;gt; {
  const router = useRouter();
  router.push('/thank-you');
};

return {
  publishableKey,
  serviceFee,
  selectedState,
  stateFeesData,
  showSuccessModal,
  isProcessing,
  selectedStateFees,
  stateFee,
  totalFee,
  elementRef,
  submit,
  tokenCreated,
  redirectToThankYou,
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;.deploy-page {&lt;br&gt;
  max-width: 600px;&lt;br&gt;
  margin: 0 auto;&lt;br&gt;
  padding: 20px;&lt;br&gt;
  background-color: #f3f4f6;&lt;br&gt;
  border-radius: 12px;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.header {&lt;br&gt;
  text-align: center;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.form-group {&lt;br&gt;
  margin-bottom: 20px;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.fee-summary p {&lt;br&gt;
  margin: 5px 0;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.deploy-button {&lt;br&gt;
  width: 100%;&lt;br&gt;
  padding: 10px 15px;&lt;br&gt;
  font-size: 18px;&lt;br&gt;
  color: #fff;&lt;br&gt;
  background-color: #4a90e2;&lt;br&gt;
  border: none;&lt;br&gt;
  border-radius: 8px;&lt;br&gt;
  cursor: pointer;&lt;br&gt;
  transition: background-color 0.3s ease;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.deploy-button:disabled {&lt;br&gt;
  background-color: #ccc;&lt;br&gt;
  cursor: not-allowed;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.modal-overlay {&lt;br&gt;
  position: fixed;&lt;br&gt;
  top: 0;&lt;br&gt;
  left: 0;&lt;br&gt;
  width: 100%;&lt;br&gt;
  height: 100%;&lt;br&gt;
  background-color: rgba(0, 0, 0, 0.5);&lt;br&gt;
  display: flex;&lt;br&gt;
  justify-content: center;&lt;br&gt;
  align-items: center;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.modal-content {&lt;br&gt;
  background-color: #fff;&lt;br&gt;
  padding: 20px;&lt;br&gt;
  border-radius: 10px;&lt;br&gt;
  text-align: center;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.modal-button {&lt;br&gt;
  margin-top: 15px;&lt;br&gt;
  padding: 10px 15px;&lt;br&gt;
  background-color: #4a90e2;&lt;br&gt;
  color: #fff;&lt;br&gt;
  border: none;&lt;br&gt;
  border-radius: 8px;&lt;br&gt;
  cursor: pointer;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;`&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
