[APP-1173] Clean up env (#8701)
* Clean up env files * Use new env in Sentry setup file * Use new env in Bitdrift setup file * Use new env in chat proxy header * Prefix Bitdrift key with EXPO_PUBLIC * Deprecate SENTRY_RELEASE since we use package.json now * Use existing EXPO_PUBLIC_BUNDLE_IDENTIFIER short commit has as Sentry dist value * Fix missing bundle identifier for Render deploys * Deprecate SENTRY_DIST in favor of EXPO_PUBLIC_BUNDLE_IDENTIFIER * Prefix SENTRY_DSN with EXPO_PUBLIC to match others * Remove debugging field * Replace NODE_ENV in places where its safe * Self review * Properly patch Sentry package * Echo variables to .env in Dockerfile instead of passing to shell script * Make sure EXPO_PUBLIC_ENV is set for web container builds * Update IS_TESTFLIGHT to include testflight-android * Slice bundle hash to match other platforms, needed for render.com deployments * [APP-1331] Migrate `app-info` to new env (#8703) * Move env files into directory with platform specific files * Migrate usages of app-info to new env * Fix bad import * Update BUNDLE_DATE format comment * Trim RENDER_GIT_COMMIT to first 7 to match --short sha * Clarify build process env vars and ensure they are explicitly passed in * Revert Sentry patch as a result of prev commit * Update webpack Sentry dist value based on prev commits * Add PACKAGE_VERSION and replace in statsig to fix conflict * Fix render substitution syntax * Remove invalid syntax * Remove unnecessary testflight check * Just use long commit hash * Slice full hash for display in app * Fix missing space in ios workflow * Pass in sentry CLI env vars, align matching values * Align on RELEASE_VERSION * Add new env setup to missed OTA spot * Update webpack to use same SENTRY_RELEASE var * Just fallback to package version for Render deploys * Remove TF check for BUNDLE_DATE * Set EXPO_PUBLIC_ENV for bundle update * Consistent naming "Env" * Add comment * Use RELEASE_VERSION instead of package.json * Update PR comment CI
This commit is contained in:
@@ -2,13 +2,13 @@ import {Pressable} from 'react-native'
|
||||
import * as Clipboard from 'expo-clipboard'
|
||||
import {t} from '@lingui/macro'
|
||||
|
||||
import {IS_INTERNAL} from '#/lib/app-info'
|
||||
import {DISCOVER_DEBUG_DIDS} from '#/lib/constants'
|
||||
import {useGate} from '#/lib/statsig/statsig'
|
||||
import {useSession} from '#/state/session'
|
||||
import * as Toast from '#/view/com/util/Toast'
|
||||
import {atoms as a, useBreakpoints, useTheme} from '#/alf'
|
||||
import {Text} from '#/components/Typography'
|
||||
import {IS_INTERNAL} from '#/env'
|
||||
|
||||
export function DiscoverDebug({
|
||||
feedContext,
|
||||
|
||||
@@ -17,7 +17,6 @@ import {msg} from '@lingui/macro'
|
||||
import {useLingui} from '@lingui/react'
|
||||
import {useNavigation} from '@react-navigation/native'
|
||||
|
||||
import {IS_INTERNAL} from '#/lib/app-info'
|
||||
import {DISCOVER_DEBUG_DIDS} from '#/lib/constants'
|
||||
import {useOpenLink} from '#/lib/hooks/useOpenLink'
|
||||
import {getCurrentRoute} from '#/lib/routes/helpers'
|
||||
@@ -83,6 +82,7 @@ import {
|
||||
useReportDialogControl,
|
||||
} from '#/components/moderation/ReportDialog'
|
||||
import * as Prompt from '#/components/Prompt'
|
||||
import {IS_INTERNAL} from '#/env'
|
||||
import * as bsky from '#/types/bsky'
|
||||
|
||||
let PostMenuItems = ({
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
export const LOG_DEBUG = process.env.EXPO_PUBLIC_LOG_DEBUG || ''
|
||||
export const LOG_LEVEL = (process.env.EXPO_PUBLIC_LOG_LEVEL || 'info') as
|
||||
| 'debug'
|
||||
| 'info'
|
||||
| 'warn'
|
||||
| 'error'
|
||||
Vendored
+79
@@ -0,0 +1,79 @@
|
||||
import {type Did} from '@atproto/api'
|
||||
|
||||
import packageJson from '#/../package.json'
|
||||
|
||||
/**
|
||||
* The semver version of the app, as defined in `package.json.`
|
||||
*
|
||||
* N.B. The fallback is needed for Render.com deployments
|
||||
*/
|
||||
export const RELEASE_VERSION: string =
|
||||
process.env.EXPO_PUBLIC_RELEASE_VERSION || packageJson.version
|
||||
|
||||
/**
|
||||
* The env the app is running in e.g. development, testflight, production
|
||||
*/
|
||||
export const ENV: string = process.env.EXPO_PUBLIC_ENV
|
||||
|
||||
/**
|
||||
* Indicates whether the app is running in TestFlight
|
||||
*/
|
||||
export const IS_TESTFLIGHT = ENV === 'testflight'
|
||||
|
||||
/**
|
||||
* Indicates whether the app is __DEV__
|
||||
*/
|
||||
export const IS_DEV = __DEV__
|
||||
|
||||
/**
|
||||
* Indicates whether the app is __DEV__ or TestFlight
|
||||
*/
|
||||
export const IS_INTERNAL = IS_DEV || IS_TESTFLIGHT
|
||||
|
||||
/**
|
||||
* The commit hash that the current bundle was made from. The user can
|
||||
* see the commit hash in the app's settings along with the other version info.
|
||||
* Useful for debugging/reporting.
|
||||
*/
|
||||
export const BUNDLE_IDENTIFIER: string =
|
||||
process.env.EXPO_PUBLIC_BUNDLE_IDENTIFIER || 'dev'
|
||||
|
||||
/**
|
||||
* This will always be in the format of YYMMDDHH, so that it always increases
|
||||
* for each build. This should only be used for StatSig reporting and shouldn't
|
||||
* be used to identify a specific bundle.
|
||||
*/
|
||||
export const BUNDLE_DATE: number = !process.env.EXPO_PUBLIC_BUNDLE_DATE
|
||||
? 0
|
||||
: Number(process.env.EXPO_PUBLIC_BUNDLE_DATE)
|
||||
|
||||
/**
|
||||
* The log level for the app.
|
||||
*/
|
||||
export const LOG_LEVEL = (process.env.EXPO_PUBLIC_LOG_LEVEL || 'info') as
|
||||
| 'debug'
|
||||
| 'info'
|
||||
| 'warn'
|
||||
| 'error'
|
||||
|
||||
/**
|
||||
* Enable debug logs for specific logger instances
|
||||
*/
|
||||
export const LOG_DEBUG: string = process.env.EXPO_PUBLIC_LOG_DEBUG || ''
|
||||
|
||||
/**
|
||||
* The DID of the chat service to proxy to
|
||||
*/
|
||||
export const CHAT_PROXY_DID: Did =
|
||||
process.env.EXPO_PUBLIC_CHAT_PROXY_DID || 'did:web:api.bsky.chat'
|
||||
|
||||
/**
|
||||
* Sentry DSN for telemetry
|
||||
*/
|
||||
export const SENTRY_DSN: string | undefined = process.env.EXPO_PUBLIC_SENTRY_DSN
|
||||
|
||||
/**
|
||||
* Bitdrift API key. If undefined, Bitdrift should be disabled.
|
||||
*/
|
||||
export const BITDRIFT_API_KEY: string | undefined =
|
||||
process.env.EXPO_PUBLIC_BITDRIFT_API_KEY
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
import {nativeBuildVersion} from 'expo-application'
|
||||
|
||||
import {BUNDLE_IDENTIFIER, IS_TESTFLIGHT, RELEASE_VERSION} from '#/env/common'
|
||||
|
||||
export * from '#/env/common'
|
||||
|
||||
/**
|
||||
* The semver version of the app, specified in our `package.json`.file. On
|
||||
* iOs/Android, the native build version is appended to the semver version, so
|
||||
* that it can be used to identify a specific build.
|
||||
*/
|
||||
export const APP_VERSION = `${RELEASE_VERSION}.${nativeBuildVersion}`
|
||||
|
||||
/**
|
||||
* The short commit hash and environment of the current bundle.
|
||||
*/
|
||||
export const APP_METADATA = `${BUNDLE_IDENTIFIER.slice(0, 7)} (${
|
||||
__DEV__ ? 'dev' : IS_TESTFLIGHT ? 'tf' : 'prod'
|
||||
})`
|
||||
Vendored
+15
@@ -0,0 +1,15 @@
|
||||
import {BUNDLE_IDENTIFIER, RELEASE_VERSION} from '#/env/common'
|
||||
|
||||
export * from '#/env/common'
|
||||
|
||||
/**
|
||||
* The semver version of the app, specified in our `package.json`.file. On
|
||||
* iOs/Android, the native build version is appended to the semver version, so
|
||||
* that it can be used to identify a specific build.
|
||||
*/
|
||||
export const APP_VERSION = RELEASE_VERSION
|
||||
|
||||
/**
|
||||
* The short commit hash and environment of the current bundle.
|
||||
*/
|
||||
export const APP_METADATA = `${BUNDLE_IDENTIFIER.slice(0, 7)} (${__DEV__ ? 'dev' : 'prod'})`
|
||||
@@ -1,18 +0,0 @@
|
||||
import {nativeApplicationVersion, nativeBuildVersion} from 'expo-application'
|
||||
|
||||
export const IS_TESTFLIGHT = process.env.EXPO_PUBLIC_ENV === 'testflight'
|
||||
export const IS_INTERNAL = __DEV__ || IS_TESTFLIGHT
|
||||
|
||||
// This is the commit hash that the current bundle was made from. The user can see the commit hash in the app's settings
|
||||
// along with the other version info. Useful for debugging/reporting.
|
||||
export const BUNDLE_IDENTIFIER = process.env.EXPO_PUBLIC_BUNDLE_IDENTIFIER ?? ''
|
||||
|
||||
// This will always be in the format of YYMMDD, so that it always increases for each build. This should only be used
|
||||
// for Statsig reporting and shouldn't be used to identify a specific bundle.
|
||||
export const BUNDLE_DATE =
|
||||
IS_TESTFLIGHT || __DEV__ ? 0 : Number(process.env.EXPO_PUBLIC_BUNDLE_DATE)
|
||||
|
||||
export const appVersion = `${nativeApplicationVersion}.${nativeBuildVersion}`
|
||||
export const bundleInfo = `${BUNDLE_IDENTIFIER} (${
|
||||
__DEV__ ? 'dev' : IS_TESTFLIGHT ? 'tf' : 'prod'
|
||||
})`
|
||||
@@ -1,18 +0,0 @@
|
||||
import packageDotJson from '../../package.json'
|
||||
|
||||
export const IS_TESTFLIGHT = false
|
||||
export const IS_INTERNAL = __DEV__
|
||||
|
||||
// This is the commit hash that the current bundle was made from. The user can see the commit hash in the app's settings
|
||||
// along with the other version info. Useful for debugging/reporting.
|
||||
export const BUNDLE_IDENTIFIER =
|
||||
process.env.EXPO_PUBLIC_BUNDLE_IDENTIFIER ?? 'dev'
|
||||
|
||||
// This will always be in the format of YYMMDD, so that it always increases for each build. This should only be used
|
||||
// for Statsig reporting and shouldn't be used to identify a specific bundle.
|
||||
export const BUNDLE_DATE = __DEV__
|
||||
? 0
|
||||
: Number(process.env.EXPO_PUBLIC_BUNDLE_DATE)
|
||||
|
||||
export const appVersion = packageDotJson.version
|
||||
export const bundleInfo = `${BUNDLE_IDENTIFIER} (${__DEV__ ? 'dev' : 'prod'})`
|
||||
@@ -10,9 +10,9 @@ import {
|
||||
useUpdates,
|
||||
} from 'expo-updates'
|
||||
|
||||
import {IS_TESTFLIGHT} from '#/lib/app-info'
|
||||
import {logger} from '#/logger'
|
||||
import {isIOS} from '#/platform/detection'
|
||||
import {IS_TESTFLIGHT} from '#/env'
|
||||
|
||||
const MINIMUM_MINIMIZE_TIME = 15 * 60e3
|
||||
|
||||
|
||||
@@ -3,12 +3,11 @@ import {Platform} from 'react-native'
|
||||
import {AppState, type AppStateStatus} from 'react-native'
|
||||
import {Statsig, StatsigProvider} from 'statsig-react-native-expo'
|
||||
|
||||
import {BUNDLE_DATE, BUNDLE_IDENTIFIER, IS_TESTFLIGHT} from '#/lib/app-info'
|
||||
import {logger} from '#/logger'
|
||||
import {type MetricEvents} from '#/logger/metrics'
|
||||
import {isWeb} from '#/platform/detection'
|
||||
import * as persisted from '#/state/persisted'
|
||||
import packageDotJson from '../../../package.json'
|
||||
import * as env from '#/env'
|
||||
import {useSession} from '../../state/session'
|
||||
import {timeout} from '../async/timeout'
|
||||
import {useNonReactiveCallback} from '../hooks/useNonReactiveCallback'
|
||||
@@ -49,12 +48,11 @@ export type {MetricEvents as LogEvents}
|
||||
function createStatsigOptions(prefetchUsers: StatsigUser[]) {
|
||||
return {
|
||||
environment: {
|
||||
tier:
|
||||
process.env.NODE_ENV === 'development'
|
||||
? 'development'
|
||||
: IS_TESTFLIGHT
|
||||
? 'staging'
|
||||
: 'production',
|
||||
tier: env.IS_DEV
|
||||
? 'development'
|
||||
: env.IS_TESTFLIGHT
|
||||
? 'staging'
|
||||
: 'production',
|
||||
},
|
||||
// Don't block on waiting for network. The fetched config will kick in on next load.
|
||||
// This ensures the UI is always consistent and doesn't update mid-session.
|
||||
@@ -212,9 +210,9 @@ function toStatsigUser(did: string | undefined): StatsigUser {
|
||||
refSrc,
|
||||
refUrl,
|
||||
platform: Platform.OS as 'ios' | 'android' | 'web',
|
||||
appVersion: packageDotJson.version,
|
||||
bundleIdentifier: BUNDLE_IDENTIFIER,
|
||||
bundleDate: BUNDLE_DATE,
|
||||
appVersion: env.RELEASE_VERSION,
|
||||
bundleIdentifier: env.BUNDLE_IDENTIFIER,
|
||||
bundleDate: env.BUNDLE_DATE,
|
||||
appLanguage: languagePrefs.appLanguage,
|
||||
contentLanguages: languagePrefs.contentLanguages,
|
||||
},
|
||||
|
||||
@@ -2,8 +2,7 @@ import {init, SessionStrategy} from '@bitdrift/react-native'
|
||||
import {Statsig} from 'statsig-react-native-expo'
|
||||
|
||||
import {initPromise} from '#/lib/statsig/statsig'
|
||||
|
||||
const BITDRIFT_API_KEY = process.env.BITDRIFT_API_KEY
|
||||
import {BITDRIFT_API_KEY} from '#/env'
|
||||
|
||||
initPromise.then(() => {
|
||||
let isEnabled = false
|
||||
|
||||
+2
-1
@@ -14,9 +14,10 @@ import {
|
||||
} from '#/logger/types'
|
||||
import {enabledLogLevels} from '#/logger/util'
|
||||
import {isNative} from '#/platform/detection'
|
||||
import {ENV} from '#/env'
|
||||
|
||||
const TRANSPORTS: Transport[] = (function configureTransports() {
|
||||
switch (process.env.NODE_ENV) {
|
||||
switch (ENV) {
|
||||
case 'production': {
|
||||
return [sentryTransport, isNative && bitdriftTransport].filter(
|
||||
Boolean,
|
||||
|
||||
@@ -1,32 +1,15 @@
|
||||
/**
|
||||
* Importing these separately from `platform/detection` and `lib/app-info` to
|
||||
* avoid future conflicts and/or circular deps
|
||||
*/
|
||||
|
||||
import {init} from '@sentry/react-native'
|
||||
|
||||
import pkgJson from '#/../package.json'
|
||||
|
||||
/**
|
||||
* Examples:
|
||||
* - `dev`
|
||||
* - `1.99.0`
|
||||
*/
|
||||
const release = process.env.SENTRY_RELEASE || pkgJson.version
|
||||
|
||||
/**
|
||||
* The latest deployed commit hash
|
||||
*/
|
||||
const dist = process.env.SENTRY_DIST || 'dev'
|
||||
import * as env from '#/env'
|
||||
|
||||
init({
|
||||
enabled: !__DEV__ && !!process.env.SENTRY_DSN,
|
||||
enabled: !env.IS_DEV && !!env.SENTRY_DSN,
|
||||
autoSessionTracking: false,
|
||||
dsn: process.env.SENTRY_DSN,
|
||||
dsn: env.SENTRY_DSN,
|
||||
debug: false, // If `true`, Sentry will try to print out useful debugging information if something goes wrong with sending the event. Set it to `false` in production
|
||||
environment: process.env.NODE_ENV,
|
||||
dist,
|
||||
release,
|
||||
environment: env.ENV,
|
||||
dist: env.BUNDLE_IDENTIFIER,
|
||||
release: env.RELEASE_VERSION,
|
||||
ignoreErrors: [
|
||||
/*
|
||||
* Unknown internals errors
|
||||
|
||||
@@ -9,7 +9,6 @@ import {type NativeStackScreenProps} from '@react-navigation/native-stack'
|
||||
import {useMutation} from '@tanstack/react-query'
|
||||
import {Statsig} from 'statsig-react-native-expo'
|
||||
|
||||
import {appVersion, BUNDLE_DATE, bundleInfo} from '#/lib/app-info'
|
||||
import {STATUS_PAGE_URL} from '#/lib/constants'
|
||||
import {type CommonNavigatorParams} from '#/lib/routes/types'
|
||||
import {isAndroid, isIOS, isNative} from '#/platform/detection'
|
||||
@@ -23,6 +22,7 @@ import {Newspaper_Stroke2_Corner2_Rounded as NewspaperIcon} from '#/components/i
|
||||
import {Wrench_Stroke2_Corner2_Rounded as WrenchIcon} from '#/components/icons/Wrench'
|
||||
import * as Layout from '#/components/Layout'
|
||||
import {Loader} from '#/components/Loader'
|
||||
import * as env from '#/env'
|
||||
import {useDemoMode} from '#/storage/hooks/demo-mode'
|
||||
import {useDevMode} from '#/storage/hooks/dev-mode'
|
||||
import {OTAInfo} from './components/OTAInfo'
|
||||
@@ -123,7 +123,7 @@ export function AboutSettingsScreen({}: Props) {
|
||||
</SettingsList.PressableItem>
|
||||
)}
|
||||
<SettingsList.PressableItem
|
||||
label={_(msg`Version ${appVersion}`)}
|
||||
label={_(msg`Version ${env.APP_VERSION}`)}
|
||||
accessibilityHint={_(msg`Copies build version to clipboard`)}
|
||||
onLongPress={() => {
|
||||
const newDevModeEnabled = !devModeEnabled
|
||||
@@ -146,15 +146,15 @@ export function AboutSettingsScreen({}: Props) {
|
||||
}}
|
||||
onPress={() => {
|
||||
setStringAsync(
|
||||
`Build version: ${appVersion}; Bundle info: ${bundleInfo}; Bundle date: ${BUNDLE_DATE}; Platform: ${Platform.OS}; Platform version: ${Platform.Version}; Anonymous ID: ${stableID}`,
|
||||
`Build version: ${env.APP_VERSION}; Bundle info: ${env.APP_METADATA}; Bundle date: ${env.BUNDLE_DATE}; Platform: ${Platform.OS}; Platform version: ${Platform.Version}; Anonymous ID: ${stableID}`,
|
||||
)
|
||||
Toast.show(_(msg`Copied build version to clipboard`))
|
||||
}}>
|
||||
<SettingsList.ItemIcon icon={WrenchIcon} />
|
||||
<SettingsList.ItemText>
|
||||
<Trans>Version {appVersion}</Trans>
|
||||
<Trans>Version {env.APP_VERSION}</Trans>
|
||||
</SettingsList.ItemText>
|
||||
<SettingsList.BadgeText>{bundleInfo}</SettingsList.BadgeText>
|
||||
<SettingsList.BadgeText>{env.APP_METADATA}</SettingsList.BadgeText>
|
||||
</SettingsList.PressableItem>
|
||||
{devModeEnabled && (
|
||||
<>
|
||||
|
||||
@@ -3,20 +3,20 @@ import {Alert, View} from 'react-native'
|
||||
import {msg, Trans} from '@lingui/macro'
|
||||
import {useLingui} from '@lingui/react'
|
||||
import * as DynamicAppIcon from '@mozzius/expo-dynamic-app-icon'
|
||||
import {NativeStackScreenProps} from '@react-navigation/native-stack'
|
||||
import {type NativeStackScreenProps} from '@react-navigation/native-stack'
|
||||
|
||||
import {IS_INTERNAL} from '#/lib/app-info'
|
||||
import {PressableScale} from '#/lib/custom-animations/PressableScale'
|
||||
import {CommonNavigatorParams} from '#/lib/routes/types'
|
||||
import {type CommonNavigatorParams} from '#/lib/routes/types'
|
||||
import {useGate} from '#/lib/statsig/statsig'
|
||||
import {isAndroid} from '#/platform/detection'
|
||||
import {AppIconImage} from '#/screens/Settings/AppIconSettings/AppIconImage'
|
||||
import {AppIconSet} from '#/screens/Settings/AppIconSettings/types'
|
||||
import {type AppIconSet} from '#/screens/Settings/AppIconSettings/types'
|
||||
import {useAppIconSets} from '#/screens/Settings/AppIconSettings/useAppIconSets'
|
||||
import {atoms as a, useTheme} from '#/alf'
|
||||
import * as Toggle from '#/components/forms/Toggle'
|
||||
import * as Layout from '#/components/Layout'
|
||||
import {Text} from '#/components/Typography'
|
||||
import {IS_INTERNAL} from '#/env'
|
||||
|
||||
type Props = NativeStackScreenProps<CommonNavigatorParams, 'AppIconSettings'>
|
||||
export function AppIconSettingsScreen({}: Props) {
|
||||
|
||||
@@ -8,7 +8,6 @@ import Animated, {
|
||||
import {msg, Trans} from '@lingui/macro'
|
||||
import {useLingui} from '@lingui/react'
|
||||
|
||||
import {IS_INTERNAL} from '#/lib/app-info'
|
||||
import {
|
||||
type CommonNavigatorParams,
|
||||
type NativeStackScreenProps,
|
||||
@@ -26,6 +25,7 @@ import {TextSize_Stroke2_Corner0_Rounded as TextSize} from '#/components/icons/T
|
||||
import {TitleCase_Stroke2_Corner0_Rounded as Aa} from '#/components/icons/TitleCase'
|
||||
import * as Layout from '#/components/Layout'
|
||||
import {Text} from '#/components/Typography'
|
||||
import {IS_INTERNAL} from '#/env'
|
||||
import * as SettingsList from './components/SettingsList'
|
||||
|
||||
type Props = NativeStackScreenProps<CommonNavigatorParams, 'AppearanceSettings'>
|
||||
|
||||
@@ -9,7 +9,6 @@ import {useNavigation} from '@react-navigation/native'
|
||||
import {type NativeStackScreenProps} from '@react-navigation/native-stack'
|
||||
|
||||
import {useActorStatus} from '#/lib/actor-status'
|
||||
import {IS_INTERNAL} from '#/lib/app-info'
|
||||
import {HELP_DESK_URL} from '#/lib/constants'
|
||||
import {useAccountSwitcher} from '#/lib/hooks/useAccountSwitcher'
|
||||
import {useApplyPullRequestOTAUpdate} from '#/lib/hooks/useOTAUpdates'
|
||||
@@ -66,6 +65,7 @@ import {
|
||||
shouldShowVerificationCheckButton,
|
||||
VerificationCheckButton,
|
||||
} from '#/components/verification/VerificationCheckButton'
|
||||
import {IS_INTERNAL} from '#/env'
|
||||
import {useActivitySubscriptionsNudged} from '#/storage/hooks/activity-subscriptions-nudged'
|
||||
|
||||
type Props = NativeStackScreenProps<CommonNavigatorParams, 'Settings'>
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import {CHAT_PROXY_DID} from '#/env'
|
||||
|
||||
export const DM_SERVICE_HEADERS = {
|
||||
'atproto-proxy': 'did:web:api.bsky.chat#bsky_chat',
|
||||
'atproto-proxy': `${CHAT_PROXY_DID}#bsky_chat`,
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import {AtpSessionData, AtpSessionEvent} from '@atproto/api'
|
||||
import {type AtpSessionData, type AtpSessionEvent} from '@atproto/api'
|
||||
import {sha256} from 'js-sha256'
|
||||
import {Statsig} from 'statsig-react-native-expo'
|
||||
|
||||
import {IS_INTERNAL} from '#/lib/app-info'
|
||||
import {Schema} from '../persisted'
|
||||
import {Action, State} from './reducer'
|
||||
import {SessionAccount} from './types'
|
||||
import {IS_INTERNAL} from '#/env'
|
||||
import {type Schema} from '../persisted'
|
||||
import {type Action, type State} from './reducer'
|
||||
import {type SessionAccount} from './types'
|
||||
|
||||
type Reducer = (state: State, action: Action) => State
|
||||
|
||||
|
||||
Reference in New Issue
Block a user