Skip to content

Commit 6999bfb

Browse files
authored
Merge pull request #56316 from huult/55462-unable-leave-invited-workspace
2 parents 4bc37d7 + 7c9919a commit 6999bfb

File tree

3 files changed

+46
-15
lines changed

3 files changed

+46
-15
lines changed

src/languages/en.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2713,6 +2713,7 @@ const translations = {
27132713
submitExpense: 'Submit your expenses below:',
27142714
defaultCategory: 'Default category',
27152715
viewTransactions: 'View transactions',
2716+
leaveConfirmation: "Are you sure you want to leave this workspace? Once you leave, you'll lose access to all data and settings associated with this workspace.",
27162717
},
27172718
perDiem: {
27182719
subtitle: 'Set per diem rates to control daily employee spend. ',

src/languages/es.ts

+2
Original file line numberDiff line numberDiff line change
@@ -2738,6 +2738,8 @@ const translations = {
27382738
submitExpense: 'Envía tus gastos a continuación:',
27392739
defaultCategory: 'Categoría predeterminada',
27402740
viewTransactions: 'Ver transacciones',
2741+
leaveConfirmation:
2742+
'¿Estás seguro de que quieres salir de este espacio de trabajo? Una vez que salgas, perderás el acceso a todos los datos y configuraciones asociadas con este espacio de trabajo.',
27412743
},
27422744
perDiem: {
27432745
subtitle: 'Establece las tasas per diem para controlar los gastos diarios de los empleados. ',

src/pages/workspace/WorkspaceProfilePage.tsx

+43-15
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout';
2020
import useThemeIllustrations from '@hooks/useThemeIllustrations';
2121
import useThemeStyles from '@hooks/useThemeStyles';
2222
import {clearInviteDraft} from '@libs/actions/Policy/Member';
23-
import {clearAvatarErrors, clearPolicyErrorField, deleteWorkspace, deleteWorkspaceAvatar, openPolicyProfilePage, updateWorkspaceAvatar} from '@libs/actions/Policy/Policy';
23+
import {clearAvatarErrors, clearPolicyErrorField, deleteWorkspace, deleteWorkspaceAvatar, leaveWorkspace, openPolicyProfilePage, updateWorkspaceAvatar} from '@libs/actions/Policy/Policy';
2424
import {getLatestErrorField} from '@libs/ErrorUtils';
2525
import getTopmostBottomTabRoute from '@libs/Navigation/getTopmostBottomTabRoute';
2626
import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
@@ -49,6 +49,7 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, route}: Workspac
4949
const illustrations = useThemeIllustrations();
5050
const {activeWorkspaceID, setActiveWorkspaceID} = useActiveWorkspace();
5151
const {canUseSpotnanaTravel} = usePermissions();
52+
const [isLeaveModalOpen, setIsLeaveModalOpen] = useState(false);
5253

5354
const [currencyList = {}] = useOnyx(ONYXKEYS.CURRENCY_LIST);
5455
const [currentUserAccountID = -1] = useOnyx(ONYXKEYS.SESSION, {selector: (session) => session?.accountID});
@@ -156,27 +157,34 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, route}: Workspac
156157

157158
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
158159

159-
const confirmDeleteAndHideModal = useCallback(() => {
160-
if (!policy?.id || !policyName) {
161-
return;
162-
}
160+
const handleWorkspaceAction = useCallback(
161+
(action: 'delete' | 'leave') => {
162+
if (!policy?.id || !policyName) {
163+
return;
164+
}
163165

164-
deleteWorkspace(policy.id, policyName);
165-
setIsDeleteModalOpen(false);
166+
if (action === 'delete') {
167+
deleteWorkspace(policy.id, policyName);
168+
setIsDeleteModalOpen(false);
169+
} else {
170+
leaveWorkspace(policy.id);
171+
}
172+
173+
if (activeWorkspaceID !== policy?.id) {
174+
return;
175+
}
166176

167-
// If the workspace being deleted is the active workspace, switch to the "All Workspaces" view
168-
if (activeWorkspaceID === policy.id) {
169177
setActiveWorkspaceID(undefined);
170178
Navigation.dismissModal();
171179
const rootState = navigationRef.current?.getRootState() as State<RootStackParamList>;
172180
const topmostBottomTabRoute = getTopmostBottomTabRoute(rootState);
173181
if (topmostBottomTabRoute?.name === SCREENS.SETTINGS.ROOT) {
174182
Navigation.setParams({policyID: undefined}, topmostBottomTabRoute?.key);
175183
}
176-
}
177-
goBackFromInvalidPolicy();
178-
}, [policy?.id, policyName, activeWorkspaceID, setActiveWorkspaceID]);
179-
184+
goBackFromInvalidPolicy();
185+
},
186+
[policy?.id, policyName, activeWorkspaceID, setActiveWorkspaceID],
187+
);
180188
return (
181189
<WorkspacePageWithSections
182190
headerText={translate('workspace.common.profile')}
@@ -223,7 +231,7 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, route}: Workspac
223231
styles.sectionMenuItemTopDescription,
224232
]}
225233
editIconStyle={styles.smallEditIconWorkspace}
226-
isUsingDefaultAvatar={!policy?.avatarURL ?? false}
234+
isUsingDefaultAvatar={!policy?.avatarURL}
227235
onImageSelected={(file) => {
228236
if (!policy?.id) {
229237
return;
@@ -367,17 +375,37 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, route}: Workspac
367375
)}
368376
</View>
369377
)}
378+
{!(isPolicyAdmin || isOwner) && (
379+
<View style={[styles.flexRow, styles.mt6, styles.mnw120]}>
380+
<Button
381+
accessibilityLabel={translate('common.leave')}
382+
text={translate('common.leave')}
383+
onPress={() => setIsLeaveModalOpen(true)}
384+
icon={Expensicons.Exit}
385+
/>
386+
</View>
387+
)}
370388
</Section>
371389
<ConfirmModal
372390
title={translate('workspace.common.delete')}
373391
isVisible={isDeleteModalOpen}
374-
onConfirm={confirmDeleteAndHideModal}
392+
onConfirm={() => handleWorkspaceAction('delete')}
375393
onCancel={() => setIsDeleteModalOpen(false)}
376394
prompt={hasCardFeedOrExpensifyCard ? translate('workspace.common.deleteWithCardsConfirmation') : translate('workspace.common.deleteConfirmation')}
377395
confirmText={translate('common.delete')}
378396
cancelText={translate('common.cancel')}
379397
danger
380398
/>
399+
<ConfirmModal
400+
title={translate('common.leave')}
401+
isVisible={isLeaveModalOpen}
402+
onConfirm={() => handleWorkspaceAction('leave')}
403+
onCancel={() => setIsLeaveModalOpen(false)}
404+
prompt={translate('workspace.common.leaveConfirmation')}
405+
confirmText={translate('common.leave')}
406+
cancelText={translate('common.cancel')}
407+
danger
408+
/>
381409
</View>
382410
)}
383411
</WorkspacePageWithSections>

0 commit comments

Comments
 (0)