import React from 'react' import { ActivityIndicator, FlatList as RNFlatList, RefreshControl, StyleProp, View, ViewStyle, } from 'react-native' import {AppBskyGraphDefs as GraphDefs} from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {usePalette} from '#/lib/hooks/usePalette' import {cleanError} from '#/lib/strings/errors' import {s} from '#/lib/styles' import {logger} from '#/logger' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {MyListsFilter, useMyListsQuery} from '#/state/queries/my-lists' import {EmptyState} from '#/view/com/util/EmptyState' import {atoms as a, useTheme} from '#/alf' import * as ListCard from '#/components/ListCard' import {ErrorMessage} from '../util/error/ErrorMessage' import {List} from '../util/List' const LOADING = {_reactKey: '__loading__'} const EMPTY = {_reactKey: '__empty__'} const ERROR_ITEM = {_reactKey: '__error__'} export function MyLists({ filter, inline, style, renderItem, testID, }: { filter: MyListsFilter inline?: boolean style?: StyleProp renderItem?: (list: GraphDefs.ListView, index: number) => JSX.Element testID?: string }) { const pal = usePalette('default') const t = useTheme() const {_} = useLingui() const moderationOpts = useModerationOpts() const [isPTRing, setIsPTRing] = React.useState(false) const {data, isFetching, isFetched, isError, error, refetch} = useMyListsQuery(filter) const isEmpty = !isFetching && !data?.length const items = React.useMemo(() => { let items: any[] = [] if (isError && isEmpty) { items = items.concat([ERROR_ITEM]) } if ((!isFetched && isFetching) || !moderationOpts) { items = items.concat([LOADING]) } else if (isEmpty) { items = items.concat([EMPTY]) } else { items = items.concat(data) } return items }, [isError, isEmpty, isFetched, isFetching, moderationOpts, data]) // events // = const onRefresh = React.useCallback(async () => { setIsPTRing(true) try { await refetch() } catch (err) { logger.error('Failed to refresh lists', {message: err}) } setIsPTRing(false) }, [refetch, setIsPTRing]) // rendering // = const renderItemInner = React.useCallback( ({item, index}: {item: any; index: number}) => { if (item === EMPTY) { return ( ) } else if (item === ERROR_ITEM) { return ( ) } else if (item === LOADING) { return ( ) } return renderItem ? ( renderItem(item, index) ) : ( ) }, [renderItem, t.atoms.border_contrast_low, _, error, onRefresh], ) if (inline) { return ( {items.length > 0 && ( (item.uri ? item.uri : item._reactKey)} renderItem={renderItemInner} refreshControl={ } contentContainerStyle={[s.contentContainer]} removeClippedSubviews={true} /> )} ) } else { return ( {items.length > 0 && ( (item.uri ? item.uri : item._reactKey)} renderItem={renderItemInner} refreshing={isPTRing} onRefresh={onRefresh} contentContainerStyle={[s.contentContainer]} removeClippedSubviews={true} desktopFixedHeight sideBorders={false} /> )} ) } }