Few list tweaks on web (#3062)
* share button only on native * update gttablet to be 1300px * improve web layout * change re-layout to mobile breakpoint * adjustable not found reason * don't show the borders on mobile web * slight padding for the spinnerzio/stable
parent
e11bd4385d
commit
82655f2ee3
|
@ -17,7 +17,7 @@ const breakpoints: {
|
||||||
[key: string]: number
|
[key: string]: number
|
||||||
} = {
|
} = {
|
||||||
gtMobile: 800,
|
gtMobile: 800,
|
||||||
gtTablet: 1200,
|
gtTablet: 1300,
|
||||||
}
|
}
|
||||||
function getActiveBreakpoints({width}: {width: number}) {
|
function getActiveBreakpoints({width}: {width: number}) {
|
||||||
const active: (keyof typeof breakpoints)[] = Object.keys(breakpoints).filter(
|
const active: (keyof typeof breakpoints)[] = Object.keys(breakpoints).filter(
|
||||||
|
|
|
@ -9,6 +9,7 @@ import {Text} from '#/components/Typography'
|
||||||
import {StackActions} from '@react-navigation/native'
|
import {StackActions} from '@react-navigation/native'
|
||||||
import {useNavigation} from '@react-navigation/core'
|
import {useNavigation} from '@react-navigation/core'
|
||||||
import {NavigationProp} from 'lib/routes/types'
|
import {NavigationProp} from 'lib/routes/types'
|
||||||
|
import {router} from '#/routes'
|
||||||
|
|
||||||
export function ListFooter({
|
export function ListFooter({
|
||||||
isFetching,
|
isFetching,
|
||||||
|
@ -30,6 +31,7 @@ export function ListFooter({
|
||||||
a.align_center,
|
a.align_center,
|
||||||
a.justify_center,
|
a.justify_center,
|
||||||
a.border_t,
|
a.border_t,
|
||||||
|
a.pb_lg,
|
||||||
t.atoms.border_contrast_low,
|
t.atoms.border_contrast_low,
|
||||||
{height: 100},
|
{height: 100},
|
||||||
]}>
|
]}>
|
||||||
|
@ -128,6 +130,7 @@ export function ListMaybePlaceholder({
|
||||||
isError,
|
isError,
|
||||||
empty,
|
empty,
|
||||||
error,
|
error,
|
||||||
|
notFoundType = 'page',
|
||||||
onRetry,
|
onRetry,
|
||||||
}: {
|
}: {
|
||||||
isLoading: boolean
|
isLoading: boolean
|
||||||
|
@ -135,10 +138,12 @@ export function ListMaybePlaceholder({
|
||||||
isError: boolean
|
isError: boolean
|
||||||
empty?: string
|
empty?: string
|
||||||
error?: string
|
error?: string
|
||||||
|
notFoundType?: 'page' | 'results'
|
||||||
onRetry?: () => Promise<unknown>
|
onRetry?: () => Promise<unknown>
|
||||||
}) {
|
}) {
|
||||||
const navigation = useNavigation<NavigationProp>()
|
const navigation = useNavigation<NavigationProp>()
|
||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
|
const {gtMobile} = useBreakpoints()
|
||||||
|
|
||||||
const canGoBack = navigation.canGoBack()
|
const canGoBack = navigation.canGoBack()
|
||||||
const onGoBack = React.useCallback(() => {
|
const onGoBack = React.useCallback(() => {
|
||||||
|
@ -146,8 +151,15 @@ export function ListMaybePlaceholder({
|
||||||
navigation.goBack()
|
navigation.goBack()
|
||||||
} else {
|
} else {
|
||||||
navigation.navigate('HomeTab')
|
navigation.navigate('HomeTab')
|
||||||
|
|
||||||
|
// Checking the state for routes ensures that web doesn't encounter errors while going back
|
||||||
|
if (navigation.getState()?.routes) {
|
||||||
|
navigation.dispatch(StackActions.push(...router.matchPath('/')))
|
||||||
|
} else {
|
||||||
|
navigation.navigate('HomeTab')
|
||||||
navigation.dispatch(StackActions.popToTop())
|
navigation.dispatch(StackActions.popToTop())
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}, [navigation, canGoBack])
|
}, [navigation, canGoBack])
|
||||||
|
|
||||||
if (!isEmpty) return null
|
if (!isEmpty) return null
|
||||||
|
@ -157,8 +169,7 @@ export function ListMaybePlaceholder({
|
||||||
style={[
|
style={[
|
||||||
a.flex_1,
|
a.flex_1,
|
||||||
a.align_center,
|
a.align_center,
|
||||||
a.border_t,
|
!gtMobile ? [a.justify_between, a.border_t] : a.gap_5xl,
|
||||||
a.justify_between,
|
|
||||||
t.atoms.border_contrast_low,
|
t.atoms.border_contrast_low,
|
||||||
{paddingTop: 175, paddingBottom: 110},
|
{paddingTop: 175, paddingBottom: 110},
|
||||||
]}>
|
]}>
|
||||||
|
@ -173,7 +184,13 @@ export function ListMaybePlaceholder({
|
||||||
{isError ? (
|
{isError ? (
|
||||||
<Trans>Oops!</Trans>
|
<Trans>Oops!</Trans>
|
||||||
) : isEmpty ? (
|
) : isEmpty ? (
|
||||||
|
<>
|
||||||
|
{notFoundType === 'results' ? (
|
||||||
|
<Trans>No results found</Trans>
|
||||||
|
) : (
|
||||||
<Trans>Page not found</Trans>
|
<Trans>Page not found</Trans>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
) : undefined}
|
) : undefined}
|
||||||
</Text>
|
</Text>
|
||||||
|
|
||||||
|
@ -195,7 +212,8 @@ export function ListMaybePlaceholder({
|
||||||
</Text>
|
</Text>
|
||||||
) : undefined}
|
) : undefined}
|
||||||
</View>
|
</View>
|
||||||
<View style={[a.w_full, a.px_lg, a.gap_md]}>
|
<View
|
||||||
|
style={[a.gap_md, !gtMobile ? [a.w_full, a.px_lg] : {width: 350}]}>
|
||||||
{isError && onRetry && (
|
{isError && onRetry && (
|
||||||
<Button
|
<Button
|
||||||
variant="solid"
|
variant="solid"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {ListRenderItemInfo, Pressable} from 'react-native'
|
import {ListRenderItemInfo, Pressable} from 'react-native'
|
||||||
import {atoms as a} from '#/alf'
|
import {atoms as a, useBreakpoints} from '#/alf'
|
||||||
import {useFocusEffect} from '@react-navigation/native'
|
import {useFocusEffect} from '@react-navigation/native'
|
||||||
import {useSetMinimalShellMode} from 'state/shell'
|
import {useSetMinimalShellMode} from 'state/shell'
|
||||||
import {ViewHeader} from 'view/com/util/ViewHeader'
|
import {ViewHeader} from 'view/com/util/ViewHeader'
|
||||||
|
@ -23,6 +23,7 @@ import {CenteredView} from 'view/com/util/Views'
|
||||||
import {ArrowOutOfBox_Stroke2_Corner0_Rounded} from '#/components/icons/ArrowOutOfBox'
|
import {ArrowOutOfBox_Stroke2_Corner0_Rounded} from '#/components/icons/ArrowOutOfBox'
|
||||||
import {shareUrl} from 'lib/sharing'
|
import {shareUrl} from 'lib/sharing'
|
||||||
import {HITSLOP_10} from 'lib/constants'
|
import {HITSLOP_10} from 'lib/constants'
|
||||||
|
import {isNative} from 'platform/detection'
|
||||||
|
|
||||||
const renderItem = ({item}: ListRenderItemInfo<PostView>) => {
|
const renderItem = ({item}: ListRenderItemInfo<PostView>) => {
|
||||||
return <Post post={item} />
|
return <Post post={item} />
|
||||||
|
@ -37,6 +38,7 @@ export default function HashtagScreen({
|
||||||
}: NativeStackScreenProps<CommonNavigatorParams, 'Hashtag'>) {
|
}: NativeStackScreenProps<CommonNavigatorParams, 'Hashtag'>) {
|
||||||
const {tag, author} = route.params
|
const {tag, author} = route.params
|
||||||
const setMinimalShellMode = useSetMinimalShellMode()
|
const setMinimalShellMode = useSetMinimalShellMode()
|
||||||
|
const {gtMobile} = useBreakpoints()
|
||||||
const {_} = useLingui()
|
const {_} = useLingui()
|
||||||
const [isPTR, setIsPTR] = React.useState(false)
|
const [isPTR, setIsPTR] = React.useState(false)
|
||||||
|
|
||||||
|
@ -101,12 +103,14 @@ export default function HashtagScreen({
|
||||||
}, [isFetching, hasNextPage, error, fetchNextPage])
|
}, [isFetching, hasNextPage, error, fetchNextPage])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CenteredView style={a.flex_1}>
|
<CenteredView style={a.flex_1} sideBorders={gtMobile}>
|
||||||
<ViewHeader
|
<ViewHeader
|
||||||
title={headerTitle}
|
title={headerTitle}
|
||||||
subtitle={author ? _(msg`From @${sanitizedAuthor}`) : undefined}
|
subtitle={author ? _(msg`From @${sanitizedAuthor}`) : undefined}
|
||||||
canGoBack={true}
|
canGoBack
|
||||||
renderButton={() => (
|
renderButton={
|
||||||
|
isNative
|
||||||
|
? () => (
|
||||||
<Pressable
|
<Pressable
|
||||||
accessibilityRole="button"
|
accessibilityRole="button"
|
||||||
onPress={onShare}
|
onPress={onShare}
|
||||||
|
@ -116,13 +120,16 @@ export default function HashtagScreen({
|
||||||
onPress={onShare}
|
onPress={onShare}
|
||||||
/>
|
/>
|
||||||
</Pressable>
|
</Pressable>
|
||||||
)}
|
)
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<ListMaybePlaceholder
|
<ListMaybePlaceholder
|
||||||
isLoading={isLoading || isRefetching}
|
isLoading={isLoading || isRefetching}
|
||||||
isError={isError}
|
isError={isError}
|
||||||
isEmpty={posts.length < 1}
|
isEmpty={posts.length < 1}
|
||||||
onRetry={refetch}
|
onRetry={refetch}
|
||||||
|
notFoundType="results"
|
||||||
empty={_(msg`We couldn't find any results for that hashtag.`)}
|
empty={_(msg`We couldn't find any results for that hashtag.`)}
|
||||||
/>
|
/>
|
||||||
{!isLoading && posts.length > 0 && (
|
{!isLoading && posts.length > 0 && (
|
||||||
|
|
Loading…
Reference in New Issue