From 0daa3df4d31702a44105233ab57bd34cbb766f8d Mon Sep 17 00:00:00 2001 From: daledah Date: Wed, 4 Jun 2025 12:22:58 +0700 Subject: [PATCH 1/4] feat: add search bar to Workspace list page --- src/pages/workspace/WorkspacesListPage.tsx | 94 +++++++++++++--------- 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/src/pages/workspace/WorkspacesListPage.tsx b/src/pages/workspace/WorkspacesListPage.tsx index e09a780f7ec0..b41ce3a50696 100755 --- a/src/pages/workspace/WorkspacesListPage.tsx +++ b/src/pages/workspace/WorkspacesListPage.tsx @@ -21,6 +21,8 @@ import type {PopoverMenuItem} from '@components/PopoverMenu'; import {PressableWithoutFeedback} from '@components/Pressable'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; +import SearchBar from '@components/SearchBar'; +import type {ListItem} from '@components/SelectionList/types'; import SupportalActionRestrictedModal from '@components/SupportalActionRestrictedModal'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; @@ -29,6 +31,7 @@ import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import usePayAndDowngrade from '@hooks/usePayAndDowngrade'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; +import useSearchResults from '@hooks/useSearchResults'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import {isConnectionInProgress} from '@libs/actions/connections'; @@ -54,7 +57,8 @@ import type {PolicyDetailsForNonMembers} from '@src/types/onyx/Policy'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import WorkspacesListRow from './WorkspacesListRow'; -type WorkspaceItem = Required> & +type WorkspaceItem = ListItem & + Required> & Pick & Pick & Pick & { @@ -316,42 +320,6 @@ function WorkspacesListPage() { ], ); - const listHeaderComponent = useCallback(() => { - if (isLessThanMediumScreen) { - return ; - } - - return ( - - - - {translate('workspace.common.workspaceName')} - - - - - {translate('workspace.common.workspaceOwner')} - - - - - {translate('workspace.common.workspaceType')} - - - - - ); - }, [isLessThanMediumScreen, styles, translate]); - const policyRooms = useMemo(() => { if (!reports || isEmptyObject(reports)) { return; @@ -422,7 +390,7 @@ function WorkspacesListPage() { fallbackIcon: Expensicons.FallbackWorkspaceAvatar, policyID: id, role: CONST.POLICY.ROLE.USER, - errors: null, + errors: undefined, action: () => null, dismissError: () => null, isJoinRequestPending: true, @@ -458,6 +426,46 @@ function WorkspacesListPage() { .sort((a, b) => localeCompare(a.title, b.title)); }, [reimbursementAccount?.errors, policies, isOffline, session?.email, allConnectionSyncProgresses, theme.textLight, policyRooms, navigateToWorkspace]); + const filterWorkspace = useCallback((workspace: WorkspaceItem, inputValue: string) => workspace.title.toLowerCase().includes(inputValue), []); + const sortWorkspace = useCallback((workspaceItems: WorkspaceItem[]) => workspaceItems, []); + const [inputValue, setInputValue, filteredWorkspaces] = useSearchResults(workspaces, filterWorkspace, sortWorkspace); + + const listHeaderComponent = useCallback(() => { + if (isLessThanMediumScreen) { + return ; + } + + return ( + + + + {translate('workspace.common.workspaceName')} + + + + + {translate('workspace.common.workspaceOwner')} + + + + + {translate('workspace.common.workspaceType')} + + + + + ); + }, [isLessThanMediumScreen, styles, translate]); + const getHeaderButton = () => (