import {useCallback, useEffect, useMemo} from 'react' import {ScrollView, View} from 'react-native' import {AppBskyEmbedVideo, AtUri} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useQueryClient} from '@tanstack/react-query' import {VIDEO_FEED_URI} from '#/lib/constants' import {makeCustomFeedLink} from '#/lib/routes/links' import {logEvent} from '#/lib/statsig/statsig' import {useTrendingSettingsApi} from '#/state/preferences/trending' import {usePostFeedQuery} from '#/state/queries/post-feed' import {RQKEY} from '#/state/queries/post-feed' import {BlockDrawerGesture} from '#/view/shell/BlockDrawerGesture' import {atoms as a, useGutters, useTheme} from '#/alf' import {Button, ButtonIcon} from '#/components/Button' import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRight} from '#/components/icons/Chevron' import {TimesLarge_Stroke2_Corner0_Rounded as X} from '#/components/icons/Times' import {Link} from '#/components/Link' import * as Prompt from '#/components/Prompt' import {Text} from '#/components/Typography' import { CompactVideoPostCard, CompactVideoPostCardPlaceholder, } from '#/components/VideoPostCard' const CARD_WIDTH = 108 const FEED_DESC = `feedgen|${VIDEO_FEED_URI}` const FEED_PARAMS: { feedCacheKey: 'discover' } = { feedCacheKey: 'discover', } export function TrendingVideos() { const t = useTheme() const {_} = useLingui() const gutters = useGutters([0, 'base']) const {data, isLoading, error} = usePostFeedQuery(FEED_DESC, FEED_PARAMS) // Refetch on unmount if nothing else is using this query. const queryClient = useQueryClient() useEffect(() => { return () => { const query = queryClient .getQueryCache() .find({queryKey: RQKEY(FEED_DESC, FEED_PARAMS)}) if (query && query.getObserversCount() <= 1) { query.fetch() } } }, [queryClient]) const {setTrendingVideoDisabled} = useTrendingSettingsApi() const trendingPrompt = Prompt.usePromptControl() const onConfirmHide = useCallback(() => { setTrendingVideoDisabled(true) logEvent('trendingVideos:hide', {context: 'interstitial:discover'}) }, [setTrendingVideoDisabled]) if (error) { return null } return ( Trending Videos {isLoading ? ( Array(10) .fill(0) .map((_, i) => ( )) ) : error || !data ? ( Whoops! Trending videos failed to load. ) : ( )} ) } function VideoCards({ data, }: { data: Exclude['data'], undefined> }) { const items = useMemo(() => { return data.pages .flatMap(page => page.slices) .map(slice => slice.items[0]) .filter(Boolean) .filter(item => AppBskyEmbedVideo.isView(item.post.embed)) .slice(0, 8) }, [data]) return ( <> {items.map(item => ( { logEvent('videoCard:click', { context: 'interstitial:discover', }) }} /> ))} ) } function ViewMoreCard() { const t = useTheme() const {_} = useLingui() const href = useMemo(() => { const urip = new AtUri(VIDEO_FEED_URI) return makeCustomFeedLink(urip.host, urip.rkey, undefined, 'discover') }, []) return ( {({pressed}) => ( View more )} ) }