experiments.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import hash from 'string-hash';
  2. import Account from './ui/account';
  3. const experiments = {
  4. signin_button_color: {
  5. eligible: function() {
  6. return true;
  7. },
  8. variant: function() {
  9. return ['white-primary', 'primary', 'white-violet', 'violet'][
  10. Math.floor(Math.random() * 4)
  11. ];
  12. },
  13. run: function(variant, state) {
  14. const account = state.cache(Account, 'account');
  15. account.buttonClass = variant;
  16. }
  17. }
  18. };
  19. //Returns a number between 0 and 1
  20. // eslint-disable-next-line no-unused-vars
  21. function luckyNumber(str) {
  22. return hash(str) / 0xffffffff;
  23. }
  24. function checkExperiments(state, emitter) {
  25. const all = Object.keys(experiments);
  26. const id = all.find(id => experiments[id].eligible(state));
  27. if (id) {
  28. const variant = experiments[id].variant(state);
  29. state.storage.enroll(id, variant);
  30. experiments[id].run(variant, state, emitter);
  31. }
  32. }
  33. export default function initialize(state, emitter) {
  34. emitter.on('DOMContentLoaded', () => {
  35. const xp = experiments[state.query.x];
  36. if (xp) {
  37. xp.run(+state.query.v, state, emitter);
  38. }
  39. });
  40. const enrolled = state.storage.enrolled;
  41. // single experiment per session for now
  42. const id = Object.keys(enrolled)[0];
  43. if (Object.keys(experiments).includes(id)) {
  44. experiments[id].run(enrolled[id], state, emitter);
  45. } else {
  46. checkExperiments(state, emitter);
  47. }
  48. }