All Projects → adearriba → ShopifyCheckoutJS

adearriba / ShopifyCheckoutJS

Licence: MIT license
A little code for having a better experience manipulating Shopify´s Checkout via JS.

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to ShopifyCheckoutJS

Magento2 NewsletterSubscribeAtCheckout
This Magento 2 module allows you to enable a newsletter subscription checkbox on the checkout page.
Stars: ✭ 13 (-76.36%)
Mutual labels:  checkout
paypal-sdk-constants
No description or website provided.
Stars: ✭ 16 (-70.91%)
Mutual labels:  checkout
vox
⚡️ instant interactivity for the web 💫
Stars: ✭ 85 (+54.55%)
Mutual labels:  shopify
bolt-magento2
Bolt plugin for magento2
Stars: ✭ 17 (-69.09%)
Mutual labels:  checkout
backendless-ecommerce-platform
BEP is short for “Backendless Ecommerce Platform,” and it turns any website into a shop with just 1-line of code. There's no backend or CMS to manage. Just add our snippet and you're in business!
Stars: ✭ 73 (+32.73%)
Mutual labels:  checkout
ng-payment-card
💳 Responsive credit card component for Angular.
Stars: ✭ 27 (-50.91%)
Mutual labels:  checkout
checkout-demo
Sample code for demonstrating Xendit Checkout including creating invoice, redirection type, and type of integration through desktop or mobile view.
Stars: ✭ 17 (-69.09%)
Mutual labels:  checkout
mechanic-tasks
Public task repository for Mechanic (https://mechanic.dev)
Stars: ✭ 42 (-23.64%)
Mutual labels:  shopify
Shopify-Serverless-Starter-App
Shopify Serverless Starter Application built on Serverless Framework and Polaris UI (React.js)
Stars: ✭ 56 (+1.82%)
Mutual labels:  shopify
koa-shopify-auth
DEPRECATED Middleware to authenticate a Koa application with Shopify
Stars: ✭ 82 (+49.09%)
Mutual labels:  shopify
magento2
Mollie Payments for Magento 2
Stars: ✭ 70 (+27.27%)
Mutual labels:  checkout
awesome-ecommerce
Collect and develop Open Source or Free Projects for building ecommerce platform easy and fast and free
Stars: ✭ 39 (-29.09%)
Mutual labels:  checkout
shopify-react-astro
A demo of a Shopify site using Astro and React.
Stars: ✭ 103 (+87.27%)
Mutual labels:  shopify
wp-simple-pay-lite
Add high conversion Stripe payment forms to your WordPress site in minutes.
Stars: ✭ 31 (-43.64%)
Mutual labels:  checkout
react-autofill
Automate the filling of checkout forms, increasing your chance of purchasing limited release items.
Stars: ✭ 57 (+3.64%)
Mutual labels:  shopify
vtex
Scripts de integração com a VTEX.
Stars: ✭ 24 (-56.36%)
Mutual labels:  checkout
Ajaxinate
🎡 Ajax pagination plugin for Shopify themes
Stars: ✭ 107 (+94.55%)
Mutual labels:  shopify
shopify-mail-notifications
Blazing-fast Shopify mail notifications templating environment with Liquid, MJML and Twig
Stars: ✭ 25 (-54.55%)
Mutual labels:  shopify
checkout
Laravel Cart, Checkout, Orders and Coupons API with Nova Management
Stars: ✭ 36 (-34.55%)
Mutual labels:  checkout
shopify-node-express-app
Simple Shopify app with Express and Node.js that connects to a Shopify store via OAuth.
Stars: ✭ 20 (-63.64%)
Mutual labels:  shopify

ShopifyCheckoutJS

A little library that will help you manipulate Shopify´s Checkout via JS.

IMPORTANT: Shopify Plus is needed. The resulting JS needs to be included in checkout.liquid file which is only available to Shopify Plus stores.

Other versions

Please refer to each version branch in case you are using a previous verions.

Important: V0.2.0 has breaking changes.

v0.1.0: https://github.com/adearriba/ShopifyCheckoutJS/tree/v0.1.0

1. Install

npm i @adearriba/shopify-checkout

2. $checkout object

The $checkout object is created to help with the different tasks manipulating Shopify´s checkout page.

2.1. Events

To register handlers for common events, you can use the $checkout.on(event, callback) function.

import { $checkout } from '@adearriba/shopify-checkout/checkout.js';

$checkout.on('load', (e) => { console.log(e); })

$checkout.on('load:information', function(e) { 
	console.log(e); 
})

$checkout.on('error', function(e) { 
	console.trace(); 
})

Loading events

This are events related to loading or changing a page/step during the checkout process:

Event name Descripcion
continue Triggers whenever any of any checkout pages are submitted.
load This is triggered for convenience in every Shopify´s page:load or page:change event.
load:information Information step is loaded
load:shipping Shipping step is loaded. The event.detail object contains the shipping methods shown in the page.
load:payment Payment step is loaded. The event.detail object contains the payment methods shown in the page.
load:processing Processing page is loaded
load:thankyou Thank you page is loaded
load:orderstatus Order status page is loaded
load:stockproblems Stock problems page is loaded. The event.detail object contains a list of name and variant of the products shown in the page.

Interactive events

This are events related to interactions with the UI.

Event name Descripcion
shippingmethod:changed When a shipping method is selected. The event.detail contains the shipping method object.
paymentmethod:changed When a payment method is selected. The event.detail contains the payment method object.
component:changed When a component's value changes. The event.detail contains the component that changed.
field:changed When a field's value changes. The event.detail contains the field that changed. Not all Fields are components so this is a special type of InputComponent.

Other events

Event name Descripcion
error When an exception is catch inside a callback of any triggered event
field:created When a field is created. The field reference is inside the event.detail property.
field:removed When a field is removed. The field reference is inside the event.detail property.

3. Components

3.1. General component methods

Insert components into the DOM

Components can be inserted before or after another components. Here an example with fields, which are a specific type of component. Below you'll find an example for sections.

$checkout.fields["checkout_billing_address_phone"].insertBefore(field);
$checkout.fields["checkout_billing_address_last_name"].insertAfter(field);

Watch for changes in components

When a component changes, the checkout:component:changed event triggers. Note: In case of fields, a checkout:field:changed event triggers. For a shorthand, instead of remembering the name of the event, you can use onValueChanged(callback) for both components and fields. At the same time, you can also use on('changed', callback).

field.onValueChanged(function(event){
	console.log(event);
});

field.on('changed', function(event){
	console.log(event);
});

component.onValueChanged(function(event){
	console.log(event);
});

component.on('changed', function(event){
	console.log(event);
});

3.2. Sections

In Shopify's checkout, you'll encounter different sections within a page. In case you want to create a new section for an additional form or separate controllers, you can do so.

Get a section that already exists

//always import the corresponding component
import {SectionComponent} from '@adearriba/shopify-checkout/checkout';

//Using a css selector, you can create a reference to an existing section
let shippingFormSection = new SectionComponent({selector: '.section--shipping-address'});

Create a new section and add it before/after another one

import {SectionComponent} from '@adearriba/shopify-checkout/checkout';

//Create a new Section component
let section = new SectionComponent({name: 'shipping-method', title: 'Shipping method'});

//Add the section before or after the previous reference
shippingFormSection.insertBefore(section);
shippingFormSection.insertAfter(section);

3.3. Radio buttons group

Create a radiobox in a section

//Import both components together
import {SectionComponent, RadioContentBoxComponent} from '@adearriba/shopify-checkout/checkout';

//Create a new RadioContentBoxComponent
var radioBox = new RadioContentBoxComponent({name: 'RadioContentBox' });

//Create an option using innerHTML instead of a text label
let option1 = {
	htmlFor: 'shipping', 
	value: 'shipping', 
	innerHTML: '<svg aria-hidden="true" class="icon-svg icon-svg--size-18 icon-svg--inline-before" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M17.816 14c-.415-1.162-1.514-2-2.816-2-1.302 0-2.4.838-2.816 2H12v-4h6v4h-.184zM15 16c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zM5 16c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zM2 4h8v10H7.816C7.4 12.838 6.302 12 5 12c-1.302 0-2.4.838-2.816 2H2V4zm13.434 1l1.8 3H12V5h3.434zm4.424 3.485l-3-5C16.678 3.185 16.35 3 16 3h-4c0-.552-.448-1-1-1H1c-.552 0-1 .448-1 1v12c0 .552.448 1 1 1h1.185C2.6 17.162 3.698 18 5 18s2.4-.838 2.816-2h4.37c.413 1.162 1.512 2 2.814 2s2.4-.838 2.816-2H19c.552 0 1-.448 1-1V9c0-.18-.05-.36-.142-.515z" fill-rule="evenodd"></path></svg>Shipping'};

//Using a text label
let option2 = {label: 'Pickup in Store', htmlFor: 'pickup', value: 'pickup'};

//Add options to RadioContentBoxComponent
radioBox.addOption(option1);
radioBox.addOption(option2);

//Add the RadioContentBoxComponent to the previous section
section.addContent(radioBox);

//Insert the new section before the existing shippingFormSection
shippingFormSection.insertBefore(section);

Result RadioContentBoxComponent

Get selected value

console.log(radioBox.value);

4. Fields

Fields are a special kind of components with additional functionality. Different types of fields can be created. Whenever a field is created with its constructor, it is added to the $checkout.fields dictionary with its key being 'checkout_attributes_' + ${name}.

For Shopify´s original form fields, they are registered in the dictionary with the input´s id. For example, the address line 1 would be:

//Shopify´s form fields using their id
$checkout.fields["checkout_billing_address_address1"]

//$checkout created fields using the field´s name given upon creation
$checkout.fields["checkout_attributes_fieldName"]

4.1. General field methods

Get input value

console.log(field.value);
field.value = '';

Add an error message and color

You can add a red border to the input and a message below it. The message can contain HTML elements in it.

field.showError('Testing error message with <b>bold</b> text!');

Remove errors

Remove the error state.

field.removeError();

4.2. TextFields

Create TextFields

import {TextField} from '@adearriba/shopify-checkout/checkout';

var field = new TextField({
	name:'dni',
	//Optional properties
	type: 'text', 
	placeholder:'DNI', 
	label:'DNI',
	size: 30, 
	defaultValue: '', 
	tooltip: 'Content of the tooltip'
});

//Accesible also from $checkout.fields
console.log($checkout.fields["checkout_attributes_dni"]);

Add tooltip to field

field.addTooltip('The content of the tooltip');

Adding it to the DOM

$checkout.fields["checkout_billing_address_phone"].insertBefore(field);

4.3. Checkboxs

Create Checkbox

import {CheckboxField} from '@adearriba/shopify-checkout/checkout';

var field = new CheckboxField({
	name:'dni', 
	//Optional properties
	label:'DNI',
	checked: true, // default: false
});

Get and set checked state

field.checked = true;
console.log(field.checked);

4.4. Dropdowns

Create a dropdown/select

import {DropdownField} from '@adearriba/shopify-checkout/checkout';

var select = new DropdownField({
    name: 'selections',
    options: [
        { text: 'option1', value: 1 },
        { text: 'option2', value: 2 },
        { text: 'option3', value: 3 },
        { text: 'option4', value: 4 },
        { text: 'option5', value: 5 },
	],
	//optional properties
	defaultValue: 'First & disabled Option', 
	label:'Selections',
});

Get selected value

console.log(select.value);

5. Shipping methods

When the load:shipping event is triggered, the event.detail object contains the shipping methods shown to the customer.

5.1. Add description to shipping method

You can add a little description beneath the shipping method name. This accepts HTML so it can be more flexible.

$checkout.on('load:shipping', e => { 
    let shippingMethods = e.detail.shippingMethods;
    shippingMethods[0].addDescription('Shipping by <b>UPS</b>')
});

5.2. Get/set checked status

...
shippingMethods[0].checked = true;
console.log(shippingMethods[0].checked);
...

5.3. Get shipping info

The shipping method object has direct access to the shipping rate and subtotal price (lineitems + shipping rate). More data can be obtained from the methodData property.

console.log(shippingMethods[0].shippingRate);
console.log(shippingMethods[0].subtotalPrice);

console.log(shippingMethods[0].methodData);

6. Payment methods

When the load:payment event is triggered, the event.detail object contains the payment methods shown to the customer.

6.1. Add description to payment method

You can add a little description in the content box beneath the payment method radio button. This accepts HTML so it can be more flexible.

$checkout.on('load:payment', e => { 
    let paymentMethods = e.detail.paymentMethods;
    paymentMethods[1].addDescription('Payment using <b>Paypal</b>')
});

6.2. Get/set checked status

...
paymentMethods[0].checked = true;
console.log(paymentMethods[0].checked);
...

6.3. Get payment method info

The payment method object has direct access to the gateway ID and gateway name. More data can be obtained from the methodData property.

console.log(paymentMethods[0].gatewayId);
console.log(paymentMethods[0].gatewayName);

console.log(paymentMethods[0].methodData);
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].