import React 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 {useFocusEffect} from '@react-navigation/native' 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 {isWeb} from '#/platform/detection' import {useSavedFeeds} from '#/state/queries/feed' import {RQKEY, usePostFeedQuery} from '#/state/queries/post-feed' import {useAddSavedFeedsMutation} from '#/state/queries/preferences' import {BlockDrawerGesture} from '#/view/shell/BlockDrawerGesture' import {atoms as a, tokens, useGutters, useTheme} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import {GradientFill} from '#/components/GradientFill' import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRight} from '#/components/icons/Chevron' import {Pin_Stroke2_Corner0_Rounded as Pin} from '#/components/icons/Pin' import {Trending2_Stroke2_Corner2_Rounded as Graph} from '#/components/icons/Trending2' import {Link} from '#/components/Link' import {Text} from '#/components/Typography' import { CompactVideoPostCard, CompactVideoPostCardPlaceholder, } from '#/components/VideoPostCard' const CARD_WIDTH = 100 const FEED_DESC = `feedgen|${VIDEO_FEED_URI}` const FEED_PARAMS: { feedCacheKey: 'explore' } = { feedCacheKey: 'explore', } export function ExploreTrendingVideos() { const t = useTheme() const {_} = useLingui() const gutters = useGutters([0, 'base']) const {data, isLoading, error} = usePostFeedQuery(FEED_DESC, FEED_PARAMS) // Refetch on tab change if nothing else is using this query. const queryClient = useQueryClient() useFocusEffect(() => { return () => { const query = queryClient .getQueryCache() .find({queryKey: RQKEY(FEED_DESC, FEED_PARAMS)}) if (query && query.getObserversCount() <= 1) { query.fetch() } } }) const {data: saved} = useSavedFeeds() const isSavedAlready = React.useMemo(() => { return !!saved?.feeds?.some(info => info.config.value === VIDEO_FEED_URI) }, [saved]) const {mutateAsync: addSavedFeeds, isPending: isPinPending} = useAddSavedFeedsMutation() const pinFeed = React.useCallback( (e: any) => { e.preventDefault() addSavedFeeds([ { type: 'feed', value: VIDEO_FEED_URI, pinned: true, }, ]) // prevent navigation return false }, [addSavedFeeds], ) if (error) { return null } return ( Trending Videos BETA Popular videos in your network. {isLoading ? ( Array(10) .fill(0) .map((_, i) => ( )) ) : error || !data ? ( Whoops! Trending videos failed to load. ) : ( )} {!isSavedAlready && ( Pin the trending videos feed to your home screen for easy access )} ) } function VideoCards({ data, }: { data: Exclude['data'], undefined> }) { const t = useTheme() const {_} = useLingui() const items = React.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]) const href = React.useMemo(() => { const urip = new AtUri(VIDEO_FEED_URI) return makeCustomFeedLink(urip.host, urip.rkey, undefined, 'explore') }, []) return ( <> {items.map(item => ( { logEvent('videoCard:click', { context: 'interstitial:explore', }) }} /> ))} {({pressed}) => ( View more )} ) }