diff --git a/apps/meteor/client/components/ResultsLiveRegion.tsx b/apps/meteor/client/components/ResultsLiveRegion.tsx
new file mode 100644
index 0000000000000..2697575b76494
--- /dev/null
+++ b/apps/meteor/client/components/ResultsLiveRegion.tsx
@@ -0,0 +1,14 @@
+import { VisuallyHidden } from 'react-aria';
+import { useTranslation } from 'react-i18next';
+
+const ResultsLiveRegion = ({ shouldAnnounce, itemCount }: { shouldAnnounce: boolean; itemCount: number }) => {
+ const { t } = useTranslation();
+
+ if (itemCount === 0) {
+ return {shouldAnnounce && t('No_results_found')};
+ }
+
+ return {shouldAnnounce && t('__count__result_found', { count: itemCount })};
+};
+
+export default ResultsLiveRegion;
diff --git a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.spec.tsx b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.spec.tsx
new file mode 100644
index 0000000000000..95f4b9bb6db3d
--- /dev/null
+++ b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.spec.tsx
@@ -0,0 +1,24 @@
+import { composeStories } from '@storybook/react';
+import { render } from '@testing-library/react';
+import { axe } from 'jest-axe';
+
+import * as stories from './DiscussionsList.stories';
+
+jest.mock('../../../../lib/rooms/roomCoordinator', () => ({
+ roomCoordinator: {
+ getRoomDirectives: jest.fn(() => ({})),
+ },
+}));
+
+const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]);
+test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => {
+ const { baseElement } = render();
+ expect(baseElement).toMatchSnapshot();
+});
+
+test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => {
+ const { container } = render();
+
+ const results = await axe(container);
+ expect(results).toHaveNoViolations();
+});
diff --git a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.stories.tsx b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.stories.tsx
new file mode 100644
index 0000000000000..df2d0be0d1e01
--- /dev/null
+++ b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.stories.tsx
@@ -0,0 +1,55 @@
+import { Contextualbar } from '@rocket.chat/ui-client';
+import { action } from '@storybook/addon-actions';
+import type { Meta, StoryFn } from '@storybook/react';
+
+import DiscussionsList from './DiscussionsList';
+
+export default {
+ component: DiscussionsList,
+ parameters: {
+ layout: 'fullscreen',
+ actions: { argTypesRegex: '^on.*' },
+ },
+ decorators: [(fn) => {fn()}],
+ args: {
+ text: '',
+ loadMoreItems: action('loadMoreItems'),
+ },
+} satisfies Meta;
+
+const Template: StoryFn = (args) => ;
+
+const fakeDiscussions = Array.from({ length: 10 }, (_, i) => ({
+ _id: String(i),
+ msg: `Discussion ${i}`,
+ ts: new Date('2024-01-01T00:00:00Z'),
+ username: 'user.name',
+ dcount: 5,
+ dlm: new Date('2024-01-01T00:00:00Z'),
+ drid: `drid-${i}`,
+ rid: 'roomId',
+ _updatedAt: new Date('2024-01-01T00:00:00Z'),
+ u: {
+ _id: 'user-id',
+ username: 'user.name',
+ },
+}));
+
+export const Default = Template.bind({});
+Default.args = {
+ isSuccess: true,
+ discussions: fakeDiscussions,
+ itemCount: fakeDiscussions.length,
+};
+
+export const Loading = Template.bind({});
+Loading.args = {
+ isPending: true,
+};
+
+export const Empty = Template.bind({});
+Empty.args = {
+ isSuccess: true,
+ discussions: [],
+ itemCount: 0,
+};
diff --git a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx
index 0626a532d87c1..a34b4d015d3b9 100644
--- a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx
+++ b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx
@@ -14,18 +14,20 @@ import {
} from '@rocket.chat/ui-client';
import { useSetting } from '@rocket.chat/ui-contexts';
import type { ChangeEvent, MouseEvent, RefObject } from 'react';
-import { useCallback } from 'react';
+import { useCallback, useId } from 'react';
import { useTranslation } from 'react-i18next';
import { Virtuoso } from 'react-virtuoso';
import DiscussionsListRow from './DiscussionsListRow';
+import ResultsLiveRegion from '../../../../components/ResultsLiveRegion';
import { useGoToRoom } from '../../hooks/useGoToRoom';
type DiscussionsListProps = {
- total: number;
+ itemCount: number;
discussions: Array;
loadMoreItems: (start: number, end: number) => void;
- loading: boolean;
+ isPending: boolean;
+ isSuccess: boolean;
onClose: () => void;
error: unknown;
text: string;
@@ -33,16 +35,19 @@ type DiscussionsListProps = {
};
function DiscussionsList({
- total = 10,
+ itemCount,
discussions = [],
loadMoreItems,
- loading,
+ isPending,
+ isSuccess,
onClose,
error,
text,
onChangeFilter,
}: DiscussionsListProps) {
const { t } = useTranslation();
+ const discussionListId = useId();
+
const showRealNames = useSetting('UI_Use_Real_Name', false);
const inputRef = useAutoFocus(true);
@@ -70,6 +75,8 @@ function DiscussionsList({
}
@@ -77,37 +84,37 @@ function DiscussionsList({
/>
- {loading && (
+
+ {isPending && (
)}
-
{error instanceof Error && (
{error.toString()}
)}
-
- {!loading && total === 0 && }
-
-
- {!error && total > 0 && discussions.length > 0 && (
-
- undefined : (start) => loadMoreItems(start, Math.min(50, total - start))}
- overscan={25}
- data={discussions}
- itemContent={(_, data) => }
- />
-
- )}
-
+ {isSuccess && (
+
+ {discussions.length === 0 && }
+ {discussions.length > 0 && (
+
+ undefined : (start) => loadMoreItems(start, Math.min(50, itemCount - start))}
+ overscan={25}
+ data={discussions}
+ itemContent={(_, data) => }
+ />
+
+ )}
+
+ )}
);
diff --git a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsListContextBar.tsx b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsListContextBar.tsx
index 76682bbe6b131..23ae4d6081573 100644
--- a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsListContextBar.tsx
+++ b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsListContextBar.tsx
@@ -23,10 +23,10 @@ const DiscussionListContextBar = () => {
[room._id, debouncedText],
);
- const { isPending, error, data, fetchNextPage } = useDiscussionsList(options);
+ const { isPending, isSuccess, error, data, fetchNextPage } = useDiscussionsList(options);
const discussions = data?.items || [];
- const totalItemCount = data?.itemCount ?? 0;
+ const itemCount = data?.itemCount ?? 0;
const handleTextChange = useCallback((e: ChangeEvent) => {
setText(e.currentTarget.value);
@@ -41,8 +41,9 @@ const DiscussionListContextBar = () => {
onClose={closeTab}
error={error}
discussions={discussions}
- total={totalItemCount}
- loading={isPending}
+ itemCount={itemCount}
+ isPending={isPending}
+ isSuccess={isSuccess}
loadMoreItems={() => fetchNextPage()}
text={text}
onChangeFilter={handleTextChange}
diff --git a/apps/meteor/client/views/room/contextualBar/Discussions/__snapshots__/DiscussionsList.spec.tsx.snap b/apps/meteor/client/views/room/contextualBar/Discussions/__snapshots__/DiscussionsList.spec.tsx.snap
new file mode 100644
index 0000000000000..a8381c4465d03
--- /dev/null
+++ b/apps/meteor/client/views/room/contextualBar/Discussions/__snapshots__/DiscussionsList.spec.tsx.snap
@@ -0,0 +1,478 @@
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
+
+exports[`renders Default without crashing 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+ Discussions
+
+
+
+
+
+
+
+
+
+ __count__result_found
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`renders Empty without crashing 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+ Discussions
+
+
+
+
+
+
+
+
+
+ No_results_found
+
+
+
+
+
+
+
+
+ No_Discussions_found
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`renders Loading without crashing 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+ Discussions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/apps/meteor/client/views/room/contextualBar/MessageSearchTab/MessageSearchTab.tsx b/apps/meteor/client/views/room/contextualBar/MessageSearchTab/MessageSearchTab.tsx
index 3f2978113f889..c804515c61ac7 100644
--- a/apps/meteor/client/views/room/contextualBar/MessageSearchTab/MessageSearchTab.tsx
+++ b/apps/meteor/client/views/room/contextualBar/MessageSearchTab/MessageSearchTab.tsx
@@ -1,4 +1,5 @@
-import { Callout } from '@rocket.chat/fuselage';
+import { Callout, Box, MessageDivider, Throbber } from '@rocket.chat/fuselage';
+import { MessageTypes } from '@rocket.chat/message-types';
import {
ContextualbarClose,
ContextualbarContent,
@@ -7,23 +8,43 @@ import {
ContextualbarIcon,
ContextualbarSection,
ContextualbarDialog,
+ VirtualizedScrollbars,
+ ContextualbarEmptyContent,
} from '@rocket.chat/ui-client';
-import { useRoomToolbox } from '@rocket.chat/ui-contexts';
-import { useState } from 'react';
+import { useRoomToolbox, useUserPreference, useSetting } from '@rocket.chat/ui-contexts';
+import { useState, memo, Fragment, useId } from 'react';
import { useTranslation } from 'react-i18next';
+import { Virtuoso } from 'react-virtuoso';
-import MessageSearch from './components/MessageSearch';
import MessageSearchForm from './components/MessageSearchForm';
import { useMessageSearchProviderQuery } from './hooks/useMessageSearchProviderQuery';
+import { useMessageSearchQuery } from './hooks/useMessageSearchQuery';
+import ResultsLiveRegion from '../../../../components/ResultsLiveRegion';
+import RoomMessage from '../../../../components/message/variants/RoomMessage';
+import SystemMessage from '../../../../components/message/variants/SystemMessage';
+import { useFormatDate } from '../../../../hooks/useFormatDate';
+import MessageListErrorBoundary from '../../MessageList/MessageListErrorBoundary';
+import { isMessageNewDay } from '../../MessageList/lib/isMessageNewDay';
+import MessageListProvider from '../../MessageList/providers/MessageListProvider';
+import { useRoomSubscription } from '../../contexts/RoomContext';
+// TODO: Refactor this component to isolate the data from the visual
const MessageSearchTab = () => {
- const providerQuery = useMessageSearchProviderQuery();
-
+ const { t } = useTranslation();
+ const searchListId = useId();
+ const formatDate = useFormatDate();
const { closeTab } = useRoomToolbox();
+ const pageSize = useSetting('PageSize', 10);
- const [{ searchText, globalSearch }, handleSearch] = useState({ searchText: '', globalSearch: false });
+ const [limit, setLimit] = useState(pageSize);
+ const subscription = useRoomSubscription();
+ const showUserAvatar = !!useUserPreference('displayAvatars');
- const { t } = useTranslation();
+ const providerQuery = useMessageSearchProviderQuery();
+
+ const [{ searchText, globalSearch }, handleSearch] = useState({ searchText: '', globalSearch: false });
+ const { isSuccess, data: messageSearchData, isPending } = useMessageSearchQuery({ searchText, limit, globalSearch });
+ const itemCount = messageSearchData?.length ?? 0;
return (
@@ -34,11 +55,71 @@ const MessageSearchTab = () => {
{providerQuery.data && (
-
+
)}
- {providerQuery.isSuccess && }
+
+ {providerQuery.isSuccess && (
+ <>
+ {searchText && isPending && }
+ {isSuccess && (
+
+ {messageSearchData.length === 0 && }
+ {messageSearchData.length > 0 && (
+
+
+
+
+ {
+ const previous = messageSearchData[index - 1];
+
+ const newDay = isMessageNewDay(message, previous);
+
+ const system = MessageTypes.isSystemMessage(message);
+
+ const unread = subscription?.tunread?.includes(message._id) ?? false;
+ const mention = subscription?.tunreadUser?.includes(message._id) ?? false;
+ const all = subscription?.tunreadGroup?.includes(message._id) ?? false;
+
+ return (
+
+ {newDay && {formatDate(message.ts)}}
+
+ {system ? (
+
+ ) : (
+
+ )}
+
+ );
+ }}
+ endReached={() => {
+ setLimit((limit) => limit + pageSize);
+ }}
+ />
+
+
+
+
+ )}
+
+ )}
+ >
+ )}
{providerQuery.isError && (
{t('Search_current_provider_not_active')}
@@ -49,4 +130,4 @@ const MessageSearchTab = () => {
);
};
-export default MessageSearchTab;
+export default memo(MessageSearchTab);
diff --git a/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearch.tsx b/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearch.tsx
deleted file mode 100644
index d1c9d787560c1..0000000000000
--- a/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearch.tsx
+++ /dev/null
@@ -1,96 +0,0 @@
-import { Box, MessageDivider } from '@rocket.chat/fuselage';
-import { MessageTypes } from '@rocket.chat/message-types';
-import { VirtualizedScrollbars, ContextualbarEmptyContent } from '@rocket.chat/ui-client';
-import { useSetting, useTranslation, useUserPreference } from '@rocket.chat/ui-contexts';
-import type { ReactElement } from 'react';
-import { Fragment, memo, useState } from 'react';
-import { Virtuoso } from 'react-virtuoso';
-
-import RoomMessage from '../../../../../components/message/variants/RoomMessage';
-import SystemMessage from '../../../../../components/message/variants/SystemMessage';
-import { useFormatDate } from '../../../../../hooks/useFormatDate';
-import MessageListErrorBoundary from '../../../MessageList/MessageListErrorBoundary';
-import { isMessageNewDay } from '../../../MessageList/lib/isMessageNewDay';
-import MessageListProvider from '../../../MessageList/providers/MessageListProvider';
-import LoadingMessagesIndicator from '../../../body/LoadingMessagesIndicator';
-import { useRoomSubscription } from '../../../contexts/RoomContext';
-import { useMessageSearchQuery } from '../hooks/useMessageSearchQuery';
-
-type MessageSearchProps = {
- searchText: string;
- globalSearch: boolean;
-};
-
-const MessageSearch = ({ searchText, globalSearch }: MessageSearchProps): ReactElement => {
- const t = useTranslation();
- const formatDate = useFormatDate();
- const pageSize = useSetting('PageSize', 10);
- const [limit, setLimit] = useState(pageSize);
- const showUserAvatar = !!useUserPreference('displayAvatars');
-
- const subscription = useRoomSubscription();
- const messageSearchQuery = useMessageSearchQuery({ searchText, limit, globalSearch });
-
- return (
-
- {messageSearchQuery.data && (
- <>
- {messageSearchQuery.data.length === 0 && }
- {messageSearchQuery.data.length > 0 && (
-
-
-
-
- {
- const previous = messageSearchQuery.data[index - 1];
-
- const newDay = isMessageNewDay(message, previous);
-
- const system = MessageTypes.isSystemMessage(message);
-
- const unread = subscription?.tunread?.includes(message._id) ?? false;
- const mention = subscription?.tunreadUser?.includes(message._id) ?? false;
- const all = subscription?.tunreadGroup?.includes(message._id) ?? false;
-
- return (
-
- {newDay && {formatDate(message.ts)}}
-
- {system ? (
-
- ) : (
-
- )}
-
- );
- }}
- endReached={() => {
- setLimit((limit) => limit + pageSize);
- }}
- />
-
-
-
-
- )}
- >
- )}
- {searchText && messageSearchQuery.isLoading && }
-
- );
-};
-
-export default memo(MessageSearch);
diff --git a/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearchForm.tsx b/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearchForm.tsx
index f807ec4411a5c..c7bf80efcd7a8 100644
--- a/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearchForm.tsx
+++ b/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearchForm.tsx
@@ -13,9 +13,11 @@ import { useRoom } from '../../../contexts/RoomContext';
type MessageSearchFormProps = {
provider: IMessageSearchProvider;
onSearch: (params: { searchText: string; globalSearch: boolean }) => void;
+ searchListId: string;
+ isSuccess: boolean;
};
-const MessageSearchForm = ({ provider, onSearch }: MessageSearchFormProps) => {
+const MessageSearchForm = ({ provider, onSearch, searchListId, isSuccess }: MessageSearchFormProps) => {
const { handleSubmit, register, setFocus, control } = useForm({
defaultValues: {
searchText: '',
@@ -55,6 +57,7 @@ const MessageSearchForm = ({ provider, onSearch }: MessageSearchFormProps) => {
addon={}
placeholder={t('Search_Messages')}
aria-label={t('Search_Messages')}
+ aria-controls={isSuccess ? searchListId : undefined}
autoComplete='off'
{...register('searchText')}
/>
diff --git a/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.spec.tsx b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.spec.tsx
new file mode 100644
index 0000000000000..969d54ca792f9
--- /dev/null
+++ b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.spec.tsx
@@ -0,0 +1,23 @@
+import { composeStories } from '@storybook/react';
+import { render } from '@testing-library/react';
+import { axe } from 'jest-axe';
+
+import * as stories from './RoomFiles.stories';
+
+jest.mock('../../../../../app/utils/client', () => ({
+ getURL: jest.fn((url: string) => url),
+}));
+
+const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]);
+test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => {
+ const { baseElement } = render();
+ expect(baseElement).toMatchSnapshot();
+});
+
+test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => {
+ const { container } = render();
+
+ // Disable 'nested-interactive' rule because our `Select` component is still not a11y compliant
+ const results = await axe(container, { rules: { 'nested-interactive': { enabled: false } } });
+ expect(results).toHaveNoViolations();
+});
diff --git a/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.stories.tsx b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.stories.tsx
index bae5571abf330..ea11df526c995 100644
--- a/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.stories.tsx
+++ b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.stories.tsx
@@ -11,50 +11,43 @@ export default {
actions: { argTypesRegex: '^on.*' },
},
decorators: [(fn) => {fn()}],
+ args: {
+ type: 'all',
+ text: '',
+ loadMoreItems: action('loadMoreItems'),
+ setText: action('setText'),
+ setType: action('setType'),
+ },
} satisfies Meta;
const Template: StoryFn = (args) => ;
+const fakeItems = Array.from({ length: 10 }, (_, i) => ({
+ _id: String(i),
+ name: `File ${i}`,
+ url: '#',
+ uploadedAt: new Date(),
+ user: {
+ _id: 'rocket.cat',
+ username: 'rocket.cat',
+ },
+}));
+
export const Default = Template.bind({});
Default.args = {
- filesItems: [
- {
- _id: '1',
- name: 'Lorem Ipsum Indolor Dolor',
- url: '#',
- uploadedAt: new Date(),
- user: {
- _id: 'rocket.cat',
- username: 'rocket.cat',
- },
- },
- {
- _id: '2',
- name: 'Lorem Ipsum Indolor Dolor',
- url: '#',
- uploadedAt: new Date(),
- user: {
- _id: 'rocket.cat',
- username: 'rocket.cat',
- },
- },
- ],
- text: 'Ipsum',
- type: 'text',
- setText: action('setText'),
- setType: action('setType'),
- total: 2,
- loadMoreItems: action('loadMoreItems'),
+ filesItems: fakeItems,
+ total: fakeItems.length,
+ isSuccess: true,
};
export const Loading = Template.bind({});
Loading.args = {
- loading: true,
+ isPending: true,
};
export const Empty = Template.bind({});
Empty.args = {
- setText: action('setText'),
- setType: action('setType'),
- loadMoreItems: action('loadMoreItems'),
+ isSuccess: true,
+ filesItems: [],
+ total: 0,
};
diff --git a/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.tsx b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.tsx
index 77d60c0b0a2e4..a3f65f86432a2 100644
--- a/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.tsx
+++ b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.tsx
@@ -1,4 +1,4 @@
-import type { IUpload, IUploadWithUser } from '@rocket.chat/core-typings';
+import type { IRoom, IUpload, IUploadWithUser } from '@rocket.chat/core-typings';
import type { SelectOption } from '@rocket.chat/fuselage';
import { Box, Icon, TextInput, Select, Throbber, ContextualbarSection } from '@rocket.chat/fuselage';
import {
@@ -12,16 +12,19 @@ import {
ContextualbarDialog,
} from '@rocket.chat/ui-client';
import type { ChangeEvent } from 'react';
-import { useMemo } from 'react';
+import { useId, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { Virtuoso } from 'react-virtuoso';
import RoomFileItemWrapper from './RoomFileItemWrapper';
import RoomFilesListWrapper from './RoomFilesListWrapper';
import FileItem from './components/FileItem';
+import ResultsLiveRegion from '../../../../components/ResultsLiveRegion';
type RoomFilesProps = {
- loading: boolean;
+ rid: IRoom['_id'];
+ isPending: boolean;
+ isSuccess: boolean;
type: string;
text: string;
filesItems: IUploadWithUser[];
@@ -34,7 +37,9 @@ type RoomFilesProps = {
};
const RoomFiles = ({
- loading,
+ rid,
+ isPending,
+ isSuccess,
type,
text,
filesItems = [],
@@ -46,6 +51,7 @@ const RoomFiles = ({
onClickDelete,
}: RoomFilesProps) => {
const { t } = useTranslation();
+ const filesListId = useId();
const options: SelectOption[] = useMemo(
() => [
@@ -70,40 +76,45 @@ const RoomFiles = ({
}
/>
-
+
- {loading && (
+
+ {isPending && (
)}
- {!loading && filesItems.length === 0 && }
- {!loading && filesItems.length > 0 && (
-
-
- }
- components={{
- List: RoomFilesListWrapper,
- Item: RoomFileItemWrapper,
- }}
- />
-
+ {isSuccess && (
+
+ {filesItems.length === 0 && }
+ {filesItems.length > 0 && (
+
+ }
+ components={{
+ List: RoomFilesListWrapper,
+ Item: RoomFileItemWrapper,
+ }}
+ />
+
+ )}
)}
diff --git a/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFilesWithData.tsx b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFilesWithData.tsx
index 93888db5e5c5c..cd7df321c7a1b 100644
--- a/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFilesWithData.tsx
+++ b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFilesWithData.tsx
@@ -16,7 +16,7 @@ const RoomFilesWithData = () => {
const debouncedText = useDebouncedValue(text, 400);
- const { isPending, data, fetchNextPage, refetch } = useFilesList({
+ const { isPending, isSuccess, data, fetchNextPage, refetch } = useFilesList({
rid: room._id,
type,
text: debouncedText,
@@ -30,7 +30,9 @@ const RoomFilesWithData = () => {
return (
+
+
+
+
+
+
+
+
+
+
+
+ Files
+
+
+
+
+
+
+
+
+
+
+
+ __count__result_found
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Files
+
+
+
+
+
+
+
+
+
+
+
+ No_results_found
+
+
+
+
+
+
+
+
+ No_files_found
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Files
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+