start-free-trial-button.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { useCallback, useEffect } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { startFreeTrial } from '@/main/account-upgrade'
  4. import * as eventTracking from '../../infrastructure/event-tracking'
  5. import OLButton from '@/shared/components/ol/ol-button'
  6. import { useFeatureFlag } from '@/shared/context/split-test-context'
  7. type StartFreeTrialButtonProps = {
  8. source: string
  9. variant?: string
  10. buttonProps?: React.ComponentProps<typeof OLButton>
  11. children?: React.ReactNode
  12. handleClick?: React.ComponentProps<typeof OLButton>['onClick']
  13. segmentation?: eventTracking.Segmentation
  14. extraSearchParams?: Record<string, string>
  15. }
  16. export default function StartFreeTrialButton({
  17. buttonProps = {
  18. variant: 'secondary',
  19. },
  20. children,
  21. handleClick,
  22. source,
  23. variant,
  24. segmentation,
  25. extraSearchParams,
  26. }: StartFreeTrialButtonProps) {
  27. const { t } = useTranslation()
  28. const plans2026 = useFeatureFlag('plans-2026-phase-1')
  29. useEffect(() => {
  30. const eventSegmentation: { [key: string]: unknown } = {
  31. 'paywall-type': source,
  32. ...segmentation,
  33. }
  34. if (variant) {
  35. eventSegmentation.variant = variant
  36. }
  37. eventTracking.sendMB('paywall-prompt', eventSegmentation)
  38. }, [source, variant, segmentation])
  39. const onClick = useCallback(
  40. (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
  41. event.preventDefault()
  42. let shouldNavigate = true
  43. if (handleClick) {
  44. handleClick(event)
  45. if (event.isPropagationStopped()) {
  46. shouldNavigate = false
  47. }
  48. }
  49. startFreeTrial(
  50. source,
  51. variant,
  52. segmentation,
  53. extraSearchParams,
  54. shouldNavigate
  55. )
  56. },
  57. [handleClick, source, variant, segmentation, extraSearchParams]
  58. )
  59. return (
  60. <OLButton {...buttonProps} onClick={onClick}>
  61. {children ||
  62. (plans2026
  63. ? t('start_free_trial_without_exclamation')
  64. : t('start_free_trial'))}
  65. </OLButton>
  66. )
  67. }