Merge remote-tracking branch 'origin/main' into hailey/oauth-yeag

This commit is contained in:
Hailey
2025-07-22 12:06:05 -07:00
61 changed files with 32474 additions and 19576 deletions
+1 -1
View File
@@ -160,7 +160,7 @@ function PostContent({record}: {record: AppBskyFeedPost.Record | null}) {
richText.push(
<Link
key={counter}
href={`/tag/${segment.tag.tag}`}
href={`/hashtag/${segment.tag.tag}`}
className="text-blue-500 hover:underline">
{segment.text}
</Link>,
+2 -1
View File
@@ -12,7 +12,8 @@
"buildFromSource": [
"expo-notifications",
"expo-haptics",
"expo-media-library"
"expo-media-library",
"expo-image-picker"
]
}
}
+38
View File
@@ -0,0 +1,38 @@
diff --git a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/MediaHandler.kt b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/MediaHandler.kt
index c863fb8..cde8859 100644
--- a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/MediaHandler.kt
+++ b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/MediaHandler.kt
@@ -101,16 +101,30 @@ internal class MediaHandler(
val fileData = getAdditionalFileData(sourceUri)
val mimeType = getType(context.contentResolver, sourceUri)
+ // Extract basic metadata
+ var width = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)
+ var height = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)
+ val rotation = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION)
+
+ // Android returns the encoded width/height which do not take the display rotation into
+ // account. For videos recorded in portrait mode the encoded dimensions are often landscape
+ // (e.g. 1920x1080) paired with a 90°/270° rotation flag. iOS adjusts these values before
+ // reporting them, so to keep the behaviour consistent across platforms we swap the width
+ // and height when the rotation indicates the video should be displayed in portrait.
+ if (rotation % 180 != 0) {
+ width = height.also { height = width }
+ }
+
return ImagePickerAsset(
type = MediaType.VIDEO,
uri = outputUri.toString(),
- width = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH),
- height = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT),
+ width = width,
+ height = height,
fileName = fileData?.fileName,
fileSize = fileData?.fileSize,
mimeType = mimeType,
duration = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_DURATION),
- rotation = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION),
+ rotation = rotation,
assetId = sourceUri.getMediaStoreAssetId()
)
} catch (cause: FailedToExtractVideoMetadataException) {
@@ -0,0 +1,5 @@
# Expo Image Picker patch
Cherry-picked https://github.com/expo/expo/pull/37849
Remove when we update to a version that includes this commit.
@@ -62,11 +62,17 @@ export const RepostButton = ({
</Menu.Trigger>
<Menu.Outer style={{minWidth: 170}}>
<Menu.Item
label={isReposted ? _(msg`Undo repost`) : _(msg`Repost`)}
label={
isReposted
? _(msg`Undo repost`)
: _(msg({message: `Repost`, context: `action`}))
}
testID="repostDropdownRepostBtn"
onPress={onRepost}>
<Menu.ItemText>
{isReposted ? _(msg`Undo repost`) : _(msg`Repost`)}
{isReposted
? _(msg`Undo repost`)
: _(msg({message: `Repost`, context: `action`}))}
</Menu.ItemText>
<Menu.ItemIcon icon={Repost} position="right" />
</Menu.Item>
@@ -78,10 +78,12 @@ function MenuInner({
<DropdownMenu.Content
sideOffset={5}
collisionPadding={{left: 5, right: 5, bottom: 5}}>
<EmojiPicker
onEmojiSelect={handleEmojiPickerResponse}
autoFocus={true}
/>
<div onWheel={evt => evt.stopPropagation()}>
<EmojiPicker
onEmojiSelect={handleEmojiPickerResponse}
autoFocus={true}
/>
</div>
</DropdownMenu.Content>
</DropdownMenu.Portal>
) : (
+19 -13
View File
@@ -1,4 +1,4 @@
import {BskyAgent} from '@atproto/api'
import {type BskyAgent} from '@atproto/api'
import {LINK_META_PROXY} from '#/lib/constants'
import {getGiphyMetaUri} from '#/lib/strings/embed-player'
@@ -37,6 +37,7 @@ export async function getLinkMeta(
}
let urlp
let shouldFollowRedirect = false
try {
urlp = new URL(url)
@@ -46,6 +47,9 @@ export async function getLinkMeta(
url = giphyMetaUri
urlp = new URL(url)
}
// follow redirects for soundcloud shortlinks
// QUESTION - do we want to follow redirects in other cases? -sfn
shouldFollowRedirect = urlp.hostname === 'on.soundcloud.com'
} catch (e) {
return {
error: 'Invalid URL',
@@ -62,33 +66,35 @@ export async function getLinkMeta(
return meta
}
try {
const controller = new AbortController()
const to = setTimeout(() => controller.abort(), timeout || 5e3)
const controller = new AbortController()
const to = setTimeout(() => controller.abort(), timeout || 5e3)
try {
const response = await fetch(
`${LINK_META_PROXY(agent.service.toString() || '')}${encodeURIComponent(
`${LINK_META_PROXY(agent.serviceUrl.toString() || '')}${encodeURIComponent(
url,
)}`,
{signal: controller.signal},
)
const body = await response.json()
clearTimeout(to)
const {description, error, image, title} = body
if (error !== '') {
throw new Error(error)
if (body.error !== '') {
throw new Error(body.error)
}
meta.description = description
meta.image = image
meta.title = title
meta.description = body.description
meta.image = body.image
meta.title = body.title
if (shouldFollowRedirect) {
meta.url = body.url
}
} catch (e) {
// failed
console.error(e)
meta.error = e instanceof Error ? e.toString() : 'Failed to fetch link'
} finally {
clearTimeout(to)
}
return meta
@@ -1,3 +1,5 @@
import {useCallback} from 'react'
export function useNotificationsRegistration() {}
export function useRequestNotificationsPermission() {
@@ -6,6 +8,10 @@ export function useRequestNotificationsPermission() {
) => {}
}
export function useGetAndRegisterPushToken() {
return useCallback(async ({}: {} = {}) => {}, [])
}
export async function decrementBadgeCount(_by: number) {}
export async function resetBadgeCount() {}
+1 -2
View File
@@ -45,8 +45,7 @@ function getLocalizedLanguage(
const translatedName = allNames.of(langCode)
if (translatedName) {
// force simple title case (as languages do not always start with an uppercase in Unicode data)
return translatedName[0].toLocaleUpperCase() + translatedName.slice(1)
return translatedName
}
} catch (e) {
// ignore RangeError from Intl.DisplayNames APIs
+17 -17
View File
@@ -55,45 +55,45 @@ interface AppLanguageConfig {
export const APP_LANGUAGES: AppLanguageConfig[] = [
{code2: AppLanguage.en, name: 'English'},
{code2: AppLanguage.an, name: 'Aragonés Aragonese'},
{code2: AppLanguage.ast, name: 'Asturianu Asturian'},
{code2: AppLanguage.ca, name: 'Català Catalan'},
{code2: AppLanguage.an, name: 'aragonés Aragonese'},
{code2: AppLanguage.ast, name: 'asturianu Asturian'},
{code2: AppLanguage.ca, name: 'català Catalan'},
{code2: AppLanguage.cy, name: 'Cymraeg Welsh'},
{code2: AppLanguage.da, name: 'Dansk Danish'},
{code2: AppLanguage.da, name: 'dansk Danish'},
{code2: AppLanguage.de, name: 'Deutsch German'},
{code2: AppLanguage.el, name: 'Ελληνικά Greek'},
{code2: AppLanguage.en_GB, name: 'English (UK)'},
{code2: AppLanguage.en_GB, name: 'British English'},
{code2: AppLanguage.eo, name: 'Esperanto'},
{code2: AppLanguage.es, name: 'Español Spanish'},
{code2: AppLanguage.eu, name: 'Euskera Basque'},
{code2: AppLanguage.fi, name: 'Suomi Finnish'},
{code2: AppLanguage.fr, name: 'Français French'},
{code2: AppLanguage.fy, name: 'Frysk Frisian'},
{code2: AppLanguage.es, name: 'español Spanish'},
{code2: AppLanguage.eu, name: 'euskara Basque'},
{code2: AppLanguage.fi, name: 'suomi Finnish'},
{code2: AppLanguage.fr, name: 'français French'},
{code2: AppLanguage.fy, name: 'Frysk Western Frisian'},
{code2: AppLanguage.ga, name: 'Gaeilge Irish'},
{code2: AppLanguage.gd, name: 'Gàidhlig Scottish Gaelic'},
{code2: AppLanguage.gl, name: 'Galego Galician'},
{code2: AppLanguage.gl, name: 'galego Galician'},
{code2: AppLanguage.hi, name: 'हिंदी Hindi'},
{code2: AppLanguage.hu, name: 'magyar Hungarian'},
{code2: AppLanguage.ia, name: 'Interlingua'},
{code2: AppLanguage.id, name: 'Bahasa Indonesia Indonesian'},
{code2: AppLanguage.it, name: 'Italiano Italian'},
{code2: AppLanguage.it, name: 'italiano Italian'},
{code2: AppLanguage.ja, name: '日本語 Japanese'},
{code2: AppLanguage.km, name: 'ភាសាខ្មែរ Khmer'},
{code2: AppLanguage.ko, name: '한국어 Korean'},
{code2: AppLanguage.ne, name: 'नेपाली Nepali'},
{code2: AppLanguage.nl, name: 'Nederlands Dutch'},
{code2: AppLanguage.pl, name: 'Polski Polish'},
{code2: AppLanguage.pl, name: 'polski Polish'},
{
code2: AppLanguage.pt_BR,
name: 'português do Brasil Brazilian Portuguese',
},
{code2: AppLanguage.pt_PT, name: 'português europeu European Portuguese'},
{code2: AppLanguage.ro, name: 'Română Romanian'},
{code2: AppLanguage.ru, name: 'Русский Russian'},
{code2: AppLanguage.sv, name: 'Svenska Swedish'},
{code2: AppLanguage.ro, name: 'română Romanian'},
{code2: AppLanguage.ru, name: 'русский Russian'},
{code2: AppLanguage.sv, name: 'svenska Swedish'},
{code2: AppLanguage.th, name: 'ภาษาไทย Thai'},
{code2: AppLanguage.tr, name: 'Türkçe Turkish'},
{code2: AppLanguage.uk, name: 'Українська Ukrainian'},
{code2: AppLanguage.uk, name: 'українська Ukrainian'},
{code2: AppLanguage.vi, name: 'Tiếng Việt Vietnamese'},
{code2: AppLanguage.zh_CN, name: '简体中文 Simplified Chinese'},
{code2: AppLanguage.zh_TW, name: '繁體中文 Traditional Chinese'},
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+31 -32
View File
@@ -824,7 +824,7 @@ msgstr ""
msgid "All languages"
msgstr ""
#: src/view/screens/Feeds.tsx:705
#: src/view/screens/Feeds.tsx:707
msgid "All the feeds you've saved, right in one place."
msgstr ""
@@ -905,7 +905,7 @@ msgstr ""
msgid "An error occurred"
msgstr ""
#: src/view/com/composer/state/video.ts:398
#: src/view/com/composer/state/video.ts:400
msgid "An error occurred while compressing the video."
msgstr ""
@@ -938,7 +938,7 @@ msgstr ""
msgid "An error occurred while trying to follow all"
msgstr ""
#: src/view/com/composer/state/video.ts:435
#: src/view/com/composer/state/video.ts:441
msgid "An error occurred while uploading the video."
msgstr ""
@@ -1730,7 +1730,7 @@ msgstr ""
msgid "Choose your account provider"
msgstr ""
#: src/view/screens/Feeds.tsx:731
#: src/view/screens/Feeds.tsx:733
msgid "Choose your own timeline! Feeds built by the community help you find content you love."
msgstr ""
@@ -2632,7 +2632,7 @@ msgstr ""
msgid "Discover new custom feeds"
msgstr ""
#: src/view/screens/Feeds.tsx:728
#: src/view/screens/Feeds.tsx:730
msgid "Discover New Feeds"
msgstr ""
@@ -3020,14 +3020,11 @@ msgstr ""
msgid "Enable trending topics"
msgstr ""
#: src/screens/Settings/ContentAndMediaSettings.tsx:153
#: src/screens/Settings/ContentAndMediaSettings.tsx:167
msgid "Enable trending videos in your Discover feed"
msgstr ""
#: src/screens/Settings/ContentAndMediaSettings.tsx:153
msgid "Enable trending videos in your Discover feed."
msgstr ""
#: src/screens/Messages/Settings.tsx:146
#: src/screens/Messages/Settings.tsx:149
#: src/screens/Moderation/index.tsx:392
@@ -3685,6 +3682,12 @@ msgstr ""
msgid "Followers you know"
msgstr ""
#: src/view/screens/Feeds.tsx:603
#: src/view/screens/SavedFeeds.tsx:420
msgctxt "feed-name"
msgid "Following"
msgstr ""
#. User is following this account, click to unfollow
#: src/components/ProfileCard.tsx:484
#: src/components/ProfileHoverCard/index.web.tsx:493
@@ -3692,8 +3695,6 @@ msgstr ""
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:241
#: src/screens/VideoFeed/index.tsx:848
#: src/view/com/post-thread/PostThreadFollowBtn.tsx:134
#: src/view/screens/Feeds.tsx:602
#: src/view/screens/SavedFeeds.tsx:420
msgid "Following"
msgstr ""
@@ -4157,7 +4158,7 @@ msgstr ""
msgid "Hmmmm, we couldn't load that moderation service."
msgstr ""
#: src/view/com/composer/state/video.ts:413
#: src/view/com/composer/state/video.ts:415
msgid "Hold up! Were gradually giving access to video, and youre still waiting in line. Check back soon!"
msgstr ""
@@ -5206,7 +5207,7 @@ msgstr ""
msgid "My Birthday"
msgstr ""
#: src/view/screens/Feeds.tsx:702
#: src/view/screens/Feeds.tsx:704
msgid "My Feeds"
msgstr ""
@@ -6544,8 +6545,8 @@ msgstr ""
#: src/components/PostControls/RepostButton.tsx:174
#: src/components/PostControls/RepostButton.tsx:197
#: src/components/PostControls/RepostButton.web.tsx:78
#: src/components/PostControls/RepostButton.web.tsx:85
#: src/components/PostControls/RepostButton.web.tsx:84
#: src/components/PostControls/RepostButton.web.tsx:91
msgid "Quote post"
msgstr ""
@@ -6559,8 +6560,8 @@ msgstr ""
#: src/components/PostControls/RepostButton.tsx:173
#: src/components/PostControls/RepostButton.tsx:195
#: src/components/PostControls/RepostButton.web.tsx:77
#: src/components/PostControls/RepostButton.web.tsx:84
#: src/components/PostControls/RepostButton.web.tsx:83
#: src/components/PostControls/RepostButton.web.tsx:90
msgid "Quote posts disabled"
msgstr ""
@@ -7007,15 +7008,12 @@ msgstr ""
#: src/components/PostControls/RepostButton.tsx:152
#: src/components/PostControls/RepostButton.tsx:163
#: src/components/PostControls/RepostButton.web.tsx:68
#: src/components/PostControls/RepostButton.web.tsx:75
msgctxt "action"
msgid "Repost"
msgstr ""
#: src/components/PostControls/RepostButton.web.tsx:65
#: src/components/PostControls/RepostButton.web.tsx:69
msgid "Repost"
msgstr ""
#. Accessibility label for the repost button when the post has not been reposted, verb form followed by number of reposts and noun form
#: src/components/PostControls/RepostButton.tsx:76
msgid "Repost ({0, plural, one {# repost} other {# reposts}})"
@@ -7027,7 +7025,7 @@ msgstr ""
#: src/components/PostControls/RepostButton.tsx:144
#: src/components/PostControls/RepostButton.web.tsx:43
#: src/components/PostControls/RepostButton.web.tsx:97
#: src/components/PostControls/RepostButton.web.tsx:103
#: src/screens/StarterPack/StarterPackScreen.tsx:561
msgid "Repost or quote post"
msgstr ""
@@ -8474,8 +8472,9 @@ msgstr ""
msgid "The Privacy Policy has been moved to <0/>"
msgstr ""
#: src/view/com/composer/state/video.ts:395
msgid "The selected video is larger than 100 MB."
#: src/view/com/composer/state/video.ts:396
#: src/view/com/composer/state/video.ts:435
msgid "The selected video is larger than 100 MB. Please try again with a smaller file."
msgstr ""
#: src/lib/hooks/useCleanError.ts:40
@@ -9045,8 +9044,8 @@ msgstr ""
msgid "Unblock list"
msgstr ""
#: src/components/PostControls/RepostButton.web.tsx:65
#: src/components/PostControls/RepostButton.web.tsx:69
#: src/components/PostControls/RepostButton.web.tsx:67
#: src/components/PostControls/RepostButton.web.tsx:74
msgid "Undo repost"
msgstr ""
@@ -9735,7 +9734,7 @@ msgstr ""
msgid "We sent an email to <0>{0}</0> containing a link. Please click on it to complete the email verification process."
msgstr ""
#: src/view/com/composer/state/video.ts:417
#: src/view/com/composer/state/video.ts:419
msgid "We were unable to determine if you are allowed to upload videos. Please try again."
msgstr ""
@@ -10002,7 +10001,7 @@ msgstr ""
msgid "You are not allowed to go live"
msgstr ""
#: src/view/com/composer/state/video.ts:410
#: src/view/com/composer/state/video.ts:412
msgid "You are not allowed to upload videos."
msgstr ""
@@ -10342,11 +10341,11 @@ msgstr ""
msgid "You've reached the maximum number of requests allowed. Please try again later."
msgstr ""
#: src/view/com/composer/state/video.ts:421
#: src/view/com/composer/state/video.ts:423
msgid "You've reached your daily limit for video uploads (too many bytes)"
msgstr ""
#: src/view/com/composer/state/video.ts:425
#: src/view/com/composer/state/video.ts:427
msgid "You've reached your daily limit for video uploads (too many videos)"
msgstr ""
@@ -10366,7 +10365,7 @@ msgstr ""
msgid "Your account has been suspended"
msgstr ""
#: src/view/com/composer/state/video.ts:429
#: src/view/com/composer/state/video.ts:431
msgid "Your account is not yet old enough to upload videos. Please try again later."
msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -150,7 +150,7 @@ export function ContentAndMediaSettingsScreen({}: Props) {
</Toggle.Item>
<Toggle.Item
name="show_trending_videos"
label={_(msg`Enable trending videos in your Discover feed.`)}
label={_(msg`Enable trending videos in your Discover feed`)}
value={!trendingVideoDisabled}
onChange={value => {
const hide = Boolean(!value)
+5
View File
@@ -699,6 +699,7 @@ export const ComposePost = ({
dispatch={composerDispatch}
textInput={post.id === activePost.id ? textInput : null}
isFirstPost={index === 0}
isLastPost={index === thread.posts.length - 1}
isPartOfThread={thread.posts.length > 1}
isReply={index > 0 || !!replyTo}
isActive={post.id === activePost.id}
@@ -738,6 +739,7 @@ let ComposerPost = React.memo(function ComposerPost({
isActive,
isReply,
isFirstPost,
isLastPost,
isPartOfThread,
canRemovePost,
canRemoveQuote,
@@ -752,6 +754,7 @@ let ComposerPost = React.memo(function ComposerPost({
isActive: boolean
isReply: boolean
isFirstPost: boolean
isLastPost: boolean
isPartOfThread: boolean
canRemovePost: boolean
canRemoveQuote: boolean
@@ -830,6 +833,8 @@ let ComposerPost = React.memo(function ComposerPost({
<View
style={[
a.mx_lg,
a.mb_sm,
!isActive && isLastPost && a.mb_lg,
!isActive && styles.inactivePost,
isTextOnly && isNative && a.flex_grow,
]}>
+12 -6
View File
@@ -1,7 +1,7 @@
import {ImagePickerAsset} from 'expo-image-picker'
import {AppBskyVideoDefs, BlobRef, BskyAgent} from '@atproto/api'
import {JobStatus} from '@atproto/api/dist/client/types/app/bsky/video/defs'
import {I18n} from '@lingui/core'
import {type ImagePickerAsset} from 'expo-image-picker'
import {type AppBskyVideoDefs, type BlobRef, type BskyAgent} from '@atproto/api'
import {type JobStatus} from '@atproto/api/dist/client/types/app/bsky/video/defs'
import {type I18n} from '@lingui/core'
import {msg} from '@lingui/macro'
import {AbortError} from '#/lib/async/cancelable'
@@ -11,7 +11,7 @@ import {
UploadLimitError,
VideoTooLargeError,
} from '#/lib/media/video/errors'
import {CompressedVideo} from '#/lib/media/video/types'
import {type CompressedVideo} from '#/lib/media/video/types'
import {uploadVideo} from '#/lib/media/video/upload'
import {createVideoAgent} from '#/lib/media/video/util'
import {logger} from '#/logger'
@@ -392,7 +392,9 @@ function getCompressErrorMessage(e: unknown, _: I18n['_']): string | null {
return null
}
if (e instanceof VideoTooLargeError) {
return _(msg`The selected video is larger than 100 MB.`)
return _(
msg`The selected video is larger than 100 MB. Please try again with a smaller file.`,
)
}
logger.error('Error compressing video', {safeMessage: e})
return _(msg`An error occurred while compressing the video.`)
@@ -428,6 +430,10 @@ function getUploadErrorMessage(e: unknown, _: I18n['_']): string | null {
return _(
msg`Your account is not yet old enough to upload videos. Please try again later.`,
)
case 'file size (100000001 bytes) is larger than the maximum allowed size (100000000 bytes)':
return _(
msg`The selected video is larger than 100 MB. Please try again with a smaller file.`,
)
default:
return e.message
}
+3 -1
View File
@@ -599,7 +599,9 @@ function FollowingFeed() {
fill={t.palette.white}
/>
</View>
<FeedCard.TitleAndByline title={_(msg`Following`)} />
<FeedCard.TitleAndByline
title={_(msg({message: 'Following', context: 'feed-name'}))}
/>
</FeedCard.Header>
</View>
)
+1 -1
View File
@@ -417,7 +417,7 @@ function FollowingFeedCard() {
</View>
<View style={[a.flex_1, a.flex_row, a.gap_sm, a.align_center]}>
<NewText style={[a.text_sm, a.font_bold, a.leading_snug]}>
<Trans>Following</Trans>
<Trans context="feed-name">Following</Trans>
</NewText>
</View>
</View>