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( richText.push(
<Link <Link
key={counter} key={counter}
href={`/tag/${segment.tag.tag}`} href={`/hashtag/${segment.tag.tag}`}
className="text-blue-500 hover:underline"> className="text-blue-500 hover:underline">
{segment.text} {segment.text}
</Link>, </Link>,
+2 -1
View File
@@ -12,7 +12,8 @@
"buildFromSource": [ "buildFromSource": [
"expo-notifications", "expo-notifications",
"expo-haptics", "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.Trigger>
<Menu.Outer style={{minWidth: 170}}> <Menu.Outer style={{minWidth: 170}}>
<Menu.Item <Menu.Item
label={isReposted ? _(msg`Undo repost`) : _(msg`Repost`)} label={
isReposted
? _(msg`Undo repost`)
: _(msg({message: `Repost`, context: `action`}))
}
testID="repostDropdownRepostBtn" testID="repostDropdownRepostBtn"
onPress={onRepost}> onPress={onRepost}>
<Menu.ItemText> <Menu.ItemText>
{isReposted ? _(msg`Undo repost`) : _(msg`Repost`)} {isReposted
? _(msg`Undo repost`)
: _(msg({message: `Repost`, context: `action`}))}
</Menu.ItemText> </Menu.ItemText>
<Menu.ItemIcon icon={Repost} position="right" /> <Menu.ItemIcon icon={Repost} position="right" />
</Menu.Item> </Menu.Item>
@@ -78,10 +78,12 @@ function MenuInner({
<DropdownMenu.Content <DropdownMenu.Content
sideOffset={5} sideOffset={5}
collisionPadding={{left: 5, right: 5, bottom: 5}}> collisionPadding={{left: 5, right: 5, bottom: 5}}>
<div onWheel={evt => evt.stopPropagation()}>
<EmojiPicker <EmojiPicker
onEmojiSelect={handleEmojiPickerResponse} onEmojiSelect={handleEmojiPickerResponse}
autoFocus={true} autoFocus={true}
/> />
</div>
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Portal> </DropdownMenu.Portal>
) : ( ) : (
+17 -11
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 {LINK_META_PROXY} from '#/lib/constants'
import {getGiphyMetaUri} from '#/lib/strings/embed-player' import {getGiphyMetaUri} from '#/lib/strings/embed-player'
@@ -37,6 +37,7 @@ export async function getLinkMeta(
} }
let urlp let urlp
let shouldFollowRedirect = false
try { try {
urlp = new URL(url) urlp = new URL(url)
@@ -46,6 +47,9 @@ export async function getLinkMeta(
url = giphyMetaUri url = giphyMetaUri
urlp = new URL(url) 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) { } catch (e) {
return { return {
error: 'Invalid URL', error: 'Invalid URL',
@@ -62,33 +66,35 @@ export async function getLinkMeta(
return meta return meta
} }
try {
const controller = new AbortController() const controller = new AbortController()
const to = setTimeout(() => controller.abort(), timeout || 5e3) const to = setTimeout(() => controller.abort(), timeout || 5e3)
try {
const response = await fetch( const response = await fetch(
`${LINK_META_PROXY(agent.service.toString() || '')}${encodeURIComponent( `${LINK_META_PROXY(agent.serviceUrl.toString() || '')}${encodeURIComponent(
url, url,
)}`, )}`,
{signal: controller.signal}, {signal: controller.signal},
) )
const body = await response.json() const body = await response.json()
clearTimeout(to)
const {description, error, image, title} = body if (body.error !== '') {
throw new Error(body.error)
if (error !== '') {
throw new Error(error)
} }
meta.description = description meta.description = body.description
meta.image = image meta.image = body.image
meta.title = title meta.title = body.title
if (shouldFollowRedirect) {
meta.url = body.url
}
} catch (e) { } catch (e) {
// failed // failed
console.error(e) console.error(e)
meta.error = e instanceof Error ? e.toString() : 'Failed to fetch link' meta.error = e instanceof Error ? e.toString() : 'Failed to fetch link'
} finally {
clearTimeout(to)
} }
return meta return meta
@@ -1,3 +1,5 @@
import {useCallback} from 'react'
export function useNotificationsRegistration() {} export function useNotificationsRegistration() {}
export function useRequestNotificationsPermission() { 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 decrementBadgeCount(_by: number) {}
export async function resetBadgeCount() {} export async function resetBadgeCount() {}
+1 -2
View File
@@ -45,8 +45,7 @@ function getLocalizedLanguage(
const translatedName = allNames.of(langCode) const translatedName = allNames.of(langCode)
if (translatedName) { if (translatedName) {
// force simple title case (as languages do not always start with an uppercase in Unicode data) return translatedName
return translatedName[0].toLocaleUpperCase() + translatedName.slice(1)
} }
} catch (e) { } catch (e) {
// ignore RangeError from Intl.DisplayNames APIs // ignore RangeError from Intl.DisplayNames APIs
+17 -17
View File
@@ -55,45 +55,45 @@ interface AppLanguageConfig {
export const APP_LANGUAGES: AppLanguageConfig[] = [ export const APP_LANGUAGES: AppLanguageConfig[] = [
{code2: AppLanguage.en, name: 'English'}, {code2: AppLanguage.en, name: 'English'},
{code2: AppLanguage.an, name: 'Aragonés Aragonese'}, {code2: AppLanguage.an, name: 'aragonés Aragonese'},
{code2: AppLanguage.ast, name: 'Asturianu Asturian'}, {code2: AppLanguage.ast, name: 'asturianu Asturian'},
{code2: AppLanguage.ca, name: 'Català Catalan'}, {code2: AppLanguage.ca, name: 'català Catalan'},
{code2: AppLanguage.cy, name: 'Cymraeg Welsh'}, {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.de, name: 'Deutsch German'},
{code2: AppLanguage.el, name: 'Ελληνικά Greek'}, {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.eo, name: 'Esperanto'},
{code2: AppLanguage.es, name: 'Español Spanish'}, {code2: AppLanguage.es, name: 'español Spanish'},
{code2: AppLanguage.eu, name: 'Euskera Basque'}, {code2: AppLanguage.eu, name: 'euskara Basque'},
{code2: AppLanguage.fi, name: 'Suomi Finnish'}, {code2: AppLanguage.fi, name: 'suomi Finnish'},
{code2: AppLanguage.fr, name: 'Français French'}, {code2: AppLanguage.fr, name: 'français French'},
{code2: AppLanguage.fy, name: 'Frysk Frisian'}, {code2: AppLanguage.fy, name: 'Frysk Western Frisian'},
{code2: AppLanguage.ga, name: 'Gaeilge Irish'}, {code2: AppLanguage.ga, name: 'Gaeilge Irish'},
{code2: AppLanguage.gd, name: 'Gàidhlig Scottish Gaelic'}, {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.hi, name: 'हिंदी Hindi'},
{code2: AppLanguage.hu, name: 'magyar Hungarian'}, {code2: AppLanguage.hu, name: 'magyar Hungarian'},
{code2: AppLanguage.ia, name: 'Interlingua'}, {code2: AppLanguage.ia, name: 'Interlingua'},
{code2: AppLanguage.id, name: 'Bahasa Indonesia Indonesian'}, {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.ja, name: '日本語 Japanese'},
{code2: AppLanguage.km, name: 'ភាសាខ្មែរ Khmer'}, {code2: AppLanguage.km, name: 'ភាសាខ្មែរ Khmer'},
{code2: AppLanguage.ko, name: '한국어 Korean'}, {code2: AppLanguage.ko, name: '한국어 Korean'},
{code2: AppLanguage.ne, name: 'नेपाली Nepali'}, {code2: AppLanguage.ne, name: 'नेपाली Nepali'},
{code2: AppLanguage.nl, name: 'Nederlands Dutch'}, {code2: AppLanguage.nl, name: 'Nederlands Dutch'},
{code2: AppLanguage.pl, name: 'Polski Polish'}, {code2: AppLanguage.pl, name: 'polski Polish'},
{ {
code2: AppLanguage.pt_BR, code2: AppLanguage.pt_BR,
name: 'português do Brasil Brazilian Portuguese', name: 'português do Brasil Brazilian Portuguese',
}, },
{code2: AppLanguage.pt_PT, name: 'português europeu European Portuguese'}, {code2: AppLanguage.pt_PT, name: 'português europeu European Portuguese'},
{code2: AppLanguage.ro, name: 'Română Romanian'}, {code2: AppLanguage.ro, name: 'română Romanian'},
{code2: AppLanguage.ru, name: 'Русский Russian'}, {code2: AppLanguage.ru, name: 'русский Russian'},
{code2: AppLanguage.sv, name: 'Svenska Swedish'}, {code2: AppLanguage.sv, name: 'svenska Swedish'},
{code2: AppLanguage.th, name: 'ภาษาไทย Thai'}, {code2: AppLanguage.th, name: 'ภาษาไทย Thai'},
{code2: AppLanguage.tr, name: 'Türkçe Turkish'}, {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.vi, name: 'Tiếng Việt Vietnamese'},
{code2: AppLanguage.zh_CN, name: '简体中文 Simplified Chinese'}, {code2: AppLanguage.zh_CN, name: '简体中文 Simplified Chinese'},
{code2: AppLanguage.zh_TW, name: '繁體中文 Traditional 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" msgid "All languages"
msgstr "" msgstr ""
#: src/view/screens/Feeds.tsx:705 #: src/view/screens/Feeds.tsx:707
msgid "All the feeds you've saved, right in one place." msgid "All the feeds you've saved, right in one place."
msgstr "" msgstr ""
@@ -905,7 +905,7 @@ msgstr ""
msgid "An error occurred" msgid "An error occurred"
msgstr "" 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." msgid "An error occurred while compressing the video."
msgstr "" msgstr ""
@@ -938,7 +938,7 @@ msgstr ""
msgid "An error occurred while trying to follow all" msgid "An error occurred while trying to follow all"
msgstr "" 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." msgid "An error occurred while uploading the video."
msgstr "" msgstr ""
@@ -1730,7 +1730,7 @@ msgstr ""
msgid "Choose your account provider" msgid "Choose your account provider"
msgstr "" 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." msgid "Choose your own timeline! Feeds built by the community help you find content you love."
msgstr "" msgstr ""
@@ -2632,7 +2632,7 @@ msgstr ""
msgid "Discover new custom feeds" msgid "Discover new custom feeds"
msgstr "" msgstr ""
#: src/view/screens/Feeds.tsx:728 #: src/view/screens/Feeds.tsx:730
msgid "Discover New Feeds" msgid "Discover New Feeds"
msgstr "" msgstr ""
@@ -3020,14 +3020,11 @@ msgstr ""
msgid "Enable trending topics" msgid "Enable trending topics"
msgstr "" msgstr ""
#: src/screens/Settings/ContentAndMediaSettings.tsx:153
#: src/screens/Settings/ContentAndMediaSettings.tsx:167 #: src/screens/Settings/ContentAndMediaSettings.tsx:167
msgid "Enable trending videos in your Discover feed" msgid "Enable trending videos in your Discover feed"
msgstr "" 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:146
#: src/screens/Messages/Settings.tsx:149 #: src/screens/Messages/Settings.tsx:149
#: src/screens/Moderation/index.tsx:392 #: src/screens/Moderation/index.tsx:392
@@ -3685,6 +3682,12 @@ msgstr ""
msgid "Followers you know" msgid "Followers you know"
msgstr "" 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 #. User is following this account, click to unfollow
#: src/components/ProfileCard.tsx:484 #: src/components/ProfileCard.tsx:484
#: src/components/ProfileHoverCard/index.web.tsx:493 #: src/components/ProfileHoverCard/index.web.tsx:493
@@ -3692,8 +3695,6 @@ msgstr ""
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:241 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:241
#: src/screens/VideoFeed/index.tsx:848 #: src/screens/VideoFeed/index.tsx:848
#: src/view/com/post-thread/PostThreadFollowBtn.tsx:134 #: src/view/com/post-thread/PostThreadFollowBtn.tsx:134
#: src/view/screens/Feeds.tsx:602
#: src/view/screens/SavedFeeds.tsx:420
msgid "Following" msgid "Following"
msgstr "" msgstr ""
@@ -4157,7 +4158,7 @@ msgstr ""
msgid "Hmmmm, we couldn't load that moderation service." msgid "Hmmmm, we couldn't load that moderation service."
msgstr "" 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!" msgid "Hold up! Were gradually giving access to video, and youre still waiting in line. Check back soon!"
msgstr "" msgstr ""
@@ -5206,7 +5207,7 @@ msgstr ""
msgid "My Birthday" msgid "My Birthday"
msgstr "" msgstr ""
#: src/view/screens/Feeds.tsx:702 #: src/view/screens/Feeds.tsx:704
msgid "My Feeds" msgid "My Feeds"
msgstr "" msgstr ""
@@ -6544,8 +6545,8 @@ msgstr ""
#: src/components/PostControls/RepostButton.tsx:174 #: src/components/PostControls/RepostButton.tsx:174
#: src/components/PostControls/RepostButton.tsx:197 #: src/components/PostControls/RepostButton.tsx:197
#: src/components/PostControls/RepostButton.web.tsx:78 #: src/components/PostControls/RepostButton.web.tsx:84
#: src/components/PostControls/RepostButton.web.tsx:85 #: src/components/PostControls/RepostButton.web.tsx:91
msgid "Quote post" msgid "Quote post"
msgstr "" msgstr ""
@@ -6559,8 +6560,8 @@ msgstr ""
#: src/components/PostControls/RepostButton.tsx:173 #: src/components/PostControls/RepostButton.tsx:173
#: src/components/PostControls/RepostButton.tsx:195 #: src/components/PostControls/RepostButton.tsx:195
#: src/components/PostControls/RepostButton.web.tsx:77 #: src/components/PostControls/RepostButton.web.tsx:83
#: src/components/PostControls/RepostButton.web.tsx:84 #: src/components/PostControls/RepostButton.web.tsx:90
msgid "Quote posts disabled" msgid "Quote posts disabled"
msgstr "" msgstr ""
@@ -7007,15 +7008,12 @@ msgstr ""
#: src/components/PostControls/RepostButton.tsx:152 #: src/components/PostControls/RepostButton.tsx:152
#: src/components/PostControls/RepostButton.tsx:163 #: src/components/PostControls/RepostButton.tsx:163
#: src/components/PostControls/RepostButton.web.tsx:68
#: src/components/PostControls/RepostButton.web.tsx:75
msgctxt "action" msgctxt "action"
msgid "Repost" msgid "Repost"
msgstr "" 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 #. 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 #: src/components/PostControls/RepostButton.tsx:76
msgid "Repost ({0, plural, one {# repost} other {# reposts}})" msgid "Repost ({0, plural, one {# repost} other {# reposts}})"
@@ -7027,7 +7025,7 @@ msgstr ""
#: src/components/PostControls/RepostButton.tsx:144 #: src/components/PostControls/RepostButton.tsx:144
#: src/components/PostControls/RepostButton.web.tsx:43 #: 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 #: src/screens/StarterPack/StarterPackScreen.tsx:561
msgid "Repost or quote post" msgid "Repost or quote post"
msgstr "" msgstr ""
@@ -8474,8 +8472,9 @@ msgstr ""
msgid "The Privacy Policy has been moved to <0/>" msgid "The Privacy Policy has been moved to <0/>"
msgstr "" msgstr ""
#: src/view/com/composer/state/video.ts:395 #: src/view/com/composer/state/video.ts:396
msgid "The selected video is larger than 100 MB." #: 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 "" msgstr ""
#: src/lib/hooks/useCleanError.ts:40 #: src/lib/hooks/useCleanError.ts:40
@@ -9045,8 +9044,8 @@ msgstr ""
msgid "Unblock list" msgid "Unblock list"
msgstr "" msgstr ""
#: src/components/PostControls/RepostButton.web.tsx:65 #: src/components/PostControls/RepostButton.web.tsx:67
#: src/components/PostControls/RepostButton.web.tsx:69 #: src/components/PostControls/RepostButton.web.tsx:74
msgid "Undo repost" msgid "Undo repost"
msgstr "" 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." msgid "We sent an email to <0>{0}</0> containing a link. Please click on it to complete the email verification process."
msgstr "" 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." msgid "We were unable to determine if you are allowed to upload videos. Please try again."
msgstr "" msgstr ""
@@ -10002,7 +10001,7 @@ msgstr ""
msgid "You are not allowed to go live" msgid "You are not allowed to go live"
msgstr "" 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." msgid "You are not allowed to upload videos."
msgstr "" msgstr ""
@@ -10342,11 +10341,11 @@ msgstr ""
msgid "You've reached the maximum number of requests allowed. Please try again later." msgid "You've reached the maximum number of requests allowed. Please try again later."
msgstr "" 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)" msgid "You've reached your daily limit for video uploads (too many bytes)"
msgstr "" 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)" msgid "You've reached your daily limit for video uploads (too many videos)"
msgstr "" msgstr ""
@@ -10366,7 +10365,7 @@ msgstr ""
msgid "Your account has been suspended" msgid "Your account has been suspended"
msgstr "" 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." msgid "Your account is not yet old enough to upload videos. Please try again later."
msgstr "" 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>
<Toggle.Item <Toggle.Item
name="show_trending_videos" name="show_trending_videos"
label={_(msg`Enable trending videos in your Discover feed.`)} label={_(msg`Enable trending videos in your Discover feed`)}
value={!trendingVideoDisabled} value={!trendingVideoDisabled}
onChange={value => { onChange={value => {
const hide = Boolean(!value) const hide = Boolean(!value)
+5
View File
@@ -699,6 +699,7 @@ export const ComposePost = ({
dispatch={composerDispatch} dispatch={composerDispatch}
textInput={post.id === activePost.id ? textInput : null} textInput={post.id === activePost.id ? textInput : null}
isFirstPost={index === 0} isFirstPost={index === 0}
isLastPost={index === thread.posts.length - 1}
isPartOfThread={thread.posts.length > 1} isPartOfThread={thread.posts.length > 1}
isReply={index > 0 || !!replyTo} isReply={index > 0 || !!replyTo}
isActive={post.id === activePost.id} isActive={post.id === activePost.id}
@@ -738,6 +739,7 @@ let ComposerPost = React.memo(function ComposerPost({
isActive, isActive,
isReply, isReply,
isFirstPost, isFirstPost,
isLastPost,
isPartOfThread, isPartOfThread,
canRemovePost, canRemovePost,
canRemoveQuote, canRemoveQuote,
@@ -752,6 +754,7 @@ let ComposerPost = React.memo(function ComposerPost({
isActive: boolean isActive: boolean
isReply: boolean isReply: boolean
isFirstPost: boolean isFirstPost: boolean
isLastPost: boolean
isPartOfThread: boolean isPartOfThread: boolean
canRemovePost: boolean canRemovePost: boolean
canRemoveQuote: boolean canRemoveQuote: boolean
@@ -830,6 +833,8 @@ let ComposerPost = React.memo(function ComposerPost({
<View <View
style={[ style={[
a.mx_lg, a.mx_lg,
a.mb_sm,
!isActive && isLastPost && a.mb_lg,
!isActive && styles.inactivePost, !isActive && styles.inactivePost,
isTextOnly && isNative && a.flex_grow, isTextOnly && isNative && a.flex_grow,
]}> ]}>
+12 -6
View File
@@ -1,7 +1,7 @@
import {ImagePickerAsset} from 'expo-image-picker' import {type ImagePickerAsset} from 'expo-image-picker'
import {AppBskyVideoDefs, BlobRef, BskyAgent} from '@atproto/api' import {type AppBskyVideoDefs, type BlobRef, type BskyAgent} from '@atproto/api'
import {JobStatus} from '@atproto/api/dist/client/types/app/bsky/video/defs' import {type JobStatus} from '@atproto/api/dist/client/types/app/bsky/video/defs'
import {I18n} from '@lingui/core' import {type I18n} from '@lingui/core'
import {msg} from '@lingui/macro' import {msg} from '@lingui/macro'
import {AbortError} from '#/lib/async/cancelable' import {AbortError} from '#/lib/async/cancelable'
@@ -11,7 +11,7 @@ import {
UploadLimitError, UploadLimitError,
VideoTooLargeError, VideoTooLargeError,
} from '#/lib/media/video/errors' } 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 {uploadVideo} from '#/lib/media/video/upload'
import {createVideoAgent} from '#/lib/media/video/util' import {createVideoAgent} from '#/lib/media/video/util'
import {logger} from '#/logger' import {logger} from '#/logger'
@@ -392,7 +392,9 @@ function getCompressErrorMessage(e: unknown, _: I18n['_']): string | null {
return null return null
} }
if (e instanceof VideoTooLargeError) { 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}) logger.error('Error compressing video', {safeMessage: e})
return _(msg`An error occurred while compressing the video.`) return _(msg`An error occurred while compressing the video.`)
@@ -428,6 +430,10 @@ function getUploadErrorMessage(e: unknown, _: I18n['_']): string | null {
return _( return _(
msg`Your account is not yet old enough to upload videos. Please try again later.`, 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: default:
return e.message return e.message
} }
+3 -1
View File
@@ -599,7 +599,9 @@ function FollowingFeed() {
fill={t.palette.white} fill={t.palette.white}
/> />
</View> </View>
<FeedCard.TitleAndByline title={_(msg`Following`)} /> <FeedCard.TitleAndByline
title={_(msg({message: 'Following', context: 'feed-name'}))}
/>
</FeedCard.Header> </FeedCard.Header>
</View> </View>
) )
+1 -1
View File
@@ -417,7 +417,7 @@ function FollowingFeedCard() {
</View> </View>
<View style={[a.flex_1, a.flex_row, a.gap_sm, a.align_center]}> <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]}> <NewText style={[a.text_sm, a.font_bold, a.leading_snug]}>
<Trans>Following</Trans> <Trans context="feed-name">Following</Trans>
</NewText> </NewText>
</View> </View>
</View> </View>