@klevu/core
Version:
Typescript SDK that simplifies development on Klevu backend. Klevu provides advanced AI-powered search and discovery solutions for online retailers.
300 lines (299 loc) • 16.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.KlevuEvents = void 0;
const index_js_1 = require("../index.js");
const lastClickedProducts_js_1 = require("../store/lastClickedProducts.js");
const lastSearches_js_1 = require("../store/lastSearches.js");
const usersession_js_1 = require("../resolvers/usersession.js");
const storage_js_1 = require("../utils/storage.js");
const eventRequests_js_1 = require("./eventRequests.js");
const ipresolver_js_1 = require("../resolvers/ipresolver.js");
/**
* @category KlevuEvents
*/
class KlevuEvents {
/**
* Tell Klevu what products where bought by the user
*
* @param items Items user bought
* @property amount count of bought products
* @property product KlevuProduct that is being bought
* @property variantId optional variantId that is being bought
* @property override optional override any settings of sent data
*
*/
static buy({ user, items, }) {
const userData = ipresolver_js_1.KlevuIpResolver.getDefault().getUserData();
const data = {
event: "order_purchase",
event_version: "1.0.0",
event_apikey: index_js_1.KlevuConfig.getDefault().apiKey,
user_profile: Object.assign(Object.assign({}, user), { ip_address_v4: userData.ipv4, ip_address_v6: userData.ipv6, data_protection: index_js_1.KlevuConfig.getDefault().useConsent &&
index_js_1.KlevuConfig.getDefault().consentGiven, klevu_uuid: userData.uuid }),
event_data: {
items: items.map((i) => {
var _a, _b, _c, _d, _e, _f;
return (Object.assign({ currency: (_a = i.product.currency) !== null && _a !== void 0 ? _a : "USD", item_group_id: (_b = i.product.itemGroupId) !== null && _b !== void 0 ? _b : i.product.id, item_id: i.product.id, item_name: (_c = i.product.name) !== null && _c !== void 0 ? _c : "unknown", item_variant_id: (_d = i.variantId) !== null && _d !== void 0 ? _d : i.product.id, unit_price: parseFloat((_e = i.product.salePrice) !== null && _e !== void 0 ? _e : "0"), order_id: i.orderId, order_line_id: i.orderLineId, units: i.amount }, ((_f = i.override) !== null && _f !== void 0 ? _f : {})));
}),
},
};
(0, eventRequests_js_1.KlevuEventV2CheckedOutProducts)(data);
}
/**
* When recommendation banner is shown in the page
*
* @param recommendation Metadata of what recommendation is shown
* @param products List of all products that are shown
* @param bannerInfo Information about the static banner that is shown
* @param override Ability to override any analytical keys in low level
*/
static recommendationView({ recommendationMetadata, products, bannerInfo, override = {}, }) {
const userData = ipresolver_js_1.KlevuIpResolver.getDefault().getUserData();
const data = {
event: "view_recs_list",
event_version: "1.0.0",
event_apikey: index_js_1.KlevuConfig.getDefault().apiKey,
user_profile: {
sessionId: storage_js_1.KlevuStorage.getItem(usersession_js_1.USER_SESSION_ID_STORAGE_KEY) || undefined,
ip_address_v4: userData.ipv4,
ip_address_v6: userData.ipv6,
data_protection: index_js_1.KlevuConfig.getDefault().useConsent &&
index_js_1.KlevuConfig.getDefault().consentGiven,
klevu_uuid: userData.uuid,
},
event_data: {
list_id: recommendationMetadata.recsKey,
list_logic: recommendationMetadata.logic,
list_name: recommendationMetadata.title,
action: recommendationMetadata.action,
spot_id: recommendationMetadata.spotKey,
spot_name: recommendationMetadata.spotName,
segment_name: recommendationMetadata.segmentName || undefined,
segment_id: recommendationMetadata.segmentKey || undefined,
static_content: bannerInfo && [bannerInfo],
items: products &&
products.map((p, index) => {
var _a, _b;
if (!p.id) {
throw new Error("Cannot send event without product id");
}
return {
index: index + 1,
item_id: p.id,
item_group_id: p.itemGroupId || p.id,
item_name: (_a = p.name) !== null && _a !== void 0 ? _a : "unknown",
item_variant_id: p.variantId || p.id,
price: (_b = p.price) !== null && _b !== void 0 ? _b : "0",
currency: p.currency,
item_brand: p.brand,
item_category: p.category,
};
}),
},
};
(0, eventRequests_js_1.KlevuEventV2)([
Object.assign(Object.assign({}, data), override),
]);
}
/**
* When product has been clicked in the recommendation banner
*
* @param recommendationMetadata Metadata of what recommendation is clicked
* @param bannerInfo Information about the static banner that is shown
* @param product Which product is clicked in the list
* @param productIndexInList What is the index of the product in the list. Starting from 1
* @param override Ability to override any analytical keys in low level
*/
static recommendationClick({ recommendationMetadata, product, bannerInfo, productIndexInList, variantId, override = {}, }) {
var _a, _b;
if (product) {
lastClickedProducts_js_1.KlevuLastClickedProducts.click(product.id, product);
}
const userData = ipresolver_js_1.KlevuIpResolver.getDefault().getUserData();
const data = {
event: "select_recs_list",
event_version: "1.0.0",
event_apikey: index_js_1.KlevuConfig.getDefault().apiKey,
user_profile: {
sessionId: storage_js_1.KlevuStorage.getItem(usersession_js_1.USER_SESSION_ID_STORAGE_KEY) || undefined,
ip_address_v4: userData.ipv4,
ip_address_v6: userData.ipv6,
data_protection: index_js_1.KlevuConfig.getDefault().useConsent &&
index_js_1.KlevuConfig.getDefault().consentGiven,
klevu_uuid: userData.uuid,
},
event_data: {
list_id: recommendationMetadata.recsKey,
list_logic: recommendationMetadata.logic,
list_name: recommendationMetadata.title,
action: recommendationMetadata.action,
spot_id: recommendationMetadata.spotKey,
spot_name: recommendationMetadata.spotName,
static_content: bannerInfo && [bannerInfo],
segment_name: recommendationMetadata.segmentName || undefined,
segment_id: recommendationMetadata.segmentKey || undefined,
items: product && [
{
index: productIndexInList !== null && productIndexInList !== void 0 ? productIndexInList : 1,
item_id: product.id,
item_group_id: product.itemGroupId || product.id,
item_name: (_a = product.name) !== null && _a !== void 0 ? _a : "unknown",
item_variant_id: variantId || product.id,
price: (_b = product.salePrice) !== null && _b !== void 0 ? _b : "0",
currency: product.currency,
item_brand: product.brand,
item_category: product.category,
},
],
},
};
(0, eventRequests_js_1.KlevuEventV2)([
Object.assign(Object.assign({}, data), override),
]);
}
/**
* When product is clicked. Do not use this for recommendations
*
* @param searchTerm
* @param product
*/
static searchProductClick({ product, searchTerm, variantId, activeFilters, tags, override = {}, }) {
var _a, _b;
if (!product.id) {
throw new Error("Cannot send event without product id");
}
lastClickedProducts_js_1.KlevuLastClickedProducts.click(product.id, product);
const userData = ipresolver_js_1.KlevuIpResolver.getDefault().getUserData();
const data = {
klevu_apiKey: index_js_1.KlevuConfig.getDefault().apiKey,
klevu_type: "clicked",
klevu_keywords: searchTerm,
klevu_productGroupId: product.itemGroupId || product.id,
klevu_productId: product.id,
klevu_productName: (_a = product.name) !== null && _a !== void 0 ? _a : "unknown",
klevu_productUrl: (_b = product.url) !== null && _b !== void 0 ? _b : "",
klevu_productVariantId: variantId || product.id,
klevu_activeFilters: activeFilters,
tags: tags || [],
klevu_shopperIP_v4: userData.ipv4,
klevu_shopperIP_v6: userData.ipv6,
data_protection: index_js_1.KlevuConfig.getDefault().useConsent &&
index_js_1.KlevuConfig.getDefault().consentGiven,
klevu_uuid: userData.uuid,
};
(0, eventRequests_js_1.KlevuEventV1ProductTracking)(Object.assign(Object.assign({}, data), override));
}
/**
* What user has last searched. This is important for Klevu to function
* properly. Use `sendSearchEvent()` modifier with search query to send results
*
* @param term What was searched
* @param totalResults Total number of results (can be found in result meta)
* @param typeOfSearch Type of search used (can be found in result meta)
* @param override Ability to override any analytical keys in low level
*/
static search({ term, totalResults, typeOfSearch, activeFilters, tags, override = {}, }) {
lastSearches_js_1.KlevuLastSearches.save(term);
const userData = ipresolver_js_1.KlevuIpResolver.getDefault().getUserData();
const data = {
klevu_apiKey: index_js_1.KlevuConfig.getDefault().apiKey,
klevu_term: term,
klevu_totalResults: totalResults,
klevu_typeOfQuery: typeOfSearch,
klevu_activeFilters: activeFilters,
klevu_shopperIP_v4: userData.ipv4,
klevu_shopperIP_v6: userData.ipv6,
tags: tags || [],
data_protection: index_js_1.KlevuConfig.getDefault().useConsent &&
index_js_1.KlevuConfig.getDefault().consentGiven,
klevu_uuid: userData.uuid,
};
(0, eventRequests_js_1.KlevuEventV1Search)(Object.assign(Object.assign({}, data), override));
}
/**
*
* @param categoryTitle This is the name of the category being visited. For example, Stackable Rings. The name should not include parent categories.
* @param klevuCategory This is the complete hierarchy of the category being visited. For example, Jewellery;Rings;Stackable Rings. Please note the use of a semicolon as the separator between a parent and a child category.
* @param products Products in the view
* @param pageStartsFrom Offset of the first product being shown on this page. For example, if you are displaying 30 products per page and if a customer is on the 2nd page, the value here should be 30. If on the 3rd page, it will be 60.
* @param abTestId The AB test id currently running
* @param abTestVariantId Id of AB test variant
* @param activeFilters The string version of active filters applied to the query that got the products.
* @param override Ability to override any analytical keys in low level
*/
static categoryMerchandisingView({ categoryTitle, klevuCategory, products, pageStartsFrom, abTestId, abTestVariantId, activeFilters, override = {}, }) {
const userData = ipresolver_js_1.KlevuIpResolver.getDefault().getUserData();
const data = {
klevu_apiKey: index_js_1.KlevuConfig.getDefault().apiKey,
klevu_categoryName: categoryTitle,
klevu_categoryPath: klevuCategory,
klevu_productIds: products.map((p) => p.id).join(","),
klevu_pageStartsFrom: pageStartsFrom,
klevu_activeFilters: activeFilters,
klevu_abTestId: abTestId,
klevu_abTestVariantId: abTestVariantId,
klevu_shopperIP_v4: userData.ipv4,
klevu_shopperIP_v6: userData.ipv6,
data_protection: index_js_1.KlevuConfig.getDefault().useConsent &&
index_js_1.KlevuConfig.getDefault().consentGiven,
klevu_uuid: userData.uuid,
};
(0, eventRequests_js_1.KlevuEventV1CategoryView)(Object.assign(Object.assign({}, data), override));
}
/**
*
* @param product Product clicked
* @param categoryTitle This is the name of the category being visited. For example, Stackable Rings. The name should not include parent categories.
* @param klevuCategory This is the complete hierarchy of the category being visited. For example, Jewellery;Rings;Stackable Rings. Please note the use of a semicolon as the separator between a parent and a child category.
* @param variantId This is the child/variant ID of the clicked product. eg. 12345. For compound products with a parent and multiple child/variant products, this is the ID of the specific variant.
* @param productPosition Position of the product on the category page when it was clicked. For example, the value would be 0 if it is the first product on the first page. The value will be 30, if it is the first product on the 2nd page with 30 products being displayed per page.
* @param activeFilters The string version of active filters applied to the query that got the products.
* @param override Ability to override any analytical keys in low level
*/
static categoryMerchandisingProductClick({ product, categoryTitle, klevuCategory, variantId, productPosition, abTestId, abTestVariantId, activeFilters, override = {}, }) {
if (!product.id) {
throw new Error("Cannot send event without product id");
}
lastClickedProducts_js_1.KlevuLastClickedProducts.click(product.id, product);
const userData = ipresolver_js_1.KlevuIpResolver.getDefault().getUserData();
const data = {
klevu_apiKey: index_js_1.KlevuConfig.getDefault().apiKey,
klevu_categoryName: categoryTitle,
klevu_productGroupId: product.itemGroupId || product.id,
klevu_productVariantId: variantId || product.id,
klevu_categoryPath: klevuCategory,
klevu_productId: product.id,
klevu_productName: product.name,
klevu_productUrl: product.url,
klevu_salePrice: product.salePrice,
klevu_productSku: product.sku,
klevu_productPosition: productPosition,
klevu_abTestId: abTestId,
klevu_abTestVariantId: abTestVariantId,
klevu_activeFilters: activeFilters,
klevu_shopperIP_v4: userData.ipv4,
klevu_shopperIP_v6: userData.ipv6,
data_protection: index_js_1.KlevuConfig.getDefault().useConsent &&
index_js_1.KlevuConfig.getDefault().consentGiven,
klevu_uuid: userData.uuid,
};
(0, eventRequests_js_1.KlevuEventV1CategoryProductClick)(Object.assign(Object.assign({}, data), override));
}
/**
* When user clicks on the banner that is in quicksearch or on search landing page
*/
static imageBannerClick({ term, bannerId, bannerName, imageUrl, targetUrl, override = {}, }) {
const data = {
klevu_apiKey: index_js_1.KlevuConfig.getDefault().apiKey,
type: "banner",
klevu_request: "click",
klevu_term: term,
klevu_bannerId: bannerId,
klevu_bannerName: bannerName,
klevu_image: imageUrl,
klevu_target: targetUrl,
};
(0, eventRequests_js_1.KlevuEventV1BannerClick)(Object.assign(Object.assign({}, data), override));
}
}
exports.KlevuEvents = KlevuEvents;