my fork of the bluesky client

Consolidate List props a bit (#2216)

authored by danabra.mov and committed by

GitHub bc31da47 987c5437

+123 -177
+4 -19
src/view/com/feeds/ProfileFeedgens.tsx
··· 1 1 import React from 'react' 2 - import { 3 - Dimensions, 4 - RefreshControl, 5 - StyleProp, 6 - StyleSheet, 7 - View, 8 - ViewStyle, 9 - } from 'react-native' 2 + import {Dimensions, StyleProp, StyleSheet, View, ViewStyle} from 'react-native' 10 3 import {useQueryClient} from '@tanstack/react-query' 11 4 import {List, ListRef} from '../util/List' 12 5 import {FeedSourceCardLoaded} from './FeedSourceCard' ··· 180 173 data={items} 181 174 keyExtractor={(item: any) => item._reactKey || item.uri} 182 175 renderItem={renderItemInner} 183 - refreshControl={ 184 - <RefreshControl 185 - refreshing={isPTRing} 186 - onRefresh={onRefresh} 187 - tintColor={pal.colors.text} 188 - titleColor={pal.colors.text} 189 - progressViewOffset={headerOffset} 190 - /> 191 - } 176 + refreshing={isPTRing} 177 + onRefresh={onRefresh} 178 + headerOffset={headerOffset} 192 179 contentContainerStyle={{ 193 180 minHeight: Dimensions.get('window').height * 1.5, 194 181 }} 195 - style={{paddingTop: headerOffset}} 196 182 indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} 197 183 removeClippedSubviews={true} 198 - contentOffset={{x: 0, y: headerOffset * -1}} 199 184 // @ts-ignore our .web version only -prf 200 185 desktopFixedHeight 201 186 onEndReached={onEndReached}
+3 -14
src/view/com/lists/ListMembers.tsx
··· 2 2 import { 3 3 ActivityIndicator, 4 4 Dimensions, 5 - RefreshControl, 6 5 StyleProp, 7 6 View, 8 7 ViewStyle, ··· 15 14 import {ProfileCard} from '../profile/ProfileCard' 16 15 import {Button} from '../util/forms/Button' 17 16 import {useAnalytics} from 'lib/analytics/analytics' 18 - import {usePalette} from 'lib/hooks/usePalette' 19 17 import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 20 18 import {useListMembersQuery} from '#/state/queries/list-members' 21 19 import {logger} from '#/logger' ··· 51 49 headerOffset?: number 52 50 desktopFixedHeightOffset?: number 53 51 }) { 54 - const pal = usePalette('default') 55 52 const {track} = useAnalytics() 56 53 const [isRefreshing, setIsRefreshing] = React.useState(false) 57 54 const {isMobile} = useWebMediaQueries() ··· 215 212 renderItem={renderItem} 216 213 ListHeaderComponent={renderHeader} 217 214 ListFooterComponent={Footer} 218 - refreshControl={ 219 - <RefreshControl 220 - refreshing={isRefreshing} 221 - onRefresh={onRefresh} 222 - tintColor={pal.colors.text} 223 - titleColor={pal.colors.text} 224 - progressViewOffset={headerOffset} 225 - /> 226 - } 215 + refreshing={isRefreshing} 216 + onRefresh={onRefresh} 217 + headerOffset={headerOffset} 227 218 contentContainerStyle={{ 228 219 minHeight: Dimensions.get('window').height * 1.5, 229 220 }} 230 - style={{paddingTop: headerOffset}} 231 221 onScrolledDownChange={onScrolledDownChange} 232 222 onEndReached={onEndReached} 233 223 onEndReachedThreshold={0.6} 234 224 removeClippedSubviews={true} 235 - contentOffset={{x: 0, y: headerOffset * -1}} 236 225 // @ts-ignore our .web version only -prf 237 226 desktopFixedHeight={desktopFixedHeightOffset || true} 238 227 />
+45 -25
src/view/com/lists/MyLists.tsx
··· 119 119 [error, onRefresh, renderItem, pal], 120 120 ) 121 121 122 - const FlatListCom = inline ? RNFlatList : List 123 - return ( 124 - <View testID={testID} style={style}> 125 - {items.length > 0 && ( 126 - <FlatListCom 127 - testID={testID ? `${testID}-flatlist` : undefined} 128 - data={items} 129 - keyExtractor={item => (item.uri ? item.uri : item._reactKey)} 130 - renderItem={renderItemInner} 131 - refreshControl={ 132 - <RefreshControl 133 - refreshing={isPTRing} 134 - onRefresh={onRefresh} 135 - tintColor={pal.colors.text} 136 - titleColor={pal.colors.text} 137 - /> 138 - } 139 - contentContainerStyle={[s.contentContainer]} 140 - removeClippedSubviews={true} 141 - // @ts-ignore our .web version only -prf 142 - desktopFixedHeight 143 - /> 144 - )} 145 - </View> 146 - ) 122 + if (inline) { 123 + return ( 124 + <View testID={testID} style={style}> 125 + {items.length > 0 && ( 126 + <RNFlatList 127 + testID={testID ? `${testID}-flatlist` : undefined} 128 + data={items} 129 + keyExtractor={item => (item.uri ? item.uri : item._reactKey)} 130 + renderItem={renderItemInner} 131 + refreshControl={ 132 + <RefreshControl 133 + refreshing={isPTRing} 134 + onRefresh={onRefresh} 135 + tintColor={pal.colors.text} 136 + titleColor={pal.colors.text} 137 + /> 138 + } 139 + contentContainerStyle={[s.contentContainer]} 140 + removeClippedSubviews={true} 141 + // @ts-ignore our .web version only -prf 142 + desktopFixedHeight 143 + /> 144 + )} 145 + </View> 146 + ) 147 + } else { 148 + return ( 149 + <View testID={testID} style={style}> 150 + {items.length > 0 && ( 151 + <List 152 + testID={testID ? `${testID}-flatlist` : undefined} 153 + data={items} 154 + keyExtractor={item => (item.uri ? item.uri : item._reactKey)} 155 + renderItem={renderItemInner} 156 + refreshing={isPTRing} 157 + onRefresh={onRefresh} 158 + contentContainerStyle={[s.contentContainer]} 159 + removeClippedSubviews={true} 160 + // @ts-ignore our .web version only -prf 161 + desktopFixedHeight 162 + /> 163 + )} 164 + </View> 165 + ) 166 + } 147 167 } 148 168 149 169 const styles = StyleSheet.create({
+4 -19
src/view/com/lists/ProfileLists.tsx
··· 1 1 import React from 'react' 2 - import { 3 - Dimensions, 4 - RefreshControl, 5 - StyleProp, 6 - StyleSheet, 7 - View, 8 - ViewStyle, 9 - } from 'react-native' 2 + import {Dimensions, StyleProp, StyleSheet, View, ViewStyle} from 'react-native' 10 3 import {useQueryClient} from '@tanstack/react-query' 11 4 import {List, ListRef} from '../util/List' 12 5 import {ListCard} from './ListCard' ··· 182 175 data={items} 183 176 keyExtractor={(item: any) => item._reactKey} 184 177 renderItem={renderItemInner} 185 - refreshControl={ 186 - <RefreshControl 187 - refreshing={isPTRing} 188 - onRefresh={onRefresh} 189 - tintColor={pal.colors.text} 190 - titleColor={pal.colors.text} 191 - progressViewOffset={headerOffset} 192 - /> 193 - } 178 + refreshing={isPTRing} 179 + onRefresh={onRefresh} 180 + headerOffset={headerOffset} 194 181 contentContainerStyle={{ 195 182 minHeight: Dimensions.get('window').height * 1.5, 196 183 }} 197 - style={{paddingTop: headerOffset}} 198 184 indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} 199 185 removeClippedSubviews={true} 200 - contentOffset={{x: 0, y: headerOffset * -1}} 201 186 // @ts-ignore our .web version only -prf 202 187 desktopFixedHeight 203 188 onEndReached={onEndReached}
+3 -11
src/view/com/notifications/Feed.tsx
··· 1 1 import React from 'react' 2 2 import {CenteredView} from '../util/Views' 3 - import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' 3 + import {ActivityIndicator, StyleSheet, View} from 'react-native' 4 4 import {FeedItem} from './FeedItem' 5 5 import {NotificationFeedLoadingPlaceholder} from '../util/LoadingPlaceholder' 6 6 import {ErrorMessage} from '../util/error/ErrorMessage' 7 7 import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' 8 8 import {EmptyState} from '../util/EmptyState' 9 9 import {s} from 'lib/styles' 10 - import {usePalette} from 'lib/hooks/usePalette' 11 10 import {useNotificationFeedQuery} from '#/state/queries/notifications/feed' 12 11 import {useUnreadNotificationsApi} from '#/state/queries/notifications/unread' 13 12 import {logger} from '#/logger' ··· 30 29 onScrolledDownChange: (isScrolledDown: boolean) => void 31 30 ListHeaderComponent?: () => JSX.Element 32 31 }) { 33 - const pal = usePalette('default') 34 32 const [isPTRing, setIsPTRing] = React.useState(false) 35 33 36 34 const moderationOpts = useModerationOpts() ··· 152 150 renderItem={renderItem} 153 151 ListHeaderComponent={ListHeaderComponent} 154 152 ListFooterComponent={FeedFooter} 155 - refreshControl={ 156 - <RefreshControl 157 - refreshing={isPTRing} 158 - onRefresh={onRefresh} 159 - tintColor={pal.colors.text} 160 - titleColor={pal.colors.text} 161 - /> 162 - } 153 + refreshing={isPTRing} 154 + onRefresh={onRefresh} 163 155 onEndReached={onEndReached} 164 156 onEndReachedThreshold={0.6} 165 157 onScrolledDownChange={onScrolledDownChange}
+3 -11
src/view/com/post-thread/PostLikedBy.tsx
··· 1 1 import React, {useCallback, useMemo, useState} from 'react' 2 - import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' 2 + import {ActivityIndicator, StyleSheet, View} from 'react-native' 3 3 import {AppBskyFeedGetLikes as GetLikes} from '@atproto/api' 4 4 import {CenteredView} from '../util/Views' 5 5 import {List} from '../util/List' 6 6 import {ErrorMessage} from '../util/error/ErrorMessage' 7 7 import {ProfileCardWithFollowBtn} from '../profile/ProfileCard' 8 - import {usePalette} from 'lib/hooks/usePalette' 9 8 import {logger} from '#/logger' 10 9 import {useResolveUriQuery} from '#/state/queries/resolve-uri' 11 10 import {usePostLikedByQuery} from '#/state/queries/post-liked-by' 12 11 import {cleanError} from '#/lib/strings/errors' 13 12 14 13 export function PostLikedBy({uri}: {uri: string}) { 15 - const pal = usePalette('default') 16 14 const [isPTRing, setIsPTRing] = useState(false) 17 15 const { 18 16 data: resolvedUri, ··· 88 86 <List 89 87 data={likes} 90 88 keyExtractor={item => item.actor.did} 91 - refreshControl={ 92 - <RefreshControl 93 - refreshing={isPTRing} 94 - onRefresh={onRefresh} 95 - tintColor={pal.colors.text} 96 - titleColor={pal.colors.text} 97 - /> 98 - } 89 + refreshing={isPTRing} 90 + onRefresh={onRefresh} 99 91 onEndReached={onEndReached} 100 92 renderItem={renderItem} 101 93 initialNumToRender={15}
+3 -11
src/view/com/post-thread/PostRepostedBy.tsx
··· 1 1 import React, {useMemo, useCallback, useState} from 'react' 2 - import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' 2 + import {ActivityIndicator, StyleSheet, View} from 'react-native' 3 3 import {AppBskyActorDefs as ActorDefs} from '@atproto/api' 4 4 import {CenteredView} from '../util/Views' 5 5 import {List} from '../util/List' 6 6 import {ProfileCardWithFollowBtn} from '../profile/ProfileCard' 7 7 import {ErrorMessage} from '../util/error/ErrorMessage' 8 - import {usePalette} from 'lib/hooks/usePalette' 9 8 import {logger} from '#/logger' 10 9 import {useResolveUriQuery} from '#/state/queries/resolve-uri' 11 10 import {usePostRepostedByQuery} from '#/state/queries/post-reposted-by' 12 11 import {cleanError} from '#/lib/strings/errors' 13 12 14 13 export function PostRepostedBy({uri}: {uri: string}) { 15 - const pal = usePalette('default') 16 14 const [isPTRing, setIsPTRing] = useState(false) 17 15 const { 18 16 data: resolvedUri, ··· 89 87 <List 90 88 data={repostedBy} 91 89 keyExtractor={item => item.did} 92 - refreshControl={ 93 - <RefreshControl 94 - refreshing={isPTRing} 95 - onRefresh={onRefresh} 96 - tintColor={pal.colors.text} 97 - titleColor={pal.colors.text} 98 - /> 99 - } 90 + refreshing={isPTRing} 91 + onRefresh={onRefresh} 100 92 onEndReached={onEndReached} 101 93 renderItem={renderItem} 102 94 initialNumToRender={15}
+2 -9
src/view/com/post-thread/PostThread.tsx
··· 2 2 import { 3 3 ActivityIndicator, 4 4 Pressable, 5 - RefreshControl, 6 5 StyleSheet, 7 6 TouchableOpacity, 8 7 View, ··· 349 348 } 350 349 keyExtractor={item => item._reactKey} 351 350 renderItem={renderItem} 352 - refreshControl={ 353 - <RefreshControl 354 - refreshing={isPTRing} 355 - onRefresh={onPTR} 356 - tintColor={pal.colors.text} 357 - titleColor={pal.colors.text} 358 - /> 359 - } 351 + refreshing={isPTRing} 352 + onRefresh={onPTR} 360 353 onContentSizeChange={onContentSizeChange} 361 354 style={s.hContentRegion} 362 355 // @ts-ignore our .web version only -prf
+3 -14
src/view/com/posts/Feed.tsx
··· 3 3 ActivityIndicator, 4 4 AppState, 5 5 Dimensions, 6 - RefreshControl, 7 6 StyleProp, 8 7 StyleSheet, 9 8 View, ··· 16 15 import {FeedSlice} from './FeedSlice' 17 16 import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' 18 17 import {useAnalytics} from 'lib/analytics/analytics' 19 - import {usePalette} from 'lib/hooks/usePalette' 20 18 import {useTheme} from 'lib/ThemeContext' 21 19 import {logger} from '#/logger' 22 20 import { ··· 74 72 ListHeaderComponent?: () => JSX.Element 75 73 extraData?: any 76 74 }): React.ReactNode => { 77 - const pal = usePalette('default') 78 75 const theme = useTheme() 79 76 const {track} = useAnalytics() 80 77 const queryClient = useQueryClient() ··· 294 291 renderItem={renderItem} 295 292 ListFooterComponent={FeedFooter} 296 293 ListHeaderComponent={ListHeaderComponent} 297 - refreshControl={ 298 - <RefreshControl 299 - refreshing={isPTRing} 300 - onRefresh={onRefresh} 301 - tintColor={pal.colors.text} 302 - titleColor={pal.colors.text} 303 - progressViewOffset={headerOffset} 304 - /> 305 - } 294 + refreshing={isPTRing} 295 + onRefresh={onRefresh} 296 + headerOffset={headerOffset} 306 297 contentContainerStyle={{ 307 298 minHeight: Dimensions.get('window').height * 1.5, 308 299 }} 309 - style={{paddingTop: headerOffset}} 310 300 onScrolledDownChange={onScrolledDownChange} 311 301 indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} 312 302 onEndReached={onEndReached} 313 303 onEndReachedThreshold={2} // number of posts left to trigger load more 314 304 removeClippedSubviews={true} 315 - contentOffset={{x: 0, y: headerOffset * -1}} 316 305 extraData={extraData} 317 306 // @ts-ignore our .web version only -prf 318 307 desktopFixedHeight={
+3 -11
src/view/com/profile/ProfileFollowers.tsx
··· 1 1 import React from 'react' 2 - import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' 2 + import {ActivityIndicator, StyleSheet, View} from 'react-native' 3 3 import {AppBskyActorDefs as ActorDefs} from '@atproto/api' 4 4 import {CenteredView} from '../util/Views' 5 5 import {List} from '../util/List' 6 6 import {ErrorMessage} from '../util/error/ErrorMessage' 7 7 import {ProfileCardWithFollowBtn} from './ProfileCard' 8 - import {usePalette} from 'lib/hooks/usePalette' 9 8 import {useProfileFollowersQuery} from '#/state/queries/profile-followers' 10 9 import {useResolveDidQuery} from '#/state/queries/resolve-uri' 11 10 import {logger} from '#/logger' 12 11 import {cleanError} from '#/lib/strings/errors' 13 12 14 13 export function ProfileFollowers({name}: {name: string}) { 15 - const pal = usePalette('default') 16 14 const [isPTRing, setIsPTRing] = React.useState(false) 17 15 const { 18 16 data: resolvedDid, ··· 90 88 <List 91 89 data={followers} 92 90 keyExtractor={item => item.did} 93 - refreshControl={ 94 - <RefreshControl 95 - refreshing={isPTRing} 96 - onRefresh={onRefresh} 97 - tintColor={pal.colors.text} 98 - titleColor={pal.colors.text} 99 - /> 100 - } 91 + refreshing={isPTRing} 92 + onRefresh={onRefresh} 101 93 onEndReached={onEndReached} 102 94 renderItem={renderItem} 103 95 initialNumToRender={15}
+3 -11
src/view/com/profile/ProfileFollows.tsx
··· 1 1 import React from 'react' 2 - import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' 2 + import {ActivityIndicator, StyleSheet, View} from 'react-native' 3 3 import {AppBskyActorDefs as ActorDefs} from '@atproto/api' 4 4 import {CenteredView} from '../util/Views' 5 5 import {List} from '../util/List' 6 6 import {ErrorMessage} from '../util/error/ErrorMessage' 7 7 import {ProfileCardWithFollowBtn} from './ProfileCard' 8 - import {usePalette} from 'lib/hooks/usePalette' 9 8 import {useProfileFollowsQuery} from '#/state/queries/profile-follows' 10 9 import {useResolveDidQuery} from '#/state/queries/resolve-uri' 11 10 import {logger} from '#/logger' 12 11 import {cleanError} from '#/lib/strings/errors' 13 12 14 13 export function ProfileFollows({name}: {name: string}) { 15 - const pal = usePalette('default') 16 14 const [isPTRing, setIsPTRing] = React.useState(false) 17 15 const { 18 16 data: resolvedDid, ··· 90 88 <List 91 89 data={follows} 92 90 keyExtractor={item => item.did} 93 - refreshControl={ 94 - <RefreshControl 95 - refreshing={isPTRing} 96 - onRefresh={onRefresh} 97 - tintColor={pal.colors.text} 98 - titleColor={pal.colors.text} 99 - /> 100 - } 91 + refreshing={isPTRing} 92 + onRefresh={onRefresh} 101 93 onEndReached={onEndReached} 102 94 renderItem={renderItem} 103 95 initialNumToRender={15}
+42 -3
src/view/com/util/List.tsx
··· 1 1 import React, {memo, startTransition} from 'react' 2 - import {FlatListProps} from 'react-native' 2 + import {FlatListProps, RefreshControl} from 'react-native' 3 3 import {FlatList_INTERNAL} from './Views' 4 + import {addStyle} from 'lib/styles' 4 5 import {useScrollHandlers} from '#/lib/ScrollContext' 5 6 import {runOnJS, useSharedValue} from 'react-native-reanimated' 6 7 import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' 8 + import {usePalette} from '#/lib/hooks/usePalette' 7 9 8 10 export type ListMethods = FlatList_INTERNAL 9 11 export type ListProps<ItemT> = Omit< 10 12 FlatListProps<ItemT>, 11 - 'onScroll' // Use ScrollContext instead. 13 + | 'onScroll' // Use ScrollContext instead. 14 + | 'refreshControl' // Pass refreshing and/or onRefresh instead. 15 + | 'contentOffset' // Pass headerOffset instead. 12 16 > & { 13 17 onScrolledDownChange?: (isScrolledDown: boolean) => void 18 + headerOffset?: number 19 + refreshing?: boolean 20 + onRefresh?: () => void 14 21 } 15 22 export type ListRef = React.MutableRefObject<FlatList_INTERNAL | null> 16 23 17 24 const SCROLLED_DOWN_LIMIT = 200 18 25 19 26 function ListImpl<ItemT>( 20 - {onScrolledDownChange, ...props}: ListProps<ItemT>, 27 + { 28 + onScrolledDownChange, 29 + refreshing, 30 + onRefresh, 31 + headerOffset, 32 + style, 33 + ...props 34 + }: ListProps<ItemT>, 21 35 ref: React.Ref<ListMethods>, 22 36 ) { 23 37 const isScrolledDown = useSharedValue(false) 24 38 const contextScrollHandlers = useScrollHandlers() 39 + const pal = usePalette('default') 25 40 26 41 function handleScrolledDownChange(didScrollDown: boolean) { 27 42 startTransition(() => { ··· 49 64 }, 50 65 }) 51 66 67 + let refreshControl 68 + if (refreshing !== undefined || onRefresh !== undefined) { 69 + refreshControl = ( 70 + <RefreshControl 71 + refreshing={refreshing ?? false} 72 + onRefresh={onRefresh} 73 + tintColor={pal.colors.text} 74 + titleColor={pal.colors.text} 75 + progressViewOffset={headerOffset} 76 + /> 77 + ) 78 + } 79 + 80 + let contentOffset 81 + if (headerOffset != null) { 82 + style = addStyle(style, { 83 + paddingTop: headerOffset, 84 + }) 85 + contentOffset = {x: 0, y: headerOffset * -1} 86 + } 87 + 52 88 return ( 53 89 <FlatList_INTERNAL 54 90 {...props} 55 91 scrollIndicatorInsets={{right: 1}} 92 + contentOffset={contentOffset} 93 + refreshControl={refreshControl} 56 94 onScroll={scrollHandler} 57 95 scrollEventThrottle={1} 96 + style={style} 58 97 ref={ref} 59 98 /> 60 99 )
+3 -9
src/view/screens/Feeds.tsx
··· 1 1 import React from 'react' 2 - import {ActivityIndicator, StyleSheet, View, RefreshControl} from 'react-native' 2 + import {ActivityIndicator, StyleSheet, View} from 'react-native' 3 3 import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' 4 4 import {FontAwesomeIconStyle} from '@fortawesome/react-native-fontawesome' 5 5 import {ViewHeader} from 'view/com/util/ViewHeader' ··· 487 487 keyExtractor={item => item.key} 488 488 contentContainerStyle={styles.contentContainer} 489 489 renderItem={renderItem} 490 - refreshControl={ 491 - <RefreshControl 492 - refreshing={isPTR} 493 - onRefresh={isUserSearching ? undefined : onPullToRefresh} 494 - tintColor={pal.colors.text} 495 - titleColor={pal.colors.text} 496 - /> 497 - } 490 + refreshing={isPTR} 491 + onRefresh={isUserSearching ? undefined : onPullToRefresh} 498 492 initialNumToRender={10} 499 493 onEndReached={onEndReached} 500 494 // @ts-ignore our .web version only -prf
+2 -10
src/view/screens/Search/Search.tsx
··· 3 3 View, 4 4 StyleSheet, 5 5 ActivityIndicator, 6 - RefreshControl, 7 6 TextInput, 8 7 Pressable, 9 8 Platform, ··· 185 184 186 185 function SearchScreenPostResults({query}: {query: string}) { 187 186 const {_} = useLingui() 188 - const pal = usePalette('default') 189 187 const [isPTR, setIsPTR] = React.useState(false) 190 188 const { 191 189 isFetched, ··· 254 252 } 255 253 }} 256 254 keyExtractor={item => item.key} 257 - refreshControl={ 258 - <RefreshControl 259 - refreshing={isPTR} 260 - onRefresh={onPullToRefresh} 261 - tintColor={pal.colors.text} 262 - titleColor={pal.colors.text} 263 - /> 264 - } 255 + refreshing={isPTR} 256 + onRefresh={onPullToRefresh} 265 257 onEndReached={onEndReached} 266 258 // @ts-ignore web only -prf 267 259 desktopFixedHeight