HEX
Server: Apache
System: Linux 244.240.109.208.host.secureserver.net 5.14.0-611.11.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Dec 3 09:47:37 EST 2025 x86_64
User: icsla (1002)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: /home/icsla/public_html/wp-content/plugins/link-whisper/js/wpil_checkout.js
(function($, window, document){
  'use strict';

  var LWCreditCheckout = {
    stripe: null,
    elements: null,
    paymentElement: null,
    clientSecret: null,
    activeType: null,
    activePriceId: null,
    activeQuantity: null,
    activeEmail: null,

    init: function(){
      if (!window.wpilCheckout || !window.wpilCheckout.stripePublicKey || !window.wpilCheckout.apiUrl) {
        console.error('LWCreditCheckout: missing config');
        return;
      }

      this.stripe = Stripe(window.wpilCheckout.stripePublicKey);
      this.bindUI();
    },

    bindUI: function(){
      var self = this;

      // Open modal from the "Buy" button, should contain all parameters for the sale in data attres
      $(document).on('click', '.lw-credits-buy', function(e){
        e.preventDefault();

        var $btn = $(this);
        self.activeType     = $btn.data('type') || 'custom';
        self.activePriceId  = $btn.data('price-id') || null;
        self.activeQuantity = parseInt($btn.data('quantity') || $btn.data('credits') || 0, 10) || null;

        // Left side UI (you can compute price locally or set via data-price)
        $('#lwcc-credits').text((parseInt($btn.data('credits'),10) || self.activeQuantity || '—').toLocaleString());
        $('#lwcc-price').text($btn.data('price') || '$0.00');

        self.activeEmail = (window.wpilCheckout.userEmail) ? window.wpilCheckout.userEmail : ($btn.data('email') || '');
        self.open();

        // If you already know email, create intent immediately
        // Otherwise you can add an email field. If you truly want minimal, pass email from WP.
        self.createIntent();
      });

      $(document).on('click', '[data-lwcc-close]', function(e){
        e.preventDefault();
        self.close();
      });

      $(document).on('submit', '#lwcc-form', function(e){
        e.preventDefault();
        self.submit();
      });

      $(document).on('keydown', function(e){
        if(e.key === 'Escape' && $('#lw-credit-checkout-modal').is(':visible')){
          self.close();
        }
      });
    },

    open: function(){
      $('#lwcc-errors').text('');
      this.setMessage('', '');
      $('#lw-credit-checkout-modal')
        .removeClass('hidden')
        .attr('aria-hidden', 'false')
        .show();
      $('body').addClass('lwcc-open');
    },

    close: function(){
      $('#lw-credit-checkout-modal')
        .addClass('hidden')
        .attr('aria-hidden', 'true')
        .hide();
      $('body').removeClass('lwcc-open');
      $('#lwcc-errors').text('');
      this.setMessage('', '');
      this.teardownStripe();
      this.clientSecret = null;
      this.activeType = null;
      this.activePriceId = null;
      this.activeQuantity = null;
      this.activeEmail = null;
    },

    setMessage: function(msg, type){
      var $m = $('#lwcc-message');
      $m.removeClass('is-info is-success is-error');

      if (!msg){
        $m.hide().text('');
        return;
      }

      $m.addClass(type ? ('is-' + type) : 'is-info').text(msg).show();
    },

    setLoading: function(isLoading, msg){
      if (msg) this.setMessage(msg, 'info');
      $('#lwcc-loader').toggle(!!isLoading);
      $('#lwcc-submit').prop('disabled', !!isLoading);
    },

    teardownStripe: function(){
      $('#lwcc-payment-element').empty();
      this.elements = null;
      this.paymentElement = null;
    },

    createIntent: function(){
      var self = this;

      if (!this.activeEmail) {
        this.setMessage('Missing email.', 'error');
        return;
      }

      var payload = { email: this.activeEmail, type: this.activeType };

      if (this.activeType === 'custom') {
        payload.quantity = this.activeQuantity;
      } else {
        payload.price_id = this.activePriceId;
      }

      this.setLoading(true, 'Preparing checkout...');

      $.ajax({
        url: window.wpilCheckout.apiUrl + '/create-intent',
        method: 'POST',
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(payload)
      })
      .done(function(res){
        if (!res || res.error || !res.clientSecret) {
          self.setLoading(false);
          self.setMessage(res && res.error ? res.error : 'Failed to create checkout.', 'error');
          return;
        }

        self.clientSecret = res.clientSecret;

        if (res.credits) $('#lwcc-credits').text(parseInt(res.credits,10).toLocaleString());
        if (res.amount_display) $('#lwcc-price').text('$' + (res.amount_display / 100).toFixed(2));

        self.mountPaymentElement();
        self.setLoading(false, 'Enter payment details.');
      })
      .fail(function(jqXHR){
        self.setLoading(false);

        var msg = 'Network error creating checkout.';
        if (jqXHR && jqXHR.status === 0) {
          var endpoint = (window.wpilCheckout && window.wpilCheckout.apiUrl) ? window.wpilCheckout.apiUrl : 'the Link Whisper checkout endpoint';
          msg = 'Your site blocked the outbound checkout request to ' + endpoint + '. Ask your host/firewall to allow this endpoint, then try again.';
          $('#lwcc-errors').text('Outbound checkout request blocked. Allow access to ' + endpoint + ' and retry.');
        }
        self.setMessage(msg, 'error');
      });
    },

    mountPaymentElement: function(){
      this.teardownStripe();

      this.elements = this.stripe.elements({ clientSecret: this.clientSecret });
      this.paymentElement = this.elements.create('payment');
      this.paymentElement.mount('#lwcc-payment-element');
    },

    submit: function(){
      var self = this;

      if (!this.stripe || !this.elements || !this.activeType) {
        $('#lwcc-errors').text('Checkout not ready.');
        return;
      }

      $('#lwcc-errors').text('');
      this.setLoading(true, 'Confirming payment...');

      var method = (this.activeType === 'recurring') ? 'confirmSetup' : 'confirmPayment';

      this.stripe[method]({
        elements: this.elements,
        confirmParams: {
          payment_method_data: { billing_details: { email: this.activeEmail } }
        },
        redirect: 'if_required'
      }).then(function(result){
        self.setLoading(false);

        if (result.error) {
          $('#lwcc-errors').text(result.error.message || 'Payment failed.');
          return;
        }

        self.setMessage('Payment successful!', 'success');

        setTimeout(function(){
            self.close();
        }, 150);

        // trigger complete for the benefit of whoever's listening
        $(document).trigger('lwcc:paid', [result]);
      });
    }
  };

  window.LWCreditCheckout = LWCreditCheckout;

  $(function(){
    LWCreditCheckout.init();
  });

    $(document).on('lwcc:paid', function (e, result) {
        var button = $('.lw-credits-buy'),
            available = $('.ai-credits-available'),
            current = parseInt((available.text() || '0').replace(/,/g, ''), 10) || 0,
            purchase = parseInt(button.data('credits'), 10) || 0;

        $('.wpil-ai-credit-stamp').removeClass('wpil-ai-credit-stamp--bad').addClass('wpil-ai-credit-stamp--ok');
        available.text((purchase + current));
        button.hide();
    });


})(jQuery, window, document);