Merge remote-tracking branch 'origin/main' into hailey/oauth-yeag
This commit is contained in:
@@ -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
@@ -12,7 +12,8 @@
|
||||
"buildFromSource": [
|
||||
"expo-notifications",
|
||||
"expo-haptics",
|
||||
"expo-media-library"
|
||||
"expo-media-library",
|
||||
"expo-image-picker"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
) : (
|
||||
|
||||
@@ -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() {}
|
||||
|
||||
@@ -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
@@ -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'},
|
||||
|
||||
+712
-427
File diff suppressed because it is too large
Load Diff
+710
-425
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+710
-425
File diff suppressed because it is too large
Load Diff
+710
-425
File diff suppressed because it is too large
Load Diff
+713
-428
File diff suppressed because it is too large
Load Diff
+750
-465
File diff suppressed because it is too large
Load Diff
+718
-433
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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! We’re gradually giving access to video, and you’re 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 ""
|
||||
|
||||
|
||||
+728
-443
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+711
-426
File diff suppressed because it is too large
Load Diff
+713
-428
File diff suppressed because it is too large
Load Diff
+718
-433
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+710
-425
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+717
-432
File diff suppressed because it is too large
Load Diff
+710
-425
File diff suppressed because it is too large
Load Diff
+711
-426
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
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
+804
-519
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+723
-438
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+727
-444
File diff suppressed because it is too large
Load Diff
+712
-427
File diff suppressed because it is too large
Load Diff
+712
-427
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)
|
||||
|
||||
@@ -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,
|
||||
]}>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user