From b982d4a6dc16b1a0b4a2fcd7a6661ef1da2a5d4d Mon Sep 17 00:00:00 2001 From: Avanish Gupta Date: Sun, 15 Mar 2026 10:53:54 +0530 Subject: [PATCH 1/2] fix: add missing error state to ModerationConsoleTable and CustomUserStatusTable Resolves #39521. Both tables silently showed an empty state when the API request failed. Added error state with warning icon, error message, and reload button following the pattern established in CustomSoundsTable. For CustomUserStatusTable, the error state is gated on !data to preserve previously loaded table data on refetch failures. Made-with: Cursor --- .changeset/fix-missing-error-state-tables.md | 5 +++++ .../CustomUserStatusTable.tsx | 17 ++++++++++++++--- .../admin/moderation/ModerationConsoleTable.tsx | 14 +++++++++++--- 3 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 .changeset/fix-missing-error-state-tables.md diff --git a/.changeset/fix-missing-error-state-tables.md b/.changeset/fix-missing-error-state-tables.md new file mode 100644 index 0000000000000..fba9b1adbe0bd --- /dev/null +++ b/.changeset/fix-missing-error-state-tables.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: add missing error state to ModerationConsoleTable and CustomUserStatusTable diff --git a/apps/meteor/client/views/admin/customUserStatus/CustomUserStatusTable/CustomUserStatusTable.tsx b/apps/meteor/client/views/admin/customUserStatus/CustomUserStatusTable/CustomUserStatusTable.tsx index d3791a6627cf2..f479db67e85e2 100644 --- a/apps/meteor/client/views/admin/customUserStatus/CustomUserStatusTable/CustomUserStatusTable.tsx +++ b/apps/meteor/client/views/admin/customUserStatus/CustomUserStatusTable/CustomUserStatusTable.tsx @@ -1,4 +1,4 @@ -import { Pagination } from '@rocket.chat/fuselage'; +import { Pagination, States, StatesIcon, StatesActions, StatesAction, StatesTitle } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import { @@ -25,7 +25,6 @@ type CustomUserStatusProps = { onClick: (id: string) => void; }; -// TODO: Missing error state const CustomUserStatus = ({ reload, onClick }: CustomUserStatusProps): ReactElement | null => { const { t } = useTranslation(); const [text, setText] = useState(''); @@ -47,7 +46,7 @@ const CustomUserStatus = ({ reload, onClick }: CustomUserStatusProps): ReactElem const getCustomUserStatus = useEndpoint('GET', '/v1/custom-user-status.list'); - const { data, isLoading, refetch, isFetched } = useQuery({ + const { data, isLoading, refetch, isFetched, isError } = useQuery({ queryKey: ['custom-user-statuses', query], queryFn: async () => { @@ -63,6 +62,18 @@ const CustomUserStatus = ({ reload, onClick }: CustomUserStatusProps): ReactElem reload.current = refetch; }, [reload, refetch]); + if (isError && !data) { + return ( + + + {t('Something_went_wrong')} + + refetch()}>{t('Reload_page')} + + + ); + } + if (!data) { return null; } diff --git a/apps/meteor/client/views/admin/moderation/ModerationConsoleTable.tsx b/apps/meteor/client/views/admin/moderation/ModerationConsoleTable.tsx index 51f646d7ab0af..f9d483d2ff3e2 100644 --- a/apps/meteor/client/views/admin/moderation/ModerationConsoleTable.tsx +++ b/apps/meteor/client/views/admin/moderation/ModerationConsoleTable.tsx @@ -1,5 +1,5 @@ import type { IUser } from '@rocket.chat/core-typings'; -import { Pagination } from '@rocket.chat/fuselage'; +import { Pagination, States, StatesIcon, StatesActions, StatesAction, StatesTitle } from '@rocket.chat/fuselage'; import { useDebouncedValue, useMediaQuery, useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { GenericTable, @@ -19,7 +19,6 @@ import ModerationConsoleTableRow from './ModerationConsoleTableRow'; import ModerationFilter from './helpers/ModerationFilter'; import GenericNoResults from '../../../components/GenericNoResults'; -// TODO: Missing error state const ModerationConsoleTable = () => { const [text, setText] = useState(''); const router = useRouter(); @@ -54,7 +53,7 @@ const ModerationConsoleTable = () => { const getReports = useEndpoint('GET', '/v1/moderation.reportsByUsers'); - const { data, isLoading, isSuccess } = useQuery({ + const { data, isLoading, isSuccess, isError, refetch } = useQuery({ queryKey: ['moderation', 'msgReports', 'fetchAll', query], queryFn: async () => getReports(query), meta: { @@ -135,6 +134,15 @@ const ModerationConsoleTable = () => { )} {isSuccess && data.reports.length === 0 && } + {isError && ( + + + {t('Something_went_wrong')} + + refetch()}>{t('Reload_page')} + + + )} ); }; From c62fe28486c32aa162498c92113e81eaf772b411 Mon Sep 17 00:00:00 2001 From: Avanish Gupta Date: Sun, 15 Mar 2026 14:02:02 +0530 Subject: [PATCH 2/2] fix: gate error state to initial-load/no-data in ModerationConsoleTable When using keepPreviousData, a refetch failure would previously hide the cached table data behind the error UI. Now the error state only renders when no data is available, preserving the user experience on transient refetch failures. Made-with: Cursor --- .../client/views/admin/moderation/ModerationConsoleTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/meteor/client/views/admin/moderation/ModerationConsoleTable.tsx b/apps/meteor/client/views/admin/moderation/ModerationConsoleTable.tsx index f9d483d2ff3e2..d45dc1c75a199 100644 --- a/apps/meteor/client/views/admin/moderation/ModerationConsoleTable.tsx +++ b/apps/meteor/client/views/admin/moderation/ModerationConsoleTable.tsx @@ -134,7 +134,7 @@ const ModerationConsoleTable = () => { )} {isSuccess && data.reports.length === 0 && } - {isError && ( + {isError && !data && ( {t('Something_went_wrong')}