Merge branch 'consolidate-list-props' into web-layout

This commit is contained in:
Dan Abramov
2023-12-15 04:27:26 +00:00
60 changed files with 1267 additions and 689 deletions
+6 -3
View File
@@ -43,7 +43,7 @@ module.exports = function () {
icon: './assets/icon.png',
userInterfaceStyle: 'automatic',
splash: {
image: './assets/cloud-splash.png',
image: './assets/splash.png',
resizeMode: 'cover',
backgroundColor: '#ffffff',
},
@@ -73,9 +73,12 @@ module.exports = function () {
},
android: {
versionCode: ANDROID_VERSION_CODE,
icon: './assets/icon.png',
adaptiveIcon: {
foregroundImage: './assets/adaptive-icon.png',
backgroundColor: '#ffffff',
foregroundImage: './assets/icon-android-foreground.png',
monochromeImage: './assets/icon-android-foreground.png',
backgroundImage: './assets/icon-android-background.png',
backgroundColor: '#1185FE',
},
googleServicesFile: './google-services.json',
package: 'xyz.blueskyweb.app',
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 696 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

+1
View File
@@ -10,6 +10,7 @@
- After initial setup:
- Copy `google-services.json.example` to `google-services.json` or provide your own `google-services.json`. (A real firebase project is NOT required)
- `npx expo prebuild` -> you will also need to run this anytime `app.json` or native `package.json` deps change
- `yarn intl:build` -> you will also need to run this anytime `./src/locale/{locale}/messages.po` change
- Start the dev servers
- `git clone git@github.com:bluesky-social/atproto.git`
- `cd atproto`
+2 -1
View File
@@ -35,7 +35,7 @@
"intl:compile": "lingui compile"
},
"dependencies": {
"@atproto/api": "^0.7.3",
"@atproto/api": "^0.7.4",
"@bam.tech/react-native-image-resizer": "^3.0.4",
"@braintree/sanitize-url": "^6.0.2",
"@emoji-mart/react": "^1.1.1",
@@ -54,6 +54,7 @@
"@react-native-clipboard/clipboard": "^1.10.0",
"@react-native-community/blur": "^4.3.0",
"@react-native-community/datetimepicker": "7.2.0",
"@react-native-masked-view/masked-view": "^0.3.1",
"@react-native-menu/menu": "^0.8.0",
"@react-native-picker/picker": "2.4.10",
"@react-navigation/bottom-tabs": "^6.5.7",
+26 -20
View File
@@ -6,6 +6,10 @@ import {RootSiblingParent} from 'react-native-root-siblings'
import * as SplashScreen from 'expo-splash-screen'
import {GestureHandlerRootView} from 'react-native-gesture-handler'
import {QueryClientProvider} from '@tanstack/react-query'
import {
SafeAreaProvider,
initialWindowMetrics,
} from 'react-native-safe-area-context'
import 'view/icons'
@@ -34,6 +38,7 @@ import {
} from 'state/session'
import {Provider as UnreadNotifsProvider} from 'state/queries/notifications/unread'
import * as persisted from '#/state/persisted'
import {Splash} from '#/Splash'
SplashScreen.preventAutoHideAsync()
@@ -53,27 +58,28 @@ function InnerApp() {
resumeSession(account)
}, [resumeSession])
// wait for session to resume
if (isInitialLoad) return null
return (
<React.Fragment
// Resets the entire tree below when it changes:
key={currentAccount?.did}>
<LoggedOutViewProvider>
<UnreadNotifsProvider>
<ThemeProvider theme={colorMode}>
{/* All components should be within this provider */}
<RootSiblingParent>
<GestureHandlerRootView style={s.h100pct}>
<TestCtrls />
<Shell />
</GestureHandlerRootView>
</RootSiblingParent>
</ThemeProvider>
</UnreadNotifsProvider>
</LoggedOutViewProvider>
</React.Fragment>
<SafeAreaProvider initialMetrics={initialWindowMetrics}>
<Splash isReady={!isInitialLoad}>
<React.Fragment
// Resets the entire tree below when it changes:
key={currentAccount?.did}>
<LoggedOutViewProvider>
<UnreadNotifsProvider>
<ThemeProvider theme={colorMode}>
{/* All components should be within this provider */}
<RootSiblingParent>
<GestureHandlerRootView style={s.h100pct}>
<TestCtrls />
<Shell />
</GestureHandlerRootView>
</RootSiblingParent>
</ThemeProvider>
</UnreadNotifsProvider>
</LoggedOutViewProvider>
</React.Fragment>
</Splash>
</SafeAreaProvider>
)
}
+6 -4
View File
@@ -1,6 +1,5 @@
import * as React from 'react'
import {StyleSheet} from 'react-native'
import * as SplashScreen from 'expo-splash-screen'
import {
NavigationContainer,
createNavigationContainerRef,
@@ -182,7 +181,7 @@ function commonScreens(Stack: typeof HomeTab, unreadCountLabel?: string) {
<Stack.Screen
name="ProfileFeed"
getComponent={() => ProfileFeedScreen}
options={{title: title('Feed')}}
options={{title: title('Feed'), requireAuth: true}}
/>
<Stack.Screen
name="ProfileFeedLikedBy"
@@ -327,7 +326,11 @@ function FeedsTabNavigator() {
animationDuration: 250,
contentStyle,
}}>
<FeedsTab.Screen name="Feeds" getComponent={() => FeedsScreen} />
<FeedsTab.Screen
name="Feeds"
getComponent={() => FeedsScreen}
options={{requireAuth: true}}
/>
{commonScreens(FeedsTab as typeof HomeTab)}
</FeedsTab.Navigator>
)
@@ -489,7 +492,6 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) {
linking={LINKING}
theme={theme}
onReady={() => {
SplashScreen.hideAsync()
logModuleInitTime()
onReady()
}}>
+154
View File
@@ -0,0 +1,154 @@
import React, {useCallback, useEffect} from 'react'
import {View, StyleSheet} from 'react-native'
import * as SplashScreen from 'expo-splash-screen'
import LinearGradient from 'react-native-linear-gradient'
import Animated, {
interpolate,
runOnJS,
useAnimatedStyle,
useSharedValue,
withTiming,
Easing,
} from 'react-native-reanimated'
import MaskedView from '@react-native-masked-view/masked-view'
import {useSafeAreaInsets} from 'react-native-safe-area-context'
import Svg, {Path, SvgProps} from 'react-native-svg'
export const Logo = React.forwardRef(function LogoImpl(props: SvgProps, ref) {
const width = 1000
const height = width * (67 / 64)
return (
<Svg
fill="none"
// @ts-ignore it's fiiiiine
ref={ref}
viewBox="0 0 64 66"
style={{width, height}}>
<Path
fill="#fff"
d="M13.873 3.77C21.21 9.243 29.103 20.342 32 26.3v15.732c0-.335-.13.043-.41.858-1.512 4.414-7.418 21.642-20.923 7.87-7.111-7.252-3.819-14.503 9.125-16.692-7.405 1.252-15.73-.817-18.014-8.93C1.12 22.804 0 8.431 0 6.488 0-3.237 8.579-.18 13.873 3.77ZM50.127 3.77C42.79 9.243 34.897 20.342 32 26.3v15.732c0-.335.13.043.41.858 1.512 4.414 7.418 21.642 20.923 7.87 7.111-7.252 3.819-14.503-9.125-16.692 7.405 1.252 15.73-.817 18.014-8.93C62.88 22.804 64 8.431 64 6.488 64-3.237 55.422-.18 50.127 3.77Z"
/>
</Svg>
)
})
type Props = {
isReady: boolean
}
SplashScreen.preventAutoHideAsync().catch(() => {})
const AnimatedLogo = Animated.createAnimatedComponent(Logo)
export function Splash(props: React.PropsWithChildren<Props>) {
const insets = useSafeAreaInsets()
const intro = useSharedValue(0)
const outroLogo = useSharedValue(0)
const outroApp = useSharedValue(0)
const [isAnimationComplete, setIsAnimationComplete] = React.useState(false)
const logoAnimations = useAnimatedStyle(() => {
return {
transform: [
{
scale: interpolate(intro.value, [0, 1], [0.8, 1], 'clamp'),
},
{
scale: interpolate(
outroLogo.value,
[0, 0.06, 0.08, 1],
[1, 0.8, 0.8, 800],
'clamp',
),
},
],
opacity: interpolate(intro.value, [0, 1], [0, 1], 'clamp'),
}
})
const appAnimation = useAnimatedStyle(() => {
return {
transform: [
{
scale: interpolate(
outroApp.value,
[0, 0.7, 1],
[1.1, 1.1, 1],
'clamp',
),
},
],
opacity: interpolate(outroApp.value, [0, 0.7, 1], [0, 0, 1], 'clamp'),
}
})
const onFinish = useCallback(() => setIsAnimationComplete(true), [])
useEffect(() => {
if (props.isReady) {
// hide on mount
SplashScreen.hideAsync().catch(() => {})
intro.value = withTiming(
1,
{duration: 200, easing: Easing.out(Easing.cubic)},
async () => {
outroLogo.value = withTiming(
1,
{duration: 1200, easing: Easing.in(Easing.cubic)},
() => {
runOnJS(onFinish)()
},
)
outroApp.value = withTiming(
1,
{duration: 1200, easing: Easing.inOut(Easing.cubic)},
() => {
runOnJS(onFinish)()
},
)
},
)
}
}, [onFinish, intro, outroLogo, outroApp, props.isReady])
return (
<View style={{flex: 1}}>
{!isAnimationComplete && (
<LinearGradient
colors={['#0A7AFF', '#59B9FF']}
style={[StyleSheet.absoluteFillObject]}
/>
)}
<MaskedView
style={[StyleSheet.absoluteFillObject]}
maskElement={
<Animated.View
style={[
StyleSheet.absoluteFillObject,
{
// Transparent background because mask is based off alpha channel.
backgroundColor: 'transparent',
flex: 1,
justifyContent: 'center',
alignItems: 'center',
transform: [{translateY: -(insets.top / 2)}, {scale: 0.1}], // scale from 1000px to 100px
},
]}>
<AnimatedLogo style={[logoAnimations]} />
</Animated.View>
}>
{!isAnimationComplete && (
<View
style={[StyleSheet.absoluteFillObject, {backgroundColor: 'white'}]}
/>
)}
<Animated.View style={[{flex: 1}, appAnimation]}>
{props.children}
</Animated.View>
</MaskedView>
</View>
)
}
+2 -3
View File
@@ -1,5 +1,4 @@
import {ImageRequireSource} from 'react-native'
export const DEF_AVATAR: ImageRequireSource = require('../../assets/default-avatar.jpg')
export const TABS_EXPLAINER: ImageRequireSource = require('../../assets/tabs-explainer.jpg')
export const CLOUD_SPLASH: ImageRequireSource = require('../../assets/cloud-splash.png')
export const DEF_AVATAR: ImageRequireSource = require('../../assets/default-avatar.png')
export const CLOUD_SPLASH: ImageRequireSource = require('../../assets/splash.png')
+2 -6
View File
@@ -1,10 +1,6 @@
import {ImageRequireSource} from 'react-native'
// @ts-ignore we need to pretend -prf
export const DEF_AVATAR: ImageRequireSource = {uri: '/img/default-avatar.jpg'}
export const DEF_AVATAR: ImageRequireSource = {uri: '/img/default-avatar.png'}
// @ts-ignore we need to pretend -prf
export const TABS_EXPLAINER: ImageRequireSource = {
uri: '/img/tabs-explainer.jpg',
}
// @ts-ignore we need to pretend -prf
export const CLOUD_SPLASH: ImageRequireSource = {uri: '/img/cloud-splash.png'}
export const CLOUD_SPLASH: ImageRequireSource = {uri: '/img/splash.png'}
+1 -1
View File
@@ -1,2 +1,2 @@
export const LOGIN_INCLUDE_DEV_SERVERS = true
export const PWI_ENABLED = false
export const PWI_ENABLED = true
+138 -98
View File
@@ -47,7 +47,7 @@ msgstr ""
msgid "{invitesAvailable} invite codes available"
msgstr ""
#: src/view/screens/Search/Search.tsx:87
#: src/view/screens/Search/Search.tsx:88
msgid "{message}"
msgstr ""
@@ -95,7 +95,7 @@ msgstr ""
#: src/view/com/modals/ListAddRemoveUsers.tsx:264
#: src/view/com/modals/UserAddRemoveLists.tsx:193
#: src/view/screens/ProfileList.tsx:783
#: src/view/screens/ProfileList.tsx:753
msgid "Add"
msgstr ""
@@ -103,7 +103,7 @@ msgstr ""
msgid "Add a content warning"
msgstr ""
#: src/view/screens/ProfileList.tsx:773
#: src/view/screens/ProfileList.tsx:743
msgid "Add a user to this list"
msgstr ""
@@ -142,7 +142,7 @@ msgstr ""
msgid "Add to Lists"
msgstr ""
#: src/view/screens/ProfileFeed.tsx:280
#: src/view/screens/ProfileFeed.tsx:275
msgid "Add to my feeds"
msgstr ""
@@ -228,7 +228,7 @@ msgstr ""
msgid "Are you sure you'd like to discard this draft?"
msgstr ""
#: src/view/screens/ProfileList.tsx:375
#: src/view/screens/ProfileList.tsx:351
msgid "Are you sure?"
msgstr ""
@@ -250,9 +250,9 @@ msgstr ""
#: src/view/com/auth/login/LoginForm.tsx:249
#: src/view/com/auth/login/SetNewPasswordForm.tsx:148
#: src/view/com/modals/report/InputIssueDetails.tsx:45
#: src/view/com/post-thread/PostThread.tsx:392
#: src/view/com/post-thread/PostThread.tsx:442
#: src/view/com/post-thread/PostThread.tsx:450
#: src/view/com/post-thread/PostThread.tsx:395
#: src/view/com/post-thread/PostThread.tsx:445
#: src/view/com/post-thread/PostThread.tsx:453
#: src/view/com/profile/ProfileHeader.tsx:672
msgid "Back"
msgstr ""
@@ -275,15 +275,15 @@ msgstr ""
msgid "Block Account"
msgstr ""
#: src/view/screens/ProfileList.tsx:545
#: src/view/screens/ProfileList.tsx:521
msgid "Block accounts"
msgstr ""
#: src/view/screens/ProfileList.tsx:495
#: src/view/screens/ProfileList.tsx:471
msgid "Block list"
msgstr ""
#: src/view/screens/ProfileList.tsx:330
#: src/view/screens/ProfileList.tsx:306
msgid "Block these accounts?"
msgstr ""
@@ -303,14 +303,19 @@ msgstr ""
msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours."
msgstr ""
#: src/view/com/post-thread/PostThread.tsx:248
#: src/view/com/post-thread/PostThread.tsx:251
msgid "Blocked post."
msgstr ""
#: src/view/screens/ProfileList.tsx:332
#: src/view/screens/ProfileList.tsx:308
msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:93
msgid "Blog"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:31
#: src/view/com/auth/SplashScreen.tsx:26
msgid "Bluesky"
msgstr ""
@@ -343,6 +348,10 @@ msgstr ""
msgid "Build version {0} {1}"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:87
msgid "Business"
msgstr ""
#: src/view/com/composer/photos/OpenCameraBtn.tsx:60
#: src/view/com/util/UserAvatar.tsx:221
#: src/view/com/util/UserBanner.tsx:38
@@ -368,7 +377,7 @@ msgstr ""
#: src/view/com/modals/LinkWarning.tsx:85
#: src/view/com/modals/Repost.tsx:73
#: src/view/com/modals/Waitlist.tsx:136
#: src/view/screens/Search/Search.tsx:558
#: src/view/screens/Search/Search.tsx:592
#: src/view/shell/desktop/Search.tsx:182
msgid "Cancel"
msgstr ""
@@ -473,7 +482,7 @@ msgid "Clear all storage data (restart after this)"
msgstr ""
#: src/view/com/util/forms/SearchInput.tsx:73
#: src/view/screens/Search/Search.tsx:543
#: src/view/screens/Search/Search.tsx:577
msgid "Clear search query"
msgstr ""
@@ -551,7 +560,7 @@ msgstr ""
msgid "Content Languages"
msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:69
#: src/view/com/util/moderation/ScreenHider.tsx:78
msgid "Content Warning"
msgstr ""
@@ -573,7 +582,7 @@ msgstr ""
msgid "Copy"
msgstr ""
#: src/view/screens/ProfileList.tsx:407
#: src/view/screens/ProfileList.tsx:383
msgid "Copy link to list"
msgstr ""
@@ -593,14 +602,15 @@ msgstr ""
msgid "Copyright Policy"
msgstr ""
#: src/view/screens/ProfileFeed.tsx:103
#: src/view/screens/ProfileFeed.tsx:98
msgid "Could not load feed"
msgstr ""
#: src/view/screens/ProfileList.tsx:860
#: src/view/screens/ProfileList.tsx:829
msgid "Could not load list"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:62
#: src/view/com/auth/SplashScreen.tsx:41
msgid "Create a new account"
msgstr ""
@@ -609,6 +619,7 @@ msgstr ""
msgid "Create Account"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:54
#: src/view/com/auth/SplashScreen.tsx:38
msgid "Create new account"
msgstr ""
@@ -643,8 +654,8 @@ msgstr ""
msgid "Delete app password"
msgstr ""
#: src/view/screens/ProfileList.tsx:374
#: src/view/screens/ProfileList.tsx:434
#: src/view/screens/ProfileList.tsx:350
#: src/view/screens/ProfileList.tsx:410
msgid "Delete List"
msgstr ""
@@ -664,7 +675,7 @@ msgstr ""
msgid "Delete this post?"
msgstr ""
#: src/view/com/post-thread/PostThread.tsx:240
#: src/view/com/post-thread/PostThread.tsx:243
msgid "Deleted post."
msgstr ""
@@ -739,7 +750,7 @@ msgstr ""
msgid "Edit image"
msgstr ""
#: src/view/screens/ProfileList.tsx:422
#: src/view/screens/ProfileList.tsx:398
msgid "Edit list details"
msgstr ""
@@ -787,7 +798,7 @@ msgstr ""
msgid "Enable this setting to only see replies between people you follow."
msgstr ""
#: src/view/screens/Profile.tsx:471
#: src/view/screens/Profile.tsx:425
msgid "End of feed"
msgstr ""
@@ -815,7 +826,7 @@ msgstr ""
msgid "Enter your username and password"
msgstr ""
#: src/view/screens/Search/Search.tsx:105
#: src/view/screens/Search/Search.tsx:106
msgid "Error:"
msgstr ""
@@ -836,7 +847,7 @@ msgstr ""
msgid "Feed offline"
msgstr ""
#: src/view/com/feeds/FeedPage.tsx:140
#: src/view/com/feeds/FeedPage.tsx:143
msgid "Feed Preferences"
msgstr ""
@@ -847,8 +858,8 @@ msgstr ""
#: src/view/screens/Feeds.tsx:475
#: src/view/screens/Profile.tsx:164
#: src/view/shell/bottom-bar/BottomBar.tsx:160
#: src/view/shell/desktop/LeftNav.tsx:333
#: src/view/shell/bottom-bar/BottomBar.tsx:163
#: src/view/shell/desktop/LeftNav.tsx:335
#: src/view/shell/Drawer.tsx:455
#: src/view/shell/Drawer.tsx:456
msgid "Feeds"
@@ -862,6 +873,14 @@ msgstr ""
msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information."
msgstr ""
#: src/view/screens/Search/Search.tsx:422
msgid "Find users on Bluesky"
msgstr ""
#: src/view/screens/Search/Search.tsx:420
msgid "Find users with the search tool on the right"
msgstr ""
#: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150
msgid "Finding similar accounts..."
msgstr ""
@@ -940,17 +959,17 @@ msgstr ""
msgid "Get Started"
msgstr ""
#: src/view/com/auth/LoggedOut.tsx:68
#: src/view/com/auth/LoggedOut.tsx:69
#: src/view/com/util/moderation/ScreenHider.tsx:105
#: src/view/com/auth/LoggedOut.tsx:70
#: src/view/com/auth/LoggedOut.tsx:71
#: src/view/com/util/moderation/ScreenHider.tsx:123
#: src/view/shell/desktop/LeftNav.tsx:103
msgid "Go back"
msgstr ""
#: src/view/screens/ProfileFeed.tsx:107
#: src/view/screens/ProfileFeed.tsx:112
#: src/view/screens/ProfileFeed.tsx:117
#: src/view/screens/ProfileList.tsx:869
#: src/view/screens/ProfileList.tsx:874
#: src/view/screens/ProfileList.tsx:838
#: src/view/screens/ProfileList.tsx:843
msgid "Go Back"
msgstr ""
@@ -974,6 +993,7 @@ msgid "Here is your app password."
msgstr ""
#: src/view/com/notifications/FeedItem.tsx:316
#: src/view/com/util/moderation/ContentHider.tsx:103
msgid "Hide"
msgstr ""
@@ -1082,6 +1102,10 @@ msgstr ""
msgid "Invite codes: {invitesAvailable} available"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:99
msgid "Jobs"
msgstr ""
#: src/view/com/modals/Waitlist.tsx:67
msgid "Join the waitlist"
msgstr ""
@@ -1107,9 +1131,13 @@ msgstr ""
msgid "Languages"
msgstr ""
#: src/view/com/util/moderation/ContentHider.tsx:101
msgid "Learn more"
msgstr ""
#: src/view/com/util/moderation/PostAlerts.tsx:47
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65
#: src/view/com/util/moderation/ScreenHider.tsx:88
#: src/view/com/util/moderation/ScreenHider.tsx:104
msgid "Learn More"
msgstr ""
@@ -1117,7 +1145,7 @@ msgstr ""
#: src/view/com/util/moderation/PostAlerts.tsx:40
#: src/view/com/util/moderation/PostHider.tsx:76
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:49
#: src/view/com/util/moderation/ScreenHider.tsx:85
#: src/view/com/util/moderation/ScreenHider.tsx:101
msgid "Learn more about this warning"
msgstr ""
@@ -1147,7 +1175,7 @@ msgstr ""
#~ msgid "Light"
#~ msgstr ""
#: src/view/screens/ProfileFeed.tsx:643
#: src/view/screens/ProfileFeed.tsx:627
msgid "Like this feed"
msgstr ""
@@ -1177,22 +1205,22 @@ msgid "List Name"
msgstr ""
#: src/view/screens/Profile.tsx:165
#: src/view/shell/desktop/LeftNav.tsx:373
#: src/view/shell/desktop/LeftNav.tsx:372
#: src/view/shell/Drawer.tsx:471
#: src/view/shell/Drawer.tsx:472
msgid "Lists"
msgstr ""
#: src/view/com/post-thread/PostThread.tsx:257
#: src/view/com/post-thread/PostThread.tsx:265
#: src/view/com/post-thread/PostThread.tsx:260
#: src/view/com/post-thread/PostThread.tsx:268
msgid "Load more posts"
msgstr ""
#: src/view/screens/Notifications.tsx:141
#: src/view/screens/Notifications.tsx:144
msgid "Load new notifications"
msgstr ""
#: src/view/com/feeds/FeedPage.tsx:185
#: src/view/com/feeds/FeedPage.tsx:189
msgid "Load new posts"
msgstr ""
@@ -1216,7 +1244,7 @@ msgstr ""
msgid "Login to account that is not listed"
msgstr ""
#: src/view/screens/ProfileFeed.tsx:482
#: src/view/screens/ProfileFeed.tsx:472
msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
msgstr ""
@@ -1236,18 +1264,18 @@ msgstr ""
msgid "Mentioned users"
msgstr ""
#: src/view/screens/Search/Search.tsx:503
#: src/view/screens/Search/Search.tsx:537
msgid "Menu"
msgstr ""
#: src/view/com/posts/FeedErrorMessage.tsx:194
#: src/view/screens/ProfileFeed.tsx:490
#: src/view/screens/ProfileFeed.tsx:480
msgid "Message from server"
msgstr ""
#: src/view/screens/Moderation.tsx:64
#: src/view/screens/Settings.tsx:563
#: src/view/shell/desktop/LeftNav.tsx:391
#: src/view/shell/desktop/LeftNav.tsx:390
#: src/view/shell/Drawer.tsx:490
#: src/view/shell/Drawer.tsx:491
msgid "Moderation"
@@ -1266,8 +1294,8 @@ msgid "More feeds"
msgstr ""
#: src/view/com/profile/ProfileHeader.tsx:548
#: src/view/screens/ProfileFeed.tsx:370
#: src/view/screens/ProfileList.tsx:606
#: src/view/screens/ProfileFeed.tsx:365
#: src/view/screens/ProfileList.tsx:582
msgid "More options"
msgstr ""
@@ -1279,15 +1307,15 @@ msgstr ""
msgid "Mute Account"
msgstr ""
#: src/view/screens/ProfileList.tsx:533
#: src/view/screens/ProfileList.tsx:509
msgid "Mute accounts"
msgstr ""
#: src/view/screens/ProfileList.tsx:480
#: src/view/screens/ProfileList.tsx:456
msgid "Mute list"
msgstr ""
#: src/view/screens/ProfileList.tsx:293
#: src/view/screens/ProfileList.tsx:269
msgid "Mute these accounts?"
msgstr ""
@@ -1307,7 +1335,7 @@ msgstr ""
msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private."
msgstr ""
#: src/view/screens/ProfileList.tsx:295
#: src/view/screens/ProfileList.tsx:271
msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them."
msgstr ""
@@ -1345,12 +1373,12 @@ msgstr ""
msgid "New"
msgstr ""
#: src/view/com/feeds/FeedPage.tsx:196
#: src/view/com/feeds/FeedPage.tsx:200
#: src/view/screens/Feeds.tsx:510
#: src/view/screens/Profile.tsx:389
#: src/view/screens/ProfileFeed.tsx:451
#: src/view/screens/ProfileList.tsx:212
#: src/view/screens/ProfileList.tsx:244
#: src/view/screens/Profile.tsx:353
#: src/view/screens/ProfileFeed.tsx:441
#: src/view/screens/ProfileList.tsx:192
#: src/view/screens/ProfileList.tsx:220
#: src/view/shell/desktop/LeftNav.tsx:246
msgid "New post"
msgstr ""
@@ -1379,8 +1407,8 @@ msgstr ""
msgid "No"
msgstr ""
#: src/view/screens/ProfileFeed.tsx:636
#: src/view/screens/ProfileList.tsx:740
#: src/view/screens/ProfileFeed.tsx:620
#: src/view/screens/ProfileList.tsx:710
msgid "No description"
msgstr ""
@@ -1398,9 +1426,9 @@ msgstr ""
#~ msgstr ""
#: src/view/com/modals/ListAddRemoveUsers.tsx:127
#: src/view/screens/Search/Search.tsx:270
#: src/view/screens/Search/Search.tsx:298
#: src/view/screens/Search/Search.tsx:581
#: src/view/screens/Search/Search.tsx:271
#: src/view/screens/Search/Search.tsx:299
#: src/view/screens/Search/Search.tsx:615
#: src/view/shell/desktop/Search.tsx:210
msgid "No results found for {query}"
msgstr ""
@@ -1429,10 +1457,10 @@ msgstr ""
#~ msgid "Note: Third-party apps that display Bluesky content may not respect this setting."
#~ msgstr ""
#: src/view/screens/Notifications.tsx:108
#: src/view/screens/Notifications.tsx:132
#: src/view/screens/Notifications.tsx:109
#: src/view/screens/Notifications.tsx:133
#: src/view/shell/bottom-bar/BottomBar.tsx:187
#: src/view/shell/desktop/LeftNav.tsx:355
#: src/view/shell/desktop/LeftNav.tsx:354
#: src/view/shell/Drawer.tsx:416
#: src/view/shell/Drawer.tsx:417
msgid "Notifications"
@@ -1570,12 +1598,12 @@ msgid "Please tell us why you think this decision was incorrect."
msgstr ""
#: src/view/com/composer/Composer.tsx:331
#: src/view/com/post-thread/PostThread.tsx:223
#: src/view/com/post-thread/PostThread.tsx:226
#: src/view/screens/PostThread.tsx:78
msgid "Post"
msgstr ""
#: src/view/com/post-thread/PostThread.tsx:382
#: src/view/com/post-thread/PostThread.tsx:385
msgid "Post hidden"
msgstr ""
@@ -1587,7 +1615,7 @@ msgstr ""
msgid "Post Languages"
msgstr ""
#: src/view/com/post-thread/PostThread.tsx:434
#: src/view/com/post-thread/PostThread.tsx:437
msgid "Post not found"
msgstr ""
@@ -1690,7 +1718,7 @@ msgstr ""
#: src/view/com/feeds/FeedSourceCard.tsx:105
#: src/view/com/feeds/FeedSourceCard.tsx:172
#: src/view/screens/ProfileFeed.tsx:280
#: src/view/screens/ProfileFeed.tsx:275
msgid "Remove from my feeds"
msgstr ""
@@ -1735,11 +1763,11 @@ msgstr ""
msgid "Report Account"
msgstr ""
#: src/view/screens/ProfileFeed.tsx:300
#: src/view/screens/ProfileFeed.tsx:295
msgid "Report feed"
msgstr ""
#: src/view/screens/ProfileList.tsx:448
#: src/view/screens/ProfileList.tsx:424
msgid "Report List"
msgstr ""
@@ -1851,8 +1879,8 @@ msgstr ""
#: src/view/com/modals/ListAddRemoveUsers.tsx:75
#: src/view/com/util/forms/SearchInput.tsx:64
#: src/view/screens/Search/Search.tsx:381
#: src/view/screens/Search/Search.tsx:533
#: src/view/screens/Search/Search.tsx:401
#: src/view/screens/Search/Search.tsx:567
#: src/view/shell/bottom-bar/BottomBar.tsx:138
#: src/view/shell/desktop/LeftNav.tsx:315
#: src/view/shell/desktop/Search.tsx:161
@@ -1863,13 +1891,14 @@ msgid "Search"
msgstr ""
#: src/view/screens/Search/Search.tsx:390
msgid "Search for posts and users."
msgstr ""
#~ msgid "Search for posts and users."
#~ msgstr ""
#: src/view/com/modals/ChangeEmail.tsx:110
msgid "Security Step Required"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:39
#: src/view/com/auth/SplashScreen.tsx:29
msgid "See what's next"
msgstr ""
@@ -1944,7 +1973,7 @@ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your f
msgstr ""
#: src/view/screens/Settings.tsx:277
#: src/view/shell/desktop/LeftNav.tsx:427
#: src/view/shell/desktop/LeftNav.tsx:426
#: src/view/shell/Drawer.tsx:546
#: src/view/shell/Drawer.tsx:547
msgid "Settings"
@@ -1956,11 +1985,11 @@ msgstr ""
#: src/view/com/profile/ProfileHeader.tsx:338
#: src/view/com/util/forms/PostDropdownBtn.tsx:129
#: src/view/screens/ProfileList.tsx:407
#: src/view/screens/ProfileList.tsx:383
msgid "Share"
msgstr ""
#: src/view/screens/ProfileFeed.tsx:312
#: src/view/screens/ProfileFeed.tsx:307
msgid "Share feed"
msgstr ""
@@ -1968,11 +1997,12 @@ msgstr ""
#~ msgid "Share link"
#~ msgstr ""
#: src/view/com/util/moderation/ContentHider.tsx:105
#: src/view/screens/Settings.tsx:316
msgid "Show"
msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:114
#: src/view/com/util/moderation/ScreenHider.tsx:132
msgid "Show anyway"
msgstr ""
@@ -2000,13 +2030,15 @@ msgstr ""
msgid "Show users"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:70
#: src/view/com/auth/login/Login.tsx:98
#: src/view/com/auth/SplashScreen.tsx:49
#: src/view/shell/NavSignupCard.tsx:52
#: src/view/shell/NavSignupCard.tsx:53
#: src/view/shell/NavSignupCard.tsx:58
#: src/view/shell/NavSignupCard.tsx:59
msgid "Sign in"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:78
#: src/view/com/auth/SplashScreen.tsx:52
#: src/view/com/auth/SplashScreen.web.tsx:84
msgid "Sign In"
@@ -2030,16 +2062,20 @@ msgstr ""
msgid "Sign out"
msgstr ""
#: src/view/shell/NavSignupCard.tsx:43
#: src/view/shell/NavSignupCard.tsx:44
#: src/view/shell/NavSignupCard.tsx:46
#: src/view/shell/NavSignupCard.tsx:49
#: src/view/shell/NavSignupCard.tsx:50
#: src/view/shell/NavSignupCard.tsx:52
msgid "Sign up"
msgstr ""
#: src/view/shell/NavSignupCard.tsx:36
#: src/view/shell/NavSignupCard.tsx:42
msgid "Sign up or sign in to join the conversation"
msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:76
msgid "Sign-in Required"
msgstr ""
#: src/view/screens/Settings.tsx:327
msgid "Signed in as"
msgstr ""
@@ -2077,15 +2113,15 @@ msgstr ""
msgid "Submit"
msgstr "Submit"
#: src/view/screens/ProfileList.tsx:597
#: src/view/screens/ProfileList.tsx:573
msgid "Subscribe"
msgstr ""
#: src/view/screens/ProfileList.tsx:593
#: src/view/screens/ProfileList.tsx:569
msgid "Subscribe to this list"
msgstr ""
#: src/view/screens/Search/Search.tsx:354
#: src/view/screens/Search/Search.tsx:357
msgid "Suggested Follows"
msgstr ""
@@ -2135,7 +2171,7 @@ msgstr ""
msgid "The Copyright Policy has been moved to <0/>"
msgstr ""
#: src/view/com/post-thread/PostThread.tsx:437
#: src/view/com/post-thread/PostThread.tsx:440
msgid "The post may have been deleted."
msgstr ""
@@ -2159,10 +2195,14 @@ msgstr ""
msgid "This {0} has been labeled."
msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:72
#: src/view/com/util/moderation/ScreenHider.tsx:88
msgid "This {screenDescription} has been flagged:"
msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:83
msgid "This account has requested that users sign in to view their profile."
msgstr ""
#: src/view/com/posts/FeedErrorMessage.tsx:107
msgid "This content is not viewable without a Bluesky account."
msgstr ""
@@ -2222,11 +2262,11 @@ msgstr ""
msgid "Try again"
msgstr ""
#: src/view/screens/ProfileList.tsx:495
#: src/view/screens/ProfileList.tsx:471
msgid "Un-block list"
msgstr ""
#: src/view/screens/ProfileList.tsx:480
#: src/view/screens/ProfileList.tsx:456
msgid "Un-mute list"
msgstr ""
@@ -2262,7 +2302,7 @@ msgstr ""
msgid "Unmute thread"
msgstr ""
#: src/view/screens/ProfileList.tsx:463
#: src/view/screens/ProfileList.tsx:439
msgid "Unpin moderation list"
msgstr ""
@@ -2311,7 +2351,7 @@ msgstr ""
msgid "Username or email address"
msgstr ""
#: src/view/screens/ProfileList.tsx:767
#: src/view/screens/ProfileList.tsx:737
msgid "Users"
msgstr ""
@@ -2368,7 +2408,7 @@ msgstr ""
#~ msgid "We're sorry, but this feed is currently receiving high traffic and is temporarily unavailable. Please try again later."
#~ msgstr ""
#: src/view/screens/Search/Search.tsx:237
#: src/view/screens/Search/Search.tsx:238
msgid "We're sorry, but your search could not be completed. Please try again in a few minutes."
msgstr ""
@@ -2444,16 +2484,16 @@ msgstr ""
msgid "You don't have any saved feeds."
msgstr ""
#: src/view/com/post-thread/PostThread.tsx:385
#: src/view/com/post-thread/PostThread.tsx:388
msgid "You have blocked the author or you have been blocked by the author."
msgstr ""
#: src/view/com/feeds/ProfileFeedgens.tsx:154
#: src/view/com/feeds/ProfileFeedgens.tsx:141
msgid "You have no feeds."
msgstr ""
#: src/view/com/lists/MyLists.tsx:89
#: src/view/com/lists/ProfileLists.tsx:158
#: src/view/com/lists/ProfileLists.tsx:145
msgid "You have no lists."
msgstr ""
+138 -98
View File
@@ -47,7 +47,7 @@ msgstr ""
msgid "{invitesAvailable} invite codes available"
msgstr ""
#: src/view/screens/Search/Search.tsx:87
#: src/view/screens/Search/Search.tsx:88
msgid "{message}"
msgstr ""
@@ -95,7 +95,7 @@ msgstr "अकाउंट के विकल्प"
#: src/view/com/modals/ListAddRemoveUsers.tsx:264
#: src/view/com/modals/UserAddRemoveLists.tsx:193
#: src/view/screens/ProfileList.tsx:783
#: src/view/screens/ProfileList.tsx:753
msgid "Add"
msgstr "ऐड करो"
@@ -103,7 +103,7 @@ msgstr "ऐड करो"
msgid "Add a content warning"
msgstr "सामग्री चेतावनी जोड़ें"
#: src/view/screens/ProfileList.tsx:773
#: src/view/screens/ProfileList.tsx:743
msgid "Add a user to this list"
msgstr "इस सूची में किसी को जोड़ें"
@@ -142,7 +142,7 @@ msgstr "अपने डोमेन में निम्नलिखित DN
msgid "Add to Lists"
msgstr "सूचियों में जोड़ें"
#: src/view/screens/ProfileFeed.tsx:280
#: src/view/screens/ProfileFeed.tsx:275
msgid "Add to my feeds"
msgstr "इस फ़ीड को सहेजें"
@@ -228,7 +228,7 @@ msgstr "क्या आप वाकई ऐप पासवर्ड \"{name}\"
msgid "Are you sure you'd like to discard this draft?"
msgstr "क्या आप वाकई इस ड्राफ्ट को हटाना करना चाहेंगे?"
#: src/view/screens/ProfileList.tsx:375
#: src/view/screens/ProfileList.tsx:351
msgid "Are you sure?"
msgstr "क्या आप वास्तव में इसे करना चाहते हैं?"
@@ -250,9 +250,9 @@ msgstr "कलात्मक या गैर-कामुक नग्नत
#: src/view/com/auth/login/LoginForm.tsx:249
#: src/view/com/auth/login/SetNewPasswordForm.tsx:148
#: src/view/com/modals/report/InputIssueDetails.tsx:45
#: src/view/com/post-thread/PostThread.tsx:392
#: src/view/com/post-thread/PostThread.tsx:442
#: src/view/com/post-thread/PostThread.tsx:450
#: src/view/com/post-thread/PostThread.tsx:395
#: src/view/com/post-thread/PostThread.tsx:445
#: src/view/com/post-thread/PostThread.tsx:453
#: src/view/com/profile/ProfileHeader.tsx:672
msgid "Back"
msgstr "वापस"
@@ -275,15 +275,15 @@ msgstr "जन्मदिन:"
msgid "Block Account"
msgstr "खाता ब्लॉक करें"
#: src/view/screens/ProfileList.tsx:545
#: src/view/screens/ProfileList.tsx:521
msgid "Block accounts"
msgstr "खाता ब्लॉक करें"
#: src/view/screens/ProfileList.tsx:495
#: src/view/screens/ProfileList.tsx:471
msgid "Block list"
msgstr ""
#: src/view/screens/ProfileList.tsx:330
#: src/view/screens/ProfileList.tsx:306
msgid "Block these accounts?"
msgstr "खाता ब्लॉक करें?"
@@ -303,14 +303,19 @@ msgstr "अवरुद्ध खाते आपके थ्रेड्स
msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours."
msgstr "अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते। आप उनकी सामग्री नहीं देख पाएंगे और उन्हें आपकी सामग्री देखने से रोका जाएगा।"
#: src/view/com/post-thread/PostThread.tsx:248
#: src/view/com/post-thread/PostThread.tsx:251
msgid "Blocked post."
msgstr "ब्लॉक पोस्ट।"
#: src/view/screens/ProfileList.tsx:332
#: src/view/screens/ProfileList.tsx:308
msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
msgstr "अवरोधन सार्वजनिक है. अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते।"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:93
msgid "Blog"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:31
#: src/view/com/auth/SplashScreen.tsx:26
msgid "Bluesky"
msgstr "Bluesky"
@@ -343,6 +348,10 @@ msgstr "Bluesky.Social"
msgid "Build version {0} {1}"
msgstr "Build version {0} {1}"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:87
msgid "Business"
msgstr ""
#: src/view/com/composer/photos/OpenCameraBtn.tsx:60
#: src/view/com/util/UserAvatar.tsx:221
#: src/view/com/util/UserBanner.tsx:38
@@ -368,7 +377,7 @@ msgstr "केवल अक्षर, संख्या, रिक्त स्
#: src/view/com/modals/LinkWarning.tsx:85
#: src/view/com/modals/Repost.tsx:73
#: src/view/com/modals/Waitlist.tsx:136
#: src/view/screens/Search/Search.tsx:558
#: src/view/screens/Search/Search.tsx:592
#: src/view/shell/desktop/Search.tsx:182
msgid "Cancel"
msgstr "कैंसिल"
@@ -469,7 +478,7 @@ msgid "Clear all storage data (restart after this)"
msgstr ""
#: src/view/com/util/forms/SearchInput.tsx:73
#: src/view/screens/Search/Search.tsx:543
#: src/view/screens/Search/Search.tsx:577
msgid "Clear search query"
msgstr "खोज क्वेरी साफ़ करें"
@@ -547,7 +556,7 @@ msgstr "सामग्री फ़िल्टरिंग"
msgid "Content Languages"
msgstr "सामग्री भाषा"
#: src/view/com/util/moderation/ScreenHider.tsx:69
#: src/view/com/util/moderation/ScreenHider.tsx:78
msgid "Content Warning"
msgstr "सामग्री चेतावनी"
@@ -569,7 +578,7 @@ msgstr "कॉपी कर ली"
msgid "Copy"
msgstr "कॉपी"
#: src/view/screens/ProfileList.tsx:407
#: src/view/screens/ProfileList.tsx:383
msgid "Copy link to list"
msgstr ""
@@ -589,14 +598,15 @@ msgstr "पोस्ट टेक्स्ट कॉपी करें"
msgid "Copyright Policy"
msgstr "कॉपीराइट नीति"
#: src/view/screens/ProfileFeed.tsx:103
#: src/view/screens/ProfileFeed.tsx:98
msgid "Could not load feed"
msgstr "फ़ीड लोड नहीं कर सकता"
#: src/view/screens/ProfileList.tsx:860
#: src/view/screens/ProfileList.tsx:829
msgid "Could not load list"
msgstr "सूची लोड नहीं कर सकता"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:62
#: src/view/com/auth/SplashScreen.tsx:41
msgid "Create a new account"
msgstr "नया खाता बनाएं"
@@ -605,6 +615,7 @@ msgstr "नया खाता बनाएं"
msgid "Create Account"
msgstr "खाता बनाएँ"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:54
#: src/view/com/auth/SplashScreen.tsx:38
msgid "Create new account"
msgstr "नया खाता बनाएं"
@@ -639,8 +650,8 @@ msgstr "खाता हटाएं"
msgid "Delete app password"
msgstr "अप्प पासवर्ड हटाएं"
#: src/view/screens/ProfileList.tsx:374
#: src/view/screens/ProfileList.tsx:434
#: src/view/screens/ProfileList.tsx:350
#: src/view/screens/ProfileList.tsx:410
msgid "Delete List"
msgstr "सूची हटाएँ"
@@ -660,7 +671,7 @@ msgstr "पोस्ट को हटाएं"
msgid "Delete this post?"
msgstr "इस पोस्ट को डीलीट करें?"
#: src/view/com/post-thread/PostThread.tsx:240
#: src/view/com/post-thread/PostThread.tsx:243
msgid "Deleted post."
msgstr "यह पोस्ट मिटाई जा चुकी है"
@@ -735,7 +746,7 @@ msgstr "प्रत्येक कोड एक बार काम करत
msgid "Edit image"
msgstr "छवि संपादित करें"
#: src/view/screens/ProfileList.tsx:422
#: src/view/screens/ProfileList.tsx:398
msgid "Edit list details"
msgstr "सूची विवरण संपादित करें"
@@ -783,7 +794,7 @@ msgstr "ईमेल:"
msgid "Enable this setting to only see replies between people you follow."
msgstr "इस सेटिंग को केवल उन लोगों के बीच जवाब देखने में सक्षम करें जिन्हें आप फॉलो करते हैं।।"
#: src/view/screens/Profile.tsx:471
#: src/view/screens/Profile.tsx:425
msgid "End of feed"
msgstr ""
@@ -811,7 +822,7 @@ msgstr "नीचे अपना नया ईमेल पता दर्ज
msgid "Enter your username and password"
msgstr "अपने यूज़रनेम और पासवर्ड दर्ज करें"
#: src/view/screens/Search/Search.tsx:105
#: src/view/screens/Search/Search.tsx:106
msgid "Error:"
msgstr ""
@@ -832,7 +843,7 @@ msgstr "अनुशंसित फ़ीड लोड करने में
msgid "Feed offline"
msgstr "फ़ीड ऑफ़लाइन है"
#: src/view/com/feeds/FeedPage.tsx:140
#: src/view/com/feeds/FeedPage.tsx:143
msgid "Feed Preferences"
msgstr "फ़ीड प्राथमिकता"
@@ -843,8 +854,8 @@ msgstr "प्रतिक्रिया"
#: src/view/screens/Feeds.tsx:475
#: src/view/screens/Profile.tsx:164
#: src/view/shell/bottom-bar/BottomBar.tsx:160
#: src/view/shell/desktop/LeftNav.tsx:333
#: src/view/shell/bottom-bar/BottomBar.tsx:163
#: src/view/shell/desktop/LeftNav.tsx:335
#: src/view/shell/Drawer.tsx:455
#: src/view/shell/Drawer.tsx:456
msgid "Feeds"
@@ -858,6 +869,14 @@ msgstr "सामग्री को व्यवस्थित करने
msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information."
msgstr "फ़ीड कस्टम एल्गोरिदम हैं जिन्हें उपयोगकर्ता थोड़ी कोडिंग विशेषज्ञता के साथ बनाते हैं। <0/> अधिक जानकारी के लिए."
#: src/view/screens/Search/Search.tsx:422
msgid "Find users on Bluesky"
msgstr ""
#: src/view/screens/Search/Search.tsx:420
msgid "Find users with the search tool on the right"
msgstr ""
#: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150
msgid "Finding similar accounts..."
msgstr "मिलते-जुलते खाते ढूँढना"
@@ -932,17 +951,17 @@ msgstr "गैलरी"
msgid "Get Started"
msgstr "प्रारंभ करें"
#: src/view/com/auth/LoggedOut.tsx:68
#: src/view/com/auth/LoggedOut.tsx:69
#: src/view/com/util/moderation/ScreenHider.tsx:105
#: src/view/com/auth/LoggedOut.tsx:70
#: src/view/com/auth/LoggedOut.tsx:71
#: src/view/com/util/moderation/ScreenHider.tsx:123
#: src/view/shell/desktop/LeftNav.tsx:103
msgid "Go back"
msgstr "वापस जाओ"
#: src/view/screens/ProfileFeed.tsx:107
#: src/view/screens/ProfileFeed.tsx:112
#: src/view/screens/ProfileFeed.tsx:117
#: src/view/screens/ProfileList.tsx:869
#: src/view/screens/ProfileList.tsx:874
#: src/view/screens/ProfileList.tsx:838
#: src/view/screens/ProfileList.tsx:843
msgid "Go Back"
msgstr "वापस जाओ"
@@ -966,6 +985,7 @@ msgid "Here is your app password."
msgstr "यहां आपका ऐप पासवर्ड है."
#: src/view/com/notifications/FeedItem.tsx:316
#: src/view/com/util/moderation/ContentHider.tsx:103
msgid "Hide"
msgstr "इसे छिपाएं"
@@ -1074,6 +1094,10 @@ msgstr ""
msgid "Invite codes: {invitesAvailable} available"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:99
msgid "Jobs"
msgstr ""
#: src/view/com/modals/Waitlist.tsx:67
msgid "Join the waitlist"
msgstr "प्रतीक्षा सूची में शामिल हों"
@@ -1099,9 +1123,13 @@ msgstr "भाषा सेटिंग्स"
msgid "Languages"
msgstr "भाषा"
#: src/view/com/util/moderation/ContentHider.tsx:101
msgid "Learn more"
msgstr ""
#: src/view/com/util/moderation/PostAlerts.tsx:47
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65
#: src/view/com/util/moderation/ScreenHider.tsx:88
#: src/view/com/util/moderation/ScreenHider.tsx:104
msgid "Learn More"
msgstr "अधिक जानें"
@@ -1109,7 +1137,7 @@ msgstr "अधिक जानें"
#: src/view/com/util/moderation/PostAlerts.tsx:40
#: src/view/com/util/moderation/PostHider.tsx:76
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:49
#: src/view/com/util/moderation/ScreenHider.tsx:85
#: src/view/com/util/moderation/ScreenHider.tsx:101
msgid "Learn more about this warning"
msgstr "इस चेतावनी के बारे में अधिक जानें"
@@ -1139,7 +1167,7 @@ msgstr "चित्र पुस्तकालय"
#~ msgid "Light"
#~ msgstr "लाइट मोड"
#: src/view/screens/ProfileFeed.tsx:643
#: src/view/screens/ProfileFeed.tsx:627
msgid "Like this feed"
msgstr "इस फ़ीड को लाइक करो"
@@ -1169,22 +1197,22 @@ msgid "List Name"
msgstr "सूची का नाम"
#: src/view/screens/Profile.tsx:165
#: src/view/shell/desktop/LeftNav.tsx:373
#: src/view/shell/desktop/LeftNav.tsx:372
#: src/view/shell/Drawer.tsx:471
#: src/view/shell/Drawer.tsx:472
msgid "Lists"
msgstr "सूची"
#: src/view/com/post-thread/PostThread.tsx:257
#: src/view/com/post-thread/PostThread.tsx:265
#: src/view/com/post-thread/PostThread.tsx:260
#: src/view/com/post-thread/PostThread.tsx:268
msgid "Load more posts"
msgstr "अधिक पोस्ट लोड करें"
#: src/view/screens/Notifications.tsx:141
#: src/view/screens/Notifications.tsx:144
msgid "Load new notifications"
msgstr "नई सूचनाएं लोड करें"
#: src/view/com/feeds/FeedPage.tsx:185
#: src/view/com/feeds/FeedPage.tsx:189
msgid "Load new posts"
msgstr "नई पोस्ट लोड करें"
@@ -1208,7 +1236,7 @@ msgstr ""
msgid "Login to account that is not listed"
msgstr "उस खाते में लॉग इन करें जो सूचीबद्ध नहीं है"
#: src/view/screens/ProfileFeed.tsx:482
#: src/view/screens/ProfileFeed.tsx:472
msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
msgstr ""
@@ -1228,18 +1256,18 @@ msgstr ""
msgid "Mentioned users"
msgstr ""
#: src/view/screens/Search/Search.tsx:503
#: src/view/screens/Search/Search.tsx:537
msgid "Menu"
msgstr "मेनू"
#: src/view/com/posts/FeedErrorMessage.tsx:194
#: src/view/screens/ProfileFeed.tsx:490
#: src/view/screens/ProfileFeed.tsx:480
msgid "Message from server"
msgstr ""
#: src/view/screens/Moderation.tsx:64
#: src/view/screens/Settings.tsx:563
#: src/view/shell/desktop/LeftNav.tsx:391
#: src/view/shell/desktop/LeftNav.tsx:390
#: src/view/shell/Drawer.tsx:490
#: src/view/shell/Drawer.tsx:491
msgid "Moderation"
@@ -1258,8 +1286,8 @@ msgid "More feeds"
msgstr "अधिक फ़ीड"
#: src/view/com/profile/ProfileHeader.tsx:548
#: src/view/screens/ProfileFeed.tsx:370
#: src/view/screens/ProfileList.tsx:606
#: src/view/screens/ProfileFeed.tsx:365
#: src/view/screens/ProfileList.tsx:582
msgid "More options"
msgstr "अधिक विकल्प"
@@ -1271,15 +1299,15 @@ msgstr "अधिक विकल्प"
msgid "Mute Account"
msgstr "खाता म्यूट करें"
#: src/view/screens/ProfileList.tsx:533
#: src/view/screens/ProfileList.tsx:509
msgid "Mute accounts"
msgstr "खातों को म्यूट करें"
#: src/view/screens/ProfileList.tsx:480
#: src/view/screens/ProfileList.tsx:456
msgid "Mute list"
msgstr ""
#: src/view/screens/ProfileList.tsx:293
#: src/view/screens/ProfileList.tsx:269
msgid "Mute these accounts?"
msgstr "इन खातों को म्यूट करें?"
@@ -1299,7 +1327,7 @@ msgstr "म्यूट किए गए खाते"
msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private."
msgstr "म्यूट किए गए खातों की पोस्ट आपके फ़ीड और आपकी सूचनाओं से हटा दी जाती हैं। म्यूट पूरी तरह से निजी हैं."
#: src/view/screens/ProfileList.tsx:295
#: src/view/screens/ProfileList.tsx:271
msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them."
msgstr "म्यूट करना निजी है. म्यूट किए गए खाते आपके साथ इंटरैक्ट कर सकते हैं, लेकिन आप उनकी पोस्ट नहीं देखेंगे या उनसे सूचनाएं प्राप्त नहीं करेंगे।"
@@ -1337,12 +1365,12 @@ msgstr "अपने फ़ॉलोअर्स और डेटा तक प
msgid "New"
msgstr "नया"
#: src/view/com/feeds/FeedPage.tsx:196
#: src/view/com/feeds/FeedPage.tsx:200
#: src/view/screens/Feeds.tsx:510
#: src/view/screens/Profile.tsx:389
#: src/view/screens/ProfileFeed.tsx:451
#: src/view/screens/ProfileList.tsx:212
#: src/view/screens/ProfileList.tsx:244
#: src/view/screens/Profile.tsx:353
#: src/view/screens/ProfileFeed.tsx:441
#: src/view/screens/ProfileList.tsx:192
#: src/view/screens/ProfileList.tsx:220
#: src/view/shell/desktop/LeftNav.tsx:246
msgid "New post"
msgstr "नई पोस्ट"
@@ -1371,8 +1399,8 @@ msgstr "अगली फोटो"
msgid "No"
msgstr "नहीं"
#: src/view/screens/ProfileFeed.tsx:636
#: src/view/screens/ProfileList.tsx:740
#: src/view/screens/ProfileFeed.tsx:620
#: src/view/screens/ProfileList.tsx:710
msgid "No description"
msgstr "कोई विवरण नहीं"
@@ -1390,9 +1418,9 @@ msgstr "\"{query}\" के लिए कोई परिणाम नहीं
#~ msgstr "{0} के लिए कोई परिणाम नहीं मिला"
#: src/view/com/modals/ListAddRemoveUsers.tsx:127
#: src/view/screens/Search/Search.tsx:270
#: src/view/screens/Search/Search.tsx:298
#: src/view/screens/Search/Search.tsx:581
#: src/view/screens/Search/Search.tsx:271
#: src/view/screens/Search/Search.tsx:299
#: src/view/screens/Search/Search.tsx:615
#: src/view/shell/desktop/Search.tsx:210
msgid "No results found for {query}"
msgstr ""
@@ -1421,10 +1449,10 @@ msgstr ""
#~ msgid "Note: Third-party apps that display Bluesky content may not respect this setting."
#~ msgstr ""
#: src/view/screens/Notifications.tsx:108
#: src/view/screens/Notifications.tsx:132
#: src/view/screens/Notifications.tsx:109
#: src/view/screens/Notifications.tsx:133
#: src/view/shell/bottom-bar/BottomBar.tsx:187
#: src/view/shell/desktop/LeftNav.tsx:355
#: src/view/shell/desktop/LeftNav.tsx:354
#: src/view/shell/Drawer.tsx:416
#: src/view/shell/Drawer.tsx:417
msgid "Notifications"
@@ -1562,12 +1590,12 @@ msgid "Please tell us why you think this decision was incorrect."
msgstr ""
#: src/view/com/composer/Composer.tsx:331
#: src/view/com/post-thread/PostThread.tsx:223
#: src/view/com/post-thread/PostThread.tsx:226
#: src/view/screens/PostThread.tsx:78
msgid "Post"
msgstr "पोस्ट"
#: src/view/com/post-thread/PostThread.tsx:382
#: src/view/com/post-thread/PostThread.tsx:385
msgid "Post hidden"
msgstr "छुपा पोस्ट"
@@ -1579,7 +1607,7 @@ msgstr "पोस्ट भाषा"
msgid "Post Languages"
msgstr "पोस्ट भाषा"
#: src/view/com/post-thread/PostThread.tsx:434
#: src/view/com/post-thread/PostThread.tsx:437
msgid "Post not found"
msgstr "पोस्ट नहीं मिला"
@@ -1682,7 +1710,7 @@ msgstr "फ़ीड हटाएँ"
#: src/view/com/feeds/FeedSourceCard.tsx:105
#: src/view/com/feeds/FeedSourceCard.tsx:172
#: src/view/screens/ProfileFeed.tsx:280
#: src/view/screens/ProfileFeed.tsx:275
msgid "Remove from my feeds"
msgstr "मेरे फ़ीड से हटाएँ"
@@ -1727,11 +1755,11 @@ msgstr "रिपोर्ट {collectionName}"
msgid "Report Account"
msgstr "रिपोर्ट"
#: src/view/screens/ProfileFeed.tsx:300
#: src/view/screens/ProfileFeed.tsx:295
msgid "Report feed"
msgstr "रिपोर्ट फ़ीड"
#: src/view/screens/ProfileList.tsx:448
#: src/view/screens/ProfileList.tsx:424
msgid "Report List"
msgstr "रिपोर्ट सूची"
@@ -1843,8 +1871,8 @@ msgstr "सहेजे गए फ़ीड"
#: src/view/com/modals/ListAddRemoveUsers.tsx:75
#: src/view/com/util/forms/SearchInput.tsx:64
#: src/view/screens/Search/Search.tsx:381
#: src/view/screens/Search/Search.tsx:533
#: src/view/screens/Search/Search.tsx:401
#: src/view/screens/Search/Search.tsx:567
#: src/view/shell/bottom-bar/BottomBar.tsx:138
#: src/view/shell/desktop/LeftNav.tsx:315
#: src/view/shell/desktop/Search.tsx:161
@@ -1855,13 +1883,14 @@ msgid "Search"
msgstr "खोज"
#: src/view/screens/Search/Search.tsx:390
msgid "Search for posts and users."
msgstr ""
#~ msgid "Search for posts and users."
#~ msgstr ""
#: src/view/com/modals/ChangeEmail.tsx:110
msgid "Security Step Required"
msgstr "सुरक्षा चरण आवश्यक"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:39
#: src/view/com/auth/SplashScreen.tsx:29
msgid "See what's next"
msgstr "आगे क्या है"
@@ -1936,7 +1965,7 @@ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your f
msgstr "इस सेटिंग को अपने निम्नलिखित फ़ीड में अपने सहेजे गए फ़ीड के नमूने दिखाने के लिए \"हाँ\" पर सेट करें। यह एक प्रयोगात्मक विशेषता है।।"
#: src/view/screens/Settings.tsx:277
#: src/view/shell/desktop/LeftNav.tsx:427
#: src/view/shell/desktop/LeftNav.tsx:426
#: src/view/shell/Drawer.tsx:546
#: src/view/shell/Drawer.tsx:547
msgid "Settings"
@@ -1948,11 +1977,11 @@ msgstr "यौन गतिविधि या कामुक नग्नत
#: src/view/com/profile/ProfileHeader.tsx:338
#: src/view/com/util/forms/PostDropdownBtn.tsx:129
#: src/view/screens/ProfileList.tsx:407
#: src/view/screens/ProfileList.tsx:383
msgid "Share"
msgstr "शेयर"
#: src/view/screens/ProfileFeed.tsx:312
#: src/view/screens/ProfileFeed.tsx:307
msgid "Share feed"
msgstr ""
@@ -1960,11 +1989,12 @@ msgstr ""
#~ msgid "Share link"
#~ msgstr "लिंक शेयर करें"
#: src/view/com/util/moderation/ContentHider.tsx:105
#: src/view/screens/Settings.tsx:316
msgid "Show"
msgstr "दिखाओ"
#: src/view/com/util/moderation/ScreenHider.tsx:114
#: src/view/com/util/moderation/ScreenHider.tsx:132
msgid "Show anyway"
msgstr "दिखाओ"
@@ -1992,13 +2022,15 @@ msgstr "रीपोस्ट दिखाएँ"
msgid "Show users"
msgstr "लोग दिखाएँ"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:70
#: src/view/com/auth/login/Login.tsx:98
#: src/view/com/auth/SplashScreen.tsx:49
#: src/view/shell/NavSignupCard.tsx:52
#: src/view/shell/NavSignupCard.tsx:53
#: src/view/shell/NavSignupCard.tsx:58
#: src/view/shell/NavSignupCard.tsx:59
msgid "Sign in"
msgstr "साइन इन करें"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:78
#: src/view/com/auth/SplashScreen.tsx:52
#: src/view/com/auth/SplashScreen.web.tsx:84
msgid "Sign In"
@@ -2022,16 +2054,20 @@ msgstr "साइन इन करें"
msgid "Sign out"
msgstr "साइन आउट"
#: src/view/shell/NavSignupCard.tsx:43
#: src/view/shell/NavSignupCard.tsx:44
#: src/view/shell/NavSignupCard.tsx:46
#: src/view/shell/NavSignupCard.tsx:49
#: src/view/shell/NavSignupCard.tsx:50
#: src/view/shell/NavSignupCard.tsx:52
msgid "Sign up"
msgstr ""
#: src/view/shell/NavSignupCard.tsx:36
#: src/view/shell/NavSignupCard.tsx:42
msgid "Sign up or sign in to join the conversation"
msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:76
msgid "Sign-in Required"
msgstr ""
#: src/view/screens/Settings.tsx:327
msgid "Signed in as"
msgstr "आपने इस रूप में साइन इन करा है:"
@@ -2069,15 +2105,15 @@ msgstr "Storybook"
msgid "Submit"
msgstr ""
#: src/view/screens/ProfileList.tsx:597
#: src/view/screens/ProfileList.tsx:573
msgid "Subscribe"
msgstr "सब्सक्राइब"
#: src/view/screens/ProfileList.tsx:593
#: src/view/screens/ProfileList.tsx:569
msgid "Subscribe to this list"
msgstr "इस सूची को सब्सक्राइब करें"
#: src/view/screens/Search/Search.tsx:354
#: src/view/screens/Search/Search.tsx:357
msgid "Suggested Follows"
msgstr "अनुशंसित लोग"
@@ -2127,7 +2163,7 @@ msgstr "सामुदायिक दिशानिर्देशों क
msgid "The Copyright Policy has been moved to <0/>"
msgstr "कॉपीराइट नीति को <0/> पर स्थानांतरित कर दिया गया है"
#: src/view/com/post-thread/PostThread.tsx:437
#: src/view/com/post-thread/PostThread.tsx:440
msgid "The post may have been deleted."
msgstr "हो सकता है कि यह पोस्ट हटा दी गई हो।"
@@ -2151,10 +2187,14 @@ msgstr "एप्लिकेशन में एक अप्रत्याश
msgid "This {0} has been labeled."
msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:72
#: src/view/com/util/moderation/ScreenHider.tsx:88
msgid "This {screenDescription} has been flagged:"
msgstr "यह {screenDescription} फ्लैग किया गया है:"
#: src/view/com/util/moderation/ScreenHider.tsx:83
msgid "This account has requested that users sign in to view their profile."
msgstr ""
#: src/view/com/posts/FeedErrorMessage.tsx:107
msgid "This content is not viewable without a Bluesky account."
msgstr ""
@@ -2214,11 +2254,11 @@ msgstr "अनुवाद"
msgid "Try again"
msgstr "फिर से कोशिश करो"
#: src/view/screens/ProfileList.tsx:495
#: src/view/screens/ProfileList.tsx:471
msgid "Un-block list"
msgstr ""
#: src/view/screens/ProfileList.tsx:480
#: src/view/screens/ProfileList.tsx:456
msgid "Un-mute list"
msgstr ""
@@ -2254,7 +2294,7 @@ msgstr "अनम्यूट खाता"
msgid "Unmute thread"
msgstr "थ्रेड को अनम्यूट करें"
#: src/view/screens/ProfileList.tsx:463
#: src/view/screens/ProfileList.tsx:439
msgid "Unpin moderation list"
msgstr ""
@@ -2303,7 +2343,7 @@ msgstr "लोग सूचियाँ"
msgid "Username or email address"
msgstr "यूजर नाम या ईमेल पता"
#: src/view/screens/ProfileList.tsx:767
#: src/view/screens/ProfileList.tsx:737
msgid "Users"
msgstr "यूजर लोग"
@@ -2360,7 +2400,7 @@ msgstr "हम आपके हमारी सेवा में शामि
#~ msgid "We're sorry, but this feed is currently receiving high traffic and is temporarily unavailable. Please try again later."
#~ msgstr ""
#: src/view/screens/Search/Search.tsx:237
#: src/view/screens/Search/Search.tsx:238
msgid "We're sorry, but your search could not be completed. Please try again in a few minutes."
msgstr ""
@@ -2436,16 +2476,16 @@ msgstr ""
msgid "You don't have any saved feeds."
msgstr "आपके पास कोई सहेजी गई फ़ीड नहीं है."
#: src/view/com/post-thread/PostThread.tsx:385
#: src/view/com/post-thread/PostThread.tsx:388
msgid "You have blocked the author or you have been blocked by the author."
msgstr "आपने लेखक को अवरुद्ध किया है या आपने लेखक द्वारा अवरुद्ध किया है।।"
#: src/view/com/feeds/ProfileFeedgens.tsx:154
#: src/view/com/feeds/ProfileFeedgens.tsx:141
msgid "You have no feeds."
msgstr ""
#: src/view/com/lists/MyLists.tsx:89
#: src/view/com/lists/ProfileLists.tsx:158
#: src/view/com/lists/ProfileLists.tsx:145
msgid "You have no lists."
msgstr "आपके पास कोई सूची नहीं है।।"
+138 -98
View File
@@ -39,7 +39,7 @@ msgstr ""
msgid "{invitesAvailable} invite codes available"
msgstr ""
#: src/view/screens/Search/Search.tsx:87
#: src/view/screens/Search/Search.tsx:88
msgid "{message}"
msgstr "{message}"
@@ -75,7 +75,7 @@ msgstr "アカウントオプション"
#: src/view/com/modals/ListAddRemoveUsers.tsx:264
#: src/view/com/modals/UserAddRemoveLists.tsx:193
#: src/view/screens/ProfileList.tsx:783
#: src/view/screens/ProfileList.tsx:753
msgid "Add"
msgstr "追加"
@@ -83,7 +83,7 @@ msgstr "追加"
msgid "Add a content warning"
msgstr "コンテンツ警告を追加"
#: src/view/screens/ProfileList.tsx:773
#: src/view/screens/ProfileList.tsx:743
msgid "Add a user to this list"
msgstr "リストにユーザーを追加"
@@ -122,7 +122,7 @@ msgstr "次のDNSレコードをドメインに追加してください:"
msgid "Add to Lists"
msgstr "リストに追加"
#: src/view/screens/ProfileFeed.tsx:280
#: src/view/screens/ProfileFeed.tsx:275
msgid "Add to my feeds"
msgstr "マイフィードに追加"
@@ -204,7 +204,7 @@ msgstr "本当にアプリパスワード「{name}」を削除しますか?"
msgid "Are you sure you'd like to discard this draft?"
msgstr "本当にこの下書きを破棄しますか?"
#: src/view/screens/ProfileList.tsx:375
#: src/view/screens/ProfileList.tsx:351
msgid "Are you sure?"
msgstr "本当ですか?"
@@ -222,9 +222,9 @@ msgstr "芸術的または非エロティックなヌード。"
#: src/view/com/auth/login/LoginForm.tsx:249
#: src/view/com/auth/login/SetNewPasswordForm.tsx:148
#: src/view/com/modals/report/InputIssueDetails.tsx:45
#: src/view/com/post-thread/PostThread.tsx:392
#: src/view/com/post-thread/PostThread.tsx:442
#: src/view/com/post-thread/PostThread.tsx:450
#: src/view/com/post-thread/PostThread.tsx:395
#: src/view/com/post-thread/PostThread.tsx:445
#: src/view/com/post-thread/PostThread.tsx:453
#: src/view/com/profile/ProfileHeader.tsx:672
msgid "Back"
msgstr "戻る"
@@ -247,15 +247,15 @@ msgstr "誕生日:"
msgid "Block Account"
msgstr "アカウントのブロック"
#: src/view/screens/ProfileList.tsx:545
#: src/view/screens/ProfileList.tsx:521
msgid "Block accounts"
msgstr "アカウントのブロック"
#: src/view/screens/ProfileList.tsx:495
#: src/view/screens/ProfileList.tsx:471
msgid "Block list"
msgstr ""
#: src/view/screens/ProfileList.tsx:330
#: src/view/screens/ProfileList.tsx:306
msgid "Block these accounts?"
msgstr "これらのアカウントをブロックしますか?"
@@ -275,14 +275,19 @@ msgstr "ブロックされたアカウントは、スレッド内で返信した
msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours."
msgstr "ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。あなたは相手のコンテンツを見ることができず、相手はあなたのコンテンツを見ることができなくなります。"
#: src/view/com/post-thread/PostThread.tsx:248
#: src/view/com/post-thread/PostThread.tsx:251
msgid "Blocked post."
msgstr "投稿をブロックしました。"
#: src/view/screens/ProfileList.tsx:332
#: src/view/screens/ProfileList.tsx:308
msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
msgstr "ブロックは公開されます。ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:93
msgid "Blog"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:31
#: src/view/com/auth/SplashScreen.tsx:26
msgid "Bluesky"
msgstr "Bluesky"
@@ -315,6 +320,10 @@ msgstr "Bluesky.Social"
msgid "Build version {0} {1}"
msgstr "ビルドバージョン {0} {1}"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:87
msgid "Business"
msgstr ""
#: src/view/com/composer/photos/OpenCameraBtn.tsx:60
#: src/view/com/util/UserAvatar.tsx:221
#: src/view/com/util/UserBanner.tsx:38
@@ -340,7 +349,7 @@ msgstr "文字、数字、スペース、ハイフン、およびアンダース
#: src/view/com/modals/LinkWarning.tsx:85
#: src/view/com/modals/Repost.tsx:73
#: src/view/com/modals/Waitlist.tsx:136
#: src/view/screens/Search/Search.tsx:558
#: src/view/screens/Search/Search.tsx:592
#: src/view/shell/desktop/Search.tsx:182
msgid "Cancel"
msgstr "キャンセル"
@@ -441,7 +450,7 @@ msgid "Clear all storage data (restart after this)"
msgstr "すべてのストレージデータをクリア(この後再起動)"
#: src/view/com/util/forms/SearchInput.tsx:73
#: src/view/screens/Search/Search.tsx:543
#: src/view/screens/Search/Search.tsx:577
msgid "Clear search query"
msgstr "検索クエリをクリア"
@@ -519,7 +528,7 @@ msgstr "コンテンツフィルタリング"
msgid "Content Languages"
msgstr "コンテンツ言語"
#: src/view/com/util/moderation/ScreenHider.tsx:69
#: src/view/com/util/moderation/ScreenHider.tsx:78
msgid "Content Warning"
msgstr "コンテンツ警告"
@@ -541,7 +550,7 @@ msgstr "コピー済み"
msgid "Copy"
msgstr "コピー"
#: src/view/screens/ProfileList.tsx:407
#: src/view/screens/ProfileList.tsx:383
msgid "Copy link to list"
msgstr ""
@@ -561,14 +570,15 @@ msgstr "投稿テキストをコピー"
msgid "Copyright Policy"
msgstr "著作権ポリシー"
#: src/view/screens/ProfileFeed.tsx:103
#: src/view/screens/ProfileFeed.tsx:98
msgid "Could not load feed"
msgstr "フィードのロードに失敗"
#: src/view/screens/ProfileList.tsx:860
#: src/view/screens/ProfileList.tsx:829
msgid "Could not load list"
msgstr "リストのロードに失敗"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:62
#: src/view/com/auth/SplashScreen.tsx:41
msgid "Create a new account"
msgstr "新しいアカウントを作成"
@@ -577,6 +587,7 @@ msgstr "新しいアカウントを作成"
msgid "Create Account"
msgstr "アカウントを作成"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:54
#: src/view/com/auth/SplashScreen.tsx:38
msgid "Create new account"
msgstr "新しいアカウントを作成"
@@ -607,8 +618,8 @@ msgstr "アカウントを削除"
msgid "Delete app password"
msgstr "アプリパスワードを削除"
#: src/view/screens/ProfileList.tsx:374
#: src/view/screens/ProfileList.tsx:434
#: src/view/screens/ProfileList.tsx:350
#: src/view/screens/ProfileList.tsx:410
msgid "Delete List"
msgstr "リストを削除"
@@ -628,7 +639,7 @@ msgstr "投稿を削除"
msgid "Delete this post?"
msgstr "この投稿を削除しますか?"
#: src/view/com/post-thread/PostThread.tsx:240
#: src/view/com/post-thread/PostThread.tsx:243
msgid "Deleted post."
msgstr "投稿を削除しました。"
@@ -703,7 +714,7 @@ msgstr "それぞれのコードは一度ずつ動作します。定期的によ
msgid "Edit image"
msgstr "画像を編集"
#: src/view/screens/ProfileList.tsx:422
#: src/view/screens/ProfileList.tsx:398
msgid "Edit list details"
msgstr "リストの詳細を編集"
@@ -751,7 +762,7 @@ msgstr "Eメール:"
msgid "Enable this setting to only see replies between people you follow."
msgstr "この設定を有効にすると、フォローしているユーザー間の応答だけが表示されます。"
#: src/view/screens/Profile.tsx:471
#: src/view/screens/Profile.tsx:425
msgid "End of feed"
msgstr ""
@@ -779,7 +790,7 @@ msgstr "以下に新しいメールアドレスを入力してください。"
msgid "Enter your username and password"
msgstr "ユーザー名とパスワードを入力"
#: src/view/screens/Search/Search.tsx:105
#: src/view/screens/Search/Search.tsx:106
msgid "Error:"
msgstr "エラー:"
@@ -800,7 +811,7 @@ msgstr "推奨フィードのロードに失敗"
msgid "Feed offline"
msgstr "フィードはオフライン"
#: src/view/com/feeds/FeedPage.tsx:140
#: src/view/com/feeds/FeedPage.tsx:143
msgid "Feed Preferences"
msgstr "フィード設定"
@@ -811,8 +822,8 @@ msgstr "フィードバック"
#: src/view/screens/Feeds.tsx:475
#: src/view/screens/Profile.tsx:164
#: src/view/shell/bottom-bar/BottomBar.tsx:160
#: src/view/shell/desktop/LeftNav.tsx:333
#: src/view/shell/bottom-bar/BottomBar.tsx:163
#: src/view/shell/desktop/LeftNav.tsx:335
#: src/view/shell/Drawer.tsx:455
#: src/view/shell/Drawer.tsx:456
msgid "Feeds"
@@ -826,6 +837,14 @@ msgstr "フィードはコンテンツを整理する為にユーザーによっ
msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information."
msgstr "フィードはユーザーがプログラミングの専門知識を持って構築するカスタムアルゴリズムです。詳細については、<0/>を参照してください。"
#: src/view/screens/Search/Search.tsx:422
msgid "Find users on Bluesky"
msgstr ""
#: src/view/screens/Search/Search.tsx:420
msgid "Find users with the search tool on the right"
msgstr ""
#: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150
msgid "Finding similar accounts..."
msgstr "似通ったアカウントを検索中..."
@@ -900,17 +919,17 @@ msgstr "ギャラリー"
msgid "Get Started"
msgstr "はじめに"
#: src/view/com/auth/LoggedOut.tsx:68
#: src/view/com/auth/LoggedOut.tsx:69
#: src/view/com/util/moderation/ScreenHider.tsx:105
#: src/view/com/auth/LoggedOut.tsx:70
#: src/view/com/auth/LoggedOut.tsx:71
#: src/view/com/util/moderation/ScreenHider.tsx:123
#: src/view/shell/desktop/LeftNav.tsx:103
msgid "Go back"
msgstr "戻る"
#: src/view/screens/ProfileFeed.tsx:107
#: src/view/screens/ProfileFeed.tsx:112
#: src/view/screens/ProfileFeed.tsx:117
#: src/view/screens/ProfileList.tsx:869
#: src/view/screens/ProfileList.tsx:874
#: src/view/screens/ProfileList.tsx:838
#: src/view/screens/ProfileList.tsx:843
msgid "Go Back"
msgstr "戻る"
@@ -934,6 +953,7 @@ msgid "Here is your app password."
msgstr "アプリパスワードをお知らせします。"
#: src/view/com/notifications/FeedItem.tsx:316
#: src/view/com/util/moderation/ContentHider.tsx:103
msgid "Hide"
msgstr "非表示"
@@ -1029,6 +1049,10 @@ msgstr "招待コードが確認できません。正しく入力されている
msgid "Invite codes: {invitesAvailable} available"
msgstr ""
#: src/view/com/auth/HomeLoggedOutCTA.tsx:99
msgid "Jobs"
msgstr ""
#: src/view/com/modals/Waitlist.tsx:67
msgid "Join the waitlist"
msgstr "待機リストに参加"
@@ -1054,9 +1078,13 @@ msgstr "言語設定"
msgid "Languages"
msgstr "言語"
#: src/view/com/util/moderation/ContentHider.tsx:101
msgid "Learn more"
msgstr ""
#: src/view/com/util/moderation/PostAlerts.tsx:47
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65
#: src/view/com/util/moderation/ScreenHider.tsx:88
#: src/view/com/util/moderation/ScreenHider.tsx:104
msgid "Learn More"
msgstr "詳細"
@@ -1064,7 +1092,7 @@ msgstr "詳細"
#: src/view/com/util/moderation/PostAlerts.tsx:40
#: src/view/com/util/moderation/PostHider.tsx:76
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:49
#: src/view/com/util/moderation/ScreenHider.tsx:85
#: src/view/com/util/moderation/ScreenHider.tsx:101
msgid "Learn more about this warning"
msgstr "この警告の詳細"
@@ -1090,7 +1118,7 @@ msgstr "パスワードをリセットしましょう!"
msgid "Library"
msgstr "ライブラリー"
#: src/view/screens/ProfileFeed.tsx:643
#: src/view/screens/ProfileFeed.tsx:627
msgid "Like this feed"
msgstr "このフィードをいいね"
@@ -1116,22 +1144,22 @@ msgid "List Name"
msgstr "リスト名"
#: src/view/screens/Profile.tsx:165
#: src/view/shell/desktop/LeftNav.tsx:373
#: src/view/shell/desktop/LeftNav.tsx:372
#: src/view/shell/Drawer.tsx:471
#: src/view/shell/Drawer.tsx:472
msgid "Lists"
msgstr "リスト"
#: src/view/com/post-thread/PostThread.tsx:257
#: src/view/com/post-thread/PostThread.tsx:265
#: src/view/com/post-thread/PostThread.tsx:260
#: src/view/com/post-thread/PostThread.tsx:268
msgid "Load more posts"
msgstr "より多くの投稿をロード"
#: src/view/screens/Notifications.tsx:141
#: src/view/screens/Notifications.tsx:144
msgid "Load new notifications"
msgstr "新しい通知をロード"
#: src/view/com/feeds/FeedPage.tsx:185
#: src/view/com/feeds/FeedPage.tsx:189
msgid "Load new posts"
msgstr "新しい投稿をロード"
@@ -1155,7 +1183,7 @@ msgstr ""
msgid "Login to account that is not listed"
msgstr "リストにないアカウントにログイン"
#: src/view/screens/ProfileFeed.tsx:482
#: src/view/screens/ProfileFeed.tsx:472
msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
msgstr ""
@@ -1175,18 +1203,18 @@ msgstr ""
msgid "Mentioned users"
msgstr ""
#: src/view/screens/Search/Search.tsx:503
#: src/view/screens/Search/Search.tsx:537
msgid "Menu"
msgstr "メニュー"
#: src/view/com/posts/FeedErrorMessage.tsx:194
#: src/view/screens/ProfileFeed.tsx:490
#: src/view/screens/ProfileFeed.tsx:480
msgid "Message from server"
msgstr ""
#: src/view/screens/Moderation.tsx:64
#: src/view/screens/Settings.tsx:563
#: src/view/shell/desktop/LeftNav.tsx:391
#: src/view/shell/desktop/LeftNav.tsx:390
#: src/view/shell/Drawer.tsx:490
#: src/view/shell/Drawer.tsx:491
msgid "Moderation"
@@ -1205,8 +1233,8 @@ msgid "More feeds"
msgstr "その他のフィード"
#: src/view/com/profile/ProfileHeader.tsx:548
#: src/view/screens/ProfileFeed.tsx:370
#: src/view/screens/ProfileList.tsx:606
#: src/view/screens/ProfileFeed.tsx:365
#: src/view/screens/ProfileList.tsx:582
msgid "More options"
msgstr "その他のオプション"
@@ -1214,15 +1242,15 @@ msgstr "その他のオプション"
msgid "Mute Account"
msgstr "アカウントをミュート"
#: src/view/screens/ProfileList.tsx:533
#: src/view/screens/ProfileList.tsx:509
msgid "Mute accounts"
msgstr "アカウントをミュート"
#: src/view/screens/ProfileList.tsx:480
#: src/view/screens/ProfileList.tsx:456
msgid "Mute list"
msgstr ""
#: src/view/screens/ProfileList.tsx:293
#: src/view/screens/ProfileList.tsx:269
msgid "Mute these accounts?"
msgstr "これらのアカウントをミュートしますか?"
@@ -1242,7 +1270,7 @@ msgstr "ミュート済みアカウント"
msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private."
msgstr "ミュート済みのアカウントは、フィードと通知からの投稿が削除されます。ミュート設定は知られることはありません。"
#: src/view/screens/ProfileList.tsx:295
#: src/view/screens/ProfileList.tsx:271
msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them."
msgstr "ミュートはプライベートです。ミュート済みアカウントはユーザーと相互作用することができますが、そのアカウントの投稿や通知を受信することはできません。"
@@ -1276,12 +1304,12 @@ msgstr "決してフォロワーやデータへのアクセスを失わないで
msgid "New"
msgstr "新規"
#: src/view/com/feeds/FeedPage.tsx:196
#: src/view/com/feeds/FeedPage.tsx:200
#: src/view/screens/Feeds.tsx:510
#: src/view/screens/Profile.tsx:389
#: src/view/screens/ProfileFeed.tsx:451
#: src/view/screens/ProfileList.tsx:212
#: src/view/screens/ProfileList.tsx:244
#: src/view/screens/Profile.tsx:353
#: src/view/screens/ProfileFeed.tsx:441
#: src/view/screens/ProfileList.tsx:192
#: src/view/screens/ProfileList.tsx:220
#: src/view/shell/desktop/LeftNav.tsx:246
msgid "New post"
msgstr "新しい投稿"
@@ -1310,8 +1338,8 @@ msgstr "次の画像"
msgid "No"
msgstr "なし"
#: src/view/screens/ProfileFeed.tsx:636
#: src/view/screens/ProfileList.tsx:740
#: src/view/screens/ProfileFeed.tsx:620
#: src/view/screens/ProfileList.tsx:710
msgid "No description"
msgstr "説明なし"
@@ -1324,9 +1352,9 @@ msgid "No results found for \"{query}\""
msgstr "「\\{query}」の検索結果がない"
#: src/view/com/modals/ListAddRemoveUsers.tsx:127
#: src/view/screens/Search/Search.tsx:270
#: src/view/screens/Search/Search.tsx:298
#: src/view/screens/Search/Search.tsx:581
#: src/view/screens/Search/Search.tsx:271
#: src/view/screens/Search/Search.tsx:299
#: src/view/screens/Search/Search.tsx:615
#: src/view/shell/desktop/Search.tsx:210
msgid "No results found for {query}"
msgstr "\\{query}の検索結果がない"
@@ -1347,10 +1375,10 @@ msgstr "該当なし。"
msgid "Note: Bluesky is an open and public network. This setting only limits the visibility of your content on the Bluesky app and website, and other apps may not respect this setting. Your content may still be shown to logged-out users by other apps and websites."
msgstr ""
#: src/view/screens/Notifications.tsx:108
#: src/view/screens/Notifications.tsx:132
#: src/view/screens/Notifications.tsx:109
#: src/view/screens/Notifications.tsx:133
#: src/view/shell/bottom-bar/BottomBar.tsx:187
#: src/view/shell/desktop/LeftNav.tsx:355
#: src/view/shell/desktop/LeftNav.tsx:354
#: src/view/shell/Drawer.tsx:416
#: src/view/shell/Drawer.tsx:417
msgid "Notifications"
@@ -1488,12 +1516,12 @@ msgid "Please tell us why you think this decision was incorrect."
msgstr ""
#: src/view/com/composer/Composer.tsx:331
#: src/view/com/post-thread/PostThread.tsx:223
#: src/view/com/post-thread/PostThread.tsx:226
#: src/view/screens/PostThread.tsx:78
msgid "Post"
msgstr "投稿"
#: src/view/com/post-thread/PostThread.tsx:382
#: src/view/com/post-thread/PostThread.tsx:385
msgid "Post hidden"
msgstr "投稿非表示"
@@ -1505,7 +1533,7 @@ msgstr "ポスト言語"
msgid "Post Languages"
msgstr "投稿言語"
#: src/view/com/post-thread/PostThread.tsx:434
#: src/view/com/post-thread/PostThread.tsx:437
msgid "Post not found"
msgstr "投稿が見つからない"
@@ -1603,7 +1631,7 @@ msgstr "フィードを削除"
#: src/view/com/feeds/FeedSourceCard.tsx:105
#: src/view/com/feeds/FeedSourceCard.tsx:172
#: src/view/screens/ProfileFeed.tsx:280
#: src/view/screens/ProfileFeed.tsx:275
msgid "Remove from my feeds"
msgstr "マイフィードから削除"
@@ -1648,11 +1676,11 @@ msgstr "レポート \\{collectionName}"
msgid "Report Account"
msgstr "レポートアカウント"
#: src/view/screens/ProfileFeed.tsx:300
#: src/view/screens/ProfileFeed.tsx:295
msgid "Report feed"
msgstr "レポートフィード"
#: src/view/screens/ProfileList.tsx:448
#: src/view/screens/ProfileList.tsx:424
msgid "Report List"
msgstr "レポートリスト"
@@ -1748,8 +1776,8 @@ msgstr "保存済みフィード"
#: src/view/com/modals/ListAddRemoveUsers.tsx:75
#: src/view/com/util/forms/SearchInput.tsx:64
#: src/view/screens/Search/Search.tsx:381
#: src/view/screens/Search/Search.tsx:533
#: src/view/screens/Search/Search.tsx:401
#: src/view/screens/Search/Search.tsx:567
#: src/view/shell/bottom-bar/BottomBar.tsx:138
#: src/view/shell/desktop/LeftNav.tsx:315
#: src/view/shell/desktop/Search.tsx:161
@@ -1760,13 +1788,14 @@ msgid "Search"
msgstr "検索"
#: src/view/screens/Search/Search.tsx:390
msgid "Search for posts and users."
msgstr "投稿とユーザーを検索します。"
#~ msgid "Search for posts and users."
#~ msgstr "投稿とユーザーを検索します。"
#: src/view/com/modals/ChangeEmail.tsx:110
msgid "Security Step Required"
msgstr "必要なセキュリティ手順"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:39
#: src/view/com/auth/SplashScreen.tsx:29
msgid "See what's next"
msgstr "次を見る"
@@ -1841,7 +1870,7 @@ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your f
msgstr "保存したフィードのサンプルを次のフィードに表示するには、この設定を「はい」にします。これは実験的な機能です。"
#: src/view/screens/Settings.tsx:277
#: src/view/shell/desktop/LeftNav.tsx:427
#: src/view/shell/desktop/LeftNav.tsx:426
#: src/view/shell/Drawer.tsx:546
#: src/view/shell/Drawer.tsx:547
msgid "Settings"
@@ -1853,19 +1882,20 @@ msgstr "性行為またはエロティックなヌード。"
#: src/view/com/profile/ProfileHeader.tsx:338
#: src/view/com/util/forms/PostDropdownBtn.tsx:129
#: src/view/screens/ProfileList.tsx:407
#: src/view/screens/ProfileList.tsx:383
msgid "Share"
msgstr "共有"
#: src/view/screens/ProfileFeed.tsx:312
#: src/view/screens/ProfileFeed.tsx:307
msgid "Share feed"
msgstr "フィードを共有"
#: src/view/com/util/moderation/ContentHider.tsx:105
#: src/view/screens/Settings.tsx:316
msgid "Show"
msgstr "表示"
#: src/view/com/util/moderation/ScreenHider.tsx:114
#: src/view/com/util/moderation/ScreenHider.tsx:132
msgid "Show anyway"
msgstr "とにかく表示"
@@ -1893,13 +1923,15 @@ msgstr "再投稿を表示"
msgid "Show users"
msgstr "ユーザーを表示"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:70
#: src/view/com/auth/login/Login.tsx:98
#: src/view/com/auth/SplashScreen.tsx:49
#: src/view/shell/NavSignupCard.tsx:52
#: src/view/shell/NavSignupCard.tsx:53
#: src/view/shell/NavSignupCard.tsx:58
#: src/view/shell/NavSignupCard.tsx:59
msgid "Sign in"
msgstr "サインイン"
#: src/view/com/auth/HomeLoggedOutCTA.tsx:78
#: src/view/com/auth/SplashScreen.tsx:52
#: src/view/com/auth/SplashScreen.web.tsx:84
msgid "Sign In"
@@ -1923,16 +1955,20 @@ msgstr "サインイン"
msgid "Sign out"
msgstr "サインアウト"
#: src/view/shell/NavSignupCard.tsx:43
#: src/view/shell/NavSignupCard.tsx:44
#: src/view/shell/NavSignupCard.tsx:46
#: src/view/shell/NavSignupCard.tsx:49
#: src/view/shell/NavSignupCard.tsx:50
#: src/view/shell/NavSignupCard.tsx:52
msgid "Sign up"
msgstr "サインアップ"
#: src/view/shell/NavSignupCard.tsx:36
#: src/view/shell/NavSignupCard.tsx:42
msgid "Sign up or sign in to join the conversation"
msgstr "登録またはログインして会話に参加する"
#: src/view/com/util/moderation/ScreenHider.tsx:76
msgid "Sign-in Required"
msgstr ""
#: src/view/screens/Settings.tsx:327
msgid "Signed in as"
msgstr "サインイン済み"
@@ -1970,15 +2006,15 @@ msgstr "ストーリーブック"
msgid "Submit"
msgstr ""
#: src/view/screens/ProfileList.tsx:597
#: src/view/screens/ProfileList.tsx:573
msgid "Subscribe"
msgstr "登録"
#: src/view/screens/ProfileList.tsx:593
#: src/view/screens/ProfileList.tsx:569
msgid "Subscribe to this list"
msgstr "このリストに登録"
#: src/view/screens/Search/Search.tsx:354
#: src/view/screens/Search/Search.tsx:357
msgid "Suggested Follows"
msgstr "推奨されるフォロー"
@@ -2024,7 +2060,7 @@ msgstr "コミュニティ ガイドラインが<0/>に移動された"
msgid "The Copyright Policy has been moved to <0/>"
msgstr "著作権ポリシーが<0/>に移動された"
#: src/view/com/post-thread/PostThread.tsx:437
#: src/view/com/post-thread/PostThread.tsx:440
msgid "The post may have been deleted."
msgstr "投稿が削除された可能性があります。"
@@ -2048,10 +2084,14 @@ msgstr "アプリケーションに予期しない問題が発生しました。
msgid "This {0} has been labeled."
msgstr ""
#: src/view/com/util/moderation/ScreenHider.tsx:72
#: src/view/com/util/moderation/ScreenHider.tsx:88
msgid "This {screenDescription} has been flagged:"
msgstr "この\\{screenDescription}にはフラグが設定されています。"
#: src/view/com/util/moderation/ScreenHider.tsx:83
msgid "This account has requested that users sign in to view their profile."
msgstr ""
#: src/view/com/posts/FeedErrorMessage.tsx:107
msgid "This content is not viewable without a Bluesky account."
msgstr ""
@@ -2111,11 +2151,11 @@ msgstr "翻訳"
msgid "Try again"
msgstr "再試行"
#: src/view/screens/ProfileList.tsx:495
#: src/view/screens/ProfileList.tsx:471
msgid "Un-block list"
msgstr ""
#: src/view/screens/ProfileList.tsx:480
#: src/view/screens/ProfileList.tsx:456
msgid "Un-mute list"
msgstr ""
@@ -2151,7 +2191,7 @@ msgstr "アカウントのミュート解除"
msgid "Unmute thread"
msgstr "スレッドのミュート解除"
#: src/view/screens/ProfileList.tsx:463
#: src/view/screens/ProfileList.tsx:439
msgid "Unpin moderation list"
msgstr ""
@@ -2200,7 +2240,7 @@ msgstr "ユーザーリスト"
msgid "Username or email address"
msgstr "ユーザー名またはEメールアドレス"
#: src/view/screens/ProfileList.tsx:767
#: src/view/screens/ProfileList.tsx:737
msgid "Users"
msgstr "ユーザー"
@@ -2245,7 +2285,7 @@ msgstr "サイトへアクセス"
msgid "We're so excited to have you join us!"
msgstr "あなたが参加してくれることをとても楽しみにしています!"
#: src/view/screens/Search/Search.tsx:237
#: src/view/screens/Search/Search.tsx:238
msgid "We're sorry, but your search could not be completed. Please try again in a few minutes."
msgstr "申し訳ありませんが、検索を完了できませんでした。数分後に再試行してください。"
@@ -2317,16 +2357,16 @@ msgstr "保存されたフィードがありません!"
msgid "You don't have any saved feeds."
msgstr "保存されたフィードがありません。"
#: src/view/com/post-thread/PostThread.tsx:385
#: src/view/com/post-thread/PostThread.tsx:388
msgid "You have blocked the author or you have been blocked by the author."
msgstr "著者をブロックしたか、または著者によってブロックされました。"
#: src/view/com/feeds/ProfileFeedgens.tsx:154
#: src/view/com/feeds/ProfileFeedgens.tsx:141
msgid "You have no feeds."
msgstr ""
#: src/view/com/lists/MyLists.tsx:89
#: src/view/com/lists/ProfileLists.tsx:158
#: src/view/com/lists/ProfileLists.tsx:145
msgid "You have no lists."
msgstr "リストがありません。"
+38 -5
View File
@@ -1,16 +1,27 @@
import React from 'react'
import {AppBskyActorDefs} from '@atproto/api'
import {AppBskyActorDefs, ModerationOpts, moderateProfile} from '@atproto/api'
import {useQuery, useQueryClient} from '@tanstack/react-query'
import {logger} from '#/logger'
import {getAgent} from '#/state/session'
import {useMyFollowsQuery} from '#/state/queries/my-follows'
import {STALE} from '#/state/queries'
import {
DEFAULT_LOGGED_OUT_PREFERENCES,
getModerationOpts,
useModerationOpts,
} from './preferences'
const DEFAULT_MOD_OPTS = getModerationOpts({
userDid: '',
preferences: DEFAULT_LOGGED_OUT_PREFERENCES,
})
export const RQKEY = (prefix: string) => ['actor-autocomplete', prefix]
export function useActorAutocompleteQuery(prefix: string) {
const {data: follows, isFetching} = useMyFollowsQuery()
const moderationOpts = useModerationOpts()
return useQuery<AppBskyActorDefs.ProfileViewBasic[]>({
staleTime: STALE.MINUTES.ONE,
@@ -22,9 +33,20 @@ export function useActorAutocompleteQuery(prefix: string) {
limit: 8,
})
: undefined
return computeSuggestions(prefix, follows, res?.data.actors)
return res?.data.actors || []
},
enabled: !isFetching,
select: React.useCallback(
(data: AppBskyActorDefs.ProfileViewBasic[]) => {
return computeSuggestions(
prefix,
follows,
data,
moderationOpts || DEFAULT_MOD_OPTS,
)
},
[prefix, follows, moderationOpts],
),
})
}
@@ -32,6 +54,7 @@ export type ActorAutocompleteFn = ReturnType<typeof useActorAutocompleteFn>
export function useActorAutocompleteFn() {
const queryClient = useQueryClient()
const {data: follows} = useMyFollowsQuery()
const moderationOpts = useModerationOpts()
return React.useCallback(
async ({query, limit = 8}: {query: string; limit?: number}) => {
@@ -54,9 +77,14 @@ export function useActorAutocompleteFn() {
}
}
return computeSuggestions(query, follows, res?.data.actors)
return computeSuggestions(
query,
follows,
res?.data.actors,
moderationOpts || DEFAULT_MOD_OPTS,
)
},
[follows, queryClient],
[follows, queryClient, moderationOpts],
)
}
@@ -64,6 +92,7 @@ function computeSuggestions(
prefix: string,
follows: AppBskyActorDefs.ProfileViewBasic[] | undefined,
searched: AppBskyActorDefs.ProfileViewBasic[] = [],
moderationOpts: ModerationOpts,
) {
let items: AppBskyActorDefs.ProfileViewBasic[] = []
if (follows) {
@@ -76,10 +105,14 @@ function computeSuggestions(
handle: item.handle,
displayName: item.displayName,
avatar: item.avatar,
labels: item.labels,
})
}
}
return items
return items.filter(profile => {
const mod = moderateProfile(profile, moderationOpts)
return !mod.account.filter
})
}
function prefixMatch(
+3
View File
@@ -409,6 +409,9 @@ export function* findAllPostsInQueryData(
}
function assertSomePostsPassModeration(feed: AppBskyFeedDefs.FeedViewPost[]) {
// no posts in this feed
if (feed.length === 0) return true
// assume false
let somePostsPassModeration = false
+1 -1
View File
@@ -22,7 +22,7 @@ type Controls = {
/**
* The did of the account to populate the login form with.
*/
requestedAccount?: string
requestedAccount?: string | 'none' | 'new'
}) => void
/**
* Clears the requested account so that next time the logged out view is
+165
View File
@@ -0,0 +1,165 @@
import React from 'react'
import {StyleSheet, TouchableOpacity, View} from 'react-native'
import {useLingui} from '@lingui/react'
import {Trans, msg} from '@lingui/macro'
import {ScrollView} from '../util/Views'
import {Text} from '../util/text/Text'
import {usePalette} from '#/lib/hooks/usePalette'
import {colors, s} from '#/lib/styles'
import {TextLink} from '../util/Link'
import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
import {useLoggedOutViewControls} from '#/state/shell/logged-out'
export function HomeLoggedOutCTA() {
const pal = usePalette('default')
const {_} = useLingui()
const {isMobile} = useWebMediaQueries()
const {requestSwitchToAccount} = useLoggedOutViewControls()
const showCreateAccount = React.useCallback(() => {
requestSwitchToAccount({requestedAccount: 'new'})
}, [requestSwitchToAccount])
const showSignIn = React.useCallback(() => {
requestSwitchToAccount({requestedAccount: 'none'})
}, [requestSwitchToAccount])
return (
<ScrollView style={styles.container} testID="loggedOutCTA">
<View style={[styles.hero, isMobile && styles.heroMobile]}>
<Text style={[styles.title, pal.link]}>
<Trans>Bluesky</Trans>
</Text>
<Text
style={[
styles.subtitle,
isMobile && styles.subtitleMobile,
pal.textLight,
]}>
<Trans>See what's next</Trans>
</Text>
</View>
<View
testID="signinOrCreateAccount"
style={isMobile ? undefined : styles.btnsDesktop}>
<TouchableOpacity
testID="createAccountButton"
style={[
styles.btn,
isMobile && styles.btnMobile,
{backgroundColor: colors.blue3},
]}
onPress={showCreateAccount}
accessibilityRole="button"
accessibilityLabel={_(msg`Create new account`)}
accessibilityHint="Opens flow to create a new Bluesky account">
<Text
style={[
s.white,
styles.btnLabel,
isMobile && styles.btnLabelMobile,
]}>
<Trans>Create a new account</Trans>
</Text>
</TouchableOpacity>
<TouchableOpacity
testID="signInButton"
style={[styles.btn, isMobile && styles.btnMobile, pal.btn]}
onPress={showSignIn}
accessibilityRole="button"
accessibilityLabel={_(msg`Sign in`)}
accessibilityHint="Opens flow to sign into your existing Bluesky account">
<Text
style={[
pal.text,
styles.btnLabel,
isMobile && styles.btnLabelMobile,
]}>
<Trans>Sign In</Trans>
</Text>
</TouchableOpacity>
</View>
<View style={[styles.footer, pal.view, pal.border]}>
<TextLink
type="2xl"
href="https://blueskyweb.xyz"
text={_(msg`Business`)}
style={[styles.footerLink, pal.link]}
/>
<TextLink
type="2xl"
href="https://blueskyweb.xyz/blog"
text={_(msg`Blog`)}
style={[styles.footerLink, pal.link]}
/>
<TextLink
type="2xl"
href="https://blueskyweb.xyz/join"
text={_(msg`Jobs`)}
style={[styles.footerLink, pal.link]}
/>
</View>
</ScrollView>
)
}
const styles = StyleSheet.create({
container: {
height: '100%',
},
hero: {
justifyContent: 'center',
paddingTop: 100,
paddingBottom: 30,
},
heroMobile: {
paddingBottom: 50,
},
title: {
textAlign: 'center',
fontSize: 68,
fontWeight: 'bold',
},
subtitle: {
textAlign: 'center',
fontSize: 48,
fontWeight: 'bold',
},
subtitleMobile: {
fontSize: 42,
},
btnsDesktop: {
flexDirection: 'row',
justifyContent: 'center',
gap: 20,
marginHorizontal: 20,
},
btn: {
borderRadius: 32,
width: 230,
paddingVertical: 12,
marginBottom: 20,
},
btnMobile: {
flex: 1,
width: 'auto',
marginHorizontal: 20,
paddingVertical: 16,
},
btnLabel: {
textAlign: 'center',
fontSize: 18,
},
btnLabelMobile: {
textAlign: 'center',
fontSize: 21,
},
footer: {
flexDirection: 'row',
gap: 20,
justifyContent: 'center',
},
footerLink: {},
})
+3 -1
View File
@@ -33,7 +33,9 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
const {requestedAccountSwitchTo} = useLoggedOutView()
const [screenState, setScreenState] = React.useState<ScreenState>(
requestedAccountSwitchTo
? ScreenState.S_Login
? requestedAccountSwitchTo === 'new'
? ScreenState.S_CreateAccount
: ScreenState.S_Login
: ScreenState.S_LoginOrCreateAccount,
)
const {isMobile} = useWebMediaQueries()
+11 -5
View File
@@ -7,6 +7,8 @@ import {usePalette} from 'lib/hooks/usePalette'
import {CenteredView} from '../util/Views'
import {Trans, msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {Logo} from '#/view/icons/Logo'
import {Logotype} from '#/view/icons/Logotype'
export const SplashScreen = ({
onPressSignin,
@@ -22,11 +24,14 @@ export const SplashScreen = ({
<CenteredView style={[styles.container, pal.view]}>
<ErrorBoundary>
<View style={styles.hero}>
<Text style={[styles.title, pal.link]}>
<Trans>Bluesky</Trans>
</Text>
<Text style={[styles.subtitle, pal.textLight]}>
<Trans>See what's next</Trans>
<Logo width={92} fill="sky" />
<View style={{paddingTop: 40, paddingBottom: 6}}>
<Logotype width={161} />
</View>
<Text type="lg-medium" style={[pal.textLight]}>
<Trans>What's next?</Trans>
</Text>
</View>
<View testID="signinOrCreateAccount" style={styles.btns}>
@@ -65,6 +70,7 @@ const styles = StyleSheet.create({
hero: {
flex: 2,
justifyContent: 'center',
alignItems: 'center',
},
btns: {
paddingBottom: 40,
+10 -10
View File
@@ -10,6 +10,8 @@ import {CenteredView} from '../util/Views'
import {isWeb} from 'platform/detection'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
import {Trans} from '@lingui/macro'
import {Logo} from '#/view/icons/Logo'
import {Logotype} from '#/view/icons/Logotype'
export const SplashScreen = ({
onDismiss,
@@ -55,14 +57,15 @@ export const SplashScreen = ({
styles.containerInner,
isMobileWeb && styles.containerInnerMobile,
pal.border,
{alignItems: 'center'},
]}>
<ErrorBoundary>
<Text style={isMobileWeb ? styles.titleMobile : styles.title}>
Bluesky
</Text>
<Text style={isMobileWeb ? styles.subtitleMobile : styles.subtitle}>
See what's next
</Text>
<Logo width={92} fill="sky" />
<View style={{paddingTop: 40, paddingBottom: 20}}>
<Logotype width={161} />
</View>
<View testID="signinOrCreateAccount" style={styles.btns}>
<TouchableOpacity
testID="createAccountButton"
@@ -117,8 +120,6 @@ function Footer({styles}: {styles: ReturnType<typeof useStyles>}) {
)
}
const useStyles = () => {
const {isTabletOrMobile} = useWebMediaQueries()
const isMobileWeb = isWeb && isTabletOrMobile
return StyleSheet.create({
container: {
height: '100%',
@@ -161,8 +162,7 @@ const useStyles = () => {
paddingBottom: 30,
},
btns: {
flexDirection: isMobileWeb ? 'column' : 'row',
gap: 20,
gap: 10,
justifyContent: 'center',
paddingBottom: 40,
},
+4 -19
View File
@@ -1,12 +1,5 @@
import React from 'react'
import {
Dimensions,
RefreshControl,
StyleProp,
StyleSheet,
View,
ViewStyle,
} from 'react-native'
import {Dimensions, StyleProp, StyleSheet, View, ViewStyle} from 'react-native'
import {useQueryClient} from '@tanstack/react-query'
import {List, ListRef} from '../util/List'
import {FeedSourceCardLoaded} from './FeedSourceCard'
@@ -180,22 +173,14 @@ export const ProfileFeedgens = React.forwardRef<
data={items}
keyExtractor={(item: any) => item._reactKey || item.uri}
renderItem={renderItemInner}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
progressViewOffset={headerOffset}
/>
}
refreshing={isPTRing}
onRefresh={onRefresh}
headerOffset={headerOffset}
contentContainerStyle={{
minHeight: Dimensions.get('window').height * 1.5,
}}
style={{paddingTop: headerOffset}}
indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'}
removeClippedSubviews={true}
contentOffset={{x: 0, y: headerOffset * -1}}
// @ts-ignore our .web version only -prf
desktopFixedHeight
onEndReached={onEndReached}
+3 -14
View File
@@ -2,7 +2,6 @@ import React from 'react'
import {
ActivityIndicator,
Dimensions,
RefreshControl,
StyleProp,
View,
ViewStyle,
@@ -15,7 +14,6 @@ import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn'
import {ProfileCard} from '../profile/ProfileCard'
import {Button} from '../util/forms/Button'
import {useAnalytics} from 'lib/analytics/analytics'
import {usePalette} from 'lib/hooks/usePalette'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
import {useListMembersQuery} from '#/state/queries/list-members'
import {logger} from '#/logger'
@@ -51,7 +49,6 @@ export function ListMembers({
headerOffset?: number
desktopFixedHeightOffset?: number
}) {
const pal = usePalette('default')
const {track} = useAnalytics()
const [isRefreshing, setIsRefreshing] = React.useState(false)
const {isMobile} = useWebMediaQueries()
@@ -215,24 +212,16 @@ export function ListMembers({
renderItem={renderItem}
ListHeaderComponent={renderHeader}
ListFooterComponent={Footer}
refreshControl={
<RefreshControl
refreshing={isRefreshing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
progressViewOffset={headerOffset}
/>
}
refreshing={isRefreshing}
onRefresh={onRefresh}
headerOffset={headerOffset}
contentContainerStyle={{
minHeight: Dimensions.get('window').height * 1.5,
}}
style={{paddingTop: headerOffset}}
onScrolledDownChange={onScrolledDownChange}
onEndReached={onEndReached}
onEndReachedThreshold={0.6}
removeClippedSubviews={true}
contentOffset={{x: 0, y: headerOffset * -1}}
// @ts-ignore our .web version only -prf
desktopFixedHeight={desktopFixedHeightOffset || true}
/>
+45 -25
View File
@@ -119,31 +119,51 @@ export function MyLists({
[error, onRefresh, renderItem, pal],
)
const FlatListCom = inline ? RNFlatList : List
return (
<View testID={testID} style={style}>
{items.length > 0 && (
<FlatListCom
testID={testID ? `${testID}-flatlist` : undefined}
data={items}
keyExtractor={item => (item.uri ? item.uri : item._reactKey)}
renderItem={renderItemInner}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
contentContainerStyle={[s.contentContainer]}
removeClippedSubviews={true}
// @ts-ignore our .web version only -prf
desktopFixedHeight
/>
)}
</View>
)
if (inline) {
return (
<View testID={testID} style={style}>
{items.length > 0 && (
<RNFlatList
testID={testID ? `${testID}-flatlist` : undefined}
data={items}
keyExtractor={item => (item.uri ? item.uri : item._reactKey)}
renderItem={renderItemInner}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
contentContainerStyle={[s.contentContainer]}
removeClippedSubviews={true}
// @ts-ignore our .web version only -prf
desktopFixedHeight
/>
)}
</View>
)
} else {
return (
<View testID={testID} style={style}>
{items.length > 0 && (
<List
testID={testID ? `${testID}-flatlist` : undefined}
data={items}
keyExtractor={item => (item.uri ? item.uri : item._reactKey)}
renderItem={renderItemInner}
refreshing={isPTRing}
onRefresh={onRefresh}
contentContainerStyle={[s.contentContainer]}
removeClippedSubviews={true}
// @ts-ignore our .web version only -prf
desktopFixedHeight
/>
)}
</View>
)
}
}
const styles = StyleSheet.create({
+4 -19
View File
@@ -1,12 +1,5 @@
import React from 'react'
import {
Dimensions,
RefreshControl,
StyleProp,
StyleSheet,
View,
ViewStyle,
} from 'react-native'
import {Dimensions, StyleProp, StyleSheet, View, ViewStyle} from 'react-native'
import {useQueryClient} from '@tanstack/react-query'
import {List, ListRef} from '../util/List'
import {ListCard} from './ListCard'
@@ -182,22 +175,14 @@ export const ProfileLists = React.forwardRef<SectionRef, ProfileListsProps>(
data={items}
keyExtractor={(item: any) => item._reactKey}
renderItem={renderItemInner}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
progressViewOffset={headerOffset}
/>
}
refreshing={isPTRing}
onRefresh={onRefresh}
headerOffset={headerOffset}
contentContainerStyle={{
minHeight: Dimensions.get('window').height * 1.5,
}}
style={{paddingTop: headerOffset}}
indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'}
removeClippedSubviews={true}
contentOffset={{x: 0, y: headerOffset * -1}}
// @ts-ignore our .web version only -prf
desktopFixedHeight
onEndReached={onEndReached}
+3 -11
View File
@@ -1,13 +1,12 @@
import React from 'react'
import {CenteredView} from '../util/Views'
import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native'
import {ActivityIndicator, StyleSheet, View} from 'react-native'
import {FeedItem} from './FeedItem'
import {NotificationFeedLoadingPlaceholder} from '../util/LoadingPlaceholder'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn'
import {EmptyState} from '../util/EmptyState'
import {s} from 'lib/styles'
import {usePalette} from 'lib/hooks/usePalette'
import {useNotificationFeedQuery} from '#/state/queries/notifications/feed'
import {useUnreadNotificationsApi} from '#/state/queries/notifications/unread'
import {logger} from '#/logger'
@@ -30,7 +29,6 @@ export function Feed({
onScrolledDownChange: (isScrolledDown: boolean) => void
ListHeaderComponent?: () => JSX.Element
}) {
const pal = usePalette('default')
const [isPTRing, setIsPTRing] = React.useState(false)
const moderationOpts = useModerationOpts()
@@ -152,14 +150,8 @@ export function Feed({
renderItem={renderItem}
ListHeaderComponent={ListHeaderComponent}
ListFooterComponent={FeedFooter}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
refreshing={isPTRing}
onRefresh={onRefresh}
onEndReached={onEndReached}
onEndReachedThreshold={0.6}
onScrolledDownChange={onScrolledDownChange}
+5 -8
View File
@@ -3,12 +3,9 @@ import {StyleSheet, TouchableOpacity, View} from 'react-native'
import {TabBar} from 'view/com/pager/TabBar'
import {RenderTabBarFnProps} from 'view/com/pager/Pager'
import {usePalette} from 'lib/hooks/usePalette'
import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle'
import {Link} from '../util/Link'
import {Text} from '../util/text/Text'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {FontAwesomeIconStyle} from '@fortawesome/react-native-fontawesome'
import {s} from 'lib/styles'
import {HITSLOP_10} from 'lib/constants'
import Animated from 'react-native-reanimated'
import {msg} from '@lingui/macro'
@@ -21,17 +18,17 @@ import {usePinnedFeedsInfos} from '#/state/queries/feed'
import {isWeb} from 'platform/detection'
import {useNavigation} from '@react-navigation/native'
import {NavigationProp} from 'lib/routes/types'
import {Logo} from '#/view/icons/Logo'
export function FeedsTabBar(
props: RenderTabBarFnProps & {testID?: string; onPressSelected: () => void},
) {
const pal = usePalette('default')
const {isSandbox, hasSession} = useSession()
const {hasSession} = useSession()
const {_} = useLingui()
const setDrawerOpen = useSetDrawerOpen()
const navigation = useNavigation<NavigationProp>()
const {feeds, hasPinnedCustom} = usePinnedFeedsInfos()
const brandBlue = useColorSchemeStyle(s.brandBlue, s.blue3)
const {headerHeight} = useShellLayout()
const {headerMinimalShellTransform} = useMinimalShellMode()
const pinnedDisplayNames = hasSession ? feeds.map(f => f.displayName) : []
@@ -86,9 +83,9 @@ export function FeedsTabBar(
/>
</TouchableOpacity>
</View>
<Text style={[brandBlue, s.bold, styles.title]}>
{isSandbox ? 'SANDBOX' : 'Bluesky'}
</Text>
<View>
<Logo width={30} />
</View>
<View style={[pal.view, {width: 18}]}>
{hasSession && (
<Link
+3 -11
View File
@@ -1,18 +1,16 @@
import React, {useCallback, useMemo, useState} from 'react'
import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native'
import {ActivityIndicator, StyleSheet, View} from 'react-native'
import {AppBskyFeedGetLikes as GetLikes} from '@atproto/api'
import {CenteredView} from '../util/Views'
import {List} from '../util/List'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {ProfileCardWithFollowBtn} from '../profile/ProfileCard'
import {usePalette} from 'lib/hooks/usePalette'
import {logger} from '#/logger'
import {useResolveUriQuery} from '#/state/queries/resolve-uri'
import {usePostLikedByQuery} from '#/state/queries/post-liked-by'
import {cleanError} from '#/lib/strings/errors'
export function PostLikedBy({uri}: {uri: string}) {
const pal = usePalette('default')
const [isPTRing, setIsPTRing] = useState(false)
const {
data: resolvedUri,
@@ -88,14 +86,8 @@ export function PostLikedBy({uri}: {uri: string}) {
<List
data={likes}
keyExtractor={item => item.actor.did}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
refreshing={isPTRing}
onRefresh={onRefresh}
onEndReached={onEndReached}
renderItem={renderItem}
initialNumToRender={15}
+3 -11
View File
@@ -1,18 +1,16 @@
import React, {useMemo, useCallback, useState} from 'react'
import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native'
import {ActivityIndicator, StyleSheet, View} from 'react-native'
import {AppBskyActorDefs as ActorDefs} from '@atproto/api'
import {CenteredView} from '../util/Views'
import {List} from '../util/List'
import {ProfileCardWithFollowBtn} from '../profile/ProfileCard'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {usePalette} from 'lib/hooks/usePalette'
import {logger} from '#/logger'
import {useResolveUriQuery} from '#/state/queries/resolve-uri'
import {usePostRepostedByQuery} from '#/state/queries/post-reposted-by'
import {cleanError} from '#/lib/strings/errors'
export function PostRepostedBy({uri}: {uri: string}) {
const pal = usePalette('default')
const [isPTRing, setIsPTRing] = useState(false)
const {
data: resolvedUri,
@@ -89,14 +87,8 @@ export function PostRepostedBy({uri}: {uri: string}) {
<List
data={repostedBy}
keyExtractor={item => item.did}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
refreshing={isPTRing}
onRefresh={onRefresh}
onEndReached={onEndReached}
renderItem={renderItem}
initialNumToRender={15}
+16 -13
View File
@@ -2,7 +2,6 @@ import React, {useEffect, useRef} from 'react'
import {
ActivityIndicator,
Pressable,
RefreshControl,
StyleSheet,
TouchableOpacity,
View,
@@ -157,7 +156,9 @@ function PostThreadLoaded({
// construct content
const posts = React.useMemo(() => {
let arr = [TOP_COMPONENT].concat(
Array.from(flattenThreadSkeleton(sortThread(thread, threadViewPrefs))),
Array.from(
flattenThreadSkeleton(sortThread(thread, threadViewPrefs), hasSession),
),
)
if (arr.length > maxVisible) {
arr = arr.slice(0, maxVisible).concat([LOAD_MORE])
@@ -166,7 +167,7 @@ function PostThreadLoaded({
arr.push(BOTTOM_COMPONENT)
}
return arr
}, [thread, maxVisible, threadViewPrefs])
}, [thread, maxVisible, threadViewPrefs, hasSession])
/**
* NOTE
@@ -347,14 +348,8 @@ function PostThreadLoaded({
}
keyExtractor={item => item._reactKey}
renderItem={renderItem}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onPTR}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
refreshing={isPTRing}
onRefresh={onPTR}
onContentSizeChange={onContentSizeChange}
style={s.hContentRegion}
// @ts-ignore our .web version only -prf
@@ -468,20 +463,24 @@ function isThreadPost(v: unknown): v is ThreadPost {
function* flattenThreadSkeleton(
node: ThreadNode,
hasSession: boolean,
): Generator<YieldedItem, void> {
if (node.type === 'post') {
if (node.parent) {
yield* flattenThreadSkeleton(node.parent)
yield* flattenThreadSkeleton(node.parent, hasSession)
} else if (node.ctx.isParentLoading) {
yield PARENT_SPINNER
}
if (!hasSession && node.ctx.depth > 0 && hasPwiOptOut(node)) {
return
}
yield node
if (node.ctx.isHighlightedPost && !node.post.viewer?.replyDisabled) {
yield REPLY_PROMPT
}
if (node.replies?.length) {
for (const reply of node.replies) {
yield* flattenThreadSkeleton(reply)
yield* flattenThreadSkeleton(reply, hasSession)
}
} else if (node.ctx.isChildLoading) {
yield CHILD_SPINNER
@@ -493,6 +492,10 @@ function* flattenThreadSkeleton(
}
}
function hasPwiOptOut(node: ThreadPost) {
return !!node.post.author.labels?.find(l => l.val === '!no-unauthenticated')
}
function hasBranchingReplies(node: ThreadNode) {
if (node.type !== 'post') {
return false
+3 -14
View File
@@ -3,7 +3,6 @@ import {
ActivityIndicator,
AppState,
Dimensions,
RefreshControl,
StyleProp,
StyleSheet,
View,
@@ -16,7 +15,6 @@ import {FeedErrorMessage} from './FeedErrorMessage'
import {FeedSlice} from './FeedSlice'
import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn'
import {useAnalytics} from 'lib/analytics/analytics'
import {usePalette} from 'lib/hooks/usePalette'
import {useTheme} from 'lib/ThemeContext'
import {logger} from '#/logger'
import {
@@ -70,7 +68,6 @@ let Feed = ({
ListHeaderComponent?: () => JSX.Element
extraData?: any
}): React.ReactNode => {
const pal = usePalette('default')
const theme = useTheme()
const {track} = useAnalytics()
const queryClient = useQueryClient()
@@ -276,25 +273,17 @@ let Feed = ({
renderItem={renderItem}
ListFooterComponent={FeedFooter}
ListHeaderComponent={ListHeaderComponent}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
progressViewOffset={headerOffset}
/>
}
refreshing={isPTRing}
onRefresh={onRefresh}
headerOffset={headerOffset}
contentContainerStyle={{
minHeight: Dimensions.get('window').height * 1.5,
}}
style={{paddingTop: headerOffset}}
onScrolledDownChange={onScrolledDownChange}
indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'}
onEndReached={onEndReached}
onEndReachedThreshold={2} // number of posts left to trigger load more
removeClippedSubviews={true}
contentOffset={{x: 0, y: headerOffset * -1}}
extraData={extraData}
// @ts-ignore our .web version only -prf
desktopFixedHeight={
+3
View File
@@ -50,6 +50,9 @@ export function ProfileCard({
return null
}
const moderation = moderateProfile(profile, moderationOpts)
if (moderation.account.filter) {
return null
}
return (
<Link
+3 -11
View File
@@ -1,18 +1,16 @@
import React from 'react'
import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native'
import {ActivityIndicator, StyleSheet, View} from 'react-native'
import {AppBskyActorDefs as ActorDefs} from '@atproto/api'
import {CenteredView} from '../util/Views'
import {List} from '../util/List'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {ProfileCardWithFollowBtn} from './ProfileCard'
import {usePalette} from 'lib/hooks/usePalette'
import {useProfileFollowersQuery} from '#/state/queries/profile-followers'
import {useResolveDidQuery} from '#/state/queries/resolve-uri'
import {logger} from '#/logger'
import {cleanError} from '#/lib/strings/errors'
export function ProfileFollowers({name}: {name: string}) {
const pal = usePalette('default')
const [isPTRing, setIsPTRing] = React.useState(false)
const {
data: resolvedDid,
@@ -90,14 +88,8 @@ export function ProfileFollowers({name}: {name: string}) {
<List
data={followers}
keyExtractor={item => item.did}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
refreshing={isPTRing}
onRefresh={onRefresh}
onEndReached={onEndReached}
renderItem={renderItem}
initialNumToRender={15}
+3 -11
View File
@@ -1,18 +1,16 @@
import React from 'react'
import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native'
import {ActivityIndicator, StyleSheet, View} from 'react-native'
import {AppBskyActorDefs as ActorDefs} from '@atproto/api'
import {CenteredView} from '../util/Views'
import {List} from '../util/List'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {ProfileCardWithFollowBtn} from './ProfileCard'
import {usePalette} from 'lib/hooks/usePalette'
import {useProfileFollowsQuery} from '#/state/queries/profile-follows'
import {useResolveDidQuery} from '#/state/queries/resolve-uri'
import {logger} from '#/logger'
import {cleanError} from '#/lib/strings/errors'
export function ProfileFollows({name}: {name: string}) {
const pal = usePalette('default')
const [isPTRing, setIsPTRing] = React.useState(false)
const {
data: resolvedDid,
@@ -90,14 +88,8 @@ export function ProfileFollows({name}: {name: string}) {
<List
data={follows}
keyExtractor={item => item.did}
refreshControl={
<RefreshControl
refreshing={isPTRing}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
refreshing={isPTRing}
onRefresh={onRefresh}
onEndReached={onEndReached}
renderItem={renderItem}
initialNumToRender={15}
+42 -3
View File
@@ -1,27 +1,42 @@
import React, {memo, startTransition} from 'react'
import {FlatListProps} from 'react-native'
import {FlatListProps, RefreshControl} from 'react-native'
import {FlatList_INTERNAL} from './Views'
import {addStyle} from 'lib/styles'
import {useScrollHandlers} from '#/lib/ScrollContext'
import {runOnJS, useSharedValue} from 'react-native-reanimated'
import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
import {usePalette} from '#/lib/hooks/usePalette'
export type ListMethods = FlatList_INTERNAL
export type ListProps<ItemT> = Omit<
FlatListProps<ItemT>,
'onScroll' // Use ScrollContext instead.
| 'onScroll' // Use ScrollContext instead.
| 'refreshControl' // Pass refreshing and/or onRefresh instead.
| 'contentOffset' // Pass headerOffset instead.
> & {
onScrolledDownChange?: (isScrolledDown: boolean) => void
headerOffset?: number
refreshing?: boolean
onRefresh?: () => void
}
export type ListRef = React.MutableRefObject<FlatList_INTERNAL | null>
const SCROLLED_DOWN_LIMIT = 200
function ListImpl<ItemT>(
{onScrolledDownChange, ...props}: ListProps<ItemT>,
{
onScrolledDownChange,
refreshing,
onRefresh,
headerOffset,
style,
...props
}: ListProps<ItemT>,
ref: React.Ref<ListMethods>,
) {
const isScrolledDown = useSharedValue(false)
const contextScrollHandlers = useScrollHandlers()
const pal = usePalette('default')
function handleScrolledDownChange(didScrollDown: boolean) {
startTransition(() => {
@@ -49,11 +64,35 @@ function ListImpl<ItemT>(
},
})
let refreshControl
if (refreshing !== undefined || onRefresh !== undefined) {
refreshControl = (
<RefreshControl
refreshing={refreshing ?? false}
onRefresh={onRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
progressViewOffset={headerOffset}
/>
)
}
let contentOffset
if (headerOffset != null) {
style = addStyle(style, {
paddingTop: headerOffset,
})
contentOffset = {x: 0, y: headerOffset * -1}
}
return (
<FlatList_INTERNAL
{...props}
contentOffset={contentOffset}
refreshControl={refreshControl}
onScroll={scrollHandler}
scrollEventThrottle={1}
style={style}
ref={ref}
/>
)
+12 -8
View File
@@ -7,7 +7,7 @@ import {Text} from '../text/Text'
import {ShieldExclamation} from 'lib/icons'
import {describeModerationCause} from 'lib/moderation'
import {useLingui} from '@lingui/react'
import {msg} from '@lingui/macro'
import {msg, Trans} from '@lingui/macro'
import {useModalControls} from '#/state/modals'
import {isPostMediaBlurred} from 'lib/moderation'
@@ -95,13 +95,17 @@ export function ContentHider({
<Text type="md" style={pal.text}>
{desc.name}
</Text>
{!moderation.noOverride && (
<View style={styles.showBtn}>
<Text type="lg" style={pal.link}>
{override ? 'Hide' : 'Show'}
</Text>
</View>
)}
<View style={styles.showBtn}>
<Text type="lg" style={pal.link}>
{moderation.noOverride ? (
<Trans>Learn more</Trans>
) : override ? (
<Trans>Hide</Trans>
) : (
<Trans>Show</Trans>
)}
</Text>
</View>
</Pressable>
{override && <View style={childContainerStyle}>{children}</View>}
</View>
+41 -23
View File
@@ -22,6 +22,7 @@ import {Trans, msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {useModalControls} from '#/state/modals'
import {s} from '#/lib/styles'
import {CenteredView} from '../Views'
export function ScreenHider({
testID,
@@ -53,41 +54,58 @@ export function ScreenHider({
)
}
const isNoPwi =
moderation.cause?.type === 'label' &&
moderation.cause?.labelDef.id === '!no-unauthenticated'
const desc = describeModerationCause(moderation.cause, 'account')
return (
<View style={[styles.container, pal.view, containerStyle]}>
<CenteredView
style={[styles.container, pal.view, containerStyle]}
sideBorders>
<View style={styles.iconContainer}>
<View style={[styles.icon, palInverted.view]}>
<FontAwesomeIcon
icon="exclamation"
icon={isNoPwi ? ['far', 'eye-slash'] : 'exclamation'}
style={pal.textInverted as FontAwesomeIconStyle}
size={24}
/>
</View>
</View>
<Text type="title-2xl" style={[styles.title, pal.text]}>
<Trans>Content Warning</Trans>
{isNoPwi ? (
<Trans>Sign-in Required</Trans>
) : (
<Trans>Content Warning</Trans>
)}
</Text>
<Text type="2xl" style={[styles.description, pal.textLight]}>
<Trans>This {screenDescription} has been flagged:</Trans>
<Text type="2xl-medium" style={[pal.text, s.ml5]}>
{desc.name}.
</Text>
<TouchableWithoutFeedback
onPress={() => {
openModal({
name: 'moderation-details',
context: 'account',
moderation,
})
}}
accessibilityRole="button"
accessibilityLabel={_(msg`Learn more about this warning`)}
accessibilityHint="">
<Text type="2xl" style={pal.link}>
<Trans>Learn More</Trans>
</Text>
</TouchableWithoutFeedback>
{isNoPwi ? (
<Trans>
This account has requested that users sign in to view their profile.
</Trans>
) : (
<>
<Trans>This {screenDescription} has been flagged:</Trans>
<Text type="2xl-medium" style={[pal.text, s.ml5]}>
{desc.name}.
</Text>
<TouchableWithoutFeedback
onPress={() => {
openModal({
name: 'moderation-details',
context: 'account',
moderation,
})
}}
accessibilityRole="button"
accessibilityLabel={_(msg`Learn more about this warning`)}
accessibilityHint="">
<Text type="2xl" style={pal.link}>
<Trans>Learn More</Trans>
</Text>
</TouchableWithoutFeedback>
</>
)}{' '}
</Text>
{isMobile && <View style={styles.spacer} />}
<View style={styles.btnContainer}>
@@ -116,7 +134,7 @@ export function ScreenHider({
</Button>
)}
</View>
</View>
</CenteredView>
)
}
+48
View File
@@ -0,0 +1,48 @@
import React from 'react'
import Svg, {
Path,
Defs,
LinearGradient,
Stop,
SvgProps,
PathProps,
} from 'react-native-svg'
import {colors} from '#/lib/styles'
const ratio = 57 / 64
type Props = {
fill?: PathProps['fill']
} & SvgProps
export const Logo = React.forwardRef(function LogoImpl(props: Props, ref) {
const {fill, ...rest} = props
const gradient = fill === 'sky'
const _fill = gradient ? 'url(#sky)' : fill || colors.blue3
// @ts-ignore it's fiiiiine
const size = parseInt(rest.width || 32)
return (
<Svg
fill="none"
// @ts-ignore it's fiiiiine
ref={ref}
viewBox="0 0 64 57"
{...rest}
style={{width: size, height: size * ratio}}>
{gradient && (
<Defs>
<LinearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
<Stop offset="0" stopColor="#0A7AFF" stopOpacity="1" />
<Stop offset="1" stopColor="#59B9FF" stopOpacity="1" />
</LinearGradient>
</Defs>
)}
<Path
fill={_fill}
d="M13.873 3.805C21.21 9.332 29.103 20.537 32 26.55v15.882c0-.338-.13.044-.41.867-1.512 4.456-7.418 21.847-20.923 7.944-7.111-7.32-3.819-14.64 9.125-16.85-7.405 1.264-15.73-.825-18.014-9.015C1.12 23.022 0 8.51 0 6.55 0-3.268 8.579-.182 13.873 3.805ZM50.127 3.805C42.79 9.332 34.897 20.537 32 26.55v15.882c0-.338.13.044.41.867 1.512 4.456 7.418 21.847 20.923 7.944 7.111-7.32 3.819-14.64-9.125-16.85 7.405 1.264 15.73-.825 18.014-9.015C62.88 23.022 64 8.51 64 6.55c0-9.818-8.578-6.732-13.873-2.745Z"
/>
</Svg>
)
})
+28
View File
@@ -0,0 +1,28 @@
import React from 'react'
import Svg, {Path, SvgProps, PathProps} from 'react-native-svg'
import {colors} from '#/lib/styles'
const ratio = 17 / 64
export function Logotype({
fill,
...rest
}: {fill?: PathProps['fill']} & SvgProps) {
// @ts-ignore it's fiiiiine
const size = parseInt(rest.width || 32)
return (
<Svg
fill="none"
viewBox="0 0 64 17"
{...rest}
width={size}
height={Number(size) * ratio}>
<Path
fill={fill || colors.black}
d="M8.478 6.252c1.503.538 2.3 1.78 2.3 3.172 0 2.356-1.576 3.785-4.6 3.785H0V0h5.974c2.875 0 4.267 1.466 4.267 3.413 0 1.3-.594 2.245-1.763 2.839Zm-2.69-4.193H2.504v3.45h3.284c1.28 0 1.967-.667 1.967-1.78 0-1.02-.705-1.67-1.967-1.67Zm-3.284 9.072h3.544c1.41 0 2.17-.65 2.17-1.818 0-1.224-.723-1.837-2.17-1.837H2.504v3.655ZM14.251 13.209h-2.337V0h2.337v13.209ZM22.001 8.998V3.636h2.338v9.573h-2.263v-1.392c-.724 1.076-1.726 1.614-3.006 1.614-2.022 0-3.34-1.224-3.34-3.45V3.636h2.338v5.955c0 1.206.594 1.818 1.8 1.818 1.132 0 2.133-.835 2.133-2.411ZM34.979 8.59v.556h-7.161c.167 1.651 1.076 2.467 2.486 2.467 1.076 0 1.8-.463 2.189-1.372h2.244c-.5 1.947-2.17 3.19-4.452 3.19-1.428 0-2.579-.463-3.45-1.372-.872-.91-1.318-2.115-1.318-3.637 0-1.502.427-2.708 1.299-3.636.872-.909 2.004-1.372 3.432-1.372 1.447 0 2.597.482 3.45 1.428.854.946 1.28 2.208 1.28 3.747Zm-4.75-3.358c-1.28 0-2.17.742-2.393 2.281h4.805c-.204-1.391-1.057-2.281-2.411-2.281ZM40.16 13.469c-2.783 0-4.249-1.095-4.379-3.303h2.282c.13 1.188.724 1.633 2.134 1.633 1.261 0 1.892-.39 1.892-1.15 0-.687-.445-1.02-1.874-1.262l-1.094-.185c-2.097-.353-3.136-1.318-3.136-2.894 0-1.8 1.429-2.894 3.97-2.894 2.728 0 4.138 1.075 4.23 3.246h-2.207c-.056-1.169-.742-1.577-2.023-1.577-1.113 0-1.67.371-1.67 1.113 0 .668.483.965 1.596 1.169l1.206.186c2.32.426 3.32 1.28 3.32 2.912 0 1.93-1.557 3.006-4.247 3.006ZM54.667 13.209h-2.671l-2.783-4.453-1.447 1.447v3.006h-2.3V0h2.3v7.606l3.896-3.97h2.783l-3.618 3.618 3.84 5.955ZM60.772 6.048l.78-2.412H64l-3.692 10.352c-.39 1.057-.872 1.818-1.484 2.245-.612.426-1.484.63-2.634.63-.39 0-.724-.018-1.02-.055V14.97h.89c1.057 0 1.577-.65 1.577-1.54 0-.445-.149-1.094-.446-1.929l-2.746-7.866h2.487l.779 2.393c.575 1.8 1.076 3.58 1.521 5.343.408-1.521.928-3.302 1.54-5.324Z"
/>
</Svg>
)
}
+3 -9
View File
@@ -1,5 +1,5 @@
import React from 'react'
import {ActivityIndicator, StyleSheet, View, RefreshControl} from 'react-native'
import {ActivityIndicator, StyleSheet, View} from 'react-native'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {FontAwesomeIconStyle} from '@fortawesome/react-native-fontawesome'
import {ViewHeader} from 'view/com/util/ViewHeader'
@@ -487,14 +487,8 @@ export function FeedsScreen(_props: Props) {
keyExtractor={item => item.key}
contentContainerStyle={styles.contentContainer}
renderItem={renderItem}
refreshControl={
<RefreshControl
refreshing={isPTR}
onRefresh={isUserSearching ? undefined : onPullToRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
refreshing={isPTR}
onRefresh={isUserSearching ? undefined : onPullToRefresh}
initialNumToRender={10}
onEndReached={onEndReached}
// @ts-ignore our .web version only -prf
+2 -6
View File
@@ -9,6 +9,7 @@ import {CustomFeedEmptyState} from 'view/com/posts/CustomFeedEmptyState'
import {FeedsTabBar} from '../com/pager/FeedsTabBar'
import {Pager, RenderTabBarFnProps} from 'view/com/pager/Pager'
import {FeedPage} from 'view/com/feeds/FeedPage'
import {HomeLoggedOutCTA} from '../com/auth/HomeLoggedOutCTA'
import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell'
import {usePreferencesQuery} from '#/state/queries/preferences'
import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
@@ -199,12 +200,7 @@ function HomeScreenReady({
onPageScrollStateChanged={onPageScrollStateChanged}
renderTabBar={renderTabBar}
tabBarPosition="top">
<FeedPage
testID="customFeedPage"
isPageFocused={true}
feed={`feedgen|at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot`}
renderEmptyState={renderCustomFeedEmptyState}
/>
<HomeLoggedOutCTA />
</Pager>
)
}
+1 -1
View File
@@ -153,7 +153,7 @@ function ProfileScreenLoaded({
const isMe = profile.did === currentAccount?.did
const showRepliesTab = hasSession
const showLikesTab = isMe
const showFeedsTab = isMe || extraInfoQuery.data?.hasFeedgens
const showFeedsTab = hasSession && (isMe || extraInfoQuery.data?.hasFeedgens)
const showListsTab = hasSession && (isMe || extraInfoQuery.data?.hasLists)
const sectionTitles = useMemo<string[]>(() => {
return [
+68 -43
View File
@@ -3,7 +3,6 @@ import {
View,
StyleSheet,
ActivityIndicator,
RefreshControl,
TextInput,
Pressable,
Platform,
@@ -185,7 +184,6 @@ type SearchResultSlice =
function SearchScreenPostResults({query}: {query: string}) {
const {_} = useLingui()
const pal = usePalette('default')
const [isPTR, setIsPTR] = React.useState(false)
const {
isFetched,
@@ -254,14 +252,8 @@ function SearchScreenPostResults({query}: {query: string}) {
}
}}
keyExtractor={item => item.key}
refreshControl={
<RefreshControl
refreshing={isPTR}
onRefresh={onPullToRefresh}
tintColor={pal.colors.text}
titleColor={pal.colors.text}
/>
}
refreshing={isPTR}
onRefresh={onPullToRefresh}
onEndReached={onEndReached}
// @ts-ignore web only -prf
desktopFixedHeight
@@ -304,7 +296,8 @@ function SearchScreenUserResults({query}: {query: string}) {
)
}
const SECTIONS = ['Posts', 'Users']
const SECTIONS_LOGGEDOUT = ['Users']
const SECTIONS_LOGGEDIN = ['Posts', 'Users']
export function SearchScreenInner({query}: {query?: string}) {
const pal = usePalette('default')
const setMinimalShellMode = useSetMinimalShellMode()
@@ -320,44 +313,62 @@ export function SearchScreenInner({query}: {query?: string}) {
[setDrawerSwipeDisabled, setMinimalShellMode],
)
if (hasSession) {
return query ? (
<Pager
tabBarPosition="top"
onPageSelected={onPageSelected}
renderTabBar={props => (
<CenteredView sideBorders style={pal.border}>
<TabBar items={SECTIONS_LOGGEDIN} {...props} />
</CenteredView>
)}
initialPage={0}>
<View>
<SearchScreenPostResults query={query} />
</View>
<View>
<SearchScreenUserResults query={query} />
</View>
</Pager>
) : (
<View>
<CenteredView sideBorders style={pal.border}>
<Text
type="title"
style={[
pal.text,
pal.border,
{
display: 'flex',
paddingVertical: 12,
paddingHorizontal: 18,
fontWeight: 'bold',
},
]}>
<Trans>Suggested Follows</Trans>
</Text>
</CenteredView>
<SearchScreenSuggestedFollows />
</View>
)
}
return query ? (
<Pager
tabBarPosition="top"
onPageSelected={onPageSelected}
renderTabBar={props => (
<CenteredView sideBorders style={pal.border}>
<TabBar items={SECTIONS} {...props} />
<TabBar items={SECTIONS_LOGGEDOUT} {...props} />
</CenteredView>
)}
initialPage={0}>
<View>
<SearchScreenPostResults query={query} />
</View>
<View>
<SearchScreenUserResults query={query} />
</View>
</Pager>
) : hasSession ? (
<View>
<CenteredView sideBorders style={pal.border}>
<Text
type="title"
style={[
pal.text,
pal.border,
{
display: 'flex',
paddingVertical: 12,
paddingHorizontal: 18,
fontWeight: 'bold',
},
]}>
<Trans>Suggested Follows</Trans>
</Text>
</CenteredView>
<SearchScreenSuggestedFollows />
</View>
) : (
<CenteredView sideBorders style={pal.border}>
<View
@@ -383,13 +394,27 @@ export function SearchScreenInner({query}: {query?: string}) {
</Text>
)}
<Text
style={[
pal.textLight,
{textAlign: 'center', paddingVertical: 12, paddingHorizontal: 18},
]}>
<Trans>Search for posts and users.</Trans>
</Text>
<View
style={{
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 30,
gap: 15,
}}>
<MagnifyingGlassIcon
strokeWidth={3}
size={isDesktop ? 60 : 60}
style={pal.textLight}
/>
<Text type="xl" style={[pal.textLight, {paddingHorizontal: 18}]}>
{isDesktop ? (
<Trans>Find users with the search tool on the right</Trans>
) : (
<Trans>Find users on Bluesky</Trans>
)}
</Text>
</View>
</View>
</CenteredView>
)
+1 -1
View File
@@ -231,9 +231,9 @@ let DrawerContent = ({}: {}): React.ReactNode => {
onPress={onPressNotifications}
/>
)}
<FeedsMenuItem isActive={isAtFeeds} onPress={onPressMyFeeds} />
{hasSession && (
<>
<FeedsMenuItem isActive={isAtFeeds} onPress={onPressMyFeeds} />
<ListsMenuItem onPress={onPressLists} />
<ModerationMenuItem onPress={onPressModeration} />
<ProfileMenuItem
+12 -6
View File
@@ -14,13 +14,19 @@ import {useCloseAllActiveElements} from '#/state/util'
let NavSignupCard = ({}: {}): React.ReactNode => {
const {_} = useLingui()
const pal = usePalette('default')
const {setShowLoggedOut} = useLoggedOutViewControls()
const {requestSwitchToAccount} = useLoggedOutViewControls()
const closeAllActiveElements = useCloseAllActiveElements()
const showLoggedOut = React.useCallback(() => {
const showSignIn = React.useCallback(() => {
closeAllActiveElements()
setShowLoggedOut(true)
}, [setShowLoggedOut, closeAllActiveElements])
requestSwitchToAccount({requestedAccount: 'none'})
}, [requestSwitchToAccount, closeAllActiveElements])
const showCreateAccount = React.useCallback(() => {
closeAllActiveElements()
requestSwitchToAccount({requestedAccount: 'new'})
// setShowLoggedOut(true)
}, [requestSwitchToAccount, closeAllActiveElements])
return (
<View
@@ -39,7 +45,7 @@ let NavSignupCard = ({}: {}): React.ReactNode => {
<View style={{flexDirection: 'row', paddingTop: 12, gap: 8}}>
<Button
onPress={showLoggedOut}
onPress={showCreateAccount}
accessibilityHint={_(msg`Sign up`)}
accessibilityLabel={_(msg`Sign up`)}>
<Text type="md" style={[{color: 'white'}, s.bold]}>
@@ -48,7 +54,7 @@ let NavSignupCard = ({}: {}): React.ReactNode => {
</Button>
<Button
type="default"
onPress={showLoggedOut}
onPress={showSignIn}
accessibilityHint={_(msg`Sign in`)}
accessibilityLabel={_(msg`Sign in`)}>
<Text type="md" style={[pal.text, s.bold]}>
+22 -22
View File
@@ -138,31 +138,31 @@ export function BottomBar({navigation}: BottomTabBarProps) {
accessibilityLabel={_(msg`Search`)}
accessibilityHint=""
/>
<Btn
testID="bottomBarFeedsBtn"
icon={
isAtFeeds ? (
<HashtagIcon
size={24}
style={[styles.ctrlIcon, pal.text, styles.feedsIcon]}
strokeWidth={4}
/>
) : (
<HashtagIcon
size={24}
style={[styles.ctrlIcon, pal.text, styles.feedsIcon]}
strokeWidth={2.25}
/>
)
}
onPress={onPressFeeds}
accessibilityRole="tab"
accessibilityLabel={_(msg`Feeds`)}
accessibilityHint=""
/>
{hasSession && (
<>
<Btn
testID="bottomBarFeedsBtn"
icon={
isAtFeeds ? (
<HashtagIcon
size={24}
style={[styles.ctrlIcon, pal.text, styles.feedsIcon]}
strokeWidth={4}
/>
) : (
<HashtagIcon
size={24}
style={[styles.ctrlIcon, pal.text, styles.feedsIcon]}
strokeWidth={2.25}
/>
)
}
onPress={onPressFeeds}
accessibilityRole="tab"
accessibilityLabel={_(msg`Feeds`)}
accessibilityHint=""
/>
<Btn
testID="bottomBarNotificationsBtn"
icon={
+11 -11
View File
@@ -65,20 +65,20 @@ export function BottomBarWeb() {
)
}}
</NavItem>
<NavItem routeName="Feeds" href="/feeds">
{({isActive}) => {
return (
<HashtagIcon
size={22}
style={[styles.ctrlIcon, pal.text, styles.feedsIcon]}
strokeWidth={isActive ? 4 : 2.5}
/>
)
}}
</NavItem>
{hasSession && (
<>
<NavItem routeName="Feeds" href="/feeds">
{({isActive}) => {
return (
<HashtagIcon
size={22}
style={[styles.ctrlIcon, pal.text, styles.feedsIcon]}
strokeWidth={isActive ? 4 : 2.5}
/>
)
}}
</NavItem>
<NavItem routeName="Notifications" href="/notifications">
{({isActive}) => {
const Icon = isActive ? BellIconSolid : BellIcon
+18 -19
View File
@@ -314,27 +314,26 @@ export function DesktopLeftNav() {
}
label={_(msg`Search`)}
/>
<NavItem
href="/feeds"
icon={
<HashtagIcon
strokeWidth={2.25}
style={pal.text as FontAwesomeIconStyle}
size={isDesktop ? 24 : 28}
/>
}
iconFilled={
<HashtagIcon
strokeWidth={2.5}
style={pal.text as FontAwesomeIconStyle}
size={isDesktop ? 24 : 28}
/>
}
label={_(msg`Feeds`)}
/>
{hasSession && (
<>
<NavItem
href="/feeds"
icon={
<HashtagIcon
strokeWidth={2.25}
style={pal.text as FontAwesomeIconStyle}
size={isDesktop ? 24 : 28}
/>
}
iconFilled={
<HashtagIcon
strokeWidth={2.5}
style={pal.text as FontAwesomeIconStyle}
size={isDesktop ? 24 : 28}
/>
}
label={_(msg`Feeds`)}
/>
<NavItem
href="/notifications"
count={numUnread}
+6 -12
View File
@@ -19,10 +19,6 @@ import {useTheme} from 'lib/ThemeContext'
import {usePalette} from 'lib/hooks/usePalette'
import {RoutesContainer, TabsNavigator} from '../../Navigation'
import {isStateAtTabRoot} from 'lib/routes/helpers'
import {
SafeAreaProvider,
initialWindowMetrics,
} from 'react-native-safe-area-context'
import {
useIsDrawerOpen,
useSetDrawerOpen,
@@ -107,14 +103,12 @@ export const Shell: React.FC = function ShellImpl() {
const pal = usePalette('default')
const theme = useTheme()
return (
<SafeAreaProvider initialMetrics={initialWindowMetrics} style={pal.view}>
<View testID="mobileShellView" style={[styles.outerContainer, pal.view]}>
<StatusBar style={theme.colorScheme === 'dark' ? 'light' : 'dark'} />
<RoutesContainer>
<ShellInner />
</RoutesContainer>
</View>
</SafeAreaProvider>
<View testID="mobileShellView" style={[styles.outerContainer, pal.view]}>
<StatusBar style={theme.colorScheme === 'dark' ? 'light' : 'dark'} />
<RoutesContainer>
<ShellInner />
</RoutesContainer>
</View>
)
}
+9 -4
View File
@@ -48,10 +48,10 @@
typed-emitter "^2.1.0"
zod "^3.21.4"
"@atproto/api@^0.7.3":
version "0.7.3"
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.7.3.tgz#3224000353619970d5e397a157c6e189e195ef47"
integrity sha512-fKU+W+S4kKxClE6IcPBHPZAjcyBYxG28S0FW/bv3T/ZYDkNxGzDV4xuoHOyEDGtB30slltl5U83njuuRZs5xtw==
"@atproto/api@^0.7.4":
version "0.7.4"
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.7.4.tgz#0dd6e725c88d1f941c57670dc82b60fde10f4ec6"
integrity sha512-7DBy6/OcXemzCPzA0dx52LLYRABBs8bq9Docs3is+WRgEx5/Pd1kHSAlCHIaBhsym8fZ3/U4Fks/5FSHkSm4yQ==
dependencies:
"@atproto/common-web" "^0.2.3"
"@atproto/lexicon" "^0.3.1"
@@ -4448,6 +4448,11 @@
resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.3.0.tgz#9e558170c106bbafaa1ef502bd8e6d4651012bf9"
integrity sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg==
"@react-native-masked-view/masked-view@^0.3.1":
version "0.3.1"
resolved "https://registry.yarnpkg.com/@react-native-masked-view/masked-view/-/masked-view-0.3.1.tgz#5bd76f17004a6ccbcec03856893777ee91f23d29"
integrity sha512-uVm8U6nwFIlUd1iDIB5cS+lDadApKR+l8k4k84d9hn+GN4lzAIJhUZ9syYX7c022MxNgAlbxoFLt0pqKoyaAGg==
"@react-native-menu/menu@^0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@react-native-menu/menu/-/menu-0.8.0.tgz#dbf227c2081e5ffd3d2073ee68ecc84cf8639727"