Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 34 additions & 6 deletions src/persistence.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,10 @@ export default function _Persistence(mpInstance) {

// https://go.mparticle.com/work/SQDSDKS-6048
try {
if (mpInstance._Store.isLocalStorageAvailable) {
if (
mpInstance._Store.isLocalStorageAvailable &&
!mpInstance._Store.getPrivacyFlag('Products')
) {
var encodedProducts = localStorage.getItem(
mpInstance._Store.prodStorageName
);
Expand Down Expand Up @@ -269,7 +272,10 @@ export default function _Persistence(mpInstance) {
};

this.getUserProductsFromLS = function(mpid) {
if (!mpInstance._Store.isLocalStorageAvailable) {
if (
mpInstance._Store.getPrivacyFlag('Products') ||
!mpInstance._Store.isLocalStorageAvailable
) {
return [];
}

Expand Down Expand Up @@ -308,6 +314,15 @@ export default function _Persistence(mpInstance) {
};

this.getAllUserProductsFromLS = function() {
if (mpInstance._Store.getPrivacyFlag('Products')) {
var currentUser = mpInstance.Identity.getCurrentUser();
var mpid = currentUser ? currentUser.getMPID() : null;
var result = {};
if (mpid) {
result[mpid] = { cp: [] };
}
return result;
Comment thread
rmi22186 marked this conversation as resolved.
}
var decodedProducts,
encodedProducts = localStorage.getItem(
mpInstance._Store.prodStorageName
Expand Down Expand Up @@ -342,14 +357,21 @@ export default function _Persistence(mpInstance) {
? allLocalStorageProducts[mpid].cp
: [],
};

if (mpInstance._Store.getPrivacyFlag('Products')) {
return;
}
if (mpid) {
allLocalStorageProducts = allLocalStorageProducts || {};
allLocalStorageProducts[mpid] = currentUserProducts;
try {
window.localStorage.setItem(
encodeURIComponent(mpInstance._Store.prodStorageName),
Base64.encode(JSON.stringify(allLocalStorageProducts))
const encodedKey = encodeURIComponent(
mpInstance._Store.prodStorageName
);
const encodedValue = Base64.encode(
JSON.stringify(allLocalStorageProducts)
);
window.localStorage.setItem(encodedKey, encodedValue);
} catch (e) {
mpInstance.Logger.error(
'Error with setting products on localStorage.'
Expand Down Expand Up @@ -894,6 +916,9 @@ export default function _Persistence(mpInstance) {
};

this.getCartProducts = function(mpid) {
if (mpInstance._Store.getPrivacyFlag('Products')) {
return [];
}
var allCartProducts,
cartProductsString = localStorage.getItem(
mpInstance._Store.prodStorageName
Expand All @@ -913,7 +938,10 @@ export default function _Persistence(mpInstance) {
};

this.setCartProducts = function(allProducts) {
if (!mpInstance._Store.isLocalStorageAvailable) {
if (
!mpInstance._Store.isLocalStorageAvailable ||
mpInstance._Store.getPrivacyFlag('Products')
) {
return;
}

Expand Down
34 changes: 34 additions & 0 deletions test/jest/persistence.products.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import {
mParticle,
MPConfig,
testMPID,
} from '../src/config/constants';
import { Product } from '@mparticle/web-sdk';

describe('Products Persistence', () => {
let mpInstance = mParticle.getInstance();
beforeEach(() => {
mParticle._resetForTests(MPConfig);
mpInstance._Persistence.resetPersistence();
});

it('should save products to localStorage when noTargeting is false by default', () => {
const product: Partial<Product> = { Name: 'iphone', Sku: 'iphonesku', Price: 599, Quantity: 1 };
mpInstance._Persistence.setCartProducts({ [testMPID]: { cp: [product] } } as unknown as Product[]);
expect(mpInstance._Persistence.getCartProducts(testMPID).length).toBe(1);
});

it('should NOT save products to localStorage when noTargeting is true', () => {
mpInstance._Store.setNoTargeting(true);
const product: Partial<Product> = { Name: 'iphone', Sku: 'iphonesku', Price: 599, Quantity: 1 };
mpInstance._Persistence.setCartProducts({ [testMPID]: { cp: [product] } } as unknown as Product[]);
expect(mpInstance._Persistence.getCartProducts(testMPID).length).toBe(0);
});

it('should save products to localStorage when noTargeting is false', () => {
mpInstance._Store.setNoTargeting(false);
const product: Partial<Product> = { Name: 'iphone', Sku: 'iphonesku', Price: 599, Quantity: 1 };
mpInstance._Persistence.setCartProducts({ [testMPID]: { cp: [product] } } as unknown as Product[]);
expect(mpInstance._Persistence.getCartProducts(testMPID).length).toBe(1);
});
});
47 changes: 47 additions & 0 deletions test/src/tests-persistence.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1661,6 +1661,53 @@ describe('persistence', () => {
parsedProductsAfter['testMPID'].cp.length.should.equal(0);
});

describe('products persistence with noTargeting privacy flag', () => {
beforeEach(() => {
mParticle._resetForTests(MPConfig);
});

it('should NOT save products to LS when noTargeting is true', async () => {
mParticle.config.launcherOptions = { noTargeting: true };

mParticle.init(apiKey, mParticle.config);
await waitForCondition(hasIdentifyReturned);
const localStorageProducts = localStorage.getItem(LocalStorageProductsV4WithWorkSpaceName);
expect(localStorageProducts).to.not.be.ok;
});

it('should save products to LS when noTargeting is false', async () => {
mParticle.config.launcherOptions = { noTargeting: false };

mParticle.init(apiKey, mParticle.config);
await waitForCondition(hasIdentifyReturned);
const iphone = mParticle.eCommerce.createProduct(
'iphone',
'iphonesku',
599,
1
);
mParticle.eCommerce.Cart.add(iphone, true);

const localStorageProducts = localStorage.getItem(LocalStorageProductsV4WithWorkSpaceName);
expect(localStorageProducts).to.be.ok;
});

it('should save products to LS when noTargeting is false by default', async () => {
mParticle.init(apiKey, mParticle.config);
await waitForCondition(hasIdentifyReturned);
const iphone = mParticle.eCommerce.createProduct(
'iphone',
'iphonesku',
599,
1
);
mParticle.eCommerce.Cart.add(iphone, true);

const localStorageProducts = localStorage.getItem(LocalStorageProductsV4WithWorkSpaceName);
expect(localStorageProducts).to.be.ok;
});
});

it('should only set setFirstSeenTime() once', async () => {
const cookies = JSON.stringify({
gs: {
Expand Down
Loading