From fa3ccafa8028933f11802eace3dca6f6dc7c4dba Mon Sep 17 00:00:00 2001 From: noriaki watanabe Date: Thu, 14 Dec 2023 11:17:59 +0900 Subject: [PATCH 1/5] Add i18n setup in build instructions (#2206) --- docs/build.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/build.md b/docs/build.md index 2bf7324b9d..c0ffefeefb 100644 --- a/docs/build.md +++ b/docs/build.md @@ -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` From 7fd79702371e3d7829be2188c2212c090bf76670 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 14 Dec 2023 02:48:20 +0000 Subject: [PATCH 2/5] Make scroll handling contextual (#2200) * Add an intermediate List component * Fix type * Add onScrolledDownChange * Port pager to use onScrolledDownChange * Fix on mobile * Don't pass down onScroll (replacement TBD) * Remove resetMainScroll * Replace onMainScroll with MainScrollProvider * Hook ScrollProvider to pager * Fix the remaining special case * Optimize a bit * Enforce that onScroll cannot be passed * Keep value updated even if no handler * Also memo it --- src/lib/ScrollContext.tsx | 35 ++++++++ src/view/com/feeds/FeedPage.tsx | 46 ++++++----- src/view/com/feeds/ProfileFeedgens.tsx | 26 ++---- src/view/com/lists/ListMembers.tsx | 20 ++--- src/view/com/lists/MyLists.tsx | 4 +- src/view/com/lists/ProfileLists.tsx | 26 ++---- src/view/com/notifications/Feed.tsx | 19 ++--- src/view/com/pager/PagerWithHeader.tsx | 47 ++++------- src/view/com/post-thread/PostLikedBy.tsx | 5 +- src/view/com/post-thread/PostRepostedBy.tsx | 5 +- src/view/com/post-thread/PostThread.tsx | 7 +- src/view/com/posts/Feed.tsx | 20 ++--- src/view/com/profile/ProfileFollowers.tsx | 5 +- src/view/com/profile/ProfileFollows.tsx | 5 +- src/view/com/util/List.tsx | 64 +++++++++++++++ .../com/util/MainScrollProvider.tsx} | 54 +++--------- src/view/com/util/ViewSelector.tsx | 11 +-- src/view/com/util/Views.d.ts | 2 +- src/view/com/util/Views.jsx | 2 +- src/view/com/util/Views.web.tsx | 2 +- src/view/screens/Feeds.tsx | 4 +- src/view/screens/Notifications.tsx | 25 +++--- src/view/screens/Profile.tsx | 82 ++++--------------- src/view/screens/ProfileFeed.tsx | 46 ++++------- src/view/screens/ProfileList.tsx | 63 ++++---------- src/view/screens/Search/Search.tsx | 9 +- 26 files changed, 280 insertions(+), 354 deletions(-) create mode 100644 src/lib/ScrollContext.tsx create mode 100644 src/view/com/util/List.tsx rename src/{lib/hooks/useOnMainScroll.ts => view/com/util/MainScrollProvider.tsx} (69%) diff --git a/src/lib/ScrollContext.tsx b/src/lib/ScrollContext.tsx new file mode 100644 index 0000000000..00b197bedc --- /dev/null +++ b/src/lib/ScrollContext.tsx @@ -0,0 +1,35 @@ +import React, {createContext, useContext, useMemo} from 'react' +import {ScrollHandlers} from 'react-native-reanimated' + +const ScrollContext = createContext>({ + onBeginDrag: undefined, + onEndDrag: undefined, + onScroll: undefined, +}) + +export function useScrollHandlers(): ScrollHandlers { + return useContext(ScrollContext) +} + +type ProviderProps = {children: React.ReactNode} & ScrollHandlers + +// Note: this completely *overrides* the parent handlers. +// It's up to you to compose them with the parent ones via useScrollHandlers() if needed. +export function ScrollProvider({ + children, + onBeginDrag, + onEndDrag, + onScroll, +}: ProviderProps) { + const handlers = useMemo( + () => ({ + onBeginDrag, + onEndDrag, + onScroll, + }), + [onBeginDrag, onEndDrag, onScroll], + ) + return ( + {children} + ) +} diff --git a/src/view/com/feeds/FeedPage.tsx b/src/view/com/feeds/FeedPage.tsx index 31ebc75a19..9c92a0dd5f 100644 --- a/src/view/com/feeds/FeedPage.tsx +++ b/src/view/com/feeds/FeedPage.tsx @@ -7,13 +7,15 @@ import {useNavigation} from '@react-navigation/native' import {useAnalytics} from 'lib/analytics/analytics' import {useQueryClient} from '@tanstack/react-query' import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed' -import {useOnMainScroll} from 'lib/hooks/useOnMainScroll' +import {MainScrollProvider} from '../util/MainScrollProvider' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {useSetMinimalShellMode} from '#/state/shell' import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed' import {ComposeIcon2} from 'lib/icons' import {colors, s} from 'lib/styles' -import {FlatList, View, useWindowDimensions} from 'react-native' +import {View, useWindowDimensions} from 'react-native' +import {ListMethods} from '../util/List' import {Feed} from '../posts/Feed' import {TextLink} from '../util/Link' import {FAB} from '../util/fab/FAB' @@ -51,10 +53,11 @@ export function FeedPage({ const {isDesktop} = useWebMediaQueries() const queryClient = useQueryClient() const {openComposer} = useComposerControls() - const [onMainScroll, isScrolledDown, resetMainScroll] = useOnMainScroll() + const [isScrolledDown, setIsScrolledDown] = React.useState(false) + const setMinimalShellMode = useSetMinimalShellMode() const {screen, track} = useAnalytics() const headerOffset = useHeaderOffset() - const scrollElRef = React.useRef(null) + const scrollElRef = React.useRef(null) const [hasNew, setHasNew] = React.useState(false) const scrollToTop = React.useCallback(() => { @@ -62,8 +65,8 @@ export function FeedPage({ animated: isNative, offset: -headerOffset, }) - resetMainScroll() - }, [headerOffset, resetMainScroll]) + setMinimalShellMode(false) + }, [headerOffset, setMinimalShellMode]) const onSoftReset = React.useCallback(() => { const isScreenFocused = @@ -164,21 +167,22 @@ export function FeedPage({ return ( - + + + {(isScrolledDown || hasNew) && ( | null> - onScroll?: OnScrollHandler - scrollEventThrottle?: number + scrollElRef: ListRef headerOffset: number enabled?: boolean style?: StyleProp @@ -50,16 +46,7 @@ export const ProfileFeedgens = React.forwardRef< SectionRef, ProfileFeedgensProps >(function ProfileFeedgensImpl( - { - did, - scrollElRef, - onScroll, - scrollEventThrottle, - headerOffset, - enabled, - style, - testID, - }, + {did, scrollElRef, headerOffset, enabled, style, testID}, ref, ) { const pal = usePalette('default') @@ -185,10 +172,9 @@ export const ProfileFeedgens = React.forwardRef< [error, refetch, onPressRetryLoadMore, pal, preferences], ) - const scrollHandler = useAnimatedScrollHandler(onScroll || {}) return ( - - scrollElRef?: MutableRefObject | null> - onScroll: OnScrollHandler + scrollElRef?: ListRef + onScrolledDownChange: (isScrolledDown: boolean) => void onPressTryAgain?: () => void renderHeader: () => JSX.Element renderEmptyState: () => JSX.Element testID?: string - scrollEventThrottle?: number headerOffset?: number desktopFixedHeightOffset?: number }) { @@ -209,10 +205,9 @@ export function ListMembers({ [isFetching], ) - const scrollHandler = useAnimatedScrollHandler(onScroll) return ( - {items.length > 0 && ( diff --git a/src/view/com/lists/ProfileLists.tsx b/src/view/com/lists/ProfileLists.tsx index 1bd9d188ff..e3d9bd0b43 100644 --- a/src/view/com/lists/ProfileLists.tsx +++ b/src/view/com/lists/ProfileLists.tsx @@ -1,4 +1,4 @@ -import React, {MutableRefObject} from 'react' +import React from 'react' import { Dimensions, RefreshControl, @@ -8,7 +8,7 @@ import { ViewStyle, } from 'react-native' import {useQueryClient} from '@tanstack/react-query' -import {FlatList} from '../util/Views' +import {List, ListRef} from '../util/List' import {ListCard} from './ListCard' import {ErrorMessage} from '../util/error/ErrorMessage' import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' @@ -16,11 +16,9 @@ import {Text} from '../util/text/Text' import {useAnalytics} from 'lib/analytics/analytics' import {usePalette} from 'lib/hooks/usePalette' import {useProfileListsQuery, RQKEY} from '#/state/queries/profile-lists' -import {OnScrollHandler} from '#/lib/hooks/useOnMainScroll' import {logger} from '#/logger' import {Trans} from '@lingui/macro' import {cleanError} from '#/lib/strings/errors' -import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import {useTheme} from '#/lib/ThemeContext' import {FeedLoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder' import {isNative} from '#/platform/detection' @@ -36,9 +34,7 @@ interface SectionRef { interface ProfileListsProps { did: string - scrollElRef: MutableRefObject | null> - onScroll?: OnScrollHandler - scrollEventThrottle?: number + scrollElRef: ListRef headerOffset: number enabled?: boolean style?: StyleProp @@ -47,16 +43,7 @@ interface ProfileListsProps { export const ProfileLists = React.forwardRef( function ProfileListsImpl( - { - did, - scrollElRef, - onScroll, - scrollEventThrottle, - headerOffset, - enabled, - style, - testID, - }, + {did, scrollElRef, headerOffset, enabled, style, testID}, ref, ) { const pal = usePalette('default') @@ -187,10 +174,9 @@ export const ProfileLists = React.forwardRef( [error, refetch, onPressRetryLoadMore, pal], ) - const scrollHandler = useAnimatedScrollHandler(onScroll || {}) return ( - ( minHeight: Dimensions.get('window').height * 1.5, }} style={{paddingTop: headerOffset}} - onScroll={onScroll != null ? scrollHandler : undefined} - scrollEventThrottle={scrollEventThrottle} indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} removeClippedSubviews={true} contentOffset={{x: 0, y: headerOffset * -1}} diff --git a/src/view/com/notifications/Feed.tsx b/src/view/com/notifications/Feed.tsx index 260c9bbd58..52d534c4fd 100644 --- a/src/view/com/notifications/Feed.tsx +++ b/src/view/com/notifications/Feed.tsx @@ -1,13 +1,11 @@ -import React, {MutableRefObject} from 'react' -import {CenteredView, FlatList} from '../util/Views' +import React from 'react' +import {CenteredView} from '../util/Views' import {ActivityIndicator, RefreshControl, 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 {OnScrollHandler} from 'lib/hooks/useOnMainScroll' -import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import {s} from 'lib/styles' import {usePalette} from 'lib/hooks/usePalette' import {useNotificationFeedQuery} from '#/state/queries/notifications/feed' @@ -15,6 +13,7 @@ import {useUnreadNotificationsApi} from '#/state/queries/notifications/unread' import {logger} from '#/logger' import {cleanError} from '#/lib/strings/errors' import {useModerationOpts} from '#/state/queries/preferences' +import {List, ListRef} from '../util/List' const EMPTY_FEED_ITEM = {_reactKey: '__empty__'} const LOAD_MORE_ERROR_ITEM = {_reactKey: '__load_more_error__'} @@ -23,12 +22,12 @@ const LOADING_ITEM = {_reactKey: '__loading__'} export function Feed({ scrollElRef, onPressTryAgain, - onScroll, + onScrolledDownChange, ListHeaderComponent, }: { - scrollElRef?: MutableRefObject | null> + scrollElRef?: ListRef onPressTryAgain?: () => void - onScroll?: OnScrollHandler + onScrolledDownChange: (isScrolledDown: boolean) => void ListHeaderComponent?: () => JSX.Element }) { const pal = usePalette('default') @@ -135,7 +134,6 @@ export function Feed({ [isFetchingNextPage], ) - const scrollHandler = useAnimatedScrollHandler(onScroll || {}) return ( {error && ( @@ -146,7 +144,7 @@ export function Feed({ /> )} - | ScrollView | null> + scrollElRef: React.MutableRefObject } export interface PagerWithHeaderProps { @@ -62,7 +58,6 @@ export const PagerWithHeader = React.forwardRef( const [currentPage, setCurrentPage] = React.useState(0) const [tabBarHeight, setTabBarHeight] = React.useState(0) const [headerOnlyHeight, setHeaderOnlyHeight] = React.useState(0) - const [isScrolledDown, setIsScrolledDown] = React.useState(false) const scrollY = useSharedValue(0) const headerHeight = headerOnlyHeight + tabBarHeight @@ -155,15 +150,7 @@ export const PagerWithHeader = React.forwardRef( if (!throttleTimeout.current) { throttleTimeout.current = setTimeout(() => { throttleTimeout.current = null - runOnUI(adjustScrollForOtherPages)() - - const nextIsScrolledDown = scrollY.value > SCROLLED_DOWN_LIMIT - if (isScrolledDown !== nextIsScrolledDown) { - React.startTransition(() => { - setIsScrolledDown(nextIsScrolledDown) - }) - } }, 80 /* Sync often enough you're unlikely to catch it unsynced */) } }) @@ -211,7 +198,6 @@ export const PagerWithHeader = React.forwardRef( index={i} isReady={isReady} isFocused={i === currentPage} - isScrolledDown={isScrolledDown} onScrollWorklet={i === currentPage ? onScrollWorklet : noop} registerRef={registerRef} renderTab={child} @@ -293,7 +279,6 @@ function PagerItem({ index, isReady, isFocused, - isScrolledDown, onScrollWorklet, renderTab, registerRef, @@ -302,7 +287,6 @@ function PagerItem({ index: number isFocused: boolean isReady: boolean - isScrolledDown: boolean registerRef: (scrollRef: AnimatedRef | null, atIndex: number) => void onScrollWorklet: (e: NativeScrollEvent) => void renderTab: ((props: PagerWithHeaderChildParams) => JSX.Element) | null @@ -316,24 +300,21 @@ function PagerItem({ } }, [scrollElRef, registerRef, index]) - const scrollHandler = React.useMemo( - () => ({onScroll: onScrollWorklet}), - [onScrollWorklet], - ) - if (!isReady || renderTab == null) { return null } - return renderTab({ - headerHeight, - isFocused, - isScrolledDown, - onScroll: scrollHandler, - scrollElRef: scrollElRef as React.MutableRefObject< - FlatList | ScrollView | null - >, - }) + return ( + + {renderTab({ + headerHeight, + isFocused, + scrollElRef: scrollElRef as React.MutableRefObject< + ListMethods | ScrollView | null + >, + })} + + ) } const styles = StyleSheet.create({ diff --git a/src/view/com/post-thread/PostLikedBy.tsx b/src/view/com/post-thread/PostLikedBy.tsx index 60afe1f9c6..245ba59e8c 100644 --- a/src/view/com/post-thread/PostLikedBy.tsx +++ b/src/view/com/post-thread/PostLikedBy.tsx @@ -1,7 +1,8 @@ import React, {useCallback, useMemo, useState} from 'react' import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' import {AppBskyFeedGetLikes as GetLikes} from '@atproto/api' -import {CenteredView, FlatList} from '../util/Views' +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' @@ -84,7 +85,7 @@ export function PostLikedBy({uri}: {uri: string}) { // loaded // = return ( - item.actor.did} refreshControl={ diff --git a/src/view/com/post-thread/PostRepostedBy.tsx b/src/view/com/post-thread/PostRepostedBy.tsx index 1162fec403..5cc0063885 100644 --- a/src/view/com/post-thread/PostRepostedBy.tsx +++ b/src/view/com/post-thread/PostRepostedBy.tsx @@ -1,7 +1,8 @@ import React, {useMemo, useCallback, useState} from 'react' import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' import {AppBskyActorDefs as ActorDefs} from '@atproto/api' -import {CenteredView, FlatList} from '../util/Views' +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' @@ -85,7 +86,7 @@ export function PostRepostedBy({uri}: {uri: string}) { // loaded // = return ( - item.did} refreshControl={ diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx index 051bc7849f..f27da331f9 100644 --- a/src/view/com/post-thread/PostThread.tsx +++ b/src/view/com/post-thread/PostThread.tsx @@ -8,7 +8,8 @@ import { View, } from 'react-native' import {AppBskyFeedDefs} from '@atproto/api' -import {CenteredView, FlatList} from '../util/Views' +import {CenteredView} from '../util/Views' +import {List, ListMethods} from '../util/List' import { FontAwesomeIcon, FontAwesomeIconStyle, @@ -140,7 +141,7 @@ function PostThreadLoaded({ const {_} = useLingui() const pal = usePalette('default') const {isTablet, isDesktop} = useWebMediaQueries() - const ref = useRef(null) + const ref = useRef(null) const highlightedPostRef = useRef(null) const needsScrollAdjustment = useRef( !isNative || // web always uses scroll adjustment @@ -335,7 +336,7 @@ function PostThreadLoaded({ ) return ( - enabled?: boolean pollInterval?: number - scrollElRef?: MutableRefObject | null> + scrollElRef?: ListRef onHasNew?: (v: boolean) => void - onScroll?: OnScrollHandler - scrollEventThrottle?: number + onScrolledDownChange?: (isScrolledDown: boolean) => void renderEmptyState: () => JSX.Element renderEndOfFeed?: () => JSX.Element testID?: string @@ -270,10 +266,9 @@ let Feed = ({ ) }, [isFetchingNextPage, shouldRenderEndOfFeed, renderEndOfFeed, headerOffset]) - const scrollHandler = useAnimatedScrollHandler(onScroll || {}) return ( - item.did} refreshControl={ diff --git a/src/view/com/profile/ProfileFollows.tsx b/src/view/com/profile/ProfileFollows.tsx index 890c13eb23..5265ee07ea 100644 --- a/src/view/com/profile/ProfileFollows.tsx +++ b/src/view/com/profile/ProfileFollows.tsx @@ -1,7 +1,8 @@ import React from 'react' import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' import {AppBskyActorDefs as ActorDefs} from '@atproto/api' -import {CenteredView, FlatList} from '../util/Views' +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' @@ -86,7 +87,7 @@ export function ProfileFollows({name}: {name: string}) { // loaded // = return ( - item.did} refreshControl={ diff --git a/src/view/com/util/List.tsx b/src/view/com/util/List.tsx new file mode 100644 index 0000000000..5947fe87a1 --- /dev/null +++ b/src/view/com/util/List.tsx @@ -0,0 +1,64 @@ +import React, {memo, startTransition} from 'react' +import {FlatListProps} from 'react-native' +import {FlatList_INTERNAL} from './Views' +import {useScrollHandlers} from '#/lib/ScrollContext' +import {runOnJS, useSharedValue} from 'react-native-reanimated' +import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' + +export type ListMethods = FlatList_INTERNAL +export type ListProps = Omit< + FlatListProps, + 'onScroll' // Use ScrollContext instead. +> & { + onScrolledDownChange?: (isScrolledDown: boolean) => void +} +export type ListRef = React.MutableRefObject + +const SCROLLED_DOWN_LIMIT = 200 + +function ListImpl( + {onScrolledDownChange, ...props}: ListProps, + ref: React.Ref, +) { + const isScrolledDown = useSharedValue(false) + const contextScrollHandlers = useScrollHandlers() + + function handleScrolledDownChange(didScrollDown: boolean) { + startTransition(() => { + onScrolledDownChange?.(didScrollDown) + }) + } + + const scrollHandler = useAnimatedScrollHandler({ + onBeginDrag(e, ctx) { + contextScrollHandlers.onBeginDrag?.(e, ctx) + }, + onEndDrag(e, ctx) { + contextScrollHandlers.onEndDrag?.(e, ctx) + }, + onScroll(e, ctx) { + contextScrollHandlers.onScroll?.(e, ctx) + + const didScrollDown = e.contentOffset.y > SCROLLED_DOWN_LIMIT + if (isScrolledDown.value !== didScrollDown) { + isScrolledDown.value = didScrollDown + if (onScrolledDownChange != null) { + runOnJS(handleScrolledDownChange)(didScrollDown) + } + } + }, + }) + + return ( + + ) +} + +export const List = memo(React.forwardRef(ListImpl)) as ( + props: ListProps & {ref?: React.Ref}, +) => React.ReactElement diff --git a/src/lib/hooks/useOnMainScroll.ts b/src/view/com/util/MainScrollProvider.tsx similarity index 69% rename from src/lib/hooks/useOnMainScroll.ts rename to src/view/com/util/MainScrollProvider.tsx index 2e7a799137..31a4ef0c85 100644 --- a/src/lib/hooks/useOnMainScroll.ts +++ b/src/view/com/util/MainScrollProvider.tsx @@ -1,30 +1,18 @@ -import {useState, useCallback, useMemo} from 'react' -import {NativeSyntheticEvent, NativeScrollEvent} from 'react-native' +import React, {useCallback} from 'react' +import {ScrollProvider} from '#/lib/ScrollContext' +import {NativeScrollEvent} from 'react-native' import {useSetMinimalShellMode, useMinimalShellMode} from '#/state/shell' import {useShellLayout} from '#/state/shell/shell-layout' -import {s} from 'lib/styles' import {isWeb} from 'platform/detection' -import { - useSharedValue, - interpolate, - runOnJS, - ScrollHandlers, -} from 'react-native-reanimated' +import {useSharedValue, interpolate} from 'react-native-reanimated' function clamp(num: number, min: number, max: number) { 'worklet' return Math.min(Math.max(num, min), max) } -export type OnScrollCb = ( - event: NativeSyntheticEvent, -) => void -export type OnScrollHandler = ScrollHandlers -export type ResetCb = () => void - -export function useOnMainScroll(): [OnScrollHandler, boolean, ResetCb] { +export function MainScrollProvider({children}: {children: React.ReactNode}) { const {headerHeight} = useShellLayout() - const [isScrolledDown, setIsScrolledDown] = useState(false) const mode = useMinimalShellMode() const setMode = useSetMinimalShellMode() const startDragOffset = useSharedValue(null) @@ -58,13 +46,6 @@ export function useOnMainScroll(): [OnScrollHandler, boolean, ResetCb] { const onScroll = useCallback( (e: NativeScrollEvent) => { 'worklet' - // Keep track of whether we want to show "scroll to top". - if (!isScrolledDown && e.contentOffset.y > s.window.height) { - runOnJS(setIsScrolledDown)(true) - } else if (isScrolledDown && e.contentOffset.y < s.window.height) { - runOnJS(setIsScrolledDown)(false) - } - if (startDragOffset.value === null || startMode.value === null) { if (mode.value !== 0 && e.contentOffset.y < headerHeight.value) { // If we're close enough to the top, always show the shell. @@ -102,24 +83,15 @@ export function useOnMainScroll(): [OnScrollHandler, boolean, ResetCb] { startMode.value = mode.value } }, - [headerHeight, mode, setMode, isScrolledDown, startDragOffset, startMode], + [headerHeight, mode, setMode, startDragOffset, startMode], ) - const scrollHandler: ScrollHandlers = useMemo( - () => ({ - onBeginDrag, - onEndDrag, - onScroll, - }), - [onBeginDrag, onEndDrag, onScroll], + return ( + + {children} + ) - - return [ - scrollHandler, - isScrolledDown, - useCallback(() => { - setIsScrolledDown(false) - setMode(false) - }, [setMode]), - ] } diff --git a/src/view/com/util/ViewSelector.tsx b/src/view/com/util/ViewSelector.tsx index 935d93033b..ee993c564d 100644 --- a/src/view/com/util/ViewSelector.tsx +++ b/src/view/com/util/ViewSelector.tsx @@ -1,13 +1,14 @@ import React, {useEffect, useState} from 'react' import { + NativeSyntheticEvent, + NativeScrollEvent, Pressable, RefreshControl, StyleSheet, View, ScrollView, } from 'react-native' -import {FlatList} from './Views' -import {OnScrollCb} from 'lib/hooks/useOnMainScroll' +import {FlatList_INTERNAL} from './Views' import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle' import {Text} from './text/Text' import {usePalette} from 'lib/hooks/usePalette' @@ -38,7 +39,7 @@ export const ViewSelector = React.forwardRef< | null | undefined onSelectView?: (viewIndex: number) => void - onScroll?: OnScrollCb + onScroll?: (event: NativeSyntheticEvent) => void onRefresh?: () => void onEndReached?: (info: {distanceFromEnd: number}) => void } @@ -59,7 +60,7 @@ export const ViewSelector = React.forwardRef< ) { const pal = usePalette('default') const [selectedIndex, setSelectedIndex] = useState(0) - const flatListRef = React.useRef(null) + const flatListRef = React.useRef(null) // events // = @@ -110,7 +111,7 @@ export const ViewSelector = React.forwardRef< [items], ) return ( - diff --git a/src/view/com/util/Views.web.tsx b/src/view/com/util/Views.web.tsx index 5a4f266fd5..db3b9de0d8 100644 --- a/src/view/com/util/Views.web.tsx +++ b/src/view/com/util/Views.web.tsx @@ -49,7 +49,7 @@ export function CenteredView({ return } -export const FlatList = React.forwardRef(function FlatListImpl( +export const FlatList_INTERNAL = React.forwardRef(function FlatListImpl( { contentContainerStyle, style, diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx index f319fbc390..d2d0aafb8f 100644 --- a/src/view/screens/Feeds.tsx +++ b/src/view/screens/Feeds.tsx @@ -19,7 +19,7 @@ import { import {ErrorMessage} from 'view/com/util/error/ErrorMessage' import debounce from 'lodash.debounce' import {Text} from 'view/com/util/text/Text' -import {FlatList} from 'view/com/util/Views' +import {List} from 'view/com/util/List' import {useFocusEffect} from '@react-navigation/native' import {FeedSourceCard} from 'view/com/feeds/FeedSourceCard' import {Trans, msg} from '@lingui/macro' @@ -481,7 +481,7 @@ export function FeedsScreen(_props: Props) { {preferences ? : } - item.key} diff --git a/src/view/screens/Notifications.tsx b/src/view/screens/Notifications.tsx index fceaa60c29..e28a67e370 100644 --- a/src/view/screens/Notifications.tsx +++ b/src/view/screens/Notifications.tsx @@ -1,5 +1,5 @@ import React from 'react' -import {FlatList, View} from 'react-native' +import {View} from 'react-native' import {useFocusEffect} from '@react-navigation/native' import {useQueryClient} from '@tanstack/react-query' import { @@ -9,8 +9,9 @@ import { import {ViewHeader} from '../com/util/ViewHeader' import {Feed} from '../com/notifications/Feed' import {TextLink} from 'view/com/util/Link' +import {ListMethods} from 'view/com/util/List' import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn' -import {useOnMainScroll} from 'lib/hooks/useOnMainScroll' +import {MainScrollProvider} from '../com/util/MainScrollProvider' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {s, colors} from 'lib/styles' @@ -35,8 +36,8 @@ type Props = NativeStackScreenProps< export function NotificationsScreen({}: Props) { const {_} = useLingui() const setMinimalShellMode = useSetMinimalShellMode() - const [onMainScroll, isScrolledDown, resetMainScroll] = useOnMainScroll() - const scrollElRef = React.useRef(null) + const [isScrolledDown, setIsScrolledDown] = React.useState(false) + const scrollElRef = React.useRef(null) const checkLatestRef = React.useRef<() => void | null>() const {screen} = useAnalytics() const pal = usePalette('default') @@ -50,8 +51,8 @@ export function NotificationsScreen({}: Props) { // = const scrollToTop = React.useCallback(() => { scrollElRef.current?.scrollToOffset({animated: isNative, offset: 0}) - resetMainScroll() - }, [scrollElRef, resetMainScroll]) + setMinimalShellMode(false) + }, [scrollElRef, setMinimalShellMode]) const onPressLoadLatest = React.useCallback(() => { scrollToTop() @@ -130,11 +131,13 @@ export function NotificationsScreen({}: Props) { return ( - + + + {(isScrolledDown || hasNew) && ( - {({onScroll, headerHeight, isFocused, isScrolledDown, scrollElRef}) => ( + {({headerHeight, isFocused, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} ignoreFilterFor={profile.did} /> )} {showRepliesTab - ? ({ - onScroll, - headerHeight, - isFocused, - isScrolledDown, - scrollElRef, - }) => ( + ? ({headerHeight, isFocused, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} ignoreFilterFor={profile.did} /> ) : null} - {({onScroll, headerHeight, isFocused, isScrolledDown, scrollElRef}) => ( + {({headerHeight, isFocused, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} ignoreFilterFor={profile.did} /> )} {showLikesTab - ? ({ - onScroll, - headerHeight, - isFocused, - isScrolledDown, - scrollElRef, - }) => ( + ? ({headerHeight, isFocused, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} ignoreFilterFor={profile.did} /> ) : null} {showFeedsTab - ? ({onScroll, headerHeight, isFocused, scrollElRef}) => ( + ? ({headerHeight, isFocused, scrollElRef}) => ( | null> - } - onScroll={onScroll} - scrollEventThrottle={1} + scrollElRef={scrollElRef as ListRef} headerOffset={headerHeight} enabled={isFocused} /> ) : null} {showListsTab - ? ({onScroll, headerHeight, isFocused, scrollElRef}) => ( + ? ({headerHeight, isFocused, scrollElRef}) => ( | null> - } - onScroll={onScroll} - scrollEventThrottle={1} + scrollElRef={scrollElRef as ListRef} headerOffset={headerHeight} enabled={isFocused} /> @@ -396,28 +360,19 @@ function ProfileScreenLoaded({ interface FeedSectionProps { feed: FeedDescriptor - onScroll: OnScrollHandler headerHeight: number isFocused: boolean - isScrolledDown: boolean - scrollElRef: React.MutableRefObject | null> + scrollElRef: ListRef ignoreFilterFor?: string } const FeedSection = React.forwardRef( function FeedSectionImpl( - { - feed, - onScroll, - headerHeight, - isFocused, - isScrolledDown, - scrollElRef, - ignoreFilterFor, - }, + {feed, headerHeight, isFocused, scrollElRef, ignoreFilterFor}, ref, ) { const queryClient = useQueryClient() const [hasNew, setHasNew] = React.useState(false) + const [isScrolledDown, setIsScrolledDown] = React.useState(false) const onScrollToTop = React.useCallback(() => { scrollElRef.current?.scrollToOffset({ @@ -443,8 +398,7 @@ const FeedSection = React.forwardRef( feed={feed} scrollElRef={scrollElRef} onHasNew={setHasNew} - onScroll={onScroll} - scrollEventThrottle={1} + onScrolledDownChange={setIsScrolledDown} renderEmptyState={renderPostsEmpty} headerOffset={headerHeight} renderEndOfFeed={ProfileEndOfFeed} diff --git a/src/view/screens/ProfileFeed.tsx b/src/view/screens/ProfileFeed.tsx index 620b1814af..ea92ebab16 100644 --- a/src/view/screens/ProfileFeed.tsx +++ b/src/view/screens/ProfileFeed.tsx @@ -1,11 +1,5 @@ import React, {useMemo, useCallback} from 'react' -import { - Dimensions, - StyleSheet, - View, - ActivityIndicator, - FlatList, -} from 'react-native' +import {Dimensions, StyleSheet, View, ActivityIndicator} from 'react-native' import {NativeStackScreenProps} from '@react-navigation/native-stack' import {useNavigation} from '@react-navigation/native' import {useQueryClient} from '@tanstack/react-query' @@ -20,6 +14,7 @@ import {PagerWithHeader} from 'view/com/pager/PagerWithHeader' import {ProfileSubpageHeader} from 'view/com/profile/ProfileSubpageHeader' import {Feed} from 'view/com/posts/Feed' import {TextLink} from 'view/com/util/Link' +import {ListRef} from 'view/com/util/List' import {Button} from 'view/com/util/forms/Button' import {Text} from 'view/com/util/text/Text' import {RichText} from 'view/com/util/text/RichText' @@ -29,12 +24,13 @@ import {EmptyState} from 'view/com/util/EmptyState' import * as Toast from 'view/com/util/Toast' import {useSetTitle} from 'lib/hooks/useSetTitle' import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed' -import {OnScrollHandler} from 'lib/hooks/useOnMainScroll' import {shareUrl} from 'lib/sharing' import {toShareUrl} from 'lib/strings/url-helpers' import {Haptics} from 'lib/haptics' import {useAnalytics} from 'lib/analytics/analytics' import {NativeDropdown, DropdownItem} from 'view/com/util/forms/NativeDropdown' +import {useScrollHandlers} from '#/lib/ScrollContext' +import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import {makeCustomFeedLink} from 'lib/routes/links' import {pluralize} from 'lib/strings/helpers' import {CenteredView, ScrollView} from 'view/com/util/Views' @@ -46,7 +42,6 @@ import {logger} from '#/logger' import {Trans, msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useModalControls} from '#/state/modals' -import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import { useFeedSourceInfoQuery, FeedSourceFeedInfo, @@ -403,17 +398,13 @@ export function ProfileFeedScreenInner({ isHeaderReady={true} renderHeader={renderHeader} onCurrentPageSelected={onCurrentPageSelected}> - {({onScroll, headerHeight, isScrolledDown, scrollElRef, isFocused}) => + {({headerHeight, scrollElRef, isFocused}) => isPublicResponse?.isPublic ? ( | null> - } + scrollElRef={scrollElRef as ListRef} isFocused={isFocused} /> ) : ( @@ -422,13 +413,12 @@ export function ProfileFeedScreenInner({ ) } - {({onScroll, headerHeight, scrollElRef}) => ( + {({headerHeight, scrollElRef}) => ( } @@ -497,18 +487,14 @@ function NonPublicFeedMessage({rawError}: {rawError?: Error}) { interface FeedSectionProps { feed: FeedDescriptor - onScroll: OnScrollHandler headerHeight: number - isScrolledDown: boolean - scrollElRef: React.MutableRefObject | null> + scrollElRef: ListRef isFocused: boolean } const FeedSection = React.forwardRef( - function FeedSectionImpl( - {feed, onScroll, headerHeight, isScrolledDown, scrollElRef, isFocused}, - ref, - ) { + function FeedSectionImpl({feed, headerHeight, scrollElRef, isFocused}, ref) { const [hasNew, setHasNew] = React.useState(false) + const [isScrolledDown, setIsScrolledDown] = React.useState(false) const queryClient = useQueryClient() const onScrollToTop = useCallback(() => { @@ -536,8 +522,7 @@ const FeedSection = React.forwardRef( pollInterval={30e3} scrollElRef={scrollElRef} onHasNew={setHasNew} - onScroll={onScroll} - scrollEventThrottle={5} + onScrolledDownChange={setIsScrolledDown} renderEmptyState={renderPostsEmpty} headerOffset={headerHeight} /> @@ -558,7 +543,6 @@ function AboutSection({ feedRkey, feedInfo, headerHeight, - onScroll, scrollElRef, isOwner, }: { @@ -566,13 +550,13 @@ function AboutSection({ feedRkey: string feedInfo: FeedSourceFeedInfo headerHeight: number - onScroll: OnScrollHandler scrollElRef: React.MutableRefObject isOwner: boolean }) { const pal = usePalette('default') const {_} = useLingui() - const scrollHandler = useAnimatedScrollHandler(onScroll) + const scrollHandlers = useScrollHandlers() + const onScroll = useAnimatedScrollHandler(scrollHandlers) const [likeUri, setLikeUri] = React.useState(feedInfo.likeUri) const {hasSession} = useSession() const {track} = useAnalytics() @@ -608,12 +592,12 @@ function AboutSection({ return ( + }}> - {({ - onScroll, - headerHeight, - isScrolledDown, - scrollElRef, - isFocused, - }) => ( + {({headerHeight, scrollElRef, isFocused}) => ( | null> - } - onScroll={onScroll} + scrollElRef={scrollElRef as ListRef} headerHeight={headerHeight} - isScrolledDown={isScrolledDown} isFocused={isFocused} /> )} - {({onScroll, headerHeight, isScrolledDown, scrollElRef}) => ( + {({headerHeight, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} list={list} onPressAddUser={onPressAddUser} - onScroll={onScroll} headerHeight={headerHeight} - isScrolledDown={isScrolledDown} /> )} @@ -221,16 +201,12 @@ function ProfileListScreenLoaded({ items={SECTION_TITLES_MOD} isHeaderReady={true} renderHeader={renderHeader}> - {({onScroll, headerHeight, isScrolledDown, scrollElRef}) => ( + {({headerHeight, scrollElRef}) => ( | null> - } + scrollElRef={scrollElRef as ListRef} onPressAddUser={onPressAddUser} - onScroll={onScroll} headerHeight={headerHeight} - isScrolledDown={isScrolledDown} /> )} @@ -615,19 +591,15 @@ function Header({rkey, list}: {rkey: string; list: AppBskyGraphDefs.ListView}) { interface FeedSectionProps { feed: FeedDescriptor - onScroll: OnScrollHandler headerHeight: number - isScrolledDown: boolean - scrollElRef: React.MutableRefObject | null> + scrollElRef: ListRef isFocused: boolean } const FeedSection = React.forwardRef( - function FeedSectionImpl( - {feed, scrollElRef, onScroll, headerHeight, isScrolledDown, isFocused}, - ref, - ) { + function FeedSectionImpl({feed, scrollElRef, headerHeight, isFocused}, ref) { const queryClient = useQueryClient() const [hasNew, setHasNew] = React.useState(false) + const [isScrolledDown, setIsScrolledDown] = React.useState(false) const onScrollToTop = useCallback(() => { scrollElRef.current?.scrollToOffset({ @@ -654,8 +626,7 @@ const FeedSection = React.forwardRef( pollInterval={30e3} scrollElRef={scrollElRef} onHasNew={setHasNew} - onScroll={onScroll} - scrollEventThrottle={1} + onScrolledDownChange={setIsScrolledDown} renderEmptyState={renderPostsEmpty} headerOffset={headerHeight} /> @@ -674,20 +645,19 @@ const FeedSection = React.forwardRef( interface AboutSectionProps { list: AppBskyGraphDefs.ListView onPressAddUser: () => void - onScroll: OnScrollHandler headerHeight: number - isScrolledDown: boolean - scrollElRef: React.MutableRefObject | null> + scrollElRef: ListRef } const AboutSection = React.forwardRef( function AboutSectionImpl( - {list, onPressAddUser, onScroll, headerHeight, isScrolledDown, scrollElRef}, + {list, onPressAddUser, headerHeight, scrollElRef}, ref, ) { const pal = usePalette('default') const {_} = useLingui() const {isMobile} = useWebMediaQueries() const {currentAccount} = useSession() + const [isScrolledDown, setIsScrolledDown] = React.useState(false) const isCurateList = list.purpose === 'app.bsky.graph.defs#curatelist' const isOwner = list.creator.did === currentAccount?.did @@ -817,8 +787,7 @@ const AboutSection = React.forwardRef( renderHeader={renderHeader} renderEmptyState={renderEmptyState} headerOffset={headerHeight} - onScroll={onScroll} - scrollEventThrottle={1} + onScrolledDownChange={setIsScrolledDown} /> {isScrolledDown && ( } keyExtractor={item => item.did} @@ -243,7 +244,7 @@ function SearchScreenPostResults({query}: {query: string}) { {isFetched ? ( <> {posts.length ? ( - { if (item.type === 'post') { @@ -284,7 +285,7 @@ function SearchScreenUserResults({query}: {query: string}) { return isFetched && results ? ( <> {results.length ? ( - ( From 075ffdf583c5393b896d22dd179d03208311ef4a Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Thu, 14 Dec 2023 10:31:49 -0800 Subject: [PATCH 3/5] PWI behavior updates (#2207) * Enable PWI * Disable access to feeds on PWI * Remove feeds nav item from drawer when signed out * Replace discover feed on home with a CTA * Wire up the sign in and create account buttons to go straight to their respective screens * Give a custom ScreenHider interface for no-pwi * Add side borders on desktop to the screen hider * Filter accounts in the autocomplete according to mod settings * Trim replies in the post thread that are pwi opt-out * Show 'learn more' on the content hider when no-override is enabled * Apply the moderation filter on profile cards * Disable post search on logged-out view * Update locale files * Bump api pkg * Ensure feeds with no posts don't show as NSFPublic * Fix types --------- Co-authored-by: Eric Bailey --- package.json | 2 +- src/Navigation.tsx | 8 +- src/lib/build-flags.ts | 2 +- src/locale/locales/en/messages.po | 236 ++++++++++-------- src/locale/locales/hi/messages.po | 236 ++++++++++-------- src/locale/locales/ja/messages.po | 236 ++++++++++-------- src/state/queries/actor-autocomplete.ts | 43 +++- src/state/queries/post-feed.ts | 3 + src/state/shell/logged-out.tsx | 2 +- src/view/com/auth/HomeLoggedOutCTA.tsx | 165 ++++++++++++ src/view/com/auth/LoggedOut.tsx | 4 +- src/view/com/post-thread/PostThread.tsx | 18 +- src/view/com/profile/ProfileCard.tsx | 3 + src/view/com/util/moderation/ContentHider.tsx | 20 +- src/view/com/util/moderation/ScreenHider.tsx | 64 +++-- src/view/screens/Home.tsx | 8 +- src/view/screens/Profile.tsx | 2 +- src/view/screens/Search/Search.tsx | 99 +++++--- src/view/shell/Drawer.tsx | 2 +- src/view/shell/NavSignupCard.tsx | 18 +- src/view/shell/bottom-bar/BottomBar.tsx | 44 ++-- src/view/shell/bottom-bar/BottomBarWeb.tsx | 22 +- src/view/shell/desktop/LeftNav.tsx | 37 ++- yarn.lock | 8 +- 24 files changed, 839 insertions(+), 443 deletions(-) create mode 100644 src/view/com/auth/HomeLoggedOutCTA.tsx diff --git a/package.json b/package.json index 758b7fbea0..52e4b7eff5 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 3f6b5ba20c..24fbb0d818 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -182,7 +182,7 @@ function commonScreens(Stack: typeof HomeTab, unreadCountLabel?: string) { ProfileFeedScreen} - options={{title: title('Feed')}} + options={{title: title('Feed'), requireAuth: true}} /> - FeedsScreen} /> + FeedsScreen} + options={{requireAuth: true}} + /> {commonScreens(FeedsTab as typeof HomeTab)} ) diff --git a/src/lib/build-flags.ts b/src/lib/build-flags.ts index faefdd6ab7..cf05114e02 100644 --- a/src/lib/build-flags.ts +++ b/src/lib/build-flags.ts @@ -1,2 +1,2 @@ export const LOGIN_INCLUDE_DEV_SERVERS = true -export const PWI_ENABLED = false +export const PWI_ENABLED = true diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 6cb186fe50..d36445b59d 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -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 "" diff --git a/src/locale/locales/hi/messages.po b/src/locale/locales/hi/messages.po index cd7151d8d9..77930e51f6 100644 --- a/src/locale/locales/hi/messages.po +++ b/src/locale/locales/hi/messages.po @@ -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 "आपके पास कोई सूची नहीं है।।" diff --git a/src/locale/locales/ja/messages.po b/src/locale/locales/ja/messages.po index b6877181c0..449ad6b9ba 100644 --- a/src/locale/locales/ja/messages.po +++ b/src/locale/locales/ja/messages.po @@ -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 "リストがありません。" diff --git a/src/state/queries/actor-autocomplete.ts b/src/state/queries/actor-autocomplete.ts index fbd1b38f9d..fe207371d0 100644 --- a/src/state/queries/actor-autocomplete.ts +++ b/src/state/queries/actor-autocomplete.ts @@ -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({ 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 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( diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts index efdb42dd2b..423de4ae87 100644 --- a/src/state/queries/post-feed.ts +++ b/src/state/queries/post-feed.ts @@ -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 diff --git a/src/state/shell/logged-out.tsx b/src/state/shell/logged-out.tsx index a06a6d969f..8fe2a9c01f 100644 --- a/src/state/shell/logged-out.tsx +++ b/src/state/shell/logged-out.tsx @@ -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 diff --git a/src/view/com/auth/HomeLoggedOutCTA.tsx b/src/view/com/auth/HomeLoggedOutCTA.tsx new file mode 100644 index 0000000000..32b873ac67 --- /dev/null +++ b/src/view/com/auth/HomeLoggedOutCTA.tsx @@ -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 ( + + + + Bluesky + + + See what's next + + + + + + Create a new account + + + + + Sign In + + + + + + + + + + + ) +} + +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: {}, +}) diff --git a/src/view/com/auth/LoggedOut.tsx b/src/view/com/auth/LoggedOut.tsx index fcff4f7821..b0b2bf7edc 100644 --- a/src/view/com/auth/LoggedOut.tsx +++ b/src/view/com/auth/LoggedOut.tsx @@ -33,7 +33,9 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) { const {requestedAccountSwitchTo} = useLoggedOutView() const [screenState, setScreenState] = React.useState( requestedAccountSwitchTo - ? ScreenState.S_Login + ? requestedAccountSwitchTo === 'new' + ? ScreenState.S_CreateAccount + : ScreenState.S_Login : ScreenState.S_LoginOrCreateAccount, ) const {isMobile} = useWebMediaQueries() diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx index f27da331f9..9175508847 100644 --- a/src/view/com/post-thread/PostThread.tsx +++ b/src/view/com/post-thread/PostThread.tsx @@ -157,7 +157,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 +168,7 @@ function PostThreadLoaded({ arr.push(BOTTOM_COMPONENT) } return arr - }, [thread, maxVisible, threadViewPrefs]) + }, [thread, maxVisible, threadViewPrefs, hasSession]) /** * NOTE @@ -468,20 +470,24 @@ function isThreadPost(v: unknown): v is ThreadPost { function* flattenThreadSkeleton( node: ThreadNode, + hasSession: boolean, ): Generator { 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 +499,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 diff --git a/src/view/com/profile/ProfileCard.tsx b/src/view/com/profile/ProfileCard.tsx index 21972f274e..c5b2dc528a 100644 --- a/src/view/com/profile/ProfileCard.tsx +++ b/src/view/com/profile/ProfileCard.tsx @@ -50,6 +50,9 @@ export function ProfileCard({ return null } const moderation = moderateProfile(profile, moderationOpts) + if (moderation.account.filter) { + return null + } return ( {desc.name} - {!moderation.noOverride && ( - - - {override ? 'Hide' : 'Show'} - - - )} + + + {moderation.noOverride ? ( + Learn more + ) : override ? ( + Hide + ) : ( + Show + )} + + {override && {children}} diff --git a/src/view/com/util/moderation/ScreenHider.tsx b/src/view/com/util/moderation/ScreenHider.tsx index 946f937e9e..86f0cbf7bf 100644 --- a/src/view/com/util/moderation/ScreenHider.tsx +++ b/src/view/com/util/moderation/ScreenHider.tsx @@ -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 ( - + - Content Warning + {isNoPwi ? ( + Sign-in Required + ) : ( + Content Warning + )} - This {screenDescription} has been flagged: - - {desc.name}. - - { - openModal({ - name: 'moderation-details', - context: 'account', - moderation, - }) - }} - accessibilityRole="button" - accessibilityLabel={_(msg`Learn more about this warning`)} - accessibilityHint=""> - - Learn More - - + {isNoPwi ? ( + + This account has requested that users sign in to view their profile. + + ) : ( + <> + This {screenDescription} has been flagged: + + {desc.name}. + + { + openModal({ + name: 'moderation-details', + context: 'account', + moderation, + }) + }} + accessibilityRole="button" + accessibilityLabel={_(msg`Learn more about this warning`)} + accessibilityHint=""> + + Learn More + + + + )}{' '} {isMobile && } @@ -116,7 +134,7 @@ export function ScreenHider({ )} - + ) } diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index 42a958b95d..bfe4402653 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -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"> - + ) } diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx index 3f2dd773e1..f1c648a672 100644 --- a/src/view/screens/Profile.tsx +++ b/src/view/screens/Profile.tsx @@ -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(() => { return [ diff --git a/src/view/screens/Search/Search.tsx b/src/view/screens/Search/Search.tsx index 7d7b4098f8..efd8507a7e 100644 --- a/src/view/screens/Search/Search.tsx +++ b/src/view/screens/Search/Search.tsx @@ -304,7 +304,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 +321,62 @@ export function SearchScreenInner({query}: {query?: string}) { [setDrawerSwipeDisabled, setMinimalShellMode], ) + if (hasSession) { + return query ? ( + ( + + + + )} + initialPage={0}> + + + + + + + + ) : ( + + + + Suggested Follows + + + + + + ) + } + return query ? ( ( - + )} initialPage={0}> - - - - ) : hasSession ? ( - - - - Suggested Follows - - - - - ) : ( )} - - Search for posts and users. - + + + + {isDesktop ? ( + Find users with the search tool on the right + ) : ( + Find users on Bluesky + )} + + ) diff --git a/src/view/shell/Drawer.tsx b/src/view/shell/Drawer.tsx index 4d3a9531de..4fb8565e80 100644 --- a/src/view/shell/Drawer.tsx +++ b/src/view/shell/Drawer.tsx @@ -231,9 +231,9 @@ let DrawerContent = ({}: {}): React.ReactNode => { onPress={onPressNotifications} /> )} - {hasSession && ( <> + { 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 ( {