An ATproto social media client -- with an independent Appview.
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

Reduce confusing visual feedback while scrolling

+46 -14
+3 -2
src/view/com/notifications/FeedItem.tsx
··· 50 50 51 51 if (item.isReply || item.isMention) { 52 52 return ( 53 - <Link href={itemHref} title={itemTitle}> 53 + <Link href={itemHref} title={itemTitle} noFeedback> 54 54 <Post 55 55 uri={item.uri} 56 56 initView={item.additionalPost} ··· 121 121 <Link 122 122 style={[styles.outer, item.isRead ? undefined : styles.outerUnread]} 123 123 href={itemHref} 124 - title={itemTitle}> 124 + title={itemTitle} 125 + noFeedback> 125 126 <View style={styles.layout}> 126 127 <View style={styles.layoutIcon}> 127 128 {icon === 'UpIconSolid' ? (
+2 -1
src/view/com/post-thread/PostRepostedBy.tsx
··· 86 86 <Link 87 87 style={styles.outer} 88 88 href={`/profile/${item.handle}`} 89 - title={item.handle}> 89 + title={item.handle} 90 + noFeedback> 90 91 <View style={styles.layout}> 91 92 <View style={styles.layoutAvi}> 92 93 <UserAvatar
+1 -1
src/view/com/post-thread/PostThreadItem.tsx
··· 226 226 ) 227 227 } else { 228 228 return ( 229 - <Link style={styles.outer} href={itemHref} title={itemTitle}> 229 + <Link style={styles.outer} href={itemHref} title={itemTitle} noFeedback> 230 230 {!item.replyingTo && item.record.reply && ( 231 231 <View style={styles.parentReplyLine} /> 232 232 )}
+2 -1
src/view/com/post-thread/PostVotedBy.tsx
··· 86 86 <Link 87 87 style={styles.outer} 88 88 href={`/profile/${item.actor.handle}`} 89 - title={item.actor.handle}> 89 + title={item.actor.handle} 90 + noFeedback> 90 91 <View style={styles.layout}> 91 92 <View style={styles.layoutAvi}> 92 93 <UserAvatar
+5 -1
src/view/com/post/Post.tsx
··· 133 133 } 134 134 135 135 return ( 136 - <Link style={[styles.outer, style]} href={itemHref} title={itemTitle}> 136 + <Link 137 + style={[styles.outer, style]} 138 + href={itemHref} 139 + title={itemTitle} 140 + noFeedback> 137 141 {showReplyLine && <View style={styles.replyLine} />} 138 142 <View style={styles.layout}> 139 143 <View style={styles.layoutAvi}>
+1 -1
src/view/com/posts/FeedItem.tsx
··· 109 109 style={{marginTop: 2}} 110 110 /> 111 111 ) : undefined} 112 - <Link style={outerStyles} href={itemHref} title={itemTitle}> 112 + <Link style={outerStyles} href={itemHref} title={itemTitle} noFeedback> 113 113 {isChild && <View style={styles.topReplyLine} />} 114 114 {item._isThreadParent && ( 115 115 <View
+5 -1
src/view/com/profile/ProfileCard.tsx
··· 20 20 onPressButton?: () => void 21 21 }) { 22 22 return ( 23 - <Link style={styles.outer} href={`/profile/${handle}`} title={handle}> 23 + <Link 24 + style={styles.outer} 25 + href={`/profile/${handle}`} 26 + title={handle} 27 + noFeedback> 24 28 <View style={styles.layout}> 25 29 <View style={styles.layoutAvi}> 26 30 <UserAvatar
+2 -1
src/view/com/profile/ProfileFollowers.tsx
··· 84 84 <Link 85 85 style={styles.outer} 86 86 href={`/profile/${item.handle}`} 87 - title={item.handle}> 87 + title={item.handle} 88 + noFeedback> 88 89 <View style={styles.layout}> 89 90 <View style={styles.layoutAvi}> 90 91 <UserAvatar
+2 -1
src/view/com/profile/ProfileFollows.tsx
··· 84 84 <Link 85 85 style={styles.outer} 86 86 href={`/profile/${item.handle}`} 87 - title={item.handle}> 87 + title={item.handle} 88 + noFeedback> 88 89 <View style={styles.layout}> 89 90 <View style={styles.layoutAvi}> 90 91 <UserAvatar
+18 -2
src/view/com/util/Link.tsx
··· 4 4 Linking, 5 5 StyleProp, 6 6 Text, 7 + TouchableWithoutFeedback, 7 8 TouchableOpacity, 8 9 TextStyle, 10 + View, 9 11 ViewStyle, 10 12 } from 'react-native' 11 13 import {useStores, RootStoreModel} from '../../../state' ··· 16 18 href, 17 19 title, 18 20 children, 21 + noFeedback, 19 22 }: { 20 23 style?: StyleProp<ViewStyle> 21 24 href: string 22 25 title?: string 23 26 children?: React.ReactNode 27 + noFeedback?: boolean 24 28 }) { 25 29 const store = useStores() 26 30 const onPress = () => { ··· 29 33 const onLongPress = () => { 30 34 handleLink(store, href, true) 31 35 } 36 + if (noFeedback) { 37 + return ( 38 + <TouchableWithoutFeedback 39 + onPress={onPress} 40 + onLongPress={onLongPress} 41 + delayPressIn={50}> 42 + <View style={style}> 43 + {children ? children : <Text>{title || 'link'}</Text>} 44 + </View> 45 + </TouchableWithoutFeedback> 46 + ) 47 + } 32 48 return ( 33 49 <TouchableOpacity 34 - style={style} 35 50 onPress={onPress} 36 51 onLongPress={onLongPress} 37 - delayPressIn={50}> 52 + delayPressIn={50} 53 + style={style}> 38 54 {children ? children : <Text>{title || 'link'}</Text>} 39 55 </TouchableOpacity> 40 56 )
+1 -1
src/view/com/util/PostEmbeds.tsx
··· 97 97 const externalEmbed = embed as AppBskyEmbedExternal.Presented 98 98 const link = externalEmbed.external 99 99 return ( 100 - <Link style={[styles.extOuter, style]} href={link.uri}> 100 + <Link style={[styles.extOuter, style]} href={link.uri} noFeedback> 101 101 {link.thumb ? ( 102 102 <AutoSizedImage style={style} uri={link.thumb} /> 103 103 ) : undefined}
+4 -1
src/view/screens/Settings.tsx
··· 37 37 <Text style={[s.blue3, s.bold]}>Sign out</Text> 38 38 </TouchableOpacity> 39 39 </View> 40 - <Link href={`/profile/${store.me.handle}`} title="Your profile"> 40 + <Link 41 + href={`/profile/${store.me.handle}`} 42 + title="Your profile" 43 + noFeedback> 41 44 <View style={styles.profile}> 42 45 <UserAvatar 43 46 size={40}