about summary refs log tree commit diff
path: root/src/tours/index.tsx
blob: 8d4ca26b8a7ba4dc7e377c08886462a7859139d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import React from 'react'
import {InteractionManager} from 'react-native'
import {TourGuideProvider, useTourGuideController} from 'rn-tourguide'

import {useGate} from '#/lib/statsig/statsig'
import {useColorModeTheme} from '#/alf/util/useColorModeTheme'
import {HomeTour} from './HomeTour'
import {TooltipComponent} from './Tooltip'

export enum TOURS {
  HOME = 'home',
}

type StateContext = TOURS | null
type SetContext = (v: TOURS | null) => void

const stateContext = React.createContext<StateContext>(null)
const setContext = React.createContext<SetContext>((_: TOURS | null) => {})

export function Provider({children}: React.PropsWithChildren<{}>) {
  const theme = useColorModeTheme()
  const [state, setState] = React.useState<TOURS | null>(() => null)

  return (
    <TourGuideProvider
      androidStatusBarVisible
      tooltipComponent={TooltipComponent}
      backdropColor={
        theme === 'light' ? 'rgba(0, 0, 0, 0.15)' : 'rgba(0, 0, 0, 0.8)'
      }
      preventOutsideInteraction>
      <stateContext.Provider value={state}>
        <setContext.Provider value={setState}>
          <HomeTour />
          {children}
        </setContext.Provider>
      </stateContext.Provider>
    </TourGuideProvider>
  )
}

export function useTriggerTourIfQueued(tour: TOURS) {
  const {start} = useTourGuideController(tour)
  const setQueuedTour = React.useContext(setContext)
  const queuedTour = React.useContext(stateContext)
  const gate = useGate()

  return React.useCallback(() => {
    if (queuedTour === tour) {
      setQueuedTour(null)
      InteractionManager.runAfterInteractions(() => {
        if (gate('new_user_guided_tour')) {
          start()
        }
      })
    }
  }, [tour, queuedTour, setQueuedTour, start, gate])
}

export function useSetQueuedTour() {
  return React.useContext(setContext)
}