[Statsig] Typecheck gates (#3467)
* Typecheck gates * Lint against untyped useGate() * Alphabeticzio/stable
parent
bf974b147e
commit
427f3a848d
|
@ -31,6 +31,7 @@ module.exports = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
'bsky-internal/use-typed-gates': 'error',
|
||||||
'simple-import-sort/imports': [
|
'simple-import-sort/imports': [
|
||||||
'warn',
|
'warn',
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,5 +3,6 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
rules: {
|
rules: {
|
||||||
'avoid-unwrapped-text': require('./avoid-unwrapped-text'),
|
'avoid-unwrapped-text': require('./avoid-unwrapped-text'),
|
||||||
|
'use-typed-gates': require('./use-typed-gates'),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
exports.create = function create(context) {
|
||||||
|
return {
|
||||||
|
ImportSpecifier(node) {
|
||||||
|
if (
|
||||||
|
!node.local ||
|
||||||
|
node.local.type !== 'Identifier' ||
|
||||||
|
node.local.name !== 'useGate'
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
node.parent.type !== 'ImportDeclaration' ||
|
||||||
|
!node.parent.source ||
|
||||||
|
node.parent.source.type !== 'Literal'
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const source = node.parent.source.value
|
||||||
|
if (source.startsWith('.') || source.startsWith('#')) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
context.report({
|
||||||
|
node,
|
||||||
|
message:
|
||||||
|
"Use useGate() from '#/lib/statsig/statsig' instead of the one on npm.",
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,8 @@
|
||||||
import {useGate} from './statsig'
|
export type Gate =
|
||||||
|
// Keep this alphabetic please.
|
||||||
export const useNewSearchGate = () => useGate('new_search')
|
| 'autoexpand_suggestions_on_profile_follow'
|
||||||
|
| 'disable_min_shell_on_foregrounding'
|
||||||
|
| 'disable_poll_on_discover'
|
||||||
|
| 'new_search'
|
||||||
|
| 'show_follow_back_label'
|
||||||
|
| 'start_session_with_following'
|
||||||
|
|
|
@ -11,6 +11,7 @@ import {
|
||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
import {useSession} from '../../state/session'
|
import {useSession} from '../../state/session'
|
||||||
import {LogEvents} from './events'
|
import {LogEvents} from './events'
|
||||||
|
import {Gate} from './gates'
|
||||||
|
|
||||||
export type {LogEvents}
|
export type {LogEvents}
|
||||||
|
|
||||||
|
@ -69,7 +70,7 @@ export function logEvent<E extends keyof LogEvents>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useGate(gateName: string) {
|
export function useGate(gateName: Gate): boolean {
|
||||||
const {isLoading, value} = useStatsigGate(gateName)
|
const {isLoading, value} = useStatsigGate(gateName)
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
// This should not happen because of waitForInitialization={true}.
|
// This should not happen because of waitForInitialization={true}.
|
||||||
|
|
|
@ -22,7 +22,7 @@ import {HITSLOP_10} from '#/lib/constants'
|
||||||
import {usePalette} from '#/lib/hooks/usePalette'
|
import {usePalette} from '#/lib/hooks/usePalette'
|
||||||
import {MagnifyingGlassIcon} from '#/lib/icons'
|
import {MagnifyingGlassIcon} from '#/lib/icons'
|
||||||
import {NavigationProp} from '#/lib/routes/types'
|
import {NavigationProp} from '#/lib/routes/types'
|
||||||
import {useNewSearchGate} from '#/lib/statsig/gates'
|
import {useGate} from '#/lib/statsig/statsig'
|
||||||
import {augmentSearchQuery} from '#/lib/strings/helpers'
|
import {augmentSearchQuery} from '#/lib/strings/helpers'
|
||||||
import {s} from '#/lib/styles'
|
import {s} from '#/lib/styles'
|
||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
|
@ -337,7 +337,7 @@ export function SearchScreenInner({
|
||||||
const {isDesktop} = useWebMediaQueries()
|
const {isDesktop} = useWebMediaQueries()
|
||||||
const {_} = useLingui()
|
const {_} = useLingui()
|
||||||
|
|
||||||
const isNewSearch = useNewSearchGate()
|
const isNewSearch = useGate('new_search')
|
||||||
|
|
||||||
const onPageSelected = React.useCallback(
|
const onPageSelected = React.useCallback(
|
||||||
(index: number) => {
|
(index: number) => {
|
||||||
|
|
Loading…
Reference in New Issue