Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create leave workspace functionality #56316

Merged
merged 4 commits into from
Feb 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2713,6 +2713,7 @@ const translations = {
submitExpense: 'Submit your expenses below:',
defaultCategory: 'Default category',
viewTransactions: 'View transactions',
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.",
},
perDiem: {
subtitle: 'Set per diem rates to control daily employee spend. ',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2738,6 +2738,8 @@ const translations = {
submitExpense: 'Envía tus gastos a continuación:',
defaultCategory: 'Categoría predeterminada',
viewTransactions: 'Ver transacciones',
leaveConfirmation:
'¿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.',
},
perDiem: {
subtitle: 'Establece las tasas per diem para controlar los gastos diarios de los empleados. ',
Expand Down
58 changes: 43 additions & 15 deletions src/pages/workspace/WorkspaceProfilePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useThemeIllustrations from '@hooks/useThemeIllustrations';
import useThemeStyles from '@hooks/useThemeStyles';
import {clearInviteDraft} from '@libs/actions/Policy/Member';
import {clearAvatarErrors, clearPolicyErrorField, deleteWorkspace, deleteWorkspaceAvatar, openPolicyProfilePage, updateWorkspaceAvatar} from '@libs/actions/Policy/Policy';
import {clearAvatarErrors, clearPolicyErrorField, deleteWorkspace, deleteWorkspaceAvatar, leaveWorkspace, openPolicyProfilePage, updateWorkspaceAvatar} from '@libs/actions/Policy/Policy';
import {getLatestErrorField} from '@libs/ErrorUtils';
import getTopmostBottomTabRoute from '@libs/Navigation/getTopmostBottomTabRoute';
import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
Expand Down Expand Up @@ -49,6 +49,7 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, route}: Workspac
const illustrations = useThemeIllustrations();
const {activeWorkspaceID, setActiveWorkspaceID} = useActiveWorkspace();
const {canUseSpotnanaTravel} = usePermissions();
const [isLeaveModalOpen, setIsLeaveModalOpen] = useState(false);

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

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

const confirmDeleteAndHideModal = useCallback(() => {
if (!policy?.id || !policyName) {
return;
}
const handleWorkspaceAction = useCallback(
(action: 'delete' | 'leave') => {
if (!policy?.id || !policyName) {
return;
}

deleteWorkspace(policy.id, policyName);
setIsDeleteModalOpen(false);
if (action === 'delete') {
deleteWorkspace(policy.id, policyName);
setIsDeleteModalOpen(false);
} else {
leaveWorkspace(policy.id);
}

if (activeWorkspaceID !== policy?.id) {
return;
}

// If the workspace being deleted is the active workspace, switch to the "All Workspaces" view
if (activeWorkspaceID === policy.id) {
setActiveWorkspaceID(undefined);
Navigation.dismissModal();
const rootState = navigationRef.current?.getRootState() as State<RootStackParamList>;
const topmostBottomTabRoute = getTopmostBottomTabRoute(rootState);
if (topmostBottomTabRoute?.name === SCREENS.SETTINGS.ROOT) {
Navigation.setParams({policyID: undefined}, topmostBottomTabRoute?.key);
}
}
goBackFromInvalidPolicy();
}, [policy?.id, policyName, activeWorkspaceID, setActiveWorkspaceID]);

goBackFromInvalidPolicy();
},
[policy?.id, policyName, activeWorkspaceID, setActiveWorkspaceID],
);
return (
<WorkspacePageWithSections
headerText={translate('workspace.common.profile')}
Expand Down Expand Up @@ -223,7 +231,7 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, route}: Workspac
styles.sectionMenuItemTopDescription,
]}
editIconStyle={styles.smallEditIconWorkspace}
isUsingDefaultAvatar={!policy?.avatarURL ?? false}
isUsingDefaultAvatar={!policy?.avatarURL}
onImageSelected={(file) => {
if (!policy?.id) {
return;
Expand Down Expand Up @@ -367,17 +375,37 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, route}: Workspac
)}
</View>
)}
{!(isPolicyAdmin || isOwner) && (
<View style={[styles.flexRow, styles.mt6, styles.mnw120]}>
<Button
accessibilityLabel={translate('common.leave')}
text={translate('common.leave')}
onPress={() => setIsLeaveModalOpen(true)}
icon={Expensicons.Exit}
/>
</View>
)}
</Section>
<ConfirmModal
title={translate('workspace.common.delete')}
isVisible={isDeleteModalOpen}
onConfirm={confirmDeleteAndHideModal}
onConfirm={() => handleWorkspaceAction('delete')}
onCancel={() => setIsDeleteModalOpen(false)}
prompt={hasCardFeedOrExpensifyCard ? translate('workspace.common.deleteWithCardsConfirmation') : translate('workspace.common.deleteConfirmation')}
confirmText={translate('common.delete')}
cancelText={translate('common.cancel')}
danger
/>
<ConfirmModal
title={translate('common.leave')}
isVisible={isLeaveModalOpen}
onConfirm={() => handleWorkspaceAction('leave')}
onCancel={() => setIsLeaveModalOpen(false)}
prompt={translate('workspace.common.leaveConfirmation')}
confirmText={translate('common.leave')}
cancelText={translate('common.cancel')}
danger
/>
</View>
)}
</WorkspacePageWithSections>
Expand Down