Add feature gate
This commit is contained in:
@@ -3,3 +3,4 @@ export type Gate =
|
|||||||
| 'debug_show_feedcontext' // DISABLED DUE TO EME
|
| 'debug_show_feedcontext' // DISABLED DUE TO EME
|
||||||
| 'post_feed_lang_window' // DISABLED DUE TO EME
|
| 'post_feed_lang_window' // DISABLED DUE TO EME
|
||||||
| 'remove_show_latest_button'
|
| 'remove_show_latest_button'
|
||||||
|
| 'trending_topics_beta'
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
|
import {useGate} from '#/lib/statsig/statsig'
|
||||||
import {useServiceConfigQuery} from '#/state/queries/service-config'
|
import {useServiceConfigQuery} from '#/state/queries/service-config'
|
||||||
import {device} from '#/storage'
|
import {device} from '#/storage'
|
||||||
|
|
||||||
@@ -12,19 +13,40 @@ const Context = React.createContext<Context>({
|
|||||||
})
|
})
|
||||||
|
|
||||||
export function Provider({children}: React.PropsWithChildren<{}>) {
|
export function Provider({children}: React.PropsWithChildren<{}>) {
|
||||||
|
const gate = useGate()
|
||||||
// refetches at most every minute
|
// refetches at most every minute
|
||||||
const {data: config, isLoading: isInitialLoad} = useServiceConfigQuery()
|
const {data: config, isLoading: isInitialLoad} = useServiceConfigQuery()
|
||||||
const ctx = React.useMemo<Context>(() => {
|
const ctx = React.useMemo<Context>(() => {
|
||||||
// previously cached value
|
/*
|
||||||
|
* While loading, use cached value
|
||||||
|
*/
|
||||||
const cachedEnabled = device.get(['trendingBetaEnabled'])
|
const cachedEnabled = device.get(['trendingBetaEnabled'])
|
||||||
if (isInitialLoad) {
|
if (isInitialLoad) {
|
||||||
return {enabled: Boolean(cachedEnabled)}
|
return {enabled: Boolean(cachedEnabled)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Doing an extra check here to reduce hits to statsig. If it's disabled on
|
||||||
|
* the server, we can exit early.
|
||||||
|
*/
|
||||||
const enabled = Boolean(config?.topicsEnabled)
|
const enabled = Boolean(config?.topicsEnabled)
|
||||||
|
if (!enabled) {
|
||||||
|
// cache for next reload
|
||||||
|
device.set(['trendingBetaEnabled'], enabled)
|
||||||
|
return {enabled: false}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Service is enabled, but also check statsig in case we're rolling back.
|
||||||
|
*/
|
||||||
|
const gateEnabled = gate('trending_topics_beta')
|
||||||
|
const _enabled = enabled && gateEnabled
|
||||||
|
|
||||||
// update cache
|
// update cache
|
||||||
device.set(['trendingBetaEnabled'], enabled)
|
device.set(['trendingBetaEnabled'], _enabled)
|
||||||
return {enabled}
|
|
||||||
}, [isInitialLoad, config])
|
return {enabled: _enabled}
|
||||||
|
}, [isInitialLoad, config, gate])
|
||||||
return <Context.Provider value={ctx}>{children}</Context.Provider>
|
return <Context.Provider value={ctx}>{children}</Context.Provider>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user