start-free-trial-button.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. type StartFreeTrialButtonProps = {
  7. source: string
  8. variant?: string
  9. buttonProps?: React.ComponentProps<typeof OLButton>
  10. children?: React.ReactNode
  11. handleClick?: React.ComponentProps<typeof OLButton>['onClick']
  12. segmentation?: eventTracking.Segmentation
  13. extraSearchParams?: Record<string, string>
  14. }
  15. export default function StartFreeTrialButton({
  16. buttonProps = {
  17. variant: 'secondary',
  18. },
  19. children,
  20. handleClick,
  21. source,
  22. variant,
  23. segmentation,
  24. extraSearchParams,
  25. }: StartFreeTrialButtonProps) {
  26. const { t } = useTranslation()
  27. useEffect(() => {
  28. const eventSegmentation: { [key: string]: unknown } = {
  29. 'paywall-type': source,
  30. ...segmentation,
  31. }
  32. if (variant) {
  33. eventSegmentation.variant = variant
  34. }
  35. eventTracking.sendMB('paywall-prompt', eventSegmentation)
  36. }, [source, variant, segmentation])
  37. const onClick = useCallback(
  38. (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
  39. event.preventDefault()
  40. let shouldNavigate = true
  41. if (handleClick) {
  42. handleClick(event)
  43. if (event.isPropagationStopped()) {
  44. shouldNavigate = false
  45. }
  46. }
  47. startFreeTrial(
  48. source,
  49. variant,
  50. segmentation,
  51. extraSearchParams,
  52. shouldNavigate
  53. )
  54. },
  55. [handleClick, source, variant, segmentation, extraSearchParams]
  56. )
  57. return (
  58. <OLButton {...buttonProps} onClick={onClick}>
  59. {children || t('start_free_trial')}
  60. </OLButton>
  61. )
  62. }