drop the casts the dual-world layer needed

With every producer on the generated lexicons, the branded-string assertions at
these 30 sites are no-ops, and oxlint flags them. Also sorts the imports the
type flip disturbed and prunes the suppressions that no longer occur.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Samuel Newman
2026-08-04 05:05:53 +03:00
parent 02173556ab
commit 8da13e7511
282 changed files with 398 additions and 408 deletions
+3 -3
View File
@@ -45,15 +45,13 @@ import {scheduleOnUI} from 'react-native-worklets'
import * as FileSystem from 'expo-file-system'
import {type ImagePickerAsset} from 'expo-image-picker'
import {type Client, type UriString} from '@atproto/lex'
import {type AtUriString, AtUri} from '@atproto/syntax'
import {AtUri, type AtUriString} from '@atproto/syntax'
import {type RichText} from '@bsky.app/sdk/richtext'
import {plural} from '@lingui/core/macro'
import {Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native'
import {useQueries, useQueryClient} from '@tanstack/react-query'
import {matchXrpcError} from '#/lib/xrpc-error'
import * as bsky from '#/types/bsky'
import * as apilib from '#/lib/api/index'
import {EmbeddingDisabledError} from '#/lib/api/resolve'
import {useAppState} from '#/lib/appState'
@@ -74,6 +72,7 @@ import {useCallOnce} from '#/lib/once'
import {type NavigationProp} from '#/lib/routes/types'
import {cleanError} from '#/lib/strings/errors'
import {colors} from '#/lib/styles'
import {matchXrpcError} from '#/lib/xrpc-error'
import {logger} from '#/logger'
import {useDialogStateControlContext} from '#/state/dialogs'
import {emitPostCreated} from '#/state/events'
@@ -146,6 +145,7 @@ import {
} from '#/env'
import {type Gif} from '#/features/gifPicker/types'
import {app, chat} from '#/lexicons'
import * as bsky from '#/types/bsky'
import {BottomSheetPortalProvider} from '../../../../modules/bottom-sheet'
import {
draftToComposerPosts,
+2 -2
View File
@@ -5,8 +5,6 @@ import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
import * as bsky from '#/types/bsky'
import {app} from '#/lexicons'
import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles'
import {type ComposerOptsPostRef} from '#/state/shell/composer'
@@ -15,6 +13,8 @@ import {atoms as a, useTheme, utils, web} from '#/alf'
import {QuoteEmbed} from '#/components/Post/Embed'
import {ProfileBadges} from '#/components/ProfileBadges'
import {Text} from '#/components/Typography'
import {app} from '#/lexicons'
import * as bsky from '#/types/bsky'
import {parseEmbed} from '#/types/bsky/post'
export function ComposerReplyTo({replyTo}: {replyTo: ComposerOptsPostRef}) {
+1 -1
View File
@@ -1,6 +1,6 @@
import {type UriString} from '@atproto/lex'
import {useMemo} from 'react'
import {type StyleProp, View, type ViewStyle} from 'react-native'
import {type UriString} from '@atproto/lex'
import {cleanError} from '#/lib/strings/errors'
import {
+3 -3
View File
@@ -2,12 +2,10 @@
* Type converters for Draft API - convert between ComposerState and server Draft types.
*/
import {type UriString} from '@atproto/lex'
import {AtUri} from '@atproto/syntax'
import {RichText} from '@bsky.app/sdk/richtext'
import {nanoid} from 'nanoid/non-secure'
import {AtUri} from '@atproto/syntax'
import * as bsky from '#/types/bsky'
import {app} from '#/lexicons'
import {type LinkResolvers, resolveLink} from '#/lib/api/resolve'
import {getDeviceName} from '#/lib/deviceName'
import {getImageDim} from '#/lib/media/manip'
@@ -25,6 +23,8 @@ import {type VideoState} from '#/view/com/composer/state/video'
import {type AnalyticsContextType} from '#/analytics'
import {getDeviceId} from '#/analytics/identifiers'
import {type Gif} from '#/features/gifPicker/types'
import {app} from '#/lexicons'
import * as bsky from '#/types/bsky'
import {logger} from './logger'
import {type DraftPostDisplay, type DraftSummary} from './schema'
import * as storage from './storage'
@@ -4,7 +4,6 @@ import {
useQueryClient,
} from '@tanstack/react-query'
import * as bsky from '#/types/bsky'
import {isNetworkError} from '#/lib/strings/errors'
import {matchXrpcError} from '#/lib/xrpc-error'
import {useAppviewClient, useChatClient} from '#/state/session'
@@ -12,6 +11,7 @@ import {type ComposerState} from '#/view/com/composer/state/composer'
import {useAnalytics} from '#/analytics'
import {getDeviceId} from '#/analytics/identifiers'
import {app} from '#/lexicons'
import * as bsky from '#/types/bsky'
import {composerStateToDraft, draftViewToSummary} from './api'
import {logger} from './logger'
import * as storage from './storage'
@@ -147,7 +147,7 @@ export function useSaveDraftMutation() {
* `composerStateToDraft` builds the draft with unbranded string fields,
* so it is asserted once here to the generated input type.
*/
const draft = apiDraft as unknown as app.bsky.draft.defs.Draft
const draft = apiDraft
logger.debug('saving draft', {
existingDraftId,
+1 -1
View File
@@ -1,4 +1,4 @@
import {app} from '#/lexicons'
import {type app} from '#/lexicons'
/**
* Types for draft display and local media tracking.
* Server draft types come from the generated `#/lexicons` modules.
+5 -8
View File
@@ -1,5 +1,5 @@
import {type UriString} from '@atproto/lex'
import {type ImagePickerAsset} from 'expo-image-picker'
import {type UriString} from '@atproto/lex'
import {type AtUriString, toDatetimeString} from '@atproto/syntax'
import {RichText} from '@bsky.app/sdk/richtext'
import {nanoid} from 'nanoid/non-secure'
@@ -325,14 +325,13 @@ export function composerReducer(
* Draft records are still typed against the legacy client, so the
* stored rules arrive unbranded. Wave B migrates the draft types.
*/
embeddingRules:
postgateEmbeddingRules as app.bsky.feed.postgate.Main['embeddingRules'],
embeddingRules: postgateEmbeddingRules,
}),
threadgate: threadgateRecordToAllowUISetting({
$type: 'app.bsky.feed.threadgate',
post: '' as AtUriString,
createdAt: toDatetimeString(new Date()),
allow: threadgateAllow as app.bsky.feed.threadgate.Main['allow'],
allow: threadgateAllow,
}),
},
}
@@ -755,15 +754,13 @@ export function createComposerState({
* Preferences are still typed against the legacy client, so the stored
* rules arrive unbranded. Wave B migrates `getPreferences`.
*/
embeddingRules: (initInteractionSettings?.postgateEmbeddingRules ||
[]) as app.bsky.feed.postgate.Main['embeddingRules'],
embeddingRules: initInteractionSettings?.postgateEmbeddingRules || [],
}),
threadgate: threadgateRecordToAllowUISetting({
$type: 'app.bsky.feed.threadgate',
post: '' as AtUriString,
createdAt: toDatetimeString(new Date()),
allow:
initInteractionSettings?.threadgateAllowRules as app.bsky.feed.threadgate.Main['allow'],
allow: initInteractionSettings?.threadgateAllowRules,
}),
},
}
@@ -2,7 +2,6 @@ import {View} from 'react-native'
import Animated, {FadeInDown, FadeOut} from 'react-native-reanimated'
import {Trans} from '@lingui/react/macro'
import {app} from '#/lexicons'
import {PressableScale} from '#/lib/custom-animations/PressableScale'
import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles'
@@ -11,6 +10,7 @@ import {UserAvatar} from '#/view/com/util/UserAvatar'
import {atoms as a, platform, useTheme} from '#/alf'
import {ProfileBadges} from '#/components/ProfileBadges'
import {Text} from '#/components/Typography'
import {app} from '#/lexicons'
export function Autocomplete({
prefix,
@@ -10,12 +10,12 @@ import {
} from '@tiptap/suggestion'
import tippy, {type Instance as TippyInstance} from 'tippy.js'
import {app} from '#/lexicons'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {type ActorAutocompleteFn} from '#/state/queries/actor-autocomplete'
import {atoms as a, useTheme} from '#/alf'
import * as ProfileCard from '#/components/ProfileCard'
import {Text} from '#/components/Typography'
import {app} from '#/lexicons'
interface MentionListRef {
onKeyDown: (props: SuggestionKeyDownProps) => boolean
+1 -1
View File
@@ -12,7 +12,6 @@ import {useLingui} from '@lingui/react'
import {type NavigationProp, useNavigation} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query'
import {app} from '#/lexicons'
import {DISCOVER_FEED_URI, VIDEO_FEED_URIS} from '#/lib/constants'
import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
import {getRootNavigation, getTabState, TabState} from '#/lib/routes/helpers'
@@ -38,6 +37,7 @@ import {useHeaderOffset} from '#/components/hooks/useHeaderOffset'
import {EditBig_Stroke2_Corner2_Rounded as EditBigIcon} from '#/components/icons/EditBig'
import {useAnalytics} from '#/analytics'
import {IS_NATIVE} from '#/env'
import {app} from '#/lexicons'
const POLL_FREQ = 60e3 // 60sec
+4 -4
View File
@@ -1,12 +1,10 @@
import {type StyleProp, View, type ViewStyle} from 'react-native'
import {type $Typed} from '@atproto/lex'
import {AtUri} from '@atproto/syntax'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Plural, Trans} from '@lingui/react/macro'
import {type $Typed} from '@atproto/lex'
import {AtUri} from '@atproto/syntax'
import * as bsky from '#/types/bsky'
import {app} from '#/lexicons'
import {sanitizeHandle} from '#/lib/strings/handles'
import {
type FeedSourceInfo,
@@ -20,6 +18,8 @@ import {atoms as a, useTheme} from '#/alf'
import {Link} from '#/components/Link'
import {RichText} from '#/components/RichText'
import {Text} from '#/components/Typography'
import {app} from '#/lexicons'
import * as bsky from '#/types/bsky'
import {MissingFeed} from './MissingFeed'
type FeedSourceCardProps = {
+1 -1
View File
@@ -1,9 +1,9 @@
import {type StyleProp, View, type ViewStyle} from 'react-native'
import {AtUri} from '@atproto/syntax'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
import {AtUri} from '@atproto/syntax'
import {cleanError} from '#/lib/strings/errors'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {getFeedTypeFromUri} from '#/state/queries/feed'
+1 -1
View File
@@ -10,7 +10,6 @@ import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
import {app} from '#/lexicons'
import {cleanError} from '#/lib/strings/errors'
import {logger} from '#/logger'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
@@ -26,6 +25,7 @@ import {useDialogControl} from '#/components/Dialog'
import {UserAddRemoveListsDialog} from '#/components/dialogs/lists/UserAddRemoveListsDialog'
import {ListFooter} from '#/components/Lists'
import * as ProfileCard from '#/components/ProfileCard'
import {app} from '#/lexicons'
import type * as bsky from '#/types/bsky'
const LOADING_ITEM = {kind: 'loading', _reactKey: '__loading__'} as const
+1 -1
View File
@@ -10,7 +10,6 @@ import {
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {app} from '#/lexicons'
import {usePalette} from '#/lib/hooks/usePalette'
import {cleanError} from '#/lib/strings/errors'
import {s} from '#/lib/styles'
@@ -21,6 +20,7 @@ import {atoms as a, useTheme} from '#/alf'
import {BulletList_Stroke1_Corner0_Rounded as ListIcon} from '#/components/icons/BulletList'
import * as ListCard from '#/components/ListCard'
import {Text} from '#/components/Typography'
import {app} from '#/lexicons'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {List} from '../util/List'
@@ -9,7 +9,7 @@ import {
View,
} from 'react-native'
import {TID} from '@atproto/common-web'
import {type DidString, AtUri} from '@atproto/syntax'
import {AtUri, type DidString} from '@atproto/syntax'
import {
moderateProfile,
type ModerationDecision,
+1 -1
View File
@@ -2,7 +2,6 @@ import {useCallback, useMemo, useState} from 'react'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {app} from '#/lexicons'
import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
import {cleanError} from '#/lib/strings/errors'
import {logger} from '#/logger'
@@ -11,6 +10,7 @@ import {useResolveUriQuery} from '#/state/queries/resolve-uri'
import {ProfileCardWithFollowBtn} from '#/view/com/profile/ProfileCard'
import {List} from '#/view/com/util/List'
import {ListFooter, ListMaybePlaceholder} from '#/components/Lists'
import {app} from '#/lexicons'
function renderItem({
item,
+1 -1
View File
@@ -3,7 +3,6 @@ import {moderatePost, type ModerationDecision} from '@bsky.app/sdk/moderation'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {app} from '#/lexicons'
import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
import {usePostViewTracking} from '#/lib/hooks/usePostViewTracking'
import {cleanError} from '#/lib/strings/errors'
@@ -13,6 +12,7 @@ import {usePostQuotesQuery} from '#/state/queries/post-quotes'
import {useResolveUriQuery} from '#/state/queries/resolve-uri'
import {Post} from '#/view/com/post/Post'
import {ListFooter, ListMaybePlaceholder} from '#/components/Lists'
import {app} from '#/lexicons'
import * as bsky from '#/types/bsky'
import {List} from '../util/List'
+1 -1
View File
@@ -2,7 +2,6 @@ import {useCallback, useMemo, useState} from 'react'
import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {app} from '#/lexicons'
import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
import {cleanError} from '#/lib/strings/errors'
import {logger} from '#/logger'
@@ -11,6 +10,7 @@ import {useResolveUriQuery} from '#/state/queries/resolve-uri'
import {ProfileCardWithFollowBtn} from '#/view/com/profile/ProfileCard'
import {List} from '#/view/com/util/List'
import {ListFooter, ListMaybePlaceholder} from '#/components/Lists'
import {app} from '#/lexicons'
function renderItem({
item,
+2 -2
View File
@@ -1,11 +1,10 @@
import {useCallback, useMemo, useState} from 'react'
import {type StyleProp, StyleSheet, View, type ViewStyle} from 'react-native'
import {AtUri} from '@atproto/syntax'
import {moderatePost, type ModerationDecision} from '@bsky.app/sdk/moderation'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {useQueryClient} from '@tanstack/react-query'
import {AtUri} from '@atproto/syntax'
import {app} from '#/lexicons'
import {MAX_POST_LINES} from '#/lib/constants'
import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
import {makeProfileLink} from '#/lib/routes/links'
@@ -35,6 +34,7 @@ import {TranslatedPost} from '#/components/Post/Translated'
import {PostControls} from '#/components/PostControls'
import {RichText} from '#/components/RichText'
import {SubtleHover} from '#/components/SubtleHover'
import {app} from '#/lexicons'
import * as bsky from '#/types/bsky'
export function Post({
+2 -2
View File
@@ -22,8 +22,6 @@ import {type RichText as RichTextType} from '@bsky.app/sdk/richtext'
import {useLingui} from '@lingui/react/macro'
import {useQueryClient} from '@tanstack/react-query'
import * as bsky from '#/types/bsky'
import {app} from '#/lexicons'
import {DISCOVER_FEED_URI, KNOWN_SHUTDOWN_FEEDS} from '#/lib/constants'
import {useBottomBarOffset} from '#/lib/hooks/useBottomBarOffset'
import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
@@ -76,6 +74,8 @@ import {
isStatusValidForViewers,
useLiveNowConfig,
} from '#/features/liveNow'
import {app} from '#/lexicons'
import * as bsky from '#/types/bsky'
import {ComposerPrompt} from '../feeds/ComposerPrompt'
import {DiscoverFallbackHeader} from './DiscoverFallbackHeader'
import {FeedShutdownMsg} from './FeedShutdownMsg'
+3 -3
View File
@@ -1,21 +1,21 @@
import {useCallback, useMemo} from 'react'
import {View} from 'react-native'
import {AtUri} from '@atproto/syntax'
import {msg as msgLingui} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native'
import {AtUri} from '@atproto/syntax'
import {getErrorName, getErrorStatus} from '#/lib/xrpc-error'
import {app} from '#/lexicons'
import {usePalette} from '#/lib/hooks/usePalette'
import {type NavigationProp} from '#/lib/routes/types'
import {cleanError} from '#/lib/strings/errors'
import {getErrorName, getErrorStatus} from '#/lib/xrpc-error'
import {logger} from '#/logger'
import {type FeedDescriptor} from '#/state/queries/post-feed'
import {useRemoveFeedMutation} from '#/state/queries/preferences'
import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning'
import * as Prompt from '#/components/Prompt'
import {app} from '#/lexicons'
import {EmptyState} from '../util/EmptyState'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {Button} from '../util/forms/Button'
+2 -2
View File
@@ -1,11 +1,10 @@
import {memo, useCallback, useMemo, useState} from 'react'
import {StyleSheet, View} from 'react-native'
import {AtUri} from '@atproto/syntax'
import {type ModerationDecision} from '@bsky.app/sdk/moderation'
import {RichText as RichTextAPI} from '@bsky.app/sdk/richtext'
import {useQueryClient} from '@tanstack/react-query'
import {AtUri} from '@atproto/syntax'
import {app} from '#/lexicons'
import {type ReasonFeedSource} from '#/lib/api/feed/types'
import {MAX_POST_LINES} from '#/lib/constants'
import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
@@ -48,6 +47,7 @@ import {RichText} from '#/components/RichText'
import {SubtleHover} from '#/components/SubtleHover'
import {useAnalytics} from '#/analytics'
import {useActorStatus} from '#/features/liveNow'
import {app} from '#/lexicons'
import * as bsky from '#/types/bsky'
import {PostFeedReason} from './PostFeedReason'
+2 -2
View File
@@ -4,8 +4,6 @@ import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
import * as bsky from '#/types/bsky'
import {app} from '#/lexicons'
import {isReasonFeedSource, type ReasonFeedSource} from '#/lib/api/feed/types'
import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name'
import {makeProfileLink} from '#/lib/routes/links'
@@ -16,6 +14,8 @@ import {Repost_Stroke2_Corner3_Rounded as RepostIcon} from '#/components/icons/R
import {Link} from '#/components/Link'
import {ProfileHoverCard} from '#/components/ProfileHoverCard'
import {Text} from '#/components/Typography'
import {app} from '#/lexicons'
import * as bsky from '#/types/bsky'
import {FeedNameText} from '../util/FeedInfoText'
export function PostFeedReason({
+1 -1
View File
@@ -1,9 +1,9 @@
import {useMemo} from 'react'
import {View} from 'react-native'
import Svg, {Circle, Line} from 'react-native-svg'
import {AtUri} from '@atproto/syntax'
import {useLingui} from '@lingui/react/macro'
import {AtUri} from '@atproto/syntax'
import {makeProfileLink} from '#/lib/routes/links'
import {atoms as a, select, useTheme} from '#/alf'
import {Link} from '#/components/Link'
+1 -1
View File
@@ -2,7 +2,6 @@ import {useCallback, useEffect, useMemo, useRef, useState} from 'react'
import {useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native'
import {app} from '#/lexicons'
import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
import {type NavigationProp} from '#/lib/routes/types'
import {cleanError} from '#/lib/strings/errors'
@@ -19,6 +18,7 @@ import {
FollowersPromoBanner,
useFollowersPromoDismissed,
} from '#/features/inviteFriends'
import {app} from '#/lexicons'
import {List} from '../util/List'
import {ProfileCardWithFollowBtn} from './ProfileCard'
+1 -1
View File
@@ -2,7 +2,6 @@ import {useCallback, useEffect, useMemo, useRef, useState} from 'react'
import {useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native'
import {app} from '#/lexicons'
import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
import {type NavigationProp} from '#/lib/routes/types'
import {cleanError} from '#/lib/strings/errors'
@@ -15,6 +14,7 @@ import {PeopleRemove2_Stroke1_Corner0_Rounded as PeopleRemoveIcon} from '#/compo
import {ListFooter, ListMaybePlaceholder} from '#/components/Lists'
import {useAnalytics} from '#/analytics'
import {IS_WEB} from '#/env'
import {app} from '#/lexicons'
import {List} from '../util/List'
import {ProfileCardWithFollowBtn} from './ProfileCard'
+1 -1
View File
@@ -3,7 +3,6 @@ import {Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query'
import {app} from '#/lexicons'
import {makeProfileLink} from '#/lib/routes/links'
import {type NavigationProp} from '#/lib/routes/types'
import {shareText, shareUrl} from '#/lib/sharing'
@@ -66,6 +65,7 @@ import {GoLiveDialog} from '#/features/liveNow/components/GoLiveDialog'
import {GoLiveDisabledDialog} from '#/features/liveNow/components/GoLiveDisabledDialog'
import {Dot} from '#/features/nuxs/components/Dot'
import {Gradient} from '#/features/nuxs/components/Gradient'
import {app} from '#/lexicons'
import {useDevMode} from '#/storage/hooks/dev-mode'
let ProfileMenu = ({
@@ -6,7 +6,6 @@ import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native'
import {app} from '#/lexicons'
import {usePalette} from '#/lib/hooks/usePalette'
import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
import {makeProfileLink} from '#/lib/routes/links'
@@ -20,6 +19,7 @@ import {UserAvatar, type UserAvatarType} from '#/view/com/util/UserAvatar'
import {StarterPackMultiPathLarge as StarterPackIcon} from '#/components/icons/StarterPack'
import * as Layout from '#/components/Layout'
import {useLightboxControls} from '#/components/Lightbox/state'
import {app} from '#/lexicons'
export function ProfileSubpageHeader({
isLoading,
+1 -1
View File
@@ -5,7 +5,6 @@ import {msg} from '@lingui/core/macro'
import {useLingui} from '@lingui/react'
import {useQueryClient} from '@tanstack/react-query'
import {app} from '#/lexicons'
import {makeProfileLink} from '#/lib/routes/links'
import {forceLTR} from '#/lib/strings/bidi'
import {NON_BREAKING_SPACE} from '#/lib/strings/constants'
@@ -21,6 +20,7 @@ import {ProfileHoverCard} from '#/components/ProfileHoverCard'
import {Text} from '#/components/Typography'
import {IS_ANDROID} from '#/env'
import {useActorStatus} from '#/features/liveNow'
import {app} from '#/lexicons'
import {TimeElapsed} from './TimeElapsed'
import {PreviewableUserAvatar} from './UserAvatar'
+1 -1
View File
@@ -1,6 +1,5 @@
import {type StyleProp, type TextStyle} from 'react-native'
import {app} from '#/lexicons'
import {makeProfileLink} from '#/lib/routes/links'
import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles'
@@ -9,6 +8,7 @@ import {useProfileQuery} from '#/state/queries/profile'
import {atoms as a} from '#/alf'
import {InlineLinkText} from '#/components/Link'
import {Text} from '#/components/Typography'
import {app} from '#/lexicons'
import {LoadingPlaceholder} from './LoadingPlaceholder'
export function UserInfoText({