Better list empty state (#7157)

* render header conditionally, use modern footer

* move add button to empty state if empty

* center align empty state

* Tweak add people btn

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
This commit is contained in:
Samuel Newman
2024-12-18 19:03:53 +00:00
committed by GitHub
parent 5c4f870898
commit 05c43ed998
3 changed files with 98 additions and 64 deletions
+17 -18
View File
@@ -1,11 +1,5 @@
import React from 'react'
import {
ActivityIndicator,
Dimensions,
StyleProp,
View,
ViewStyle,
} from 'react-native'
import React, {useCallback} from 'react'
import {Dimensions, StyleProp, View, ViewStyle} from 'react-native'
import {AppBskyActorDefs, AppBskyGraphDefs} from '@atproto/api'
import {msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
@@ -16,6 +10,7 @@ import {logger} from '#/logger'
import {useModalControls} from '#/state/modals'
import {useListMembersQuery} from '#/state/queries/list-members'
import {useSession} from '#/state/session'
import {ListFooter} from '#/components/Lists'
import {ProfileCard} from '../profile/ProfileCard'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {Button} from '../util/forms/Button'
@@ -66,6 +61,7 @@ export function ListMembers({
refetch,
fetchNextPage,
hasNextPage,
isFetchingNextPage,
} = useListMembersQuery(list)
const isEmpty = !isFetching && !data?.pages[0].items.length
const isOwner =
@@ -197,14 +193,17 @@ export function ListMembers({
],
)
const Footer = React.useCallback(
() => (
<View style={{paddingTop: 20, paddingBottom: 400}}>
{isFetching && <ActivityIndicator />}
</View>
),
[isFetching],
)
const renderFooter = useCallback(() => {
if (isEmpty) return null
return (
<ListFooter
hasNextPage={hasNextPage}
error={cleanError(error)}
isFetchingNextPage={isFetchingNextPage}
onRetry={fetchNextPage}
/>
)
}, [hasNextPage, error, isFetchingNextPage, fetchNextPage, isEmpty])
return (
<View testID={testID} style={style}>
@@ -214,8 +213,8 @@ export function ListMembers({
data={items}
keyExtractor={(item: any) => item.subject?.did || item._reactKey}
renderItem={renderItem}
ListHeaderComponent={renderHeader}
ListFooterComponent={Footer}
ListHeaderComponent={!isEmpty ? renderHeader : undefined}
ListFooterComponent={renderFooter}
refreshing={isRefreshing}
onRefresh={onRefresh}
headerOffset={headerOffset}
+1 -3
View File
@@ -26,9 +26,7 @@ export function EmptyState({
const {isTabletOrDesktop} = useWebMediaQueries()
const iconSize = isTabletOrDesktop ? 64 : 48
return (
<View
testID={testID}
style={[isTabletOrDesktop && {paddingRight: 20}, style]}>
<View testID={testID} style={style}>
<View
style={[
styles.iconContainer,