From 8c83422a64ff8cb0aae370f8e32e2c83c5d73103 Mon Sep 17 00:00:00 2001 From: jakubstec Date: Wed, 18 Mar 2026 13:02:41 +0100 Subject: [PATCH 01/25] feat: add create new group button --- src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/pages/domain/Groups/DomainGroupsPage.tsx | 24 +++++++++++++++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 83abd5e42308..3b84e0e1a3e9 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -8650,6 +8650,7 @@ const translations = { error: { settings: 'Couldn’t save this change. Please try again or contact Concierge for more support.', }, + createNewGroupButton: 'New group' }, }, }; diff --git a/src/languages/es.ts b/src/languages/es.ts index 738204180bb7..ad92879f67b8 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -8905,6 +8905,7 @@ ${amount} para ${merchant} - ${date}`, error: { settings: 'No se pudo guardar este cambio. Inténtalo de nuevo o contacta con Concierge para obtener más ayuda.', }, + createNewGroupButton: 'Crear nuevo grupo', }, }, gps: { diff --git a/src/pages/domain/Groups/DomainGroupsPage.tsx b/src/pages/domain/Groups/DomainGroupsPage.tsx index 77c5cde1cc91..d5a0e2ac9552 100644 --- a/src/pages/domain/Groups/DomainGroupsPage.tsx +++ b/src/pages/domain/Groups/DomainGroupsPage.tsx @@ -3,6 +3,7 @@ import {defaultSecurityGroupIDSelector, groupsSelector} from '@selectors/Domain' import React from 'react'; import {View} from 'react-native'; import Badge from '@components/Badge'; +import Button from '@components/Button'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; import SelectionList from '@components/SelectionList'; @@ -10,7 +11,7 @@ import TableListItem from '@components/SelectionList/ListItem/TableListItem'; import type {ListItem} from '@components/SelectionList/ListItem/types'; import CustomListHeader from '@components/SelectionListWithModal/CustomListHeader'; import Text from '@components/Text'; -import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; +import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; @@ -33,7 +34,7 @@ type DomainGroupsPageProps = PlatformStackScreenProps Navigation.navigate()} + icon={icons.Plus} + innerStyles={[shouldUseNarrowLayout && styles.alignItemsCenter]} + style={shouldUseNarrowLayout ? [styles.flexGrow1, styles.mb3] : undefined} + success + /> + ); + return ( + > + {!shouldUseNarrowLayout && {createGroupHeaderButton}} + + {shouldUseNarrowLayout && {createGroupHeaderButton}} + Date: Wed, 18 Mar 2026 13:52:13 +0100 Subject: [PATCH 02/25] feat: RHP modal routing for new group creating --- src/ROUTES.ts | 5 +++ src/SCREENS.ts | 1 + .../ModalStackNavigators/index.tsx | 1 + .../linkingConfig/RELATIONS/DOMAIN_TO_RHP.ts | 2 +- src/libs/Navigation/linkingConfig/config.ts | 3 ++ src/libs/Navigation/types.ts | 3 ++ .../domain/Groups/DomainGroupCreatePage.tsx | 34 +++++++++++++++++++ src/pages/domain/Groups/DomainGroupsPage.tsx | 2 +- 8 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/pages/domain/Groups/DomainGroupCreatePage.tsx diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 97cc3ff853b6..7ec04a7633f5 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -4037,6 +4037,11 @@ const ROUTES = { route: 'domain/:domainAccountID/groups/:groupID/name', getRoute: (domainAccountID: number, groupID: string) => `domain/${domainAccountID}/groups/${groupID}/name` as const, }, + + DOMAIN_GROUP_CREATE: { + route: 'domain/:domainAccountID/groups/new', + getRoute: (domainAccountID: number) => `domain/${domainAccountID}/groups/new` as const, + } } as const; /** diff --git a/src/SCREENS.ts b/src/SCREENS.ts index e50aff84ddad..591fef48d3a5 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -963,6 +963,7 @@ const SCREENS = { MEMBER_LOCK_ACCOUNT: 'Member_Lock_Account', GROUP_DETAILS: 'Domain_Group_Details', GROUP_EDIT_NAME: 'Domain_Group_Edit_Name', + GROUP_CREATE: 'Domain_Group_Create', }, MULTIFACTOR_AUTHENTICATION: { MAGIC_CODE: 'Multifactor_Authentication_Magic_Code', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index bc21f437e2c0..b2e6275c911f 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -923,6 +923,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/domain/Members/DomainReportSuspiciousActivityPage').default, [SCREENS.DOMAIN.GROUP_DETAILS]: () => require('../../../../pages/domain/Groups/DomainGroupDetailsPage').default, [SCREENS.DOMAIN.GROUP_EDIT_NAME]: () => require('../../../../pages/domain/Groups/DomainGroupEditNamePage').default, + [SCREENS.DOMAIN.GROUP_CREATE]: () => require('../../../../pages/domain/Groups/DomainGroupCreatePage').default, }); const TwoFactorAuthenticatorStackNavigator = createModalStackNavigator({ diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/DOMAIN_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/DOMAIN_TO_RHP.ts index bc28c4cf9742..776a0e4e579a 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/DOMAIN_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/DOMAIN_TO_RHP.ts @@ -16,7 +16,7 @@ const DOMAIN_TO_RHP: Partial['config'] = { [SCREENS.DOMAIN.GROUP_EDIT_NAME]: { path: ROUTES.DOMAIN_GROUP_EDIT_NAME.route, }, + [SCREENS.DOMAIN.GROUP_CREATE]: { + path: ROUTES.DOMAIN_GROUP_CREATE.route, + }, }, }, [SCREENS.RIGHT_MODAL.TWO_FACTOR_AUTH]: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index b5f2c58c06e0..53623732942e 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1577,6 +1577,9 @@ type SettingsNavigatorParamList = { domainAccountID: number; groupID: string; }; + [SCREENS.DOMAIN.GROUP_CREATE]: { + domainAccountID: number; + } } & ReimbursementAccountNavigatorParamList; type DomainCardNavigatorParamList = { diff --git a/src/pages/domain/Groups/DomainGroupCreatePage.tsx b/src/pages/domain/Groups/DomainGroupCreatePage.tsx new file mode 100644 index 000000000000..50f740ef6911 --- /dev/null +++ b/src/pages/domain/Groups/DomainGroupCreatePage.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import ScreenWrapper from '@components/ScreenWrapper'; +import useLocalize from '@hooks/useLocalize'; +import Navigation from '@navigation/Navigation'; +import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@navigation/types'; +import DomainNotFoundPageWrapper from '@pages/domain/DomainNotFoundPageWrapper'; +import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; + +type DomainGroupCreatePageProps = PlatformStackScreenProps; + +function DomainGroupCreatePage({route}: DomainGroupCreatePageProps) { + const {domainAccountID} = route.params; + const {translate} = useLocalize(); + return ( + + + Navigation.goBack(ROUTES.DOMAIN_GROUPS.getRoute(domainAccountID))} + /> + + + ); +} + +export default DomainGroupCreatePage; diff --git a/src/pages/domain/Groups/DomainGroupsPage.tsx b/src/pages/domain/Groups/DomainGroupsPage.tsx index d5a0e2ac9552..0ea1ad893506 100644 --- a/src/pages/domain/Groups/DomainGroupsPage.tsx +++ b/src/pages/domain/Groups/DomainGroupsPage.tsx @@ -78,7 +78,7 @@ function DomainGroupsPage({route}: DomainGroupsPageProps) { accessibilityLabel={translate('domain.groups.createNewGroupButton')} text={translate('domain.groups.createNewGroupButton')} // sentryLabel={} - // onPress={() => Navigation.navigate()} + onPress={() => Navigation.navigate(ROUTES.DOMAIN_GROUP_CREATE.getRoute(domainAccountID))} icon={icons.Plus} innerStyles={[shouldUseNarrowLayout && styles.alignItemsCenter]} style={shouldUseNarrowLayout ? [styles.flexGrow1, styles.mb3] : undefined} From fb8847c122b6d8f5f0ae1ceddb721bdb27e0000b Mon Sep 17 00:00:00 2001 From: jakubstec Date: Thu, 19 Mar 2026 09:45:54 +0100 Subject: [PATCH 03/25] fix: add missing sentry label --- src/CONST/index.ts | 5 +++++ src/pages/domain/Groups/DomainGroupsPage.tsx | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 4bae10319adb..b6dc2369d666 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -9131,6 +9131,11 @@ const CONST = { PROFILE_PAGE: { AVATAR: 'ProfilePage-Avatar', }, + DOMAIN: { + GROUPS: { + CREATE_GROUP_BUTTON: 'DomainGroups-CreateGroupButton', + } + } }, DOMAIN: { diff --git a/src/pages/domain/Groups/DomainGroupsPage.tsx b/src/pages/domain/Groups/DomainGroupsPage.tsx index 0ea1ad893506..2be21261e03f 100644 --- a/src/pages/domain/Groups/DomainGroupsPage.tsx +++ b/src/pages/domain/Groups/DomainGroupsPage.tsx @@ -20,6 +20,7 @@ import Navigation from '@navigation/Navigation'; import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types'; import type {DomainSplitNavigatorParamList} from '@navigation/types'; import DomainNotFoundPageWrapper from '@pages/domain/DomainNotFoundPageWrapper'; +import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; @@ -77,7 +78,7 @@ function DomainGroupsPage({route}: DomainGroupsPageProps) {