stream-chat-react-native-core 5.8.0-beta.7 → 5.8.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/components/ChannelList/ChannelList.js +1 -1
- package/lib/commonjs/components/ChannelList/ChannelList.js.map +1 -1
- package/lib/commonjs/components/ChannelList/ChannelListFooterLoadingIndicator.js +2 -0
- package/lib/commonjs/components/ChannelList/ChannelListFooterLoadingIndicator.js.map +1 -1
- package/lib/commonjs/components/ChannelList/ChannelListMessenger.js +23 -25
- package/lib/commonjs/components/ChannelList/ChannelListMessenger.js.map +1 -1
- package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js +64 -48
- package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
- package/lib/commonjs/contexts/channelsContext/ChannelsContext.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/ChannelList/ChannelList.js +1 -1
- package/lib/module/components/ChannelList/ChannelList.js.map +1 -1
- package/lib/module/components/ChannelList/ChannelListFooterLoadingIndicator.js +2 -0
- package/lib/module/components/ChannelList/ChannelListFooterLoadingIndicator.js.map +1 -1
- package/lib/module/components/ChannelList/ChannelListMessenger.js +23 -25
- package/lib/module/components/ChannelList/ChannelListMessenger.js.map +1 -1
- package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js +64 -48
- package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
- package/lib/module/contexts/channelsContext/ChannelsContext.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/ChannelList/ChannelListMessenger.d.ts +1 -1
- package/lib/typescript/components/ChannelList/hooks/usePaginatedChannels.d.ts +2 -2
- package/lib/typescript/contexts/channelsContext/ChannelsContext.d.ts +1 -1
- package/package.json +1 -1
- package/src/components/ChannelList/ChannelList.tsx +2 -2
- package/src/components/ChannelList/ChannelListFooterLoadingIndicator.tsx +1 -1
- package/src/components/ChannelList/ChannelListMessenger.tsx +9 -7
- package/src/components/ChannelList/hooks/usePaginatedChannels.ts +11 -12
- package/src/contexts/channelsContext/ChannelsContext.tsx +1 -1
- package/src/version.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["waitSeconds","seconds","Promise","resolve","setTimeout","ONE_SECOND_IN_MS","DEFAULT_OPTIONS","message_limit","MAX_NUMBER_OF_RETRIES","RETRY_INTERVAL_IN_MS","usePaginatedChannels","enableOfflineSupport","filters","options","setForceUpdate","sort","useChatContext","client","useState","channels","setChannels","staticChannelsActive","setStaticChannelsActive","activeChannels","useActiveChannelsRefContext","error","setError","hasNextPage","setHasNextPage","lastRefresh","useRef","Date","now","isQueryingRef","activeQueryType","setActiveQueryType","isMountedRef","useIsMountedRef","filtersRef","sortRef","activeRequestId","queryChannels","queryType","retryCount","current","hasUpdatedData","JSON","stringify","some","Boolean","isQueryStale","currentRequestId","undefined","newOptions","limit","MAX_QUERY_CHANNELS_LIMIT","offset","length","activeChannelIds","cid","id","push","skipInitialization","channelQueryResponse","newChannels","map","c","existingChannel","console","warn","Error","loadNextPage","refreshList","reloadList","filterStr","useMemo","sortStr","useEffect","loadOfflineChannels","user","channelsFromDB","getChannelsForFilterSort","currentUserId","hydrateActiveChannels","offlineMode","e","listener","DBSyncManager","onSyncStatusChange","syncStatus","dbSyncStatus","getSyncStatus","on","event","online","u","unsubscribe","loadingChannels","loadingNextPage","refreshing"],"sources":["usePaginatedChannels.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort } from 'stream-chat';\n\nimport { useActiveChannelsRefContext } from '../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext';\n\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\n\nimport { getChannelsForFilterSort } from '../../../store/apis/getChannelsForFilterSort';\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\nimport { ONE_SECOND_IN_MS } from '../../../utils/date';\nimport { DBSyncManager } from '../../../utils/DBSyncManager';\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nconst waitSeconds = (seconds: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, seconds * ONE_SECOND_IN_MS);\n });\n\ntype Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n {\n enableOfflineSupport: boolean;\n filters: ChannelFilters<StreamChatGenerics>;\n options: ChannelOptions;\n setForceUpdate: React.Dispatch<React.SetStateAction<number>>;\n sort: ChannelSort<StreamChatGenerics>;\n };\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nconst MAX_NUMBER_OF_RETRIES = 3;\nconst RETRY_INTERVAL_IN_MS = 5000;\n\ntype QueryType = 'queryLocalDB' | 'reload' | 'refresh' | 'loadChannels';\n\nexport type QueryChannels = (queryType?: QueryType, retryCount?: number) => Promise<void>;\n\nexport const usePaginatedChannels = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n enableOfflineSupport,\n filters = {},\n options = DEFAULT_OPTIONS,\n setForceUpdate,\n sort = {},\n}: Parameters<StreamChatGenerics>) => {\n const { client } = useChatContext<StreamChatGenerics>();\n const [channels, setChannels] = useState<Channel<StreamChatGenerics>[] | null>(null);\n const [staticChannelsActive, setStaticChannelsActive] = useState<boolean>(false);\n const activeChannels = useActiveChannelsRefContext();\n const [error, setError] = useState<Error>();\n const [hasNextPage, setHasNextPage] = useState(true);\n const lastRefresh = useRef(Date.now());\n const isQueryingRef = useRef(false);\n const [activeQueryType, setActiveQueryType] = useState<QueryType | null>('queryLocalDB');\n const isMountedRef = useIsMountedRef();\n const filtersRef = useRef<typeof filters | null>(null);\n const sortRef = useRef<typeof sort | null>(null);\n const activeRequestId = useRef<number>(0);\n\n const queryChannels: QueryChannels = async (\n queryType: QueryType = 'loadChannels',\n retryCount = 0,\n ): Promise<void> => {\n if (!client || !isMountedRef.current) return;\n\n const hasUpdatedData =\n queryType === 'loadChannels' ||\n queryType === 'refresh' ||\n [\n JSON.stringify(filtersRef.current) !== JSON.stringify(filters),\n JSON.stringify(sortRef.current) !== JSON.stringify(sort),\n ].some(Boolean);\n\n const isQueryStale = () => !isMountedRef || activeRequestId.current !== currentRequestId;\n\n /**\n * We don't need to make another call to query channels if we don't\n * have new data for the query to include\n * */\n if (!hasUpdatedData) {\n if (activeQueryType === null) return;\n }\n\n filtersRef.current = filters;\n sortRef.current = sort;\n isQueryingRef.current = true;\n setError(undefined);\n activeRequestId.current++;\n const currentRequestId = activeRequestId.current;\n setActiveQueryType(queryType);\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset:\n queryType === 'loadChannels' && !staticChannelsActive && channels ? channels.length : 0,\n ...options,\n };\n\n try {\n const activeChannelIds: string[] = [];\n for (const cid in client.activeChannels) {\n if (client.activeChannels[cid].id) {\n // @ts-ignore\n activeChannelIds.push(client.activeChannels[cid].id);\n }\n }\n\n // TODO: Think about the implications of this.\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions, {\n skipInitialization: enableOfflineSupport ? activeChannelIds : activeChannels.current,\n });\n if (isQueryStale() || !isMountedRef.current) {\n return;\n }\n\n const newChannels =\n queryType === 'loadChannels' && !staticChannelsActive && channels\n ? [...channels, ...channelQueryResponse]\n : channelQueryResponse.map((c) => {\n const existingChannel = client.activeChannels[c.cid];\n if (existingChannel) {\n return existingChannel;\n }\n\n return c;\n });\n\n setChannels(newChannels);\n setStaticChannelsActive(false);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n setError(undefined);\n isQueryingRef.current = false;\n } catch (err: unknown) {\n isQueryingRef.current = false;\n await waitSeconds(2);\n\n if (isQueryStale()) {\n return;\n }\n\n // querying.current check is needed in order to make sure the next query call doesnt flick an error\n // state and then succeed (reconnect case)\n if (retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current) {\n setActiveQueryType(null);\n console.warn(err);\n\n setError(\n new Error(\n `Maximum number of retries reached in queryChannels. Last error message is: ${err}`,\n ),\n );\n return;\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setActiveQueryType(null);\n };\n\n const loadNextPage = hasNextPage ? queryChannels : undefined;\n\n const refreshList = () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < RETRY_INTERVAL_IN_MS && error === undefined) {\n return;\n }\n\n lastRefresh.current = Date.now();\n return queryChannels('refresh');\n };\n\n const reloadList = () => queryChannels('reload');\n\n /**\n * Equality check using stringified filters/sort ensure that we don't make un-necessary queryChannels api calls\n * for the scenario:\n *\n * <ChannelList\n * filters={{\n * members: { $in: ['vishal'] }\n * }}\n * ...\n * />\n *\n * Here we have passed filters as inline object, which means on every re-render of\n * parent component, ChannelList will receive new object reference (even though value is same), which\n * in return will trigger useEffect. To avoid this, we can add a value check.\n */\n const filterStr = useMemo(() => JSON.stringify(filters), [filters]);\n const sortStr = useMemo(() => JSON.stringify(sort), [sort]);\n\n useEffect(() => {\n const loadOfflineChannels = () => {\n if (!client?.user?.id) return;\n\n try {\n const channelsFromDB = getChannelsForFilterSort({\n currentUserId: client.user.id,\n filters,\n sort,\n });\n\n if (channelsFromDB) {\n setChannels(\n client.hydrateActiveChannels(channelsFromDB, {\n offlineMode: true,\n }),\n );\n setStaticChannelsActive(true);\n }\n } catch (e) {\n console.warn('Failed to get channels from database: ', e);\n }\n\n setActiveQueryType(null);\n };\n\n let listener: ReturnType<typeof DBSyncManager.onSyncStatusChange>;\n if (enableOfflineSupport) {\n // Any time DB is synced, we need to update the UI with local DB channels first,\n // and then call queryChannels to ensure any new channels are added to UI.\n listener = DBSyncManager.onSyncStatusChange((syncStatus) => {\n if (syncStatus) {\n loadOfflineChannels();\n reloadList();\n }\n });\n // On start, load the channels from local db.\n loadOfflineChannels();\n\n // If db is already synced (sync api and pending api calls), then\n // right away call queryChannels.\n const dbSyncStatus = DBSyncManager.getSyncStatus();\n if (dbSyncStatus) {\n reloadList();\n }\n } else {\n listener = client.on('connection.changed', async (event) => {\n if (event.online) {\n await refreshList();\n setForceUpdate((u) => u + 1);\n }\n });\n\n reloadList();\n }\n\n return () => listener?.unsubscribe?.();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels:\n activeQueryType === 'queryLocalDB'\n ? true\n : (activeQueryType === 'reload' || activeQueryType === null) && channels === null,\n loadingNextPage: activeQueryType === 'loadChannels',\n loadNextPage,\n refreshing: activeQueryType === 'refresh',\n refreshList,\n reloadList,\n // Although channels can be null, there is no practical case where channels will be null\n // when setChannels is used. setChannels is only recommended to be used for overriding\n // event handler. Thus instead of adding if check for channels === null, its better to\n // simply reassign types here.\n setChannels,\n staticChannelsActive,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["waitSeconds","seconds","Promise","resolve","setTimeout","ONE_SECOND_IN_MS","DEFAULT_OPTIONS","message_limit","MAX_NUMBER_OF_RETRIES","RETRY_INTERVAL_IN_MS","usePaginatedChannels","enableOfflineSupport","filters","options","setForceUpdate","sort","useState","channels","setChannels","undefined","error","setError","staticChannelsActive","setStaticChannelsActive","activeQueryType","setActiveQueryType","hasNextPage","setHasNextPage","activeChannels","useActiveChannelsRefContext","isMountedRef","useIsMountedRef","useChatContext","client","filtersRef","useRef","sortRef","activeRequestId","isQueryingRef","lastRefresh","Date","now","queryChannels","queryType","retryCount","current","hasUpdatedData","JSON","stringify","some","Boolean","isQueryStale","currentRequestId","newOptions","limit","MAX_QUERY_CHANNELS_LIMIT","offset","length","activeChannelIds","cid","id","push","skipInitialization","channelQueryResponse","newChannels","map","c","existingChannel","console","warn","Error","refreshList","reloadList","filterStr","useMemo","sortStr","useEffect","loadOfflineChannels","user","channelsFromDB","getChannelsForFilterSort","currentUserId","hydrateActiveChannels","offlineMode","e","listener","DBSyncManager","onSyncStatusChange","syncStatus","dbSyncStatus","getSyncStatus","on","event","online","u","unsubscribe","loadingChannels","loadingNextPage","loadNextPage","refreshing"],"sources":["usePaginatedChannels.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort } from 'stream-chat';\n\nimport { useActiveChannelsRefContext } from '../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext';\n\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\n\nimport { getChannelsForFilterSort } from '../../../store/apis/getChannelsForFilterSort';\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\nimport { ONE_SECOND_IN_MS } from '../../../utils/date';\nimport { DBSyncManager } from '../../../utils/DBSyncManager';\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nconst waitSeconds = (seconds: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, seconds * ONE_SECOND_IN_MS);\n });\n\ntype Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n {\n enableOfflineSupport: boolean;\n filters: ChannelFilters<StreamChatGenerics>;\n options: ChannelOptions;\n setForceUpdate: React.Dispatch<React.SetStateAction<number>>;\n sort: ChannelSort<StreamChatGenerics>;\n };\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nconst MAX_NUMBER_OF_RETRIES = 3;\nconst RETRY_INTERVAL_IN_MS = 5000;\n\ntype QueryType = 'queryLocalDB' | 'reload' | 'refresh' | 'loadChannels';\n\nexport type QueryChannels = (queryType?: QueryType, retryCount?: number) => Promise<void>;\n\nexport const usePaginatedChannels = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n enableOfflineSupport,\n filters = {},\n options = DEFAULT_OPTIONS,\n setForceUpdate,\n sort = {},\n}: Parameters<StreamChatGenerics>) => {\n const [channels, setChannels] = useState<Channel<StreamChatGenerics>[] | null>(null);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [staticChannelsActive, setStaticChannelsActive] = useState<boolean>(false);\n const [activeQueryType, setActiveQueryType] = useState<QueryType | null>('queryLocalDB');\n const [hasNextPage, setHasNextPage] = useState<boolean>(false);\n\n const activeChannels = useActiveChannelsRefContext();\n const isMountedRef = useIsMountedRef();\n const { client } = useChatContext<StreamChatGenerics>();\n\n const filtersRef = useRef<typeof filters | null>(null);\n const sortRef = useRef<typeof sort | null>(null);\n const activeRequestId = useRef<number>(0);\n const isQueryingRef = useRef(false);\n const lastRefresh = useRef(Date.now());\n\n const queryChannels: QueryChannels = async (\n queryType: QueryType = 'loadChannels',\n retryCount = 0,\n ): Promise<void> => {\n if (!client || !isMountedRef.current) return;\n\n const hasUpdatedData =\n queryType === 'loadChannels' ||\n queryType === 'refresh' ||\n [\n JSON.stringify(filtersRef.current) !== JSON.stringify(filters),\n JSON.stringify(sortRef.current) !== JSON.stringify(sort),\n ].some(Boolean);\n\n const isQueryStale = () => !isMountedRef || activeRequestId.current !== currentRequestId;\n\n /**\n * We don't need to make another call to query channels if we don't\n * have new data for the query to include\n * */\n if (!hasUpdatedData) {\n if (activeQueryType === null) return;\n }\n\n filtersRef.current = filters;\n sortRef.current = sort;\n isQueryingRef.current = true;\n setError(undefined);\n activeRequestId.current++;\n const currentRequestId = activeRequestId.current;\n setActiveQueryType(queryType);\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset:\n queryType === 'loadChannels' && !staticChannelsActive && channels ? channels.length : 0,\n ...options,\n };\n\n try {\n const activeChannelIds: string[] = [];\n for (const cid in client.activeChannels) {\n if (client.activeChannels[cid].id) {\n // @ts-ignore\n activeChannelIds.push(client.activeChannels[cid].id);\n }\n }\n\n // TODO: Think about the implications of this.\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions, {\n skipInitialization: enableOfflineSupport ? activeChannelIds : activeChannels.current,\n });\n if (isQueryStale() || !isMountedRef.current) {\n return;\n }\n\n const newChannels =\n queryType === 'loadChannels' && !staticChannelsActive && channels\n ? [...channels, ...channelQueryResponse]\n : channelQueryResponse.map((c) => {\n const existingChannel = client.activeChannels[c.cid];\n if (existingChannel) {\n return existingChannel;\n }\n\n return c;\n });\n\n setChannels(newChannels);\n setStaticChannelsActive(false);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n isQueryingRef.current = false;\n } catch (err: unknown) {\n isQueryingRef.current = false;\n await waitSeconds(2);\n\n if (isQueryStale()) {\n return;\n }\n\n // querying.current check is needed in order to make sure the next query call doesnt flick an error\n // state and then succeed (reconnect case)\n if (retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current) {\n setActiveQueryType(null);\n console.warn(err);\n\n setError(\n new Error(\n `Maximum number of retries reached in queryChannels. Last error message is: ${err}`,\n ),\n );\n return;\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setActiveQueryType(null);\n };\n\n const refreshList = async () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < RETRY_INTERVAL_IN_MS && error === undefined) {\n return;\n }\n\n lastRefresh.current = Date.now();\n await queryChannels('refresh');\n };\n\n const reloadList = () => queryChannels('reload');\n\n /**\n * Equality check using stringified filters/sort ensure that we don't make un-necessary queryChannels api calls\n * for the scenario:\n *\n * <ChannelList\n * filters={{\n * members: { $in: ['vishal'] }\n * }}\n * ...\n * />\n *\n * Here we have passed filters as inline object, which means on every re-render of\n * parent component, ChannelList will receive new object reference (even though value is same), which\n * in return will trigger useEffect. To avoid this, we can add a value check.\n */\n const filterStr = useMemo(() => JSON.stringify(filters), [filters]);\n const sortStr = useMemo(() => JSON.stringify(sort), [sort]);\n\n useEffect(() => {\n const loadOfflineChannels = () => {\n if (!client?.user?.id) return;\n\n try {\n const channelsFromDB = getChannelsForFilterSort({\n currentUserId: client.user.id,\n filters,\n sort,\n });\n\n if (channelsFromDB) {\n setChannels(\n client.hydrateActiveChannels(channelsFromDB, {\n offlineMode: true,\n }),\n );\n setStaticChannelsActive(true);\n }\n } catch (e) {\n console.warn('Failed to get channels from database: ', e);\n }\n\n setActiveQueryType(null);\n };\n\n let listener: ReturnType<typeof DBSyncManager.onSyncStatusChange>;\n if (enableOfflineSupport) {\n // Any time DB is synced, we need to update the UI with local DB channels first,\n // and then call queryChannels to ensure any new channels are added to UI.\n listener = DBSyncManager.onSyncStatusChange((syncStatus) => {\n if (syncStatus) {\n loadOfflineChannels();\n reloadList();\n }\n });\n // On start, load the channels from local db.\n loadOfflineChannels();\n\n // If db is already synced (sync api and pending api calls), then\n // right away call queryChannels.\n const dbSyncStatus = DBSyncManager.getSyncStatus();\n if (dbSyncStatus) {\n reloadList();\n }\n } else {\n listener = client.on('connection.changed', async (event) => {\n if (event.online) {\n await refreshList();\n setForceUpdate((u) => u + 1);\n }\n });\n\n reloadList();\n }\n\n return () => listener?.unsubscribe?.();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels:\n activeQueryType === 'queryLocalDB'\n ? true\n : (activeQueryType === 'reload' || activeQueryType === null) && channels === null,\n loadingNextPage: activeQueryType === 'loadChannels',\n loadNextPage: queryChannels,\n refreshing: activeQueryType === 'refresh',\n refreshList,\n reloadList,\n // Although channels can be null, there is no practical case where channels will be null\n // when setChannels is used. setChannels is only recommended to be used for overriding\n // event handler. Thus instead of adding if check for channels === null, its better to\n // simply reassign types here.\n setChannels,\n staticChannelsActive,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ChannelsContext","React","createContext","DEFAULT_BASE_CONTEXT_VALUE","ChannelsProvider","children","value","useChannelsContext","contextValue","useContext","isTestEnvironment","Error","withChannelsContext","Component","WithChannelsContextComponent","props","channelsContext","displayName","getDisplayName"],"sources":["ChannelsContext.tsx"],"sourcesContent":["import React, { PropsWithChildren, useContext } from 'react';\n\nimport type { FlatListProps } from 'react-native';\nimport type { FlatList } from 'react-native-gesture-handler';\n\nimport type { ChannelPreviewMutedStatusProps } from 'src/components/ChannelPreview/ChannelPreviewMutedStatus';\n\nimport type { Channel } from 'stream-chat';\n\nimport type { HeaderErrorProps } from '../../components/ChannelList/ChannelListHeaderErrorIndicator';\nimport type { QueryChannels } from '../../components/ChannelList/hooks/usePaginatedChannels';\nimport type { ChannelAvatarProps } from '../../components/ChannelPreview/ChannelAvatar';\nimport type { ChannelPreviewMessageProps } from '../../components/ChannelPreview/ChannelPreviewMessage';\nimport type { ChannelPreviewMessengerProps } from '../../components/ChannelPreview/ChannelPreviewMessenger';\nimport type { ChannelPreviewStatusProps } from '../../components/ChannelPreview/ChannelPreviewStatus';\nimport type { ChannelPreviewTitleProps } from '../../components/ChannelPreview/ChannelPreviewTitle';\nimport type { ChannelPreviewUnreadCountProps } from '../../components/ChannelPreview/ChannelPreviewUnreadCount';\nimport type { EmptyStateProps } from '../../components/Indicators/EmptyStateIndicator';\nimport type { LoadingErrorProps } from '../../components/Indicators/LoadingErrorIndicator';\nimport type { LoadingProps } from '../../components/Indicators/LoadingIndicator';\nimport type { DefaultStreamChatGenerics, UnknownType } from '../../types/types';\nimport { DEFAULT_BASE_CONTEXT_VALUE } from '../utils/defaultBaseContextValue';\n\nimport { getDisplayName } from '../utils/getDisplayName';\nimport { isTestEnvironment } from '../utils/isTestEnvironment';\n\nexport type ChannelsContextValue<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = {\n /**\n * Besides the existing default behavior of the ChannelListMessenger component, you can attach\n * additional props to the underlying React Native FlatList.\n *\n * You can find list of all the available FlatList props here - https://facebook.github.io/react-native/docs/flatlist#props\n *\n * **EXAMPLE:**\n *\n * ```\n * <ChannelListMessenger\n * channels={channels}\n * additionalFlatListProps={{ bounces: true }}\n * />\n * ```\n *\n * **Note:** Don't use `additionalFlatListProps` to access the FlatList ref, use `setFlatListRef`\n */\n additionalFlatListProps: Partial<FlatListProps<Channel<StreamChatGenerics>>>;\n /**\n * Channels can be either an array of channels or a promise which resolves to an array of channels\n */\n channels: Channel<StreamChatGenerics>[] | null;\n /**\n * Custom indicator to use when channel list is empty\n *\n * Default: [EmptyStateIndicator](https://getstream.io/chat/docs/sdk/reactnative/core-components/channel/#emptystateindicator)\n * */\n EmptyStateIndicator: React.ComponentType<EmptyStateProps>;\n /**\n * Custom loading indicator to display at bottom of the list, while loading further pages\n *\n * Default: [ChannelListFooterLoadingIndicator](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#footerloadingindicator)\n */\n FooterLoadingIndicator: React.ComponentType;\n /**\n * Incremental number change to force update the FlatList\n */\n forceUpdate: number;\n /**\n * Whether or not the FlatList has another page to render\n */\n hasNextPage: boolean;\n /**\n * Custom indicator to display error at top of list, if loading/pagination error occurs\n *\n * Default: [ChannelListHeaderErrorIndicator](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#headererrorindicator)\n */\n HeaderErrorIndicator: React.ComponentType<HeaderErrorProps>;\n /**\n * Custom indicator to display network-down error at top of list, if there is connectivity issue\n *\n * Default: [ChannelListHeaderNetworkDownIndicator](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#headernetworkdownindicator)\n */\n HeaderNetworkDownIndicator: React.ComponentType;\n /**\n * Initial channels query loading state, triggers the LoadingIndicator\n */\n loadingChannels: boolean;\n /**\n * Custom indicator to use when there is error in fetching channels\n *\n * Default: [LoadingErrorIndicator](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#loadingerrorindicator)\n * */\n LoadingErrorIndicator: React.ComponentType<LoadingErrorProps>;\n /**\n * Custom loading indicator to use on Channel List\n *\n * */\n LoadingIndicator: React.ComponentType<Pick<LoadingProps, 'listType'>>;\n /**\n * Whether or not additional channels are being loaded, triggers the FooterLoadingIndicator\n */\n loadingNextPage: boolean;\n /**\n * The React Native FlatList threshold to fetch more data\n * @see See loadMoreThreshold [doc](https://facebook.github.io/react-native/docs/flatlist#onendreachedthreshold)\n * */\n loadMoreThreshold: number;\n /**\n * Loads the next page of `channels`, which is present as a required prop\n */\n loadNextPage: QueryChannels | undefined;\n /**\n * Max number to display within notification badge. Default: 255 and it cannot be higher than that for now due to backend limitations\n */\n maxUnreadCount: number;\n /**\n * Number of skeletons that should show when loading. Default: 6\n */\n numberOfSkeletons: number;\n /**\n * Custom UI component to display individual channel list items\n *\n * Default: [ChannelPreviewMessenger](https://getstream.io/chat/docs/sdk/reactnative/ui-components/channel-preview-messenger/)\n */\n Preview: React.ComponentType<ChannelPreviewMessengerProps<StreamChatGenerics>>;\n /**\n * Triggered when the channel list is refreshing, displays a loading spinner at the top of the list\n */\n refreshing: boolean;\n /**\n * Function to refresh the channel list that is similar to `reloadList`, but it doesn't wipe out existing channels\n * from UI before loading the new ones\n */\n refreshList: () => void | Promise<void>;\n /**\n * Removes all the existing channels from UI and loads fresh channels\n * */\n reloadList: () => Promise<void>;\n // /**\n // * Function to set the currently active channel, acts as a bridge between ChannelList and Channel components\n // *\n // * @param channel A channel object\n // */\n // setActiveChannel?: (channel: Channel<StreamChatGenerics>) => void;\n /**\n * Function to gain access to the inner FlatList ref\n *\n * **Example:**\n *\n * ```\n * <ChannelListMessenger\n * setFlatListRef={(ref) => {\n * // Use ref for your own good\n * }}\n * ```\n */\n setFlatListRef: (ref: FlatList<Channel<StreamChatGenerics>> | null) => void;\n /**\n * Custom UI component to display loading channel skeletons\n *\n * Default: [Skeleton](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#skeleton)\n */\n Skeleton: React.ComponentType;\n /**\n * Error in channels query, if any\n */\n error?: Error;\n ListHeaderComponent?: React.ComponentType;\n /**\n * Function to set the currently active channel, acts as a bridge between ChannelList and Channel components\n *\n * @param channel A channel object\n */\n onSelect?: (channel: Channel<StreamChatGenerics>) => void;\n /**\n * Custom UI component to render preview avatar.\n *\n * **Default** [ChannelAvatar](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelAvatar.tsx)\n */\n PreviewAvatar?: React.ComponentType<ChannelAvatarProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render preview of latest message on channel.\n *\n * **Default** [ChannelPreviewMessage](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewMessage.tsx)\n */\n PreviewMessage?: React.ComponentType<ChannelPreviewMessageProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render muted status.\n *\n * **Default** [ChannelMutedStatus](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewMutedStatus.tsx)\n */\n PreviewMutedStatus?: React.ComponentType<ChannelPreviewMutedStatusProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render preview avatar.\n *\n * **Default** [ChannelPreviewStatus](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewStatus.tsx)\n */\n PreviewStatus?: React.ComponentType<ChannelPreviewStatusProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render preview avatar.\n *\n * **Default** [ChannelPreviewTitle](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewTitle.tsx)\n */\n PreviewTitle?: React.ComponentType<ChannelPreviewTitleProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render preview avatar.\n *\n * **Default** [ChannelPreviewUnreadCount](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewUnreadCount.tsx)\n */\n PreviewUnreadCount?: React.ComponentType<ChannelPreviewUnreadCountProps<StreamChatGenerics>>;\n};\n\nexport const ChannelsContext = React.createContext(\n DEFAULT_BASE_CONTEXT_VALUE as ChannelsContextValue,\n);\n\nexport const ChannelsProvider = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n children,\n value,\n}: PropsWithChildren<{\n value: ChannelsContextValue<StreamChatGenerics>;\n}>) => (\n <ChannelsContext.Provider value={value as unknown as ChannelsContextValue}>\n {children}\n </ChannelsContext.Provider>\n);\n\nexport const useChannelsContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>() => {\n const contextValue = useContext(\n ChannelsContext,\n ) as unknown as ChannelsContextValue<StreamChatGenerics>;\n\n if (contextValue === DEFAULT_BASE_CONTEXT_VALUE && !isTestEnvironment()) {\n throw new Error(\n `The useChannelsContext hook was called outside of the ChannelsContext provider. Make sure you have configured ChannelList component correctly - https://getstream.io/chat/docs/sdk/reactnative/basics/hello_stream_chat/#channel-list`,\n );\n }\n\n return contextValue;\n};\n/**\n * Typescript currently does not support partial inference so if ChatContext\n * typing is desired while using the HOC withChannelContext the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withChannelsContext = <\n P extends UnknownType,\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n Component: React.ComponentType<P>,\n): React.FC<Omit<P, keyof ChannelsContextValue<StreamChatGenerics>>> => {\n const WithChannelsContextComponent = (\n props: Omit<P, keyof ChannelsContextValue<StreamChatGenerics>>,\n ) => {\n const channelsContext = useChannelsContext<StreamChatGenerics>();\n\n return <Component {...(props as P)} {...channelsContext} />;\n };\n WithChannelsContextComponent.displayName = `WithChannelsContext${getDisplayName(Component)}`;\n return WithChannelsContextComponent;\n};\n"],"mappings":";;;;;;;AAAA;AAqBA;AAEA;AACA;AAA+D;EAAA;AAAA;AAAA;AA4LxD,IAAMA,eAAe,GAAGC,iBAAK,CAACC,aAAa,CAChDC,mDAA0B,CAC3B;AAAC;AAEK,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAgB;EAAA,IAG3BC,QAAQ,QAARA,QAAQ;IACRC,KAAK,QAALA,KAAK;EAAA,OAIL,gCAAC,eAAe,CAAC,QAAQ;IAAC,KAAK,EAAEA,KAAyC;IAAA;IAAA;MAAA;MAAA;MAAA;IAAA;EAAA,GACvED,QAAQ,CACgB;AAAA,CAC5B;AAAC;AAEK,IAAME,kBAAkB,GAAG,SAArBA,kBAAkB,GAExB;EACL,IAAMC,YAAY,GAAG,IAAAC,iBAAU,EAC7BT,eAAe,CACuC;EAExD,IAAIQ,YAAY,KAAKL,mDAA0B,IAAI,CAAC,IAAAO,oCAAiB,GAAE,EAAE;IACvE,MAAM,IAAIC,KAAK,yOAEd;EACH;EAEA,OAAOH,YAAY;AACrB,CAAC;AAAC;AAMK,IAAMI,mBAAmB,GAAG,SAAtBA,mBAAmB,CAI9BC,SAAiC,EACqC;EACtE,IAAMC,4BAA4B,GAAG,SAA/BA,4BAA4B,CAChCC,KAA8D,EAC3D;IACH,IAAMC,eAAe,GAAGT,kBAAkB,EAAsB;IAEhE,OAAO,gCAAC,SAAS,gCAAMQ,KAAK,EAAYC,eAAe;MAAA;MAAA;QAAA;QAAA;QAAA;MAAA;IAAA,GAAI;EAC7D,CAAC;EACDF,4BAA4B,CAACG,WAAW,2BAAyB,IAAAC,8BAAc,EAACL,SAAS,CAAG;EAC5F,OAAOC,4BAA4B;AACrC,CAAC;AAAC"}
|
|
1
|
+
{"version":3,"names":["ChannelsContext","React","createContext","DEFAULT_BASE_CONTEXT_VALUE","ChannelsProvider","children","value","useChannelsContext","contextValue","useContext","isTestEnvironment","Error","withChannelsContext","Component","WithChannelsContextComponent","props","channelsContext","displayName","getDisplayName"],"sources":["ChannelsContext.tsx"],"sourcesContent":["import React, { PropsWithChildren, useContext } from 'react';\n\nimport type { FlatListProps } from 'react-native';\nimport type { FlatList } from 'react-native-gesture-handler';\n\nimport type { ChannelPreviewMutedStatusProps } from 'src/components/ChannelPreview/ChannelPreviewMutedStatus';\n\nimport type { Channel } from 'stream-chat';\n\nimport type { HeaderErrorProps } from '../../components/ChannelList/ChannelListHeaderErrorIndicator';\nimport type { QueryChannels } from '../../components/ChannelList/hooks/usePaginatedChannels';\nimport type { ChannelAvatarProps } from '../../components/ChannelPreview/ChannelAvatar';\nimport type { ChannelPreviewMessageProps } from '../../components/ChannelPreview/ChannelPreviewMessage';\nimport type { ChannelPreviewMessengerProps } from '../../components/ChannelPreview/ChannelPreviewMessenger';\nimport type { ChannelPreviewStatusProps } from '../../components/ChannelPreview/ChannelPreviewStatus';\nimport type { ChannelPreviewTitleProps } from '../../components/ChannelPreview/ChannelPreviewTitle';\nimport type { ChannelPreviewUnreadCountProps } from '../../components/ChannelPreview/ChannelPreviewUnreadCount';\nimport type { EmptyStateProps } from '../../components/Indicators/EmptyStateIndicator';\nimport type { LoadingErrorProps } from '../../components/Indicators/LoadingErrorIndicator';\nimport type { LoadingProps } from '../../components/Indicators/LoadingIndicator';\nimport type { DefaultStreamChatGenerics, UnknownType } from '../../types/types';\nimport { DEFAULT_BASE_CONTEXT_VALUE } from '../utils/defaultBaseContextValue';\n\nimport { getDisplayName } from '../utils/getDisplayName';\nimport { isTestEnvironment } from '../utils/isTestEnvironment';\n\nexport type ChannelsContextValue<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = {\n /**\n * Besides the existing default behavior of the ChannelListMessenger component, you can attach\n * additional props to the underlying React Native FlatList.\n *\n * You can find list of all the available FlatList props here - https://facebook.github.io/react-native/docs/flatlist#props\n *\n * **EXAMPLE:**\n *\n * ```\n * <ChannelListMessenger\n * channels={channels}\n * additionalFlatListProps={{ bounces: true }}\n * />\n * ```\n *\n * **Note:** Don't use `additionalFlatListProps` to access the FlatList ref, use `setFlatListRef`\n */\n additionalFlatListProps: Partial<FlatListProps<Channel<StreamChatGenerics>>>;\n /**\n * Channels can be either an array of channels or a promise which resolves to an array of channels\n */\n channels: Channel<StreamChatGenerics>[] | null;\n /**\n * Custom indicator to use when channel list is empty\n *\n * Default: [EmptyStateIndicator](https://getstream.io/chat/docs/sdk/reactnative/core-components/channel/#emptystateindicator)\n * */\n EmptyStateIndicator: React.ComponentType<EmptyStateProps>;\n /**\n * Custom loading indicator to display at bottom of the list, while loading further pages\n *\n * Default: [ChannelListFooterLoadingIndicator](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#footerloadingindicator)\n */\n FooterLoadingIndicator: React.ComponentType;\n /**\n * Incremental number change to force update the FlatList\n */\n forceUpdate: number;\n /**\n * Whether or not the FlatList has another page to render\n */\n hasNextPage: boolean;\n /**\n * Custom indicator to display error at top of list, if loading/pagination error occurs\n *\n * Default: [ChannelListHeaderErrorIndicator](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#headererrorindicator)\n */\n HeaderErrorIndicator: React.ComponentType<HeaderErrorProps>;\n /**\n * Custom indicator to display network-down error at top of list, if there is connectivity issue\n *\n * Default: [ChannelListHeaderNetworkDownIndicator](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#headernetworkdownindicator)\n */\n HeaderNetworkDownIndicator: React.ComponentType;\n /**\n * Initial channels query loading state, triggers the LoadingIndicator\n */\n loadingChannels: boolean;\n /**\n * Custom indicator to use when there is error in fetching channels\n *\n * Default: [LoadingErrorIndicator](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#loadingerrorindicator)\n * */\n LoadingErrorIndicator: React.ComponentType<LoadingErrorProps>;\n /**\n * Custom loading indicator to use on Channel List\n *\n * */\n LoadingIndicator: React.ComponentType<Pick<LoadingProps, 'listType'>>;\n /**\n * Whether or not additional channels are being loaded, triggers the FooterLoadingIndicator\n */\n loadingNextPage: boolean;\n /**\n * The React Native FlatList threshold to fetch more data\n * @see See loadMoreThreshold [doc](https://facebook.github.io/react-native/docs/flatlist#onendreachedthreshold)\n * */\n loadMoreThreshold: number;\n /**\n * Loads the next page of `channels`, which is present as a required prop\n */\n loadNextPage: QueryChannels;\n /**\n * Max number to display within notification badge. Default: 255 and it cannot be higher than that for now due to backend limitations\n */\n maxUnreadCount: number;\n /**\n * Number of skeletons that should show when loading. Default: 6\n */\n numberOfSkeletons: number;\n /**\n * Custom UI component to display individual channel list items\n *\n * Default: [ChannelPreviewMessenger](https://getstream.io/chat/docs/sdk/reactnative/ui-components/channel-preview-messenger/)\n */\n Preview: React.ComponentType<ChannelPreviewMessengerProps<StreamChatGenerics>>;\n /**\n * Triggered when the channel list is refreshing, displays a loading spinner at the top of the list\n */\n refreshing: boolean;\n /**\n * Function to refresh the channel list that is similar to `reloadList`, but it doesn't wipe out existing channels\n * from UI before loading the new ones\n */\n refreshList: () => void | Promise<void>;\n /**\n * Removes all the existing channels from UI and loads fresh channels\n * */\n reloadList: () => Promise<void>;\n // /**\n // * Function to set the currently active channel, acts as a bridge between ChannelList and Channel components\n // *\n // * @param channel A channel object\n // */\n // setActiveChannel?: (channel: Channel<StreamChatGenerics>) => void;\n /**\n * Function to gain access to the inner FlatList ref\n *\n * **Example:**\n *\n * ```\n * <ChannelListMessenger\n * setFlatListRef={(ref) => {\n * // Use ref for your own good\n * }}\n * ```\n */\n setFlatListRef: (ref: FlatList<Channel<StreamChatGenerics>> | null) => void;\n /**\n * Custom UI component to display loading channel skeletons\n *\n * Default: [Skeleton](https://getstream.io/chat/docs/sdk/reactnative/contexts/channels-context/#skeleton)\n */\n Skeleton: React.ComponentType;\n /**\n * Error in channels query, if any\n */\n error?: Error;\n ListHeaderComponent?: React.ComponentType;\n /**\n * Function to set the currently active channel, acts as a bridge between ChannelList and Channel components\n *\n * @param channel A channel object\n */\n onSelect?: (channel: Channel<StreamChatGenerics>) => void;\n /**\n * Custom UI component to render preview avatar.\n *\n * **Default** [ChannelAvatar](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelAvatar.tsx)\n */\n PreviewAvatar?: React.ComponentType<ChannelAvatarProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render preview of latest message on channel.\n *\n * **Default** [ChannelPreviewMessage](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewMessage.tsx)\n */\n PreviewMessage?: React.ComponentType<ChannelPreviewMessageProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render muted status.\n *\n * **Default** [ChannelMutedStatus](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewMutedStatus.tsx)\n */\n PreviewMutedStatus?: React.ComponentType<ChannelPreviewMutedStatusProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render preview avatar.\n *\n * **Default** [ChannelPreviewStatus](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewStatus.tsx)\n */\n PreviewStatus?: React.ComponentType<ChannelPreviewStatusProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render preview avatar.\n *\n * **Default** [ChannelPreviewTitle](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewTitle.tsx)\n */\n PreviewTitle?: React.ComponentType<ChannelPreviewTitleProps<StreamChatGenerics>>;\n /**\n * Custom UI component to render preview avatar.\n *\n * **Default** [ChannelPreviewUnreadCount](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/ChannelPreview/ChannelPreviewUnreadCount.tsx)\n */\n PreviewUnreadCount?: React.ComponentType<ChannelPreviewUnreadCountProps<StreamChatGenerics>>;\n};\n\nexport const ChannelsContext = React.createContext(\n DEFAULT_BASE_CONTEXT_VALUE as ChannelsContextValue,\n);\n\nexport const ChannelsProvider = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n children,\n value,\n}: PropsWithChildren<{\n value: ChannelsContextValue<StreamChatGenerics>;\n}>) => (\n <ChannelsContext.Provider value={value as unknown as ChannelsContextValue}>\n {children}\n </ChannelsContext.Provider>\n);\n\nexport const useChannelsContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>() => {\n const contextValue = useContext(\n ChannelsContext,\n ) as unknown as ChannelsContextValue<StreamChatGenerics>;\n\n if (contextValue === DEFAULT_BASE_CONTEXT_VALUE && !isTestEnvironment()) {\n throw new Error(\n `The useChannelsContext hook was called outside of the ChannelsContext provider. Make sure you have configured ChannelList component correctly - https://getstream.io/chat/docs/sdk/reactnative/basics/hello_stream_chat/#channel-list`,\n );\n }\n\n return contextValue;\n};\n/**\n * Typescript currently does not support partial inference so if ChatContext\n * typing is desired while using the HOC withChannelContext the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withChannelsContext = <\n P extends UnknownType,\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n Component: React.ComponentType<P>,\n): React.FC<Omit<P, keyof ChannelsContextValue<StreamChatGenerics>>> => {\n const WithChannelsContextComponent = (\n props: Omit<P, keyof ChannelsContextValue<StreamChatGenerics>>,\n ) => {\n const channelsContext = useChannelsContext<StreamChatGenerics>();\n\n return <Component {...(props as P)} {...channelsContext} />;\n };\n WithChannelsContextComponent.displayName = `WithChannelsContext${getDisplayName(Component)}`;\n return WithChannelsContextComponent;\n};\n"],"mappings":";;;;;;;AAAA;AAqBA;AAEA;AACA;AAA+D;EAAA;AAAA;AAAA;AA4LxD,IAAMA,eAAe,GAAGC,iBAAK,CAACC,aAAa,CAChDC,mDAA0B,CAC3B;AAAC;AAEK,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAgB;EAAA,IAG3BC,QAAQ,QAARA,QAAQ;IACRC,KAAK,QAALA,KAAK;EAAA,OAIL,gCAAC,eAAe,CAAC,QAAQ;IAAC,KAAK,EAAEA,KAAyC;IAAA;IAAA;MAAA;MAAA;MAAA;IAAA;EAAA,GACvED,QAAQ,CACgB;AAAA,CAC5B;AAAC;AAEK,IAAME,kBAAkB,GAAG,SAArBA,kBAAkB,GAExB;EACL,IAAMC,YAAY,GAAG,IAAAC,iBAAU,EAC7BT,eAAe,CACuC;EAExD,IAAIQ,YAAY,KAAKL,mDAA0B,IAAI,CAAC,IAAAO,oCAAiB,GAAE,EAAE;IACvE,MAAM,IAAIC,KAAK,yOAEd;EACH;EAEA,OAAOH,YAAY;AACrB,CAAC;AAAC;AAMK,IAAMI,mBAAmB,GAAG,SAAtBA,mBAAmB,CAI9BC,SAAiC,EACqC;EACtE,IAAMC,4BAA4B,GAAG,SAA/BA,4BAA4B,CAChCC,KAA8D,EAC3D;IACH,IAAMC,eAAe,GAAGT,kBAAkB,EAAsB;IAEhE,OAAO,gCAAC,SAAS,gCAAMQ,KAAK,EAAYC,eAAe;MAAA;MAAA;QAAA;QAAA;QAAA;MAAA;IAAA,GAAI;EAC7D,CAAC;EACDF,4BAA4B,CAACG,WAAW,2BAAyB,IAAAC,8BAAc,EAACL,SAAS,CAAG;EAC5F,OAAOC,4BAA4B;AACrC,CAAC;AAAC"}
|
|
@@ -58,7 +58,7 @@ var ChannelList = function ChannelList(props) {
|
|
|
58
58
|
_props$LoadingIndicat = props.LoadingIndicator,
|
|
59
59
|
LoadingIndicator = _props$LoadingIndicat === void 0 ? _ChannelListLoadingIndicator.ChannelListLoadingIndicator : _props$LoadingIndicat,
|
|
60
60
|
_props$loadMoreThresh = props.loadMoreThreshold,
|
|
61
|
-
loadMoreThreshold = _props$loadMoreThresh === void 0 ?
|
|
61
|
+
loadMoreThreshold = _props$loadMoreThresh === void 0 ? 0.1 : _props$loadMoreThresh,
|
|
62
62
|
_props$lockChannelOrd = props.lockChannelOrder,
|
|
63
63
|
lockChannelOrder = _props$lockChannelOrd === void 0 ? false : _props$lockChannelOrd,
|
|
64
64
|
_props$maxUnreadCount = props.maxUnreadCount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_FILTERS","DEFAULT_OPTIONS","DEFAULT_SORT","ChannelList","props","additionalFlatListProps","EmptyStateIndicator","EmptyStateIndicatorDefault","FooterLoadingIndicator","ChannelListFooterLoadingIndicator","filters","HeaderErrorIndicator","ChannelListHeaderErrorIndicator","HeaderNetworkDownIndicator","ChannelListHeaderNetworkDownIndicator","List","ChannelListMessenger","ListHeaderComponent","LoadingErrorIndicator","LoadingErrorIndicatorDefault","LoadingIndicator","ChannelListLoadingIndicator","loadMoreThreshold","lockChannelOrder","maxUnreadCount","numberOfSkeletons","onAddedToChannel","onChannelDeleted","onChannelHidden","onChannelVisible","onChannelTruncated","onChannelUpdated","onMessageNew","onRemovedFromChannel","onSelect","options","Preview","ChannelPreviewMessenger","PreviewAvatar","PreviewMessage","PreviewStatus","PreviewTitle","PreviewUnreadCount","setFlatListRef","Skeleton","SkeletonDefault","sort","useState","forceUpdate","setForceUpdate","useChatContext","enableOfflineSupport","usePaginatedChannels","channels","error","hasNextPage","loadingChannels","loadingNextPage","loadNextPage","refreshing","refreshList","reloadList","setChannels","staticChannelsActive","useAddedToChannelNotification","useChannelDeleted","useChannelHidden","useChannelTruncated","useChannelUpdated","useChannelVisible","useNewMessage","useNewMessageNotification","useRemovedFromChannelNotification","useUserPresence","channelIdsStr","reduce","acc","channel","cid","useEffect","upsertCidsForQuery","cids","map","c","channelsContext","useCreateChannelsContext","ref"],"sources":["ChannelList.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\n\nimport type { FlatList } from 'react-native-gesture-handler';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort, Event } from 'stream-chat';\n\nimport { ChannelListFooterLoadingIndicator } from './ChannelListFooterLoadingIndicator';\nimport { ChannelListHeaderErrorIndicator } from './ChannelListHeaderErrorIndicator';\nimport { ChannelListHeaderNetworkDownIndicator } from './ChannelListHeaderNetworkDownIndicator';\nimport { ChannelListLoadingIndicator } from './ChannelListLoadingIndicator';\nimport { ChannelListMessenger, ChannelListMessengerProps } from './ChannelListMessenger';\nimport { useAddedToChannelNotification } from './hooks/listeners/useAddedToChannelNotification';\nimport { useChannelDeleted } from './hooks/listeners/useChannelDeleted';\nimport { useChannelHidden } from './hooks/listeners/useChannelHidden';\nimport { useChannelTruncated } from './hooks/listeners/useChannelTruncated';\nimport { useChannelUpdated } from './hooks/listeners/useChannelUpdated';\nimport { useChannelVisible } from './hooks/listeners/useChannelVisible';\nimport { useNewMessage } from './hooks/listeners/useNewMessage';\nimport { useNewMessageNotification } from './hooks/listeners/useNewMessageNotification';\nimport { useRemovedFromChannelNotification } from './hooks/listeners/useRemovedFromChannelNotification';\nimport { useUserPresence } from './hooks/listeners/useUserPresence';\nimport { useCreateChannelsContext } from './hooks/useCreateChannelsContext';\nimport { usePaginatedChannels } from './hooks/usePaginatedChannels';\nimport { Skeleton as SkeletonDefault } from './Skeleton';\n\nimport {\n ChannelsContextValue,\n ChannelsProvider,\n} from '../../contexts/channelsContext/ChannelsContext';\nimport { useChatContext } from '../../contexts/chatContext/ChatContext';\nimport { upsertCidsForQuery } from '../../store/apis/upsertCidsForQuery';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport { ChannelPreviewMessenger } from '../ChannelPreview/ChannelPreviewMessenger';\nimport { EmptyStateIndicator as EmptyStateIndicatorDefault } from '../Indicators/EmptyStateIndicator';\nimport { LoadingErrorIndicator as LoadingErrorIndicatorDefault } from '../Indicators/LoadingErrorIndicator';\n\nexport type ChannelListProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Partial<\n Pick<\n ChannelsContextValue<StreamChatGenerics>,\n | 'additionalFlatListProps'\n | 'EmptyStateIndicator'\n | 'FooterLoadingIndicator'\n | 'HeaderErrorIndicator'\n | 'HeaderNetworkDownIndicator'\n | 'LoadingErrorIndicator'\n | 'LoadingIndicator'\n | 'Preview'\n | 'setFlatListRef'\n | 'ListHeaderComponent'\n | 'onSelect'\n | 'PreviewAvatar'\n | 'PreviewMessage'\n | 'PreviewStatus'\n | 'PreviewTitle'\n | 'PreviewUnreadCount'\n | 'loadMoreThreshold'\n | 'Skeleton'\n | 'maxUnreadCount'\n | 'numberOfSkeletons'\n >\n> & {\n /**\n * Object containing channel query filters\n *\n * @see See [Channel query documentation](https://getstream.io/chat/docs/query_channels) for a list of available filter fields\n *\n * @overrideType object\n * */\n filters?: ChannelFilters<StreamChatGenerics>;\n /**\n * Custom UI component to display the list of channels\n *\n * Default: [ChannelListMessenger](https://getstream.io/chat/docs/sdk/reactnative/ui-components/channel-list-messenger/)\n */\n List?: React.ComponentType<ChannelListMessengerProps<StreamChatGenerics>>;\n /**\n * If set to true, channels won't dynamically sort by most recent message, defaults to false\n */\n lockChannelOrder?: boolean;\n /**\n * Function that overrides default behavior when a user gets added to a channel\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event Object](https://getstream.io/chat/docs/event_object) corresponding to `notification.added_to_channel` event\n *\n * @overrideType Function\n * */\n onAddedToChannel?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a channel gets deleted. In absence of this prop, the channel will be removed from the list.\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.deleted` event\n *\n * @overrideType Function\n * */\n onChannelDeleted?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a channel gets hidden. In absence of this prop, the channel will be removed from the list.\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.hidden` event\n *\n * @overrideType Function\n * */\n onChannelHidden?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function to customize behavior when a channel gets truncated\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.truncated` event\n *\n * @overrideType Function\n * */\n onChannelTruncated?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a channel gets updated\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.updated` event\n *\n * @overrideType Function\n * */\n onChannelUpdated?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a channel gets visible. In absence of this prop, the channel will be added to the list.\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.visible` event\n *\n * @overrideType Function\n * */\n onChannelVisible?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Override the default listener/handler for event `notification.message_new`\n * This event is received on channel, which is not being watched.\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `notification.message_new` event\n *\n * @overrideType Function\n * */\n onMessageNew?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a user gets removed from a channel\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `notification.removed_from_channel` event\n *\n * @overrideType Function\n * */\n onRemovedFromChannel?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Object containing channel query options\n * @see See [Channel query documentation](https://getstream.io/chat/docs/query_channels) for a list of available option fields\n * */\n options?: ChannelOptions;\n /**\n * Object containing channel sort parameters\n * @see See [Channel query documentation](https://getstream.io/chat/docs/query_channels) for a list of available sorting fields\n * */\n sort?: ChannelSort<StreamChatGenerics>;\n};\n\nconst DEFAULT_FILTERS = {};\nconst DEFAULT_OPTIONS = {};\nconst DEFAULT_SORT = {};\n\n/**\n * This component fetches a list of channels, allowing you to select the channel you want to open.\n * The ChannelList doesn't provide any UI for the underlying React Native FlatList. UI is determined by the `List` component which is\n * provided to the ChannelList component as a prop. By default, the ChannelListMessenger component is used as the list UI.\n *\n * @example ./ChannelList.md\n */\nexport const ChannelList = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelListProps<StreamChatGenerics>,\n) => {\n const {\n additionalFlatListProps = {},\n EmptyStateIndicator = EmptyStateIndicatorDefault,\n FooterLoadingIndicator = ChannelListFooterLoadingIndicator,\n filters = DEFAULT_FILTERS,\n HeaderErrorIndicator = ChannelListHeaderErrorIndicator,\n HeaderNetworkDownIndicator = ChannelListHeaderNetworkDownIndicator,\n List = ChannelListMessenger,\n ListHeaderComponent,\n LoadingErrorIndicator = LoadingErrorIndicatorDefault,\n LoadingIndicator = ChannelListLoadingIndicator,\n // https://github.com/facebook/react-native/blob/a7a7970e543959e9db5281914d5f132beb01db8d/Libraries/Lists/VirtualizedList.js#L466\n loadMoreThreshold = 2,\n lockChannelOrder = false,\n maxUnreadCount = 255,\n numberOfSkeletons = 6,\n onAddedToChannel,\n onChannelDeleted,\n onChannelHidden,\n onChannelVisible,\n onChannelTruncated,\n onChannelUpdated,\n onMessageNew,\n onRemovedFromChannel,\n onSelect,\n options = DEFAULT_OPTIONS,\n Preview = ChannelPreviewMessenger,\n PreviewAvatar,\n PreviewMessage,\n PreviewStatus,\n PreviewTitle,\n PreviewUnreadCount,\n setFlatListRef,\n Skeleton = SkeletonDefault,\n sort = DEFAULT_SORT,\n } = props;\n\n const [forceUpdate, setForceUpdate] = useState(0);\n const { enableOfflineSupport } = useChatContext<StreamChatGenerics>();\n const {\n channels,\n error,\n hasNextPage,\n loadingChannels,\n loadingNextPage,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setChannels,\n staticChannelsActive,\n } = usePaginatedChannels<StreamChatGenerics>({\n enableOfflineSupport,\n filters,\n options,\n setForceUpdate,\n sort,\n });\n\n // Setup event listeners\n useAddedToChannelNotification({\n onAddedToChannel,\n setChannels,\n });\n\n useChannelDeleted({\n onChannelDeleted,\n setChannels,\n });\n\n useChannelHidden({\n onChannelHidden,\n setChannels,\n });\n\n useChannelTruncated({\n onChannelTruncated,\n refreshList,\n setChannels,\n setForceUpdate,\n });\n\n useChannelUpdated({\n onChannelUpdated,\n setChannels,\n });\n\n useChannelVisible({\n onChannelVisible,\n setChannels,\n });\n\n useNewMessage({\n lockChannelOrder,\n setChannels,\n });\n\n useNewMessageNotification({\n onMessageNew,\n setChannels,\n });\n\n useRemovedFromChannelNotification({\n onRemovedFromChannel,\n setChannels,\n });\n\n useUserPresence({\n setChannels,\n });\n\n const channelIdsStr = channels?.reduce((acc, channel) => `${acc}${channel.cid}`, '');\n\n useEffect(() => {\n if (channels === null || staticChannelsActive || !enableOfflineSupport) {\n return;\n }\n\n upsertCidsForQuery({\n cids: channels.map((c) => c.cid),\n filters,\n sort,\n });\n }, [channelIdsStr, staticChannelsActive]);\n\n const channelsContext = useCreateChannelsContext({\n additionalFlatListProps,\n channels,\n EmptyStateIndicator,\n error,\n FooterLoadingIndicator,\n forceUpdate,\n hasNextPage,\n HeaderErrorIndicator,\n HeaderNetworkDownIndicator,\n ListHeaderComponent,\n loadingChannels,\n LoadingErrorIndicator,\n LoadingIndicator,\n loadingNextPage,\n loadMoreThreshold,\n loadNextPage,\n maxUnreadCount,\n numberOfSkeletons,\n onSelect,\n Preview,\n PreviewAvatar,\n PreviewMessage,\n PreviewStatus,\n PreviewTitle,\n PreviewUnreadCount,\n refreshing,\n refreshList,\n reloadList,\n setFlatListRef: (ref: FlatList<Channel<StreamChatGenerics>> | null) => {\n if (setFlatListRef) {\n setFlatListRef(ref);\n }\n },\n Skeleton,\n });\n\n return (\n <ChannelsProvider value={channelsContext}>\n <List<StreamChatGenerics> />\n </ChannelsProvider>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["DEFAULT_FILTERS","DEFAULT_OPTIONS","DEFAULT_SORT","ChannelList","props","additionalFlatListProps","EmptyStateIndicator","EmptyStateIndicatorDefault","FooterLoadingIndicator","ChannelListFooterLoadingIndicator","filters","HeaderErrorIndicator","ChannelListHeaderErrorIndicator","HeaderNetworkDownIndicator","ChannelListHeaderNetworkDownIndicator","List","ChannelListMessenger","ListHeaderComponent","LoadingErrorIndicator","LoadingErrorIndicatorDefault","LoadingIndicator","ChannelListLoadingIndicator","loadMoreThreshold","lockChannelOrder","maxUnreadCount","numberOfSkeletons","onAddedToChannel","onChannelDeleted","onChannelHidden","onChannelVisible","onChannelTruncated","onChannelUpdated","onMessageNew","onRemovedFromChannel","onSelect","options","Preview","ChannelPreviewMessenger","PreviewAvatar","PreviewMessage","PreviewStatus","PreviewTitle","PreviewUnreadCount","setFlatListRef","Skeleton","SkeletonDefault","sort","useState","forceUpdate","setForceUpdate","useChatContext","enableOfflineSupport","usePaginatedChannels","channels","error","hasNextPage","loadingChannels","loadingNextPage","loadNextPage","refreshing","refreshList","reloadList","setChannels","staticChannelsActive","useAddedToChannelNotification","useChannelDeleted","useChannelHidden","useChannelTruncated","useChannelUpdated","useChannelVisible","useNewMessage","useNewMessageNotification","useRemovedFromChannelNotification","useUserPresence","channelIdsStr","reduce","acc","channel","cid","useEffect","upsertCidsForQuery","cids","map","c","channelsContext","useCreateChannelsContext","ref"],"sources":["ChannelList.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\n\nimport type { FlatList } from 'react-native-gesture-handler';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort, Event } from 'stream-chat';\n\nimport { ChannelListFooterLoadingIndicator } from './ChannelListFooterLoadingIndicator';\nimport { ChannelListHeaderErrorIndicator } from './ChannelListHeaderErrorIndicator';\nimport { ChannelListHeaderNetworkDownIndicator } from './ChannelListHeaderNetworkDownIndicator';\nimport { ChannelListLoadingIndicator } from './ChannelListLoadingIndicator';\nimport { ChannelListMessenger, ChannelListMessengerProps } from './ChannelListMessenger';\nimport { useAddedToChannelNotification } from './hooks/listeners/useAddedToChannelNotification';\nimport { useChannelDeleted } from './hooks/listeners/useChannelDeleted';\nimport { useChannelHidden } from './hooks/listeners/useChannelHidden';\nimport { useChannelTruncated } from './hooks/listeners/useChannelTruncated';\nimport { useChannelUpdated } from './hooks/listeners/useChannelUpdated';\nimport { useChannelVisible } from './hooks/listeners/useChannelVisible';\nimport { useNewMessage } from './hooks/listeners/useNewMessage';\nimport { useNewMessageNotification } from './hooks/listeners/useNewMessageNotification';\nimport { useRemovedFromChannelNotification } from './hooks/listeners/useRemovedFromChannelNotification';\nimport { useUserPresence } from './hooks/listeners/useUserPresence';\nimport { useCreateChannelsContext } from './hooks/useCreateChannelsContext';\nimport { usePaginatedChannels } from './hooks/usePaginatedChannels';\nimport { Skeleton as SkeletonDefault } from './Skeleton';\n\nimport {\n ChannelsContextValue,\n ChannelsProvider,\n} from '../../contexts/channelsContext/ChannelsContext';\nimport { useChatContext } from '../../contexts/chatContext/ChatContext';\nimport { upsertCidsForQuery } from '../../store/apis/upsertCidsForQuery';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport { ChannelPreviewMessenger } from '../ChannelPreview/ChannelPreviewMessenger';\nimport { EmptyStateIndicator as EmptyStateIndicatorDefault } from '../Indicators/EmptyStateIndicator';\nimport { LoadingErrorIndicator as LoadingErrorIndicatorDefault } from '../Indicators/LoadingErrorIndicator';\n\nexport type ChannelListProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Partial<\n Pick<\n ChannelsContextValue<StreamChatGenerics>,\n | 'additionalFlatListProps'\n | 'EmptyStateIndicator'\n | 'FooterLoadingIndicator'\n | 'HeaderErrorIndicator'\n | 'HeaderNetworkDownIndicator'\n | 'LoadingErrorIndicator'\n | 'LoadingIndicator'\n | 'Preview'\n | 'setFlatListRef'\n | 'ListHeaderComponent'\n | 'onSelect'\n | 'PreviewAvatar'\n | 'PreviewMessage'\n | 'PreviewStatus'\n | 'PreviewTitle'\n | 'PreviewUnreadCount'\n | 'loadMoreThreshold'\n | 'Skeleton'\n | 'maxUnreadCount'\n | 'numberOfSkeletons'\n >\n> & {\n /**\n * Object containing channel query filters\n *\n * @see See [Channel query documentation](https://getstream.io/chat/docs/query_channels) for a list of available filter fields\n *\n * @overrideType object\n * */\n filters?: ChannelFilters<StreamChatGenerics>;\n /**\n * Custom UI component to display the list of channels\n *\n * Default: [ChannelListMessenger](https://getstream.io/chat/docs/sdk/reactnative/ui-components/channel-list-messenger/)\n */\n List?: React.ComponentType<ChannelListMessengerProps<StreamChatGenerics>>;\n /**\n * If set to true, channels won't dynamically sort by most recent message, defaults to false\n */\n lockChannelOrder?: boolean;\n /**\n * Function that overrides default behavior when a user gets added to a channel\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event Object](https://getstream.io/chat/docs/event_object) corresponding to `notification.added_to_channel` event\n *\n * @overrideType Function\n * */\n onAddedToChannel?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a channel gets deleted. In absence of this prop, the channel will be removed from the list.\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.deleted` event\n *\n * @overrideType Function\n * */\n onChannelDeleted?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a channel gets hidden. In absence of this prop, the channel will be removed from the list.\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.hidden` event\n *\n * @overrideType Function\n * */\n onChannelHidden?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function to customize behavior when a channel gets truncated\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.truncated` event\n *\n * @overrideType Function\n * */\n onChannelTruncated?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a channel gets updated\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.updated` event\n *\n * @overrideType Function\n * */\n onChannelUpdated?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a channel gets visible. In absence of this prop, the channel will be added to the list.\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `channel.visible` event\n *\n * @overrideType Function\n * */\n onChannelVisible?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Override the default listener/handler for event `notification.message_new`\n * This event is received on channel, which is not being watched.\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `notification.message_new` event\n *\n * @overrideType Function\n * */\n onMessageNew?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Function that overrides default behavior when a user gets removed from a channel\n *\n * @param setChannels Setter for internal state property - `channels`. It's created from useState() hook.\n * @param event An [Event object](https://getstream.io/chat/docs/event_object) corresponding to `notification.removed_from_channel` event\n *\n * @overrideType Function\n * */\n onRemovedFromChannel?: (\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[] | null>>,\n event: Event<StreamChatGenerics>,\n ) => void;\n /**\n * Object containing channel query options\n * @see See [Channel query documentation](https://getstream.io/chat/docs/query_channels) for a list of available option fields\n * */\n options?: ChannelOptions;\n /**\n * Object containing channel sort parameters\n * @see See [Channel query documentation](https://getstream.io/chat/docs/query_channels) for a list of available sorting fields\n * */\n sort?: ChannelSort<StreamChatGenerics>;\n};\n\nconst DEFAULT_FILTERS = {};\nconst DEFAULT_OPTIONS = {};\nconst DEFAULT_SORT = {};\n\n/**\n * This component fetches a list of channels, allowing you to select the channel you want to open.\n * The ChannelList doesn't provide any UI for the underlying React Native FlatList. UI is determined by the `List` component which is\n * provided to the ChannelList component as a prop. By default, the ChannelListMessenger component is used as the list UI.\n *\n * @example ./ChannelList.md\n */\nexport const ChannelList = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelListProps<StreamChatGenerics>,\n) => {\n const {\n additionalFlatListProps = {},\n EmptyStateIndicator = EmptyStateIndicatorDefault,\n FooterLoadingIndicator = ChannelListFooterLoadingIndicator,\n filters = DEFAULT_FILTERS,\n HeaderErrorIndicator = ChannelListHeaderErrorIndicator,\n HeaderNetworkDownIndicator = ChannelListHeaderNetworkDownIndicator,\n List = ChannelListMessenger,\n ListHeaderComponent,\n LoadingErrorIndicator = LoadingErrorIndicatorDefault,\n LoadingIndicator = ChannelListLoadingIndicator,\n // https://stackoverflow.com/a/60666252/10826415\n loadMoreThreshold = 0.1,\n lockChannelOrder = false,\n maxUnreadCount = 255,\n numberOfSkeletons = 6,\n onAddedToChannel,\n onChannelDeleted,\n onChannelHidden,\n onChannelVisible,\n onChannelTruncated,\n onChannelUpdated,\n onMessageNew,\n onRemovedFromChannel,\n onSelect,\n options = DEFAULT_OPTIONS,\n Preview = ChannelPreviewMessenger,\n PreviewAvatar,\n PreviewMessage,\n PreviewStatus,\n PreviewTitle,\n PreviewUnreadCount,\n setFlatListRef,\n Skeleton = SkeletonDefault,\n sort = DEFAULT_SORT,\n } = props;\n\n const [forceUpdate, setForceUpdate] = useState(0);\n const { enableOfflineSupport } = useChatContext<StreamChatGenerics>();\n const {\n channels,\n error,\n hasNextPage,\n loadingChannels,\n loadingNextPage,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setChannels,\n staticChannelsActive,\n } = usePaginatedChannels<StreamChatGenerics>({\n enableOfflineSupport,\n filters,\n options,\n setForceUpdate,\n sort,\n });\n\n // Setup event listeners\n useAddedToChannelNotification({\n onAddedToChannel,\n setChannels,\n });\n\n useChannelDeleted({\n onChannelDeleted,\n setChannels,\n });\n\n useChannelHidden({\n onChannelHidden,\n setChannels,\n });\n\n useChannelTruncated({\n onChannelTruncated,\n refreshList,\n setChannels,\n setForceUpdate,\n });\n\n useChannelUpdated({\n onChannelUpdated,\n setChannels,\n });\n\n useChannelVisible({\n onChannelVisible,\n setChannels,\n });\n\n useNewMessage({\n lockChannelOrder,\n setChannels,\n });\n\n useNewMessageNotification({\n onMessageNew,\n setChannels,\n });\n\n useRemovedFromChannelNotification({\n onRemovedFromChannel,\n setChannels,\n });\n\n useUserPresence({\n setChannels,\n });\n\n const channelIdsStr = channels?.reduce((acc, channel) => `${acc}${channel.cid}`, '');\n\n useEffect(() => {\n if (channels === null || staticChannelsActive || !enableOfflineSupport) {\n return;\n }\n\n upsertCidsForQuery({\n cids: channels.map((c) => c.cid),\n filters,\n sort,\n });\n }, [channelIdsStr, staticChannelsActive]);\n\n const channelsContext = useCreateChannelsContext({\n additionalFlatListProps,\n channels,\n EmptyStateIndicator,\n error,\n FooterLoadingIndicator,\n forceUpdate,\n hasNextPage,\n HeaderErrorIndicator,\n HeaderNetworkDownIndicator,\n ListHeaderComponent,\n loadingChannels,\n LoadingErrorIndicator,\n LoadingIndicator,\n loadingNextPage,\n loadMoreThreshold,\n loadNextPage,\n maxUnreadCount,\n numberOfSkeletons,\n onSelect,\n Preview,\n PreviewAvatar,\n PreviewMessage,\n PreviewStatus,\n PreviewTitle,\n PreviewUnreadCount,\n refreshing,\n refreshList,\n reloadList,\n setFlatListRef: (ref: FlatList<Channel<StreamChatGenerics>> | null) => {\n if (setFlatListRef) {\n setFlatListRef(ref);\n }\n },\n Skeleton,\n });\n\n return (\n <ChannelsProvider value={channelsContext}>\n <List<StreamChatGenerics> />\n </ChannelsProvider>\n );\n};\n"],"mappings":";;;;;;;AAAA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAIA;AACA;AAEA;AACA;AACA;AAA4G;EAAA;AAAA;AAAA;AA4J5G,IAAMA,eAAe,GAAG,CAAC,CAAC;AAC1B,IAAMC,eAAe,GAAG,CAAC,CAAC;AAC1B,IAAMC,YAAY,GAAG,CAAC,CAAC;AAShB,IAAMC,WAAW,GAAG,SAAdA,WAAW,CAGtBC,KAA2C,EACxC;EACH,4BAmCIA,KAAK,CAlCPC,uBAAuB;IAAvBA,uBAAuB,sCAAG,CAAC,CAAC;IAAA,wBAkC1BD,KAAK,CAjCPE,mBAAmB;IAAnBA,mBAAmB,sCAAGC,wCAA0B;IAAA,wBAiC9CH,KAAK,CAhCPI,sBAAsB;IAAtBA,sBAAsB,sCAAGC,oEAAiC;IAAA,iBAgCxDL,KAAK,CA/BPM,OAAO;IAAPA,OAAO,+BAAGV,eAAe;IAAA,wBA+BvBI,KAAK,CA9BPO,oBAAoB;IAApBA,oBAAoB,sCAAGC,gEAA+B;IAAA,wBA8BpDR,KAAK,CA7BPS,0BAA0B;IAA1BA,0BAA0B,sCAAGC,4EAAqC;IAAA,cA6BhEV,KAAK,CA5BPW,IAAI;IAAJA,IAAI,4BAAGC,0CAAoB;IAC3BC,mBAAmB,GA2BjBb,KAAK,CA3BPa,mBAAmB;IAAA,wBA2BjBb,KAAK,CA1BPc,qBAAqB;IAArBA,qBAAqB,sCAAGC,4CAA4B;IAAA,wBA0BlDf,KAAK,CAzBPgB,gBAAgB;IAAhBA,gBAAgB,sCAAGC,wDAA2B;IAAA,wBAyB5CjB,KAAK,CAvBPkB,iBAAiB;IAAjBA,iBAAiB,sCAAG,GAAG;IAAA,wBAuBrBlB,KAAK,CAtBPmB,gBAAgB;IAAhBA,gBAAgB,sCAAG,KAAK;IAAA,wBAsBtBnB,KAAK,CArBPoB,cAAc;IAAdA,cAAc,sCAAG,GAAG;IAAA,wBAqBlBpB,KAAK,CApBPqB,iBAAiB;IAAjBA,iBAAiB,sCAAG,CAAC;IACrBC,gBAAgB,GAmBdtB,KAAK,CAnBPsB,gBAAgB;IAChBC,gBAAgB,GAkBdvB,KAAK,CAlBPuB,gBAAgB;IAChBC,eAAe,GAiBbxB,KAAK,CAjBPwB,eAAe;IACfC,gBAAgB,GAgBdzB,KAAK,CAhBPyB,gBAAgB;IAChBC,kBAAkB,GAehB1B,KAAK,CAfP0B,kBAAkB;IAClBC,gBAAgB,GAcd3B,KAAK,CAdP2B,gBAAgB;IAChBC,YAAY,GAaV5B,KAAK,CAbP4B,YAAY;IACZC,oBAAoB,GAYlB7B,KAAK,CAZP6B,oBAAoB;IACpBC,QAAQ,GAWN9B,KAAK,CAXP8B,QAAQ;IAAA,iBAWN9B,KAAK,CAVP+B,OAAO;IAAPA,OAAO,+BAAGlC,eAAe;IAAA,iBAUvBG,KAAK,CATPgC,OAAO;IAAPA,OAAO,+BAAGC,gDAAuB;IACjCC,aAAa,GAQXlC,KAAK,CARPkC,aAAa;IACbC,cAAc,GAOZnC,KAAK,CAPPmC,cAAc;IACdC,aAAa,GAMXpC,KAAK,CANPoC,aAAa;IACbC,YAAY,GAKVrC,KAAK,CALPqC,YAAY;IACZC,kBAAkB,GAIhBtC,KAAK,CAJPsC,kBAAkB;IAClBC,eAAc,GAGZvC,KAAK,CAHPuC,cAAc;IAAA,kBAGZvC,KAAK,CAFPwC,QAAQ;IAARA,QAAQ,gCAAGC,kBAAe;IAAA,cAExBzC,KAAK,CADP0C,IAAI;IAAJA,IAAI,4BAAG5C,YAAY;EAGrB,gBAAsC,IAAA6C,eAAQ,EAAC,CAAC,CAAC;IAAA;IAA1CC,WAAW;IAAEC,cAAc;EAClC,sBAAiC,IAAAC,2BAAc,GAAsB;IAA7DC,oBAAoB,mBAApBA,oBAAoB;EAC5B,4BAYI,IAAAC,2CAAoB,EAAqB;MAC3CD,oBAAoB,EAApBA,oBAAoB;MACpBzC,OAAO,EAAPA,OAAO;MACPyB,OAAO,EAAPA,OAAO;MACPc,cAAc,EAAdA,cAAc;MACdH,IAAI,EAAJA;IACF,CAAC,CAAC;IAjBAO,QAAQ,yBAARA,QAAQ;IACRC,KAAK,yBAALA,KAAK;IACLC,WAAW,yBAAXA,WAAW;IACXC,eAAe,yBAAfA,eAAe;IACfC,eAAe,yBAAfA,eAAe;IACfC,YAAY,yBAAZA,YAAY;IACZC,UAAU,yBAAVA,UAAU;IACVC,WAAW,yBAAXA,WAAW;IACXC,UAAU,yBAAVA,UAAU;IACVC,WAAW,yBAAXA,WAAW;IACXC,oBAAoB,yBAApBA,oBAAoB;EAUtB,IAAAC,4DAA6B,EAAC;IAC5BtC,gBAAgB,EAAhBA,gBAAgB;IAChBoC,WAAW,EAAXA;EACF,CAAC,CAAC;EAEF,IAAAG,oCAAiB,EAAC;IAChBtC,gBAAgB,EAAhBA,gBAAgB;IAChBmC,WAAW,EAAXA;EACF,CAAC,CAAC;EAEF,IAAAI,kCAAgB,EAAC;IACftC,eAAe,EAAfA,eAAe;IACfkC,WAAW,EAAXA;EACF,CAAC,CAAC;EAEF,IAAAK,wCAAmB,EAAC;IAClBrC,kBAAkB,EAAlBA,kBAAkB;IAClB8B,WAAW,EAAXA,WAAW;IACXE,WAAW,EAAXA,WAAW;IACXb,cAAc,EAAdA;EACF,CAAC,CAAC;EAEF,IAAAmB,oCAAiB,EAAC;IAChBrC,gBAAgB,EAAhBA,gBAAgB;IAChB+B,WAAW,EAAXA;EACF,CAAC,CAAC;EAEF,IAAAO,oCAAiB,EAAC;IAChBxC,gBAAgB,EAAhBA,gBAAgB;IAChBiC,WAAW,EAAXA;EACF,CAAC,CAAC;EAEF,IAAAQ,4BAAa,EAAC;IACZ/C,gBAAgB,EAAhBA,gBAAgB;IAChBuC,WAAW,EAAXA;EACF,CAAC,CAAC;EAEF,IAAAS,oDAAyB,EAAC;IACxBvC,YAAY,EAAZA,YAAY;IACZ8B,WAAW,EAAXA;EACF,CAAC,CAAC;EAEF,IAAAU,oEAAiC,EAAC;IAChCvC,oBAAoB,EAApBA,oBAAoB;IACpB6B,WAAW,EAAXA;EACF,CAAC,CAAC;EAEF,IAAAW,gCAAe,EAAC;IACdX,WAAW,EAAXA;EACF,CAAC,CAAC;EAEF,IAAMY,aAAa,GAAGrB,QAAQ,oBAARA,QAAQ,CAAEsB,MAAM,CAAC,UAACC,GAAG,EAAEC,OAAO;IAAA,YAAQD,GAAG,GAAGC,OAAO,CAACC,GAAG;EAAA,CAAE,EAAE,EAAE,CAAC;EAEpF,IAAAC,gBAAS,EAAC,YAAM;IACd,IAAI1B,QAAQ,KAAK,IAAI,IAAIU,oBAAoB,IAAI,CAACZ,oBAAoB,EAAE;MACtE;IACF;IAEA,IAAA6B,sCAAkB,EAAC;MACjBC,IAAI,EAAE5B,QAAQ,CAAC6B,GAAG,CAAC,UAACC,CAAC;QAAA,OAAKA,CAAC,CAACL,GAAG;MAAA,EAAC;MAChCpE,OAAO,EAAPA,OAAO;MACPoC,IAAI,EAAJA;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,CAAC4B,aAAa,EAAEX,oBAAoB,CAAC,CAAC;EAEzC,IAAMqB,eAAe,GAAG,IAAAC,kDAAwB,EAAC;IAC/ChF,uBAAuB,EAAvBA,uBAAuB;IACvBgD,QAAQ,EAARA,QAAQ;IACR/C,mBAAmB,EAAnBA,mBAAmB;IACnBgD,KAAK,EAALA,KAAK;IACL9C,sBAAsB,EAAtBA,sBAAsB;IACtBwC,WAAW,EAAXA,WAAW;IACXO,WAAW,EAAXA,WAAW;IACX5C,oBAAoB,EAApBA,oBAAoB;IACpBE,0BAA0B,EAA1BA,0BAA0B;IAC1BI,mBAAmB,EAAnBA,mBAAmB;IACnBuC,eAAe,EAAfA,eAAe;IACftC,qBAAqB,EAArBA,qBAAqB;IACrBE,gBAAgB,EAAhBA,gBAAgB;IAChBqC,eAAe,EAAfA,eAAe;IACfnC,iBAAiB,EAAjBA,iBAAiB;IACjBoC,YAAY,EAAZA,YAAY;IACZlC,cAAc,EAAdA,cAAc;IACdC,iBAAiB,EAAjBA,iBAAiB;IACjBS,QAAQ,EAARA,QAAQ;IACRE,OAAO,EAAPA,OAAO;IACPE,aAAa,EAAbA,aAAa;IACbC,cAAc,EAAdA,cAAc;IACdC,aAAa,EAAbA,aAAa;IACbC,YAAY,EAAZA,YAAY;IACZC,kBAAkB,EAAlBA,kBAAkB;IAClBiB,UAAU,EAAVA,UAAU;IACVC,WAAW,EAAXA,WAAW;IACXC,UAAU,EAAVA,UAAU;IACVlB,cAAc,EAAE,wBAAC2C,GAAiD,EAAK;MACrE,IAAI3C,eAAc,EAAE;QAClBA,eAAc,CAAC2C,GAAG,CAAC;MACrB;IACF,CAAC;IACD1C,QAAQ,EAARA;EACF,CAAC,CAAC;EAEF,OACE,gCAAC,iCAAgB;IAAC,KAAK,EAAEwC,eAAgB;IAAA;IAAA;MAAA;MAAA;MAAA;IAAA;EAAA,GACvC,gCAAC,IAAI;IAAA;IAAA;MAAA;MAAA;MAAA;IAAA;EAAA,EAAuB,CACX;AAEvB,CAAC;AAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["styles","StyleSheet","create","container","alignItems","justifyContent","width","ChannelListFooterLoadingIndicator","useTheme","theme","channelListFooterLoadingIndicator","displayName"],"sources":["ChannelListFooterLoadingIndicator.tsx"],"sourcesContent":["import React from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\nimport { Spinner } from '../Spinner/Spinner';\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n },\n});\n\nexport const ChannelListFooterLoadingIndicator: React.FC = () => {\n const {\n theme: {\n channelListFooterLoadingIndicator: { container },\n },\n } = useTheme();\n\n return (\n <View style={[styles.container, container]} testID='channel-list-footer-loading-indicator'>\n <Spinner />\n </View>\n );\n};\n\nChannelListFooterLoadingIndicator.displayName =\n 'ChannelListFooterLoadingIndicator{channelListFooterLoadingIndicator}';\n"],"mappings":";;;;;AAAA;AACA;AAEA;AACA;AAA6C;EAAA;AAE7C,IAAMA,MAAM,GAAGC,uBAAU,CAACC,MAAM,CAAC;EAC/BC,SAAS,EAAE;IACTC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,KAAK,EAAE;EACT;AACF,CAAC,CAAC;AAEK,IAAMC,iCAA2C,GAAG,SAA9CA,iCAA2C,GAAS;EAC/D,gBAII,IAAAC,sBAAQ,GAAE;IAF2BL,SAAS,aADhDM,KAAK,CACHC,iCAAiC,CAAIP,SAAS;EAIlD,OACE,gCAAC,iBAAI;IAAC,KAAK,EAAE,CAACH,MAAM,CAACG,SAAS,EAAEA,SAAS,CAAE;IAAC,MAAM,EAAC,uCAAuC;IAAA;IAAA;MAAA;MAAA;MAAA;IAAA;EAAA,GACxF,gCAAC,gBAAO;IAAA;IAAA;MAAA;MAAA;MAAA;IAAA;EAAA,EAAG,
|
|
1
|
+
{"version":3,"names":["styles","StyleSheet","create","container","alignItems","justifyContent","width","ChannelListFooterLoadingIndicator","useTheme","theme","channelListFooterLoadingIndicator","displayName"],"sources":["ChannelListFooterLoadingIndicator.tsx"],"sourcesContent":["import React from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\nimport { Spinner } from '../Spinner/Spinner';\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n },\n});\n\nexport const ChannelListFooterLoadingIndicator: React.FC = () => {\n const {\n theme: {\n channelListFooterLoadingIndicator: { container },\n },\n } = useTheme();\n\n return (\n <View style={[styles.container, container]} testID='channel-list-footer-loading-indicator'>\n <Spinner height={20} width={20} />\n </View>\n );\n};\n\nChannelListFooterLoadingIndicator.displayName =\n 'ChannelListFooterLoadingIndicator{channelListFooterLoadingIndicator}';\n"],"mappings":";;;;;AAAA;AACA;AAEA;AACA;AAA6C;EAAA;AAE7C,IAAMA,MAAM,GAAGC,uBAAU,CAACC,MAAM,CAAC;EAC/BC,SAAS,EAAE;IACTC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,KAAK,EAAE;EACT;AACF,CAAC,CAAC;AAEK,IAAMC,iCAA2C,GAAG,SAA9CA,iCAA2C,GAAS;EAC/D,gBAII,IAAAC,sBAAQ,GAAE;IAF2BL,SAAS,aADhDM,KAAK,CACHC,iCAAiC,CAAIP,SAAS;EAIlD,OACE,gCAAC,iBAAI;IAAC,KAAK,EAAE,CAACH,MAAM,CAACG,SAAS,EAAEA,SAAS,CAAE;IAAC,MAAM,EAAC,uCAAuC;IAAA;IAAA;MAAA;MAAA;MAAA;IAAA;EAAA,GACxF,gCAAC,gBAAO;IAAC,MAAM,EAAE,EAAG;IAAC,KAAK,EAAE,EAAG;IAAA;IAAA;MAAA;MAAA;MAAA;IAAA;EAAA,EAAG,CAC7B;AAEX,CAAC;AAAC;AAEFI,iCAAiC,CAACI,WAAW,GAC3C,sEAAsE"}
|
|
@@ -47,14 +47,14 @@ var StatusIndicator = function StatusIndicator() {
|
|
|
47
47
|
__self: _this,
|
|
48
48
|
__source: {
|
|
49
49
|
fileName: _jsxFileName,
|
|
50
|
-
lineNumber:
|
|
50
|
+
lineNumber: 53,
|
|
51
51
|
columnNumber: 7
|
|
52
52
|
}
|
|
53
53
|
}, _react["default"].createElement(HeaderNetworkDownIndicator, {
|
|
54
54
|
__self: _this,
|
|
55
55
|
__source: {
|
|
56
56
|
fileName: _jsxFileName,
|
|
57
|
-
lineNumber:
|
|
57
|
+
lineNumber: 54,
|
|
58
58
|
columnNumber: 9
|
|
59
59
|
}
|
|
60
60
|
}));
|
|
@@ -64,7 +64,7 @@ var StatusIndicator = function StatusIndicator() {
|
|
|
64
64
|
__self: _this,
|
|
65
65
|
__source: {
|
|
66
66
|
fileName: _jsxFileName,
|
|
67
|
-
lineNumber:
|
|
67
|
+
lineNumber: 59,
|
|
68
68
|
columnNumber: 7
|
|
69
69
|
}
|
|
70
70
|
}, _react["default"].createElement(HeaderErrorIndicator, {
|
|
@@ -72,7 +72,7 @@ var StatusIndicator = function StatusIndicator() {
|
|
|
72
72
|
__self: _this,
|
|
73
73
|
__source: {
|
|
74
74
|
fileName: _jsxFileName,
|
|
75
|
-
lineNumber:
|
|
75
|
+
lineNumber: 60,
|
|
76
76
|
columnNumber: 9
|
|
77
77
|
}
|
|
78
78
|
}));
|
|
@@ -86,7 +86,7 @@ var renderItem = function renderItem(_ref) {
|
|
|
86
86
|
__self: _this,
|
|
87
87
|
__source: {
|
|
88
88
|
fileName: _jsxFileName,
|
|
89
|
-
lineNumber:
|
|
89
|
+
lineNumber: 73,
|
|
90
90
|
columnNumber: 7
|
|
91
91
|
}
|
|
92
92
|
});
|
|
@@ -95,12 +95,14 @@ var keyExtractor = function keyExtractor(item) {
|
|
|
95
95
|
return item.cid;
|
|
96
96
|
};
|
|
97
97
|
var ChannelListMessengerWithContext = function ChannelListMessengerWithContext(props) {
|
|
98
|
+
var onEndReachedCalledDuringCurrentScrollRef = (0, _react.useRef)(false);
|
|
98
99
|
var additionalFlatListProps = props.additionalFlatListProps,
|
|
99
100
|
channels = props.channels,
|
|
100
101
|
EmptyStateIndicator = props.EmptyStateIndicator,
|
|
101
102
|
error = props.error,
|
|
102
103
|
FooterLoadingIndicator = props.FooterLoadingIndicator,
|
|
103
104
|
forceUpdate = props.forceUpdate,
|
|
105
|
+
hasNextPage = props.hasNextPage,
|
|
104
106
|
ListHeaderComponent = props.ListHeaderComponent,
|
|
105
107
|
loadingChannels = props.loadingChannels,
|
|
106
108
|
LoadingErrorIndicator = props.LoadingErrorIndicator,
|
|
@@ -150,33 +152,24 @@ var ChannelListMessengerWithContext = function ChannelListMessengerWithContext(p
|
|
|
150
152
|
__self: _this,
|
|
151
153
|
__source: {
|
|
152
154
|
fileName: _jsxFileName,
|
|
153
|
-
lineNumber:
|
|
155
|
+
lineNumber: 145,
|
|
154
156
|
columnNumber: 7
|
|
155
157
|
}
|
|
156
158
|
});
|
|
157
159
|
}
|
|
158
160
|
var onEndReached = function onEndReached() {
|
|
159
|
-
if (
|
|
161
|
+
if (!onEndReachedCalledDuringCurrentScrollRef.current && hasNextPage) {
|
|
160
162
|
loadNextPage();
|
|
163
|
+
onEndReachedCalledDuringCurrentScrollRef.current = true;
|
|
161
164
|
}
|
|
162
165
|
};
|
|
163
|
-
var ListFooterComponent = function ListFooterComponent() {
|
|
164
|
-
return channels != null && channels.length && ListHeaderComponent ? _react["default"].createElement(ListHeaderComponent, {
|
|
165
|
-
__self: _this,
|
|
166
|
-
__source: {
|
|
167
|
-
fileName: _jsxFileName,
|
|
168
|
-
lineNumber: 160,
|
|
169
|
-
columnNumber: 47
|
|
170
|
-
}
|
|
171
|
-
}) : null;
|
|
172
|
-
};
|
|
173
166
|
if (loadingChannels) {
|
|
174
167
|
return _react["default"].createElement(LoadingIndicator, {
|
|
175
168
|
listType: "channel",
|
|
176
169
|
__self: _this,
|
|
177
170
|
__source: {
|
|
178
171
|
fileName: _jsxFileName,
|
|
179
|
-
lineNumber:
|
|
172
|
+
lineNumber: 162,
|
|
180
173
|
columnNumber: 12
|
|
181
174
|
}
|
|
182
175
|
});
|
|
@@ -184,7 +177,7 @@ var ChannelListMessengerWithContext = function ChannelListMessengerWithContext(p
|
|
|
184
177
|
return _react["default"].createElement(_react["default"].Fragment, {
|
|
185
178
|
__source: {
|
|
186
179
|
fileName: _jsxFileName,
|
|
187
|
-
lineNumber:
|
|
180
|
+
lineNumber: 166,
|
|
188
181
|
columnNumber: 5
|
|
189
182
|
}
|
|
190
183
|
}, _react["default"].createElement(_reactNative.FlatList, (0, _extends2["default"])({
|
|
@@ -199,7 +192,7 @@ var ChannelListMessengerWithContext = function ChannelListMessengerWithContext(p
|
|
|
199
192
|
__self: _this,
|
|
200
193
|
__source: {
|
|
201
194
|
fileName: _jsxFileName,
|
|
202
|
-
lineNumber:
|
|
195
|
+
lineNumber: 178,
|
|
203
196
|
columnNumber: 13
|
|
204
197
|
}
|
|
205
198
|
}) : _react["default"].createElement(EmptyStateIndicator, {
|
|
@@ -207,7 +200,7 @@ var ChannelListMessengerWithContext = function ChannelListMessengerWithContext(p
|
|
|
207
200
|
__self: _this,
|
|
208
201
|
__source: {
|
|
209
202
|
fileName: _jsxFileName,
|
|
210
|
-
lineNumber:
|
|
203
|
+
lineNumber: 180,
|
|
211
204
|
columnNumber: 13
|
|
212
205
|
}
|
|
213
206
|
}),
|
|
@@ -215,13 +208,16 @@ var ChannelListMessengerWithContext = function ChannelListMessengerWithContext(p
|
|
|
215
208
|
__self: _this,
|
|
216
209
|
__source: {
|
|
217
210
|
fileName: _jsxFileName,
|
|
218
|
-
lineNumber:
|
|
211
|
+
lineNumber: 183,
|
|
219
212
|
columnNumber: 48
|
|
220
213
|
}
|
|
221
214
|
}) : undefined,
|
|
222
|
-
ListHeaderComponent:
|
|
215
|
+
ListHeaderComponent: ListHeaderComponent,
|
|
223
216
|
onEndReached: onEndReached,
|
|
224
217
|
onEndReachedThreshold: loadMoreThreshold,
|
|
218
|
+
onMomentumScrollBegin: function onMomentumScrollBegin() {
|
|
219
|
+
return onEndReachedCalledDuringCurrentScrollRef.current = false;
|
|
220
|
+
},
|
|
225
221
|
ref: setFlatListRef,
|
|
226
222
|
refreshControl: _react["default"].createElement(_reactNative.RefreshControl, {
|
|
227
223
|
onRefresh: refreshList,
|
|
@@ -242,7 +238,7 @@ var ChannelListMessengerWithContext = function ChannelListMessengerWithContext(p
|
|
|
242
238
|
__self: _this,
|
|
243
239
|
__source: {
|
|
244
240
|
fileName: _jsxFileName,
|
|
245
|
-
lineNumber:
|
|
241
|
+
lineNumber: 167,
|
|
246
242
|
columnNumber: 7
|
|
247
243
|
}
|
|
248
244
|
})), _react["default"].createElement(StatusIndicator, {
|
|
@@ -262,6 +258,7 @@ var ChannelListMessenger = function ChannelListMessenger(props) {
|
|
|
262
258
|
error = _useChannelsContext2.error,
|
|
263
259
|
FooterLoadingIndicator = _useChannelsContext2.FooterLoadingIndicator,
|
|
264
260
|
forceUpdate = _useChannelsContext2.forceUpdate,
|
|
261
|
+
hasNextPage = _useChannelsContext2.hasNextPage,
|
|
265
262
|
ListHeaderComponent = _useChannelsContext2.ListHeaderComponent,
|
|
266
263
|
loadingChannels = _useChannelsContext2.loadingChannels,
|
|
267
264
|
LoadingErrorIndicator = _useChannelsContext2.LoadingErrorIndicator,
|
|
@@ -280,6 +277,7 @@ var ChannelListMessenger = function ChannelListMessenger(props) {
|
|
|
280
277
|
error: error,
|
|
281
278
|
FooterLoadingIndicator: FooterLoadingIndicator,
|
|
282
279
|
forceUpdate: forceUpdate,
|
|
280
|
+
hasNextPage: hasNextPage,
|
|
283
281
|
ListHeaderComponent: ListHeaderComponent,
|
|
284
282
|
loadingChannels: loadingChannels,
|
|
285
283
|
LoadingErrorIndicator: LoadingErrorIndicator,
|
|
@@ -295,7 +293,7 @@ var ChannelListMessenger = function ChannelListMessenger(props) {
|
|
|
295
293
|
__self: _this,
|
|
296
294
|
__source: {
|
|
297
295
|
fileName: _jsxFileName,
|
|
298
|
-
lineNumber:
|
|
296
|
+
lineNumber: 237,
|
|
299
297
|
columnNumber: 5
|
|
300
298
|
}
|
|
301
299
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["styles","StyleSheet","create","flatList","flex","flatListContentContainer","flexGrow","statusIndicator","left","position","right","top","StatusIndicator","useChatContext","isOnline","useChannelsContext","error","HeaderErrorIndicator","HeaderNetworkDownIndicator","loadingChannels","refreshList","renderItem","item","keyExtractor","cid","ChannelListMessengerWithContext","props","additionalFlatListProps","channels","EmptyStateIndicator","FooterLoadingIndicator","forceUpdate","ListHeaderComponent","LoadingErrorIndicator","LoadingIndicator","loadingNextPage","loadMoreThreshold","loadNextPage","refreshing","reloadList","setFlatListRef","useTheme","theme","channelListMessenger","flatListContent","white_snow","colors","useState","loading","setLoading","debugRef","useDebugContext","useEffect","isDebugModeEnabled","__DEV__","current","setEventType","setSendEventParams","action","data","map","channel","members","state","onEndReached","ListFooterComponent","length","backgroundColor","undefined","ChannelListMessenger","displayName"],"sources":["ChannelListMessenger.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\n// RNGR's FlatList ist currently breaking the pull-to-refresh behaviour on Android\n// See https://github.com/software-mansion/react-native-gesture-handler/issues/598\nimport { FlatList, RefreshControl, StyleSheet, View } from 'react-native';\n\nimport type { Channel } from 'stream-chat';\n\nimport {\n ChannelsContextValue,\n useChannelsContext,\n} from '../../contexts/channelsContext/ChannelsContext';\nimport { useChatContext } from '../../contexts/chatContext/ChatContext';\nimport { useDebugContext } from '../../contexts/debugContext/DebugContext';\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\n\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport { ChannelPreview } from '../ChannelPreview/ChannelPreview';\n\nconst styles = StyleSheet.create({\n flatList: { flex: 1 },\n flatListContentContainer: { flexGrow: 1 },\n statusIndicator: { left: 0, position: 'absolute', right: 0, top: 0 },\n});\n\nexport type ChannelListMessengerPropsWithContext<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Omit<\n ChannelsContextValue<StreamChatGenerics>,\n | 'hasNextPage'\n | 'HeaderErrorIndicator'\n | 'HeaderNetworkDownIndicator'\n | 'maxUnreadCount'\n | 'numberOfSkeletons'\n | 'onSelect'\n | 'Preview'\n | 'PreviewTitle'\n | 'PreviewStatus'\n | 'PreviewAvatar'\n | 'previewMessage'\n | 'Skeleton'\n>;\n\nconst StatusIndicator = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>() => {\n const { isOnline } = useChatContext<StreamChatGenerics>();\n const { error, HeaderErrorIndicator, HeaderNetworkDownIndicator, loadingChannels, refreshList } =\n useChannelsContext<StreamChatGenerics>();\n\n if (loadingChannels) return null;\n\n if (!isOnline) {\n return (\n <View style={styles.statusIndicator}>\n <HeaderNetworkDownIndicator />\n </View>\n );\n } else if (error) {\n return (\n <View style={styles.statusIndicator}>\n <HeaderErrorIndicator onPress={refreshList} />\n </View>\n );\n }\n return null;\n};\n\nconst renderItem = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n item,\n}: {\n item: Channel<StreamChatGenerics>;\n}) => <ChannelPreview<StreamChatGenerics> channel={item} />;\n\nconst keyExtractor = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n item: Channel<StreamChatGenerics>,\n) => item.cid;\n\nconst ChannelListMessengerWithContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelListMessengerPropsWithContext<StreamChatGenerics>,\n) => {\n const {\n additionalFlatListProps,\n channels,\n EmptyStateIndicator,\n error,\n FooterLoadingIndicator,\n forceUpdate,\n ListHeaderComponent,\n loadingChannels,\n LoadingErrorIndicator,\n LoadingIndicator,\n loadingNextPage,\n loadMoreThreshold,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setFlatListRef,\n } = props;\n\n const {\n theme: {\n channelListMessenger: { flatList, flatListContent },\n colors: { white_snow },\n },\n } = useTheme();\n\n /**\n * In order to prevent the EmptyStateIndicator component from showing up briefly on mount,\n * we set the loading state one cycle behind to ensure the channels are set before the\n * change to loadingChannels is registered.\n */\n const [loading, setLoading] = useState(true);\n const debugRef = useDebugContext();\n\n useEffect(() => {\n if (!!loadingChannels !== loading) {\n setLoading(!!loadingChannels);\n }\n }, [loading, loadingChannels]);\n\n const isDebugModeEnabled = __DEV__ && debugRef && debugRef.current;\n\n if (isDebugModeEnabled) {\n if (debugRef.current.setEventType) debugRef.current.setEventType('send');\n if (debugRef.current.setSendEventParams)\n debugRef.current.setSendEventParams({\n action: 'Channels',\n data: channels?.map((channel) => ({\n data: channel.data,\n members: channel.state.members,\n })),\n });\n }\n\n if (error && !refreshing && !loadingChannels && channels === null) {\n return (\n <LoadingErrorIndicator\n error={error}\n listType='channel'\n loadNextPage={loadNextPage}\n retry={reloadList}\n />\n );\n }\n\n const onEndReached = () => {\n if (loadNextPage) {\n loadNextPage();\n }\n };\n\n const ListFooterComponent = () =>\n channels?.length && ListHeaderComponent ? <ListHeaderComponent /> : null;\n\n if (loadingChannels) {\n return <LoadingIndicator listType='channel' />;\n }\n\n return (\n <>\n <FlatList\n contentContainerStyle={[\n styles.flatListContentContainer,\n { backgroundColor: white_snow },\n flatListContent,\n ]}\n data={channels}\n extraData={forceUpdate}\n keyExtractor={keyExtractor}\n ListEmptyComponent={\n loading ? (\n <LoadingIndicator listType='channel' />\n ) : (\n <EmptyStateIndicator listType='channel' />\n )\n }\n ListFooterComponent={loadingNextPage ? <FooterLoadingIndicator /> : undefined}\n ListHeaderComponent={ListFooterComponent}\n onEndReached={onEndReached}\n onEndReachedThreshold={loadMoreThreshold}\n ref={setFlatListRef}\n refreshControl={<RefreshControl onRefresh={refreshList} refreshing={refreshing} />}\n renderItem={renderItem}\n style={[styles.flatList, { backgroundColor: white_snow }, flatList]}\n testID='channel-list-messenger'\n {...additionalFlatListProps}\n />\n <StatusIndicator<StreamChatGenerics> />\n </>\n );\n};\n\nexport type ChannelListMessengerProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Partial<ChannelListMessengerPropsWithContext<StreamChatGenerics>>;\n\n/**\n * This UI component displays the preview list of channels and handles Channel navigation. It\n * receives all props from the ChannelList component.\n *\n * @example ./ChannelListMessenger.md\n */\nexport const ChannelListMessenger = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelListMessengerProps<StreamChatGenerics>,\n) => {\n const {\n additionalFlatListProps,\n channels,\n EmptyStateIndicator,\n error,\n FooterLoadingIndicator,\n forceUpdate,\n ListHeaderComponent,\n loadingChannels,\n LoadingErrorIndicator,\n LoadingIndicator,\n loadingNextPage,\n loadMoreThreshold,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setFlatListRef,\n } = useChannelsContext<StreamChatGenerics>();\n\n return (\n <ChannelListMessengerWithContext\n {...{\n additionalFlatListProps,\n channels,\n EmptyStateIndicator,\n error,\n FooterLoadingIndicator,\n forceUpdate,\n ListHeaderComponent,\n loadingChannels,\n LoadingErrorIndicator,\n LoadingIndicator,\n loadingNextPage,\n loadMoreThreshold,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setFlatListRef,\n }}\n {...props}\n />\n );\n};\n\nChannelListMessenger.displayName = 'ChannelListMessenger{channelListMessenger}';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["styles","StyleSheet","create","flatList","flex","flatListContentContainer","flexGrow","statusIndicator","left","position","right","top","StatusIndicator","useChatContext","isOnline","useChannelsContext","error","HeaderErrorIndicator","HeaderNetworkDownIndicator","loadingChannels","refreshList","renderItem","item","keyExtractor","cid","ChannelListMessengerWithContext","props","onEndReachedCalledDuringCurrentScrollRef","useRef","additionalFlatListProps","channels","EmptyStateIndicator","FooterLoadingIndicator","forceUpdate","hasNextPage","ListHeaderComponent","LoadingErrorIndicator","LoadingIndicator","loadingNextPage","loadMoreThreshold","loadNextPage","refreshing","reloadList","setFlatListRef","useTheme","theme","channelListMessenger","flatListContent","white_snow","colors","useState","loading","setLoading","debugRef","useDebugContext","useEffect","isDebugModeEnabled","__DEV__","current","setEventType","setSendEventParams","action","data","map","channel","members","state","onEndReached","backgroundColor","undefined","ChannelListMessenger","displayName"],"sources":["ChannelListMessenger.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n// RNGR's FlatList ist currently breaking the pull-to-refresh behaviour on Android\n// See https://github.com/software-mansion/react-native-gesture-handler/issues/598\nimport { FlatList, RefreshControl, StyleSheet, View } from 'react-native';\n\nimport type { Channel } from 'stream-chat';\n\nimport {\n ChannelsContextValue,\n useChannelsContext,\n} from '../../contexts/channelsContext/ChannelsContext';\nimport { useChatContext } from '../../contexts/chatContext/ChatContext';\nimport { useDebugContext } from '../../contexts/debugContext/DebugContext';\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\n\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport { ChannelPreview } from '../ChannelPreview/ChannelPreview';\n\nconst styles = StyleSheet.create({\n flatList: { flex: 1 },\n flatListContentContainer: { flexGrow: 1 },\n statusIndicator: { left: 0, position: 'absolute', right: 0, top: 0 },\n});\n\nexport type ChannelListMessengerPropsWithContext<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Omit<\n ChannelsContextValue<StreamChatGenerics>,\n | 'HeaderErrorIndicator'\n | 'HeaderNetworkDownIndicator'\n | 'maxUnreadCount'\n | 'numberOfSkeletons'\n | 'onSelect'\n | 'Preview'\n | 'PreviewTitle'\n | 'PreviewStatus'\n | 'PreviewAvatar'\n | 'previewMessage'\n | 'Skeleton'\n>;\n\nconst StatusIndicator = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>() => {\n const { isOnline } = useChatContext<StreamChatGenerics>();\n const { error, HeaderErrorIndicator, HeaderNetworkDownIndicator, loadingChannels, refreshList } =\n useChannelsContext<StreamChatGenerics>();\n\n if (loadingChannels) return null;\n\n if (!isOnline) {\n return (\n <View style={styles.statusIndicator}>\n <HeaderNetworkDownIndicator />\n </View>\n );\n } else if (error) {\n return (\n <View style={styles.statusIndicator}>\n <HeaderErrorIndicator onPress={refreshList} />\n </View>\n );\n }\n return null;\n};\n\nconst renderItem = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n item,\n}: {\n item: Channel<StreamChatGenerics>;\n}) => <ChannelPreview<StreamChatGenerics> channel={item} />;\n\nconst keyExtractor = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n item: Channel<StreamChatGenerics>,\n) => item.cid;\n\nconst ChannelListMessengerWithContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelListMessengerPropsWithContext<StreamChatGenerics>,\n) => {\n const onEndReachedCalledDuringCurrentScrollRef = useRef<boolean>(false);\n const {\n additionalFlatListProps,\n channels,\n EmptyStateIndicator,\n error,\n FooterLoadingIndicator,\n forceUpdate,\n hasNextPage,\n ListHeaderComponent,\n loadingChannels,\n LoadingErrorIndicator,\n LoadingIndicator,\n loadingNextPage,\n loadMoreThreshold,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setFlatListRef,\n } = props;\n\n const {\n theme: {\n channelListMessenger: { flatList, flatListContent },\n colors: { white_snow },\n },\n } = useTheme();\n\n /**\n * In order to prevent the EmptyStateIndicator component from showing up briefly on mount,\n * we set the loading state one cycle behind to ensure the channels are set before the\n * change to loadingChannels is registered.\n */\n const [loading, setLoading] = useState(true);\n const debugRef = useDebugContext();\n\n useEffect(() => {\n if (!!loadingChannels !== loading) {\n setLoading(!!loadingChannels);\n }\n }, [loading, loadingChannels]);\n\n const isDebugModeEnabled = __DEV__ && debugRef && debugRef.current;\n\n if (isDebugModeEnabled) {\n if (debugRef.current.setEventType) debugRef.current.setEventType('send');\n if (debugRef.current.setSendEventParams)\n debugRef.current.setSendEventParams({\n action: 'Channels',\n data: channels?.map((channel) => ({\n data: channel.data,\n members: channel.state.members,\n })),\n });\n }\n\n if (error && !refreshing && !loadingChannels && channels === null) {\n return (\n <LoadingErrorIndicator\n error={error}\n listType='channel'\n loadNextPage={loadNextPage}\n retry={reloadList}\n />\n );\n }\n\n const onEndReached = () => {\n if (!onEndReachedCalledDuringCurrentScrollRef.current && hasNextPage) {\n loadNextPage();\n onEndReachedCalledDuringCurrentScrollRef.current = true;\n }\n };\n\n if (loadingChannels) {\n return <LoadingIndicator listType='channel' />;\n }\n\n return (\n <>\n <FlatList\n contentContainerStyle={[\n styles.flatListContentContainer,\n { backgroundColor: white_snow },\n flatListContent,\n ]}\n data={channels}\n extraData={forceUpdate}\n keyExtractor={keyExtractor}\n ListEmptyComponent={\n loading ? (\n <LoadingIndicator listType='channel' />\n ) : (\n <EmptyStateIndicator listType='channel' />\n )\n }\n ListFooterComponent={loadingNextPage ? <FooterLoadingIndicator /> : undefined}\n ListHeaderComponent={ListHeaderComponent}\n onEndReached={onEndReached}\n onEndReachedThreshold={loadMoreThreshold}\n onMomentumScrollBegin={() => (onEndReachedCalledDuringCurrentScrollRef.current = false)}\n ref={setFlatListRef}\n refreshControl={<RefreshControl onRefresh={refreshList} refreshing={refreshing} />}\n renderItem={renderItem}\n style={[styles.flatList, { backgroundColor: white_snow }, flatList]}\n testID='channel-list-messenger'\n {...additionalFlatListProps}\n />\n <StatusIndicator<StreamChatGenerics> />\n </>\n );\n};\n\nexport type ChannelListMessengerProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Partial<ChannelListMessengerPropsWithContext<StreamChatGenerics>>;\n\n/**\n * This UI component displays the preview list of channels and handles Channel navigation. It\n * receives all props from the ChannelList component.\n *\n * @example ./ChannelListMessenger.md\n */\nexport const ChannelListMessenger = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelListMessengerProps<StreamChatGenerics>,\n) => {\n const {\n additionalFlatListProps,\n channels,\n EmptyStateIndicator,\n error,\n FooterLoadingIndicator,\n forceUpdate,\n hasNextPage,\n ListHeaderComponent,\n loadingChannels,\n LoadingErrorIndicator,\n LoadingIndicator,\n loadingNextPage,\n loadMoreThreshold,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setFlatListRef,\n } = useChannelsContext<StreamChatGenerics>();\n\n return (\n <ChannelListMessengerWithContext\n {...{\n additionalFlatListProps,\n channels,\n EmptyStateIndicator,\n error,\n FooterLoadingIndicator,\n forceUpdate,\n hasNextPage,\n ListHeaderComponent,\n loadingChannels,\n LoadingErrorIndicator,\n LoadingIndicator,\n loadingNextPage,\n loadMoreThreshold,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setFlatListRef,\n }}\n {...props}\n />\n );\n};\n\nChannelListMessenger.displayName = 'ChannelListMessenger{channelListMessenger}';\n"],"mappings":"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"}
|