Added sentry support
This commit is contained in:
@ -22,9 +22,20 @@ import debounce from 'lodash/debounce';
|
||||
import NetInfo from '@react-native-community/netinfo';
|
||||
import { Colors } from '@/constants/Colors';
|
||||
import { useColorScheme } from '@/hooks/useColorScheme';
|
||||
import { useBottomTabOverflow } from '@/components/ui/TabBarBackground';
|
||||
|
||||
const StatusList = () => {
|
||||
const HEADER_HEIGHT = 150;
|
||||
|
||||
const AnimatedFlatList = Animated.createAnimatedComponent(FlatList);
|
||||
|
||||
type StatusListProps = {
|
||||
headerImage?: React.ReactNode;
|
||||
headerTitle?: React.ReactNode;
|
||||
};
|
||||
|
||||
const StatusList = ({headerImage, headerTitle}: StatusListProps) => {
|
||||
const scheme = useColorScheme() ?? 'dark';
|
||||
const bottom = useBottomTabOverflow();
|
||||
|
||||
const [statuses, setStatuses] = useState<UserStatus[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
@ -40,6 +51,19 @@ const StatusList = () => {
|
||||
const subscriptionRef = useRef<RealtimeChannel | null>(null);
|
||||
const appStateRef = useRef(AppState.currentState);
|
||||
const pendingUpdatesRef = useRef<Set<string>>(new Set());
|
||||
|
||||
// Parallax animation setup
|
||||
const scrollY = useRef(new Animated.Value(0)).current;
|
||||
const headerTranslateY = scrollY.interpolate({
|
||||
inputRange: [0, HEADER_HEIGHT],
|
||||
outputRange: [0, -HEADER_HEIGHT/2],
|
||||
extrapolate: 'clamp',
|
||||
});
|
||||
const headerScale = scrollY.interpolate({
|
||||
inputRange: [-HEADER_HEIGHT, 0, HEADER_HEIGHT],
|
||||
outputRange: [2, 1, 1],
|
||||
extrapolate: 'clamp',
|
||||
});
|
||||
|
||||
// Debounced version of the status update handler
|
||||
const debouncedHandleStatusUpdates = useRef(
|
||||
@ -402,6 +426,25 @@ const StatusList = () => {
|
||||
</TouchableOpacity>
|
||||
);
|
||||
}, [formatDate, handleUserSelect, recentlyUpdatedIds]);
|
||||
|
||||
// Render the header component
|
||||
const renderHeader = () => (
|
||||
<Animated.View
|
||||
style={[
|
||||
styles.header,
|
||||
{
|
||||
backgroundColor: Colors[scheme].accent,
|
||||
transform: [
|
||||
{ translateY: headerTranslateY },
|
||||
{ scale: headerScale }
|
||||
]
|
||||
}
|
||||
]}
|
||||
>
|
||||
{headerImage}
|
||||
{headerTitle}
|
||||
</Animated.View>
|
||||
);
|
||||
|
||||
// Empty list component
|
||||
const ListEmptyComponent = useCallback(() => (
|
||||
@ -427,13 +470,15 @@ const StatusList = () => {
|
||||
<ThemedText style={styles.offlineText}>You are offline</ThemedText>
|
||||
</ThemedView>
|
||||
)}
|
||||
|
||||
{renderHeader()}
|
||||
|
||||
<FlatList
|
||||
<AnimatedFlatList
|
||||
data={statuses}
|
||||
keyExtractor={(item) => item.id}
|
||||
refreshControl={
|
||||
<RefreshControl
|
||||
refreshing={refreshing}
|
||||
<RefreshControl
|
||||
refreshing={refreshing}
|
||||
onRefresh={onRefresh}
|
||||
enabled={isConnected}
|
||||
/>
|
||||
@ -447,6 +492,16 @@ const StatusList = () => {
|
||||
getItemLayout={(data, index) => (
|
||||
{length: 120, offset: 120 * index, index}
|
||||
)}
|
||||
contentContainerStyle={{
|
||||
paddingTop: HEADER_HEIGHT, // Add padding to account for the header
|
||||
paddingBottom: bottom,
|
||||
paddingHorizontal: 16,
|
||||
}}
|
||||
onScroll={Animated.event(
|
||||
[{ nativeEvent: { contentOffset: { y: scrollY } } }],
|
||||
{ useNativeDriver: true }
|
||||
)}
|
||||
scrollEventThrottle={16}
|
||||
/>
|
||||
|
||||
{selectedUser && (
|
||||
@ -467,6 +522,15 @@ const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
},
|
||||
header: {
|
||||
height: HEADER_HEIGHT,
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
left: 0,
|
||||
right: 0,
|
||||
zIndex: 10,
|
||||
overflow: 'hidden',
|
||||
},
|
||||
loadingContainer: {
|
||||
flex: 1,
|
||||
justifyContent: 'center',
|
||||
|
Reference in New Issue
Block a user