import React from 'react' import {FlatList, View} from 'react-native' import {useFocusEffect} from '@react-navigation/native' import {useQueryClient} from '@tanstack/react-query' import { NativeStackScreenProps, NotificationsTabNavigatorParams, } from 'lib/routes/types' import {withAuthRequired} from 'view/com/auth/withAuthRequired' import {ViewHeader} from '../com/util/ViewHeader' import {Feed} from '../com/notifications/Feed' import {TextLink} from 'view/com/util/Link' import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn' import {useStores} from 'state/index' import {useOnMainScroll} from 'lib/hooks/useOnMainScroll' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {s, colors} from 'lib/styles' import {useAnalytics} from 'lib/analytics/analytics' import {logger} from '#/logger' import {useSetMinimalShellMode} from '#/state/shell' import {useUnreadNotifications} from '#/state/queries/notifications/unread' import {RQKEY as NOTIFS_RQKEY} from '#/state/queries/notifications/feed' type Props = NativeStackScreenProps< NotificationsTabNavigatorParams, 'Notifications' > export const NotificationsScreen = withAuthRequired( function NotificationsScreenImpl({}: Props) { const store = useStores() const setMinimalShellMode = useSetMinimalShellMode() const [onMainScroll, isScrolledDown, resetMainScroll] = useOnMainScroll() const scrollElRef = React.useRef(null) const {screen} = useAnalytics() const pal = usePalette('default') const {isDesktop} = useWebMediaQueries() const unreadNotifs = useUnreadNotifications() const queryClient = useQueryClient() const hasNew = !!unreadNotifs // event handlers // = const scrollToTop = React.useCallback(() => { scrollElRef.current?.scrollToOffset({offset: 0}) resetMainScroll() }, [scrollElRef, resetMainScroll]) const onPressLoadLatest = React.useCallback(() => { scrollToTop() queryClient.invalidateQueries({queryKey: NOTIFS_RQKEY()}) }, [scrollToTop, queryClient]) // on-visible setup // = useFocusEffect( React.useCallback(() => { setMinimalShellMode(false) logger.debug('NotificationsScreen: Updating feed') const softResetSub = store.onScreenSoftReset(onPressLoadLatest) screen('Notifications') return () => { softResetSub.remove() } }, [store, screen, onPressLoadLatest, setMinimalShellMode]), ) const ListHeaderComponent = React.useCallback(() => { if (isDesktop) { return ( Notifications{' '} {hasNew && ( )} } onPress={() => store.emitScreenSoftReset()} /> ) } return <> }, [isDesktop, pal, store, hasNew]) return ( {(isScrolledDown || hasNew) && ( )} ) }, )