Skip to content

Commit 04bf0fe

Browse files
authored
Merge pull request #55927 from twilight2294/addRoleDescription
use member role selection modal consistently across app
2 parents 5b09926 + 8c3c559 commit 04bf0fe

File tree

3 files changed

+59
-32
lines changed

3 files changed

+59
-32
lines changed

src/pages/workspace/WorkspaceInviteMessagePage.tsx

+50-23
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import FormProvider from '@components/Form/FormProvider';
77
import InputWrapper from '@components/Form/InputWrapper';
88
import type {FormInputErrors} from '@components/Form/types';
99
import HeaderWithBackButton from '@components/HeaderWithBackButton';
10+
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
1011
import MultipleAvatars from '@components/MultipleAvatars';
1112
import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback';
1213
import type {AnimatedTextInputRef} from '@components/RNTextInput';
1314
import ScreenWrapper from '@components/ScreenWrapper';
1415
import Text from '@components/Text';
1516
import TextInput from '@components/TextInput';
16-
import ValuePicker from '@components/ValuePicker';
1717
import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails';
1818
import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails';
1919
import useAutoFocusInput from '@hooks/useAutoFocusInput';
@@ -41,6 +41,8 @@ import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
4141
import AccessOrNotFoundWrapper from './AccessOrNotFoundWrapper';
4242
import withPolicyAndFullscreenLoading from './withPolicyAndFullscreenLoading';
4343
import type {WithPolicyAndFullscreenLoadingProps} from './withPolicyAndFullscreenLoading';
44+
import WorkspaceMemberDetailsRoleSelectionModal from './WorkspaceMemberRoleSelectionModal';
45+
import type {ListItemType} from './WorkspaceMemberRoleSelectionModal';
4446

4547
type WorkspaceInviteMessagePageProps = WithPolicyAndFullscreenLoadingProps &
4648
WithCurrentUserPersonalDetailsProps &
@@ -62,11 +64,17 @@ function WorkspaceInviteMessagePage({policy, route, currentUserPersonalDetails}:
6264
const [allPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
6365
const isOnyxLoading = isLoadingOnyxValue(workspaceInviteMessageDraftResult, invitedEmailsToAccountIDsDraftResult, formDataResult);
6466

67+
const [isRoleSelectionModalVisible, setIsRoleSelectionModalVisible] = useState(false);
68+
6569
const welcomeNoteSubject = useMemo(
6670
() => `# ${currentUserPersonalDetails?.displayName ?? ''} invited you to ${policy?.name ?? 'a workspace'}`,
6771
[policy?.name, currentUserPersonalDetails?.displayName],
6872
);
6973

74+
const openRoleSelectionModal = useCallback(() => {
75+
setIsRoleSelectionModalVisible(true);
76+
}, []);
77+
7078
const getDefaultWelcomeNote = useCallback(() => {
7179
return (
7280
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
@@ -124,22 +132,37 @@ function WorkspaceInviteMessagePage({policy, route, currentUserPersonalDetails}:
124132

125133
const policyName = policy?.name;
126134

127-
const roleItems = useMemo(() => {
128-
return Object.values(CONST.POLICY.ROLE).map((roleValue) => {
129-
let label = '';
130-
if (roleValue === CONST.POLICY.ROLE.USER) {
131-
label = translate('common.member');
132-
} else if (roleValue === CONST.POLICY.ROLE.ADMIN) {
133-
label = translate('common.admin');
134-
} else {
135-
label = translate('common.auditor');
136-
}
137-
return {
138-
label,
139-
value: roleValue,
140-
};
141-
});
142-
}, [translate]);
135+
const roleItems: ListItemType[] = useMemo(
136+
() => [
137+
{
138+
value: CONST.POLICY.ROLE.ADMIN,
139+
text: translate('common.admin'),
140+
alternateText: translate('workspace.common.adminAlternateText'),
141+
isSelected: role === CONST.POLICY.ROLE.ADMIN,
142+
keyForList: CONST.POLICY.ROLE.ADMIN,
143+
},
144+
{
145+
value: CONST.POLICY.ROLE.AUDITOR,
146+
text: translate('common.auditor'),
147+
alternateText: translate('workspace.common.auditorAlternateText'),
148+
isSelected: role === CONST.POLICY.ROLE.AUDITOR,
149+
keyForList: CONST.POLICY.ROLE.AUDITOR,
150+
},
151+
{
152+
value: CONST.POLICY.ROLE.USER,
153+
text: translate('common.member'),
154+
alternateText: translate('workspace.common.memberAlternateText'),
155+
isSelected: role === CONST.POLICY.ROLE.USER,
156+
keyForList: CONST.POLICY.ROLE.USER,
157+
},
158+
],
159+
[role, translate],
160+
);
161+
162+
const changeRole = useCallback(({value}: ListItemType) => {
163+
setIsRoleSelectionModalVisible(false);
164+
setRole(value);
165+
}, []);
143166

144167
return (
145168
<AccessOrNotFoundWrapper
@@ -197,13 +220,17 @@ function WorkspaceInviteMessagePage({policy, route, currentUserPersonalDetails}:
197220
</View>
198221
<View style={[styles.mb3]}>
199222
<View style={[styles.mhn5, styles.mb3]}>
200-
<InputWrapper
201-
inputID={INPUT_IDS.ROLE}
202-
InputComponent={ValuePicker}
203-
label={translate('common.role')}
223+
<MenuItemWithTopDescription
224+
title={translate(`workspace.common.roleName`, {role})}
225+
description={translate('common.role')}
226+
shouldShowRightIcon
227+
onPress={openRoleSelectionModal}
228+
/>
229+
<WorkspaceMemberDetailsRoleSelectionModal
230+
isVisible={isRoleSelectionModalVisible}
204231
items={roleItems}
205-
value={role}
206-
onValueChange={(value) => setRole(value as typeof role)}
232+
onRoleChange={changeRole}
233+
onClose={() => setIsRoleSelectionModalVisible(false)}
207234
/>
208235
</View>
209236
<InputWrapper

src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx

+9-9
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import NotFoundPage from '@pages/ErrorPage/NotFoundPage';
3232
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
3333
import type {WithPolicyAndFullscreenLoadingProps} from '@pages/workspace/withPolicyAndFullscreenLoading';
3434
import withPolicyAndFullscreenLoading from '@pages/workspace/withPolicyAndFullscreenLoading';
35+
import type {ListItemType} from '@pages/workspace/WorkspaceMemberRoleSelectionModal';
36+
import WorkspaceMemberDetailsRoleSelectionModal from '@pages/workspace/WorkspaceMemberRoleSelectionModal';
3537
import variables from '@styles/variables';
3638
import {setIssueNewCardStepAndData} from '@userActions/Card';
3739
import {openPolicyCompanyCardsPage} from '@userActions/CompanyCards';
@@ -41,8 +43,6 @@ import ONYXKEYS from '@src/ONYXKEYS';
4143
import ROUTES from '@src/ROUTES';
4244
import type SCREENS from '@src/SCREENS';
4345
import type {CompanyCardFeed, Card as MemberCard, PersonalDetails, PersonalDetailsList} from '@src/types/onyx';
44-
import type {ListItemType} from './WorkspaceMemberDetailsRoleSelectionModal';
45-
import WorkspaceMemberDetailsRoleSelectionModal from './WorkspaceMemberDetailsRoleSelectionModal';
4646

4747
type WorkspacePolicyOnyxProps = {
4848
/** Personal details of all users */
@@ -116,20 +116,20 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
116116
isSelected: member?.role === CONST.POLICY.ROLE.ADMIN,
117117
keyForList: CONST.POLICY.ROLE.ADMIN,
118118
},
119-
{
120-
value: CONST.POLICY.ROLE.USER,
121-
text: translate('common.member'),
122-
alternateText: translate('workspace.common.memberAlternateText'),
123-
isSelected: member?.role === CONST.POLICY.ROLE.USER,
124-
keyForList: CONST.POLICY.ROLE.USER,
125-
},
126119
{
127120
value: CONST.POLICY.ROLE.AUDITOR,
128121
text: translate('common.auditor'),
129122
alternateText: translate('workspace.common.auditorAlternateText'),
130123
isSelected: member?.role === CONST.POLICY.ROLE.AUDITOR,
131124
keyForList: CONST.POLICY.ROLE.AUDITOR,
132125
},
126+
{
127+
value: CONST.POLICY.ROLE.USER,
128+
text: translate('common.member'),
129+
alternateText: translate('workspace.common.memberAlternateText'),
130+
isSelected: member?.role === CONST.POLICY.ROLE.USER,
131+
keyForList: CONST.POLICY.ROLE.USER,
132+
},
133133
],
134134
[member?.role, translate],
135135
);

0 commit comments

Comments
 (0)