diff options
Diffstat (limited to 'src/view')
-rw-r--r-- | src/view/com/modals/AltImage.tsx | 25 | ||||
-rw-r--r-- | src/view/com/modals/ProfilePreview.tsx | 4 | ||||
-rw-r--r-- | src/view/com/notifications/FeedItem.tsx | 4 | ||||
-rw-r--r-- | src/view/com/post-thread/PostThreadItem.tsx | 1 | ||||
-rw-r--r-- | src/view/com/util/UserInfoText.tsx | 6 | ||||
-rw-r--r-- | src/view/screens/Feeds.tsx | 4 | ||||
-rw-r--r-- | src/view/screens/Profile.tsx | 18 |
7 files changed, 50 insertions, 12 deletions
diff --git a/src/view/com/modals/AltImage.tsx b/src/view/com/modals/AltImage.tsx index 5156511d6..7671c29c8 100644 --- a/src/view/com/modals/AltImage.tsx +++ b/src/view/com/modals/AltImage.tsx @@ -4,7 +4,9 @@ import { StyleSheet, TouchableOpacity, View, + TextInput as RNTextInput, useWindowDimensions, + ScrollView as RNScrollView, } from 'react-native' import {ScrollView, TextInput} from './util' import {Image} from 'expo-image' @@ -13,6 +15,7 @@ import {gradients, s} from 'lib/styles' import {enforceLen} from 'lib/strings/helpers' import {MAX_ALT_TEXT} from 'lib/constants' import {useTheme} from 'lib/ThemeContext' +import {useIsKeyboardVisible} from 'lib/hooks/useIsKeyboardVisible' import {Text} from '../util/text/Text' import LinearGradient from 'react-native-linear-gradient' import {isWeb} from 'platform/detection' @@ -34,6 +37,24 @@ export function Component({image}: Props) { const [altText, setAltText] = useState(image.altText) const windim = useWindowDimensions() const {closeModal} = useModalControls() + const inputRef = React.useRef<RNTextInput>(null) + const scrollViewRef = React.useRef<RNScrollView>(null) + const keyboardShown = useIsKeyboardVisible() + + // Autofocus hack when we open the modal. We have to wait for the animation to complete first + React.useEffect(() => { + setTimeout(() => { + inputRef.current?.focus() + }, 500) + }, []) + + // We'd rather be at the bottom here so that we can easily dismiss the modal instead of having to scroll + // (especially on android, it acts weird) + React.useEffect(() => { + if (keyboardShown[0]) { + scrollViewRef.current?.scrollToEnd() + } + }, [keyboardShown]) const imageStyles = useMemo<ImageStyle>(() => { const maxWidth = isWeb ? 450 : windim.width @@ -71,6 +92,7 @@ export function Component({image}: Props) { testID="altTextImageModal" style={[pal.view, styles.scrollContainer]} keyboardShouldPersistTaps="always" + ref={scrollViewRef} nativeID="imageAltText"> <View style={styles.scrollInner}> <View style={[pal.viewLight, styles.imageContainer]}> @@ -97,7 +119,8 @@ export function Component({image}: Props) { accessibilityLabel={_(msg`Image alt text`)} accessibilityHint="" accessibilityLabelledBy="imageAltText" - autoFocus + // @ts-ignore This is fine, type is weird on the BottomSheetTextInput + ref={inputRef} /> <View style={styles.buttonControls}> <TouchableOpacity diff --git a/src/view/com/modals/ProfilePreview.tsx b/src/view/com/modals/ProfilePreview.tsx index 77e68db70..88b0df71d 100644 --- a/src/view/com/modals/ProfilePreview.tsx +++ b/src/view/com/modals/ProfilePreview.tsx @@ -27,12 +27,12 @@ export function Component({did}: {did: string}) { data: profile, error: profileError, refetch: refetchProfile, - isFetching: isFetchingProfile, + isLoading: isLoadingProfile, } = useProfileQuery({ did: did, }) - if (isFetchingProfile || !moderationOpts) { + if (isLoadingProfile || !moderationOpts) { return ( <CenteredView style={[pal.view, s.flex1]}> <ProfileHeader diff --git a/src/view/com/notifications/FeedItem.tsx b/src/view/com/notifications/FeedItem.tsx index 0dfac2a83..f037097df 100644 --- a/src/view/com/notifications/FeedItem.tsx +++ b/src/view/com/notifications/FeedItem.tsx @@ -167,9 +167,7 @@ let FeedItem = ({ icon = 'user-plus' iconStyle = [s.blue3 as FontAwesomeIconStyle] } else if (item.type === 'feedgen-like') { - action = item.subjectUri - ? _(msg`liked your custom feed '${new AtUri(item.subjectUri).rkey}'`) - : _(msg`liked your custom feed`) + action = _(msg`liked your custom feed`) icon = 'HeartIconSolid' iconStyle = [ s.likeColor as FontAwesomeIconStyle, diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 1cc2bb824..c5912376e 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -775,6 +775,7 @@ const useStyles = () => { }, postTextLargeContainer: { paddingHorizontal: 0, + paddingRight: 0, paddingBottom: 10, }, translateLink: { diff --git a/src/view/com/util/UserInfoText.tsx b/src/view/com/util/UserInfoText.tsx index e5d2ceb03..9cb9997f6 100644 --- a/src/view/com/util/UserInfoText.tsx +++ b/src/view/com/util/UserInfoText.tsx @@ -9,6 +9,7 @@ import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' import {makeProfileLink} from 'lib/routes/links' import {useProfileQuery} from '#/state/queries/profile' +import {STALE} from '#/state/queries' export function UserInfoText({ type = 'md', @@ -29,7 +30,10 @@ export function UserInfoText({ attr = attr || 'handle' failed = failed || 'user' - const {data: profile, isError} = useProfileQuery({did}) + const {data: profile, isError} = useProfileQuery({ + did, + staleTime: STALE.INFINITY, + }) let inner if (isError) { diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx index 9b3fd6181..6651084bd 100644 --- a/src/view/screens/Feeds.tsx +++ b/src/view/screens/Feeds.tsx @@ -30,6 +30,7 @@ import { useFeedSourceInfoQuery, useGetPopularFeedsQuery, useSearchPopularFeedsMutation, + getAvatarTypeFromUri, } from '#/state/queries/feed' import {cleanError} from 'lib/strings/errors' import {useComposerControls} from '#/state/shell/composer' @@ -555,6 +556,7 @@ function SavedFeed({feedUri}: {feedUri: string}) { const pal = usePalette('default') const {isMobile} = useWebMediaQueries() const {data: info, error} = useFeedSourceInfoQuery({uri: feedUri}) + const typeAvatar = getAvatarTypeFromUri(feedUri) if (!info) return ( @@ -582,7 +584,7 @@ function SavedFeed({feedUri}: {feedUri: string}) { /> </View> ) : ( - <UserAvatar type="algo" size={28} avatar={info.avatar} /> + <UserAvatar type={typeAvatar} size={28} avatar={info.avatar} /> )} <View style={{flex: 1, flexDirection: 'row', gap: 8, alignItems: 'center'}}> diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx index 7fc4d7a20..6d0f15d81 100644 --- a/src/view/screens/Profile.tsx +++ b/src/view/screens/Profile.tsx @@ -21,7 +21,10 @@ import {useAnalytics} from 'lib/analytics/analytics' import {ComposeIcon2} from 'lib/icons' import {useSetTitle} from 'lib/hooks/useSetTitle' import {combinedDisplayName} from 'lib/strings/display-names' -import {FeedDescriptor} from '#/state/queries/post-feed' +import { + FeedDescriptor, + resetProfilePostsQueries, +} from '#/state/queries/post-feed' import {useResolveDidQuery} from '#/state/queries/resolve-uri' import {useProfileQuery} from '#/state/queries/profile' import {useProfileShadow} from '#/state/cache/profile-shadow' @@ -55,13 +58,13 @@ export function ProfileScreen({route}: Props) { data: resolvedDid, error: resolveError, refetch: refetchDid, - isInitialLoading: isInitialLoadingDid, + isLoading: isLoadingDid, } = useResolveDidQuery(name) const { data: profile, error: profileError, refetch: refetchProfile, - isInitialLoading: isInitialLoadingProfile, + isLoading: isLoadingProfile, } = useProfileQuery({ did: resolvedDid, }) @@ -74,7 +77,14 @@ export function ProfileScreen({route}: Props) { } }, [resolveError, refetchDid, refetchProfile]) - if (isInitialLoadingDid || isInitialLoadingProfile || !moderationOpts) { + // When we open the profile, we want to reset the posts query if we are blocked. + React.useEffect(() => { + if (resolvedDid && profile?.viewer?.blockedBy) { + resetProfilePostsQueries(resolvedDid) + } + }, [profile?.viewer?.blockedBy, resolvedDid]) + + if (isLoadingDid || isLoadingProfile || !moderationOpts) { return ( <CenteredView> <ProfileHeader |