xylabs/sdk-react

View on GitHub
packages/experiments/src/hooks/useExperiment.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { useUserEvents } from '@xylabs/react-pixel'
import { useState } from 'react'

import { VariantData } from '../components'
import { ExperimentsHelper } from '../lib'

const selectVariant =
  <T>(current?: string) =>
  (variants: Record<string, T>, defaultValue: T) => {
    if (current && current in variants) {
      return variants[current]
    }
    return defaultValue
  }

export const selectVariantForExperiment = <T>(name: string, variants: Record<string, T>, defaultValue: T): T => {
  const variant = ExperimentsHelper.getSelectedVariant(name)
  if (variants[variant?.name ?? '']) {
    return variants[variant?.name ?? '']
  }
  return defaultValue
}

export const useExperiments = <T>(name: string, experiments: VariantData[]) => {
  const [activeExperiment] = useState(ExperimentsHelper.calculateExperiment(name, true, experiments, useUserEvents()))

  return {
    experimentName: name,
    selectVariant: selectVariant<T>(activeExperiment?.name),
  }
}