overleaf/services/web/app/src/Features/Helpers/NewLogsUI.js

72 lines
1.9 KiB
JavaScript
Raw Normal View History

const { ObjectId } = require('mongodb')
const Settings = require('settings-sharelatex')
const EXISTING_UI = { newLogsUI: false, subvariant: null }
const NEW_UI_WITH_POPUP = {
newLogsUI: true,
subvariant: 'new-logs-ui-with-popup',
}
const NEW_UI_WITHOUT_POPUP = {
newLogsUI: true,
subvariant: 'new-logs-ui-without-popup',
}
function _getVariantForPercentile(
percentile,
newLogsUIWithPopupPercentage,
newLogsUIWithoutPopupPercentage
) {
// The thresholds below are upper thresholds
const newLogsUIThreshold = newLogsUIWithPopupPercentage
const newLogsUIWithoutPopupThreshold =
newLogsUIWithPopupPercentage + newLogsUIWithoutPopupPercentage
// The partitions for each of the variants (range is 0 to 99) are defined as:
// * New UI with pop-up: 0 to newLogsUIThreshold (exc)
// * New UI without pop-up: newLogsUIThreshold (inc) to newLogsUIWithoutPopupThreshold (exc)
// * Existing UI: newLogsUIWithoutPopupThreshold (inc) to 99
if (percentile < newLogsUIThreshold) {
return NEW_UI_WITH_POPUP
} else if (
percentile >= newLogsUIThreshold &&
percentile < newLogsUIWithoutPopupThreshold
) {
return NEW_UI_WITHOUT_POPUP
} else {
return EXISTING_UI
}
}
function getNewLogsUIVariantForUser(user) {
const {
_id: userId,
alphaProgram: isAlphaUser,
betaProgram: isBetaUser,
} = user
if (!userId) {
return EXISTING_UI
}
const userIdAsPercentile = (ObjectId(userId).getTimestamp() / 1000) % 100
if (isAlphaUser) {
return NEW_UI_WITH_POPUP
} else if (isBetaUser) {
return _getVariantForPercentile(
userIdAsPercentile,
Settings.logsUIPercentageBeta,
Settings.logsUIPercentageWithoutPopupBeta
)
} else {
return _getVariantForPercentile(
userIdAsPercentile,
Settings.logsUIPercentage,
Settings.logsUIPercentageWithoutPopup
)
}
}
module.exports = {
getNewLogsUIVariantForUser,
}