34582edf3e
* tweaks to constants (#7478) * add did * use correct did * typo * tweak * Prevent Drawer gesture conflicting with Suggestions scroll (#7468) * Extract BlockDrawerGeesture * Block drawer when scrolling interstitials (cherry picked from commit9e3f2f4374) * yolo interstitial * yolo mode * right swipe * fix nav gesture * vibe controls * collapsible post text * rm blurview, cover for tall videos * smarter video source handling * use thumbnails, improve perf significantly * better android loading * improve aspect ratio * optimize source changes * rm spinner on ios * whoops, remove debug `false` * FIX WRONG VIDEOS SHOWING UP * don't spring on way down * release video players when leaving screen * remove jank animation * Add grid * improve contract, fix double tap * Filter out posts without videos * Only do grid on native * Pipe through feedSourceUri and link to feed * Handle passed through params * Partial revert, just filter posts to start at index * Clean up cards, remove entry interstitial * Tweak handle * Change constant name * Rename some things * Make types legit * Clean up more naming * Add placeholder for grid view * Handle web, set up new organization * Begin work on Header * Replace types * Squashed commit of the following: commit3d1be4c0f1Author: Samuel Newman <mozzius@protonmail.com> Date: Fri Jan 17 01:08:05 2025 +0000 extend animation commitc9f199413bAuthor: Samuel Newman <mozzius@protonmail.com> Date: Fri Jan 17 01:01:24 2025 +0000 fix gap commit22e520795fAuthor: Samuel Newman <mozzius@protonmail.com> Date: Fri Jan 17 00:50:16 2025 +0000 thinner bar, format time commitc32427f214Author: Samuel Newman <mozzius@protonmail.com> Date: Fri Jan 17 00:47:57 2025 +0000 fix 2 in 3 screens commitcbf84c08d6Author: Samuel Newman <mozzius@protonmail.com> Date: Fri Jan 17 00:45:46 2025 +0000 rm unneeded var commit7e0e100177Author: Samuel Newman <mozzius@protonmail.com> Date: Fri Jan 17 00:41:18 2025 +0000 scrubberrrrr * use white with opacity rather than gray * Simultaneous gesture * cleanup attempt * fix jank * link to profile on press * fix jitter fr this time * mostly fix android flicker * Maybe fix row generation * Add content hider to video card * emoji in post text * reduce update rate * fix type error * Fix grid layout trailing single item * Add Discover interstitial, settings, includes pin for now * Explore interstitial, handle dimissal, pinning, compact card * Only use grid placeholder on native * Update events * Add feature gate * android nav bar fixes + lower update speed * fix interval + decel rate on interstitials * attempt to fix broken scrub on android (not working) * follow button * Part out the interstitials for perf, add view more * Remove prod web route * Wrap interstitials with BlockDrawerGesture * Bring video cropping in line with images (#7462) * Mimic image cropping for videos on web * Same on native * Rename variables for clarity * Fix Android scrubbing * Add FeedFeedbackProvider * Remove swipe gesture * fix light status bar behaviour * bump * feedback * Copy pasta to new location * Copy pasta part deux * Filter only videos * Make whole text clickable to expand (cherry picked from commit 4cf31120779f4e06eb4c296b3d4b53814d432b07) * move scrubber to own file * end card * add icon to end card * add min view time to viewability config * play haptic on like * tweak feedback * tweak feedback again * Moderation (cherry picked from commit 6b6b471cfb363031284b3e7a1f6e0ade3ac4ae47) * remove bad check * fix feedback for new video grid * change prop name to items as well * Simplify logic * Fix mod footer * Give scrubber more space on android * Add subtle track behind scrubber, adjust opacity * wire in feed context again... * Add better a11y desc to card * Fix key issue * Update a11y copy * Fix scrubber height * improve scrubber animation * Make follow button more obvious * Make header back button more clear * Disable interactions with actual video el * keep content away from the bottom safe area * fix blur * fix moderation issue * improve contrast on mod screen * Make moderation static per item * Memoize rows * Optimizations * Take video moderation into account * Only blur titles for list blur * Change copy * Bump blur radius * animate text in both directions * Rm unused field * Filter by root early * Refactor for clarity * add compose prompt to scrubber * rm log * tweak gradient * Bump SDK, use contentMode to power video feed * Ensure ProfileFeed view also supports video feed * improve scrubber on android * rm border from footer * Update prod video feed did * Separate caches * Add lil hover to View More * Fix undefined logic, remove header for interstitial * Ungate * Fix stuckness * remove extra useless map * Fix effect cleanup * Send seen without cleanup * Simplify react stuff * Earlier early return to avoid loading flash * remove scrubber placeholder * Remove opacity hack * Render useEvent conditionally * Fix Android flash --------- Co-authored-by: dan <dan.abramov@gmail.com> Co-authored-by: Samuel Newman <mozzius@protonmail.com> Co-authored-by: Eric Bailey <git@esb.lol>
208 lines
4.7 KiB
TypeScript
208 lines
4.7 KiB
TypeScript
import React, {memo} from 'react'
|
|
import {StyleProp, View, ViewStyle} from 'react-native'
|
|
import {msg, Trans} from '@lingui/macro'
|
|
import {useLingui} from '@lingui/react'
|
|
|
|
import {cleanError} from '#/lib/strings/errors'
|
|
import {CenteredView} from '#/view/com/util/Views'
|
|
import {atoms as a, flatten, useBreakpoints, useTheme} from '#/alf'
|
|
import {Button, ButtonText} from '#/components/Button'
|
|
import {Error} from '#/components/Error'
|
|
import {Loader} from '#/components/Loader'
|
|
import {Text} from '#/components/Typography'
|
|
|
|
export function ListFooter({
|
|
isFetchingNextPage,
|
|
hasNextPage,
|
|
error,
|
|
onRetry,
|
|
height,
|
|
style,
|
|
showEndMessage = false,
|
|
endMessageText,
|
|
renderEndMessage,
|
|
}: {
|
|
isFetchingNextPage?: boolean
|
|
hasNextPage?: boolean
|
|
error?: string
|
|
onRetry?: () => Promise<unknown>
|
|
height?: number
|
|
style?: StyleProp<ViewStyle>
|
|
showEndMessage?: boolean
|
|
endMessageText?: string
|
|
renderEndMessage?: () => React.ReactNode
|
|
}) {
|
|
const t = useTheme()
|
|
|
|
return (
|
|
<View
|
|
style={[
|
|
a.w_full,
|
|
a.align_center,
|
|
a.border_t,
|
|
a.pb_lg,
|
|
t.atoms.border_contrast_low,
|
|
{height: height ?? 180, paddingTop: 30},
|
|
flatten(style),
|
|
]}>
|
|
{isFetchingNextPage ? (
|
|
<Loader size="xl" />
|
|
) : error ? (
|
|
<ListFooterMaybeError error={error} onRetry={onRetry} />
|
|
) : !hasNextPage && showEndMessage ? (
|
|
renderEndMessage ? (
|
|
renderEndMessage()
|
|
) : (
|
|
<Text style={[a.text_sm, t.atoms.text_contrast_low]}>
|
|
{endMessageText ?? <Trans>You have reached the end</Trans>}
|
|
</Text>
|
|
)
|
|
) : null}
|
|
</View>
|
|
)
|
|
}
|
|
|
|
function ListFooterMaybeError({
|
|
error,
|
|
onRetry,
|
|
}: {
|
|
error?: string
|
|
onRetry?: () => Promise<unknown>
|
|
}) {
|
|
const t = useTheme()
|
|
const {_} = useLingui()
|
|
|
|
if (!error) return null
|
|
|
|
return (
|
|
<View style={[a.w_full, a.px_lg]}>
|
|
<View
|
|
style={[
|
|
a.flex_row,
|
|
a.gap_md,
|
|
a.p_md,
|
|
a.rounded_sm,
|
|
a.align_center,
|
|
t.atoms.bg_contrast_25,
|
|
]}>
|
|
<Text
|
|
style={[a.flex_1, a.text_sm, t.atoms.text_contrast_medium]}
|
|
numberOfLines={2}>
|
|
{error ? (
|
|
cleanError(error)
|
|
) : (
|
|
<Trans>Oops, something went wrong!</Trans>
|
|
)}
|
|
</Text>
|
|
<Button
|
|
variant="gradient"
|
|
label={_(msg`Press to retry`)}
|
|
style={[
|
|
a.align_center,
|
|
a.justify_center,
|
|
a.rounded_sm,
|
|
a.overflow_hidden,
|
|
a.px_md,
|
|
a.py_sm,
|
|
]}
|
|
onPress={onRetry}>
|
|
<ButtonText>
|
|
<Trans>Retry</Trans>
|
|
</ButtonText>
|
|
</Button>
|
|
</View>
|
|
</View>
|
|
)
|
|
}
|
|
|
|
let ListMaybePlaceholder = ({
|
|
isLoading,
|
|
noEmpty,
|
|
isError,
|
|
emptyTitle,
|
|
emptyMessage,
|
|
errorTitle,
|
|
errorMessage,
|
|
emptyType = 'page',
|
|
onRetry,
|
|
onGoBack,
|
|
hideBackButton,
|
|
sideBorders,
|
|
topBorder = false,
|
|
}: {
|
|
isLoading: boolean
|
|
noEmpty?: boolean
|
|
isError?: boolean
|
|
emptyTitle?: string
|
|
emptyMessage?: string
|
|
errorTitle?: string
|
|
errorMessage?: string
|
|
emptyType?: 'page' | 'results'
|
|
onRetry?: () => Promise<unknown>
|
|
onGoBack?: () => void
|
|
hideBackButton?: boolean
|
|
sideBorders?: boolean
|
|
topBorder?: boolean
|
|
}): React.ReactNode => {
|
|
const t = useTheme()
|
|
const {_} = useLingui()
|
|
const {gtMobile, gtTablet} = useBreakpoints()
|
|
|
|
if (isLoading) {
|
|
return (
|
|
<CenteredView
|
|
style={[
|
|
a.h_full_vh,
|
|
a.align_center,
|
|
!gtMobile ? a.justify_between : a.gap_5xl,
|
|
t.atoms.border_contrast_low,
|
|
{paddingTop: 175, paddingBottom: 110},
|
|
]}
|
|
sideBorders={sideBorders ?? gtMobile}
|
|
topBorder={topBorder && !gtTablet}>
|
|
<View style={[a.w_full, a.align_center, {top: 100}]}>
|
|
<Loader size="xl" />
|
|
</View>
|
|
</CenteredView>
|
|
)
|
|
}
|
|
|
|
if (isError) {
|
|
return (
|
|
<Error
|
|
title={errorTitle ?? _(msg`Oops!`)}
|
|
message={errorMessage ?? _(msg`Something went wrong!`)}
|
|
onRetry={onRetry}
|
|
onGoBack={onGoBack}
|
|
sideBorders={sideBorders}
|
|
hideBackButton={hideBackButton}
|
|
/>
|
|
)
|
|
}
|
|
|
|
if (!noEmpty) {
|
|
return (
|
|
<Error
|
|
title={
|
|
emptyTitle ??
|
|
(emptyType === 'results'
|
|
? _(msg`No results found`)
|
|
: _(msg`Page not found`))
|
|
}
|
|
message={
|
|
emptyMessage ??
|
|
_(msg`We're sorry! We can't find the page you were looking for.`)
|
|
}
|
|
onRetry={onRetry}
|
|
onGoBack={onGoBack}
|
|
hideBackButton={hideBackButton}
|
|
sideBorders={sideBorders}
|
|
/>
|
|
)
|
|
}
|
|
|
|
return null
|
|
}
|
|
ListMaybePlaceholder = memo(ListMaybePlaceholder)
|
|
export {ListMaybePlaceholder}
|