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 {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 {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 {Trans, msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import { useUnreadNotifications, useUnreadNotificationsApi, } from '#/state/queries/notifications/unread' import {RQKEY as NOTIFS_RQKEY} from '#/state/queries/notifications/feed' import {listenSoftReset, emitSoftReset} from '#/state/events' import {truncateAndInvalidate} from '#/state/queries/util' type Props = NativeStackScreenProps< NotificationsTabNavigatorParams, 'Notifications' > export function NotificationsScreen({}: Props) { const {_} = useLingui() const setMinimalShellMode = useSetMinimalShellMode() const [onMainScroll, isScrolledDown, resetMainScroll] = useOnMainScroll() const scrollElRef = React.useRef(null) const {screen} = useAnalytics() const pal = usePalette('default') const {isDesktop} = useWebMediaQueries() const queryClient = useQueryClient() const unreadNotifs = useUnreadNotifications() const unreadApi = useUnreadNotificationsApi() const hasNew = !!unreadNotifs // event handlers // = const scrollToTop = React.useCallback(() => { scrollElRef.current?.scrollToOffset({offset: 0}) resetMainScroll() }, [scrollElRef, resetMainScroll]) const onPressLoadLatest = React.useCallback(() => { scrollToTop() if (hasNew) { // render what we have now truncateAndInvalidate(queryClient, NOTIFS_RQKEY()) } else { // check with the server unreadApi.checkUnread({invalidate: true}) } }, [scrollToTop, queryClient, unreadApi, hasNew]) // on-visible setup // = useFocusEffect( React.useCallback(() => { setMinimalShellMode(false) logger.debug('NotificationsScreen: Updating feed') screen('Notifications') return listenSoftReset(onPressLoadLatest) }, [screen, onPressLoadLatest, setMinimalShellMode]), ) const ListHeaderComponent = React.useCallback(() => { if (isDesktop) { return ( Notifications{' '} {hasNew && ( )} } onPress={emitSoftReset} /> ) } return <> }, [isDesktop, pal, hasNew]) return ( {(isScrolledDown || hasNew) && ( )} ) }