25a1ed1209
* WIP * Clean up growthbook code, integrate into init and sessions * Move everything out of React * Add metrics client * Move to separate file * Shared metadata cache * Ensure we update metadata when session ID changes * Ensure userMetadata is cleared when logging out * WIP revamp * Integrate feature gates into analytics context * Clean up old code * Fix useMeta util * Some comments and cleanup * Add logger to base analytics context * Refactor current route handling * Rip out LogEvent from navigation * Update tracking endpoint * Migrate toClout * Clear out statsig client * Add todo, reset logger readme * Ope fix statsig noop * Refactor logging in feed-feedback, add debug logging to metrics client * Remove LogEvents alias for Metrics * Prefer root package export * Remove Metrics alias from logger * [APP-1782] Migrate to new analytics APIs (#9735) * Migrate logEvent to useAnalytics * Migrate logger.metric to useAnalytics * Migrate tricky spot, fix types * Migrate remaining tricky spot * Missed one * Remove metric() from logger * Migrate useGate to useAnalytics * Remove all other StatSig mentions * Update event payload * Update logger tests * Mock expo method * Fix session ID bug * Add session ID test * Add test for metrics client * Clarify intent * Clean up core analytics file * Clean up the call once utils * Fix TODO * Fix TODO * Fix TODO * Fix TODO * Fix TODO * Remove debug code * Fix navigation context * OK nav context is not working, todo * Checkpoint: works but feels hacky * Fix navigation context issue * Improve feature API * Improve metric logging * Update logger tests
69 lines
1.9 KiB
TypeScript
69 lines
1.9 KiB
TypeScript
import {View} from 'react-native'
|
|
import {AppBskyEmbedVideo} from '@atproto/api'
|
|
|
|
import {type FeedPostSliceItem} from '#/state/queries/post-feed'
|
|
import {type VideoFeedSourceContext} from '#/screens/VideoFeed/types'
|
|
import {atoms as a, useGutters} from '#/alf'
|
|
import * as Grid from '#/components/Grid'
|
|
import {
|
|
VideoPostCard,
|
|
VideoPostCardPlaceholder,
|
|
} from '#/components/VideoPostCard'
|
|
import {useAnalytics} from '#/analytics'
|
|
|
|
export function PostFeedVideoGridRow({
|
|
items: slices,
|
|
sourceContext,
|
|
}: {
|
|
items: FeedPostSliceItem[]
|
|
sourceContext: VideoFeedSourceContext
|
|
}) {
|
|
const ax = useAnalytics()
|
|
const gutters = useGutters(['base', 'base', 0, 'base'])
|
|
const posts = slices
|
|
.filter(slice => AppBskyEmbedVideo.isView(slice.post.embed))
|
|
.map(slice => ({
|
|
post: slice.post,
|
|
moderation: slice.moderation,
|
|
}))
|
|
|
|
/**
|
|
* This should not happen because we should be filtering out posts without
|
|
* videos within the `PostFeed` component.
|
|
*/
|
|
if (posts.length !== slices.length) return null
|
|
|
|
return (
|
|
<View style={[gutters]}>
|
|
<View style={[a.flex_row, a.gap_sm]}>
|
|
<Grid.Row gap={a.gap_sm.gap}>
|
|
{posts.map(post => (
|
|
<Grid.Col key={post.post.uri} width={1 / 2}>
|
|
<VideoPostCard
|
|
post={post.post}
|
|
sourceContext={sourceContext}
|
|
moderation={post.moderation}
|
|
onInteract={() => {
|
|
ax.metric('videoCard:click', {context: 'feed'})
|
|
}}
|
|
/>
|
|
</Grid.Col>
|
|
))}
|
|
</Grid.Row>
|
|
</View>
|
|
</View>
|
|
)
|
|
}
|
|
|
|
export function PostFeedVideoGridRowPlaceholder() {
|
|
const gutters = useGutters(['base', 'base', 0, 'base'])
|
|
return (
|
|
<View style={[gutters]}>
|
|
<View style={[a.flex_row, a.gap_sm]}>
|
|
<VideoPostCardPlaceholder />
|
|
<VideoPostCardPlaceholder />
|
|
</View>
|
|
</View>
|
|
)
|
|
}
|