2018-11-05 05:06:39 -05:00
|
|
|
/* eslint-disable
|
|
|
|
camelcase,
|
|
|
|
max-len,
|
|
|
|
no-undef,
|
|
|
|
no-unused-vars,
|
|
|
|
*/
|
|
|
|
// TODO: This file was created by bulk-decaffeinate.
|
|
|
|
// Fix any style issues and re-enable lint.
|
|
|
|
/*
|
|
|
|
* decaffeinate suggestions:
|
|
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
* DS103: Rewrite code to no longer use __guard__
|
|
|
|
* DS207: Consider shorter variations of null checks
|
|
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
|
*/
|
2019-10-16 06:10:54 -04:00
|
|
|
define(['base', 'crypto-js/md5'], function(App, CryptoJS) {
|
2018-11-05 05:06:39 -05:00
|
|
|
const oldKeys = [
|
|
|
|
'sl_abt_multi_currency_editor_eu-eu',
|
|
|
|
'sl_abt_multi_currency_eu-eu',
|
|
|
|
'sl_abt_multi_currency_editor_eu-usd',
|
|
|
|
'sl_abt_multi_currency_eu-usd',
|
|
|
|
'sl_abt_trial_len_14d',
|
|
|
|
'sl_abt_trial_len_7d',
|
|
|
|
'sl_abt_trial_len_30d',
|
|
|
|
'sl_utt',
|
|
|
|
'sl_utt_trial_len',
|
|
|
|
'sl_utt_multi_currency'
|
|
|
|
]
|
|
|
|
|
|
|
|
App.factory('abTestManager', function($http, ipCookie) {
|
|
|
|
let getABTestBucket, processTestWithStep
|
|
|
|
_.each(oldKeys, oldKey => ipCookie.remove(oldKey))
|
|
|
|
|
|
|
|
const _buildCookieKey = function(testName, bucket) {
|
|
|
|
const key = `sl_abt_${testName}_${bucket}`
|
|
|
|
return key
|
|
|
|
}
|
|
|
|
|
|
|
|
const _getTestCookie = function(testName, bucket) {
|
|
|
|
const cookieKey = _buildCookieKey(testName, bucket)
|
|
|
|
const cookie = ipCookie(cookieKey)
|
|
|
|
return cookie
|
|
|
|
}
|
|
|
|
|
|
|
|
const _persistCookieStep = function(testName, bucket, newStep) {
|
|
|
|
const cookieKey = _buildCookieKey(testName, bucket)
|
|
|
|
ipCookie(cookieKey, { step: newStep }, { expires: 100, path: '/' })
|
|
|
|
return ga(
|
|
|
|
'send',
|
|
|
|
'event',
|
|
|
|
'ab_tests',
|
|
|
|
`${testName}:${bucket}`,
|
|
|
|
`step-${newStep}`
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
const _checkIfStepIsNext = function(cookieStep, newStep) {
|
|
|
|
if (cookieStep == null && newStep !== 0) {
|
|
|
|
return false
|
|
|
|
} else if (newStep === 0) {
|
|
|
|
return true
|
|
|
|
} else if (cookieStep + 1 === newStep) {
|
|
|
|
return true
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const _getUsersHash = function(testName) {
|
|
|
|
const sl_user_test_token = `sl_utt_${testName}`
|
|
|
|
let user_uuid = ipCookie(sl_user_test_token)
|
|
|
|
if (user_uuid == null) {
|
|
|
|
user_uuid = Math.random()
|
|
|
|
ipCookie(sl_user_test_token, user_uuid, { expires: 365, path: '/' })
|
|
|
|
}
|
2019-10-16 06:10:54 -04:00
|
|
|
const hash = CryptoJS(`${user_uuid}:${testName}`)
|
2018-11-05 05:06:39 -05:00
|
|
|
return hash
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
processTestWithStep: (processTestWithStep = function(
|
|
|
|
testName,
|
|
|
|
bucket,
|
|
|
|
newStep
|
|
|
|
) {
|
|
|
|
const currentCookieStep = __guard__(
|
|
|
|
_getTestCookie(testName, bucket),
|
|
|
|
x => x.step
|
|
|
|
)
|
|
|
|
if (_checkIfStepIsNext(currentCookieStep, newStep)) {
|
|
|
|
return _persistCookieStep(testName, bucket, newStep)
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
|
|
|
|
getABTestBucket: (getABTestBucket = function(test_name, buckets) {
|
|
|
|
const hash = _getUsersHash(test_name)
|
|
|
|
const bucketIndex =
|
|
|
|
parseInt(hash.toString().slice(0, 2), 16) %
|
|
|
|
((buckets != null ? buckets.length : undefined) || 2)
|
|
|
|
return buckets[bucketIndex]
|
|
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
return App.controller('AbTestController', function($scope, abTestManager) {
|
|
|
|
const testKeys = _.keys(window.ab)
|
|
|
|
|
|
|
|
return _.each(window.ab, event =>
|
|
|
|
abTestManager.processTestWithStep(
|
|
|
|
event.testName,
|
|
|
|
event.bucket,
|
|
|
|
event.step
|
|
|
|
)
|
|
|
|
)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
function __guard__(value, transform) {
|
|
|
|
return typeof value !== 'undefined' && value !== null
|
|
|
|
? transform(value)
|
|
|
|
: undefined
|
|
|
|
}
|