diff --git a/src/CONST.ts b/src/CONST.ts index 76d09c01140c..a733632ade8d 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -934,7 +934,6 @@ const CONST = { CONFIGURE_REIMBURSEMENT_SETTINGS_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/workspaces/Configure-Reimbursement-Settings', COPILOT_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/copilots-and-delegates/Assign-or-remove-a-Copilot', DELAYED_SUBMISSION_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/reports/Automatically-submit-employee-reports', - PLAN_TYPES_AND_PRICING_HELP_URL: 'https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Plan-types-and-pricing', // Use Environment.getEnvironmentURL to get the complete URL with port number DEV_NEW_EXPENSIFY_URL: 'https://dev.new.expensify.com:', NAVATTIC: { diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 6eafb3a02650..a96b5f17ba2e 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -711,10 +711,6 @@ const ROUTES = { route: 'settings/workspaces/:policyID/profile/address', getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/profile/address` as const, backTo), }, - WORKSPACE_PROFILE_PLAN: { - route: 'settings/workspaces/:policyID/profile/plan', - getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/profile/plan` as const, backTo), - }, WORKSPACE_ACCOUNTING: { route: 'settings/workspaces/:policyID/accounting', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting` as const, @@ -978,9 +974,9 @@ const ROUTES = { getRoute: (policyID: string, categoryName: string) => `settings/workspaces/${policyID}/category/${encodeURIComponent(categoryName)}` as const, }, WORKSPACE_UPGRADE: { - route: 'settings/workspaces/:policyID/upgrade/:featureName?', - getRoute: (policyID: string, featureName?: string, backTo?: string) => - getUrlWithBackToParam(`settings/workspaces/${policyID}/upgrade/${encodeURIComponent(featureName ?? '')}` as const, backTo), + route: 'settings/workspaces/:policyID/upgrade/:featureName', + getRoute: (policyID: string, featureName: string, backTo?: string) => + getUrlWithBackToParam(`settings/workspaces/${policyID}/upgrade/${encodeURIComponent(featureName)}` as const, backTo), }, WORKSPACE_DOWNGRADE: { route: 'settings/workspaces/:policyID/downgrade/', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 0e9c54352c32..092a5c28f07a 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -498,7 +498,6 @@ const SCREENS = { TAG_GL_CODE: 'Tag_GL_Code', CURRENCY: 'Workspace_Profile_Currency', ADDRESS: 'Workspace_Profile_Address', - PLAN: 'Workspace_Profile_Plan_Type', WORKFLOWS: 'Workspace_Workflows', WORKFLOWS_PAYER: 'Workspace_Workflows_Payer', WORKFLOWS_APPROVALS_NEW: 'Workspace_Approvals_New', diff --git a/src/languages/en.ts b/src/languages/en.ts index 855854c58dba..e10f9dc263d5 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -190,7 +190,6 @@ import type { WelcomeNoteParams, WelcomeToRoomParams, WeSentYouMagicSignInLinkParams, - WorkspaceLockedPlanTypeParams, WorkspaceOwnerWillNeedToAddOrUpdatePaymentCardParams, YourPlanPriceParams, ZipCodeExampleFormatParams, @@ -2536,7 +2535,6 @@ const translations = { return 'Member'; } }, - planType: 'Plan type', submitExpense: 'Submit expenses using your workspace chat below:', defaultCategory: 'Default category', }, @@ -4278,19 +4276,6 @@ const translations = { moreDetails: 'for more details.', gotIt: 'Got it, thanks', }, - commonFeatures: { - title: 'Upgrade Workspace to Control', - note: 'Get access to all our most advanced functionality, including:', - benefits: { - note: 'The Control plan starts at $9 per active member per month.', - learnMore: 'Learn more', - pricing: 'about our plans and pricing.', - benefit1: 'Advanced accounting connections (NetSuite, Sage Intacct and more)', - benefit2: 'Expense rules', - benefit3: 'Multiple approval workflows', - benefit4: 'Enhanced security controls', - }, - }, }, restrictedAction: { restricted: 'Restricted', @@ -4394,23 +4379,6 @@ const translations = { andEnableWorkflows: 'and enable workflows, then add approvals to unlock this feature.', }, }, - planTypePage: { - planTypes: { - team: { - label: 'Collect', - description: 'For teams looking to automate their processes.', - }, - corporate: { - label: 'Control', - description: 'For organizations with advanced requirements.', - }, - }, - description: "Choose a plan that's right for you. For a detailed list of features and pricing, check out our", - subscriptionLink: 'plan types and pricing help page', - lockedPlanDescription: ({subscriptionUsersCount, annualSubscriptionEndDate}: WorkspaceLockedPlanTypeParams) => - `You've committed to ${subscriptionUsersCount} active users on the Control plan until your annual subscription ends on ${annualSubscriptionEndDate}. You can switch to pay-per-use subscription and downgrade to the Collect plan starting ${annualSubscriptionEndDate} by disabling auto-renew in`, - subscriptions: 'Subscriptions', - }, }, getAssistancePage: { title: 'Get assistance', diff --git a/src/languages/es.ts b/src/languages/es.ts index 57ff99f80b6b..085976242a42 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -190,7 +190,6 @@ import type { WelcomeNoteParams, WelcomeToRoomParams, WeSentYouMagicSignInLinkParams, - WorkspaceLockedPlanTypeParams, WorkspaceOwnerWillNeedToAddOrUpdatePaymentCardParams, YourPlanPriceParams, ZipCodeExampleFormatParams, @@ -2560,7 +2559,6 @@ const translations = { return 'Miembro'; } }, - planType: 'Tipo de plan', submitExpense: 'Envíe los gastos utilizando el chat de su espacio de trabajo:', defaultCategory: 'Categoría predeterminada', }, @@ -4245,23 +4243,6 @@ const translations = { confirmText: 'Sí, exportar de nuevo', cancelText: 'Cancelar', }, - planTypePage: { - planTypes: { - team: { - label: 'Collect', - description: 'Para equipos que buscan automatizar sus procesos.', - }, - corporate: { - label: 'Recolectar', - description: 'Para organizaciones con requisitos avanzados.', - }, - }, - description: 'Elige el plan adecuado para ti. Para ver una lista detallada de funciones y precios, consulta nuestra', - subscriptionLink: 'página de ayuda sobre tipos de planes y precios', - lockedPlanDescription: ({subscriptionUsersCount, annualSubscriptionEndDate}: WorkspaceLockedPlanTypeParams) => - `Tienes un compromiso anual de ${subscriptionUsersCount} miembros activos en el plan Control hasta el ${annualSubscriptionEndDate}. Puedes cambiar a una suscripción de pago por uso y desmejorar al plan Recopilar a partir del ${annualSubscriptionEndDate} desactivando la renovación automática en`, - subscriptions: 'Suscripciones', - }, upgrade: { reportFields: { title: 'Los campos', @@ -4343,19 +4324,6 @@ const translations = { moreDetails: 'para obtener más información.', gotIt: 'Entendido, gracias.', }, - commonFeatures: { - title: 'Actualiza tu espacio de trabajo al plan Controlar', - note: 'Obtén acceso a todas nuestras funciones más avanzadas, incluyendo:', - benefits: { - note: 'El plan Controlar comienza en $9 por miembro activo al mes.', - learnMore: 'Obtén más información', - pricing: 'sobre nuestros planes y precios.', - benefit1: 'Conexiones contables avanzadas (NetSuite, Sage Intacct y más)', - benefit2: 'Reglas de gastos', - benefit3: 'Flujos de aprobación múltiples', - benefit4: 'Controles de seguridad mejorados', - }, - }, }, restrictedAction: { restricted: 'Restringido', diff --git a/src/languages/params.ts b/src/languages/params.ts index a2d5e1bee124..b5dec90cd8ea 100644 --- a/src/languages/params.ts +++ b/src/languages/params.ts @@ -555,10 +555,6 @@ type CurrencyCodeParams = { currencyCode: string; }; -type WorkspaceLockedPlanTypeParams = { - subscriptionUsersCount: number; - annualSubscriptionEndDate: string; -}; type CompanyNameParams = { companyName: string; }; @@ -768,7 +764,6 @@ export type { AssignCardParams, ImportedTypesParams, CurrencyCodeParams, - WorkspaceLockedPlanTypeParams, CompanyNameParams, ChatWithAccountManagerParams, }; diff --git a/src/libs/API/parameters/UpgradeToCorporateParams.ts b/src/libs/API/parameters/UpgradeToCorporateParams.ts index 7b7ff3e0adcc..ee9d1359c4dd 100644 --- a/src/libs/API/parameters/UpgradeToCorporateParams.ts +++ b/src/libs/API/parameters/UpgradeToCorporateParams.ts @@ -1,6 +1,6 @@ type UpgradeToCorporateParams = { policyID: string; - featureName?: string; + featureName: string; }; export default UpgradeToCorporateParams; diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 64482e692663..90a36dcc935a 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -270,7 +270,6 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP [SCREENS.WORKSPACE.CURRENCY]: () => require<ReactComponentModule>('../../../../pages/workspace/WorkspaceProfileCurrencyPage').default, [SCREENS.WORKSPACE.CATEGORY_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/categories/CategorySettingsPage').default, [SCREENS.WORKSPACE.ADDRESS]: () => require<ReactComponentModule>('../../../../pages/workspace/WorkspaceProfileAddressPage').default, - [SCREENS.WORKSPACE.PLAN]: () => require<ReactComponentModule>('../../../../pages/workspace/WorkspaceProfilePlanTypePage').default, [SCREENS.WORKSPACE.CATEGORIES_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/categories/WorkspaceCategoriesSettingsPage').default, [SCREENS.WORKSPACE.CATEGORIES_IMPORT]: () => require<ReactComponentModule>('../../../../pages/workspace/categories/ImportCategoriesPage').default, [SCREENS.WORKSPACE.CATEGORIES_IMPORTED]: () => require<ReactComponentModule>('../../../../pages/workspace/categories/ImportedCategoriesPage').default, diff --git a/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts b/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts index 108cd86c05d6..7ae8fb43178a 100755 --- a/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts +++ b/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts @@ -5,7 +5,6 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial<Record<FullScreenName, string[]>> = { [SCREENS.WORKSPACE.PROFILE]: [ SCREENS.WORKSPACE.NAME, SCREENS.WORKSPACE.ADDRESS, - SCREENS.WORKSPACE.PLAN, SCREENS.WORKSPACE.CURRENCY, SCREENS.WORKSPACE.DESCRIPTION, SCREENS.WORKSPACE.SHARE, diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 55382e2d0889..e68e1b1c49df 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -347,9 +347,6 @@ const config: LinkingOptions<RootStackParamList>['config'] = { [SCREENS.WORKSPACE.ADDRESS]: { path: ROUTES.WORKSPACE_PROFILE_ADDRESS.route, }, - [SCREENS.WORKSPACE.PLAN]: { - path: ROUTES.WORKSPACE_PROFILE_PLAN.route, - }, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_IMPORT]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_IMPORT.route}, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_CHART_OF_ACCOUNTS.route}, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_ONLINE_CLASSES]: {path: ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_CLASSES.route}, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 56aaf05ebf51..b28a8d1e2241 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -246,7 +246,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.UPGRADE]: { policyID: string; - featureName?: string; + featureName: string; backTo?: Routes; categoryId?: string; }; diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index b7494659c92f..ab24f472cdf4 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -1114,17 +1114,6 @@ function getActivePolicy(): OnyxEntry<Policy> { return getPolicy(activePolicyId); } -function getUserFriendlyWorkspaceType(workspaceType: ValueOf<typeof CONST.POLICY.TYPE>) { - switch (workspaceType) { - case CONST.POLICY.TYPE.CORPORATE: - return Localize.translateLocal('workspace.type.control'); - case CONST.POLICY.TYPE.TEAM: - return Localize.translateLocal('workspace.type.collect'); - default: - return Localize.translateLocal('workspace.type.free'); - } -} - function isPolicyAccessible(policy: OnyxEntry<Policy>): boolean { return !isEmptyObject(policy) && (Object.keys(policy).length !== 1 || isEmptyObject(policy.errors)) && !!policy?.id; } @@ -1257,7 +1246,6 @@ export { getNetSuiteImportCustomFieldLabel, getAllPoliciesLength, getActivePolicy, - getUserFriendlyWorkspaceType, isPolicyAccessible, areAllGroupPoliciesExpenseChatDisabled, }; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 01a5909de9db..0b72d2de3f98 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -1663,7 +1663,6 @@ function buildPolicyData(policyOwnerEmail = '', makeMeAdmin = false, policyName outputCurrency: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, address: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, description: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - type: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, }, }, }, @@ -1736,7 +1735,6 @@ function buildPolicyData(policyOwnerEmail = '', makeMeAdmin = false, policyName outputCurrency: null, address: null, description: null, - type: null, }, }, }, @@ -3326,7 +3324,7 @@ function setForeignCurrencyDefault(policyID: string, taxCode: string) { API.write(WRITE_COMMANDS.SET_POLICY_TAXES_FOREIGN_CURRENCY_DEFAULT, parameters, onyxData); } -function upgradeToCorporate(policyID: string, featureName?: string) { +function upgradeToCorporate(policyID: string, featureName: string) { const policy = getPolicy(policyID); const optimisticData: OnyxUpdate[] = [ { @@ -3378,7 +3376,7 @@ function upgradeToCorporate(policyID: string, featureName?: string) { }, ]; - const parameters: UpgradeToCorporateParams = {policyID, ...(featureName ? {featureName} : {})}; + const parameters: UpgradeToCorporateParams = {policyID, featureName}; API.write(WRITE_COMMANDS.UPGRADE_TO_CORPORATE, parameters, {optimisticData, successData, failureData}); } diff --git a/src/pages/workspace/WorkspaceProfilePage.tsx b/src/pages/workspace/WorkspaceProfilePage.tsx index d96c44c6e839..756da0f644b0 100644 --- a/src/pages/workspace/WorkspaceProfilePage.tsx +++ b/src/pages/workspace/WorkspaceProfilePage.tsx @@ -77,7 +77,6 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, route}: Workspac const onPressName = useCallback(() => Navigation.navigate(ROUTES.WORKSPACE_PROFILE_NAME.getRoute(policy?.id ?? '-1')), [policy?.id]); const onPressDescription = useCallback(() => Navigation.navigate(ROUTES.WORKSPACE_PROFILE_DESCRIPTION.getRoute(policy?.id ?? '-1')), [policy?.id]); const onPressShare = useCallback(() => Navigation.navigate(ROUTES.WORKSPACE_PROFILE_SHARE.getRoute(policy?.id ?? '-1')), [policy?.id]); - const onPressPlanType = useCallback(() => Navigation.navigate(ROUTES.WORKSPACE_PROFILE_PLAN.getRoute(policy?.id ?? '-1')), [policy?.id]); const policyName = policy?.name ?? ''; const policyDescription = @@ -268,22 +267,6 @@ function WorkspaceProfilePage({policyDraft, policy: policyProp, route}: Workspac </View> </OfflineWithFeedback> )} - {!readOnly && !!policy?.type && ( - <OfflineWithFeedback pendingAction={policy?.pendingFields?.type}> - <View> - <MenuItemWithTopDescription - title={PolicyUtils.getUserFriendlyWorkspaceType(policy.type)} - description={translate('workspace.common.planType')} - shouldShowRightIcon={!readOnly} - disabled={readOnly} - wrapperStyle={styles.sectionMenuItemTopDescription} - onPress={onPressPlanType} - shouldGreyOutWhenDisabled={false} - shouldUseDefaultCursorWhenDisabled - /> - </View> - </OfflineWithFeedback> - )} {!readOnly && ( <View style={[styles.flexRow, styles.mt6, styles.mnw120]}> <Button diff --git a/src/pages/workspace/WorkspaceProfilePlanTypePage.tsx b/src/pages/workspace/WorkspaceProfilePlanTypePage.tsx deleted file mode 100644 index 046a97a88164..000000000000 --- a/src/pages/workspace/WorkspaceProfilePlanTypePage.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import React, {useState} from 'react'; -import {useOnyx} from 'react-native-onyx'; -import type {ValueOf} from 'type-fest'; -import Button from '@components/Button'; -import FixedFooter from '@components/FixedFooter'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import Icon from '@components/Icon'; -import * as Expensicons from '@components/Icon/Expensicons'; -import ScreenWrapper from '@components/ScreenWrapper'; -import SelectionList from '@components/SelectionList'; -import RadioListItem from '@components/SelectionList/RadioListItem'; -import Text from '@components/Text'; -import TextLink from '@components/TextLink'; -import useLocalize from '@hooks/useLocalize'; -import useTheme from '@hooks/useTheme'; -import useThemeStyles from '@hooks/useThemeStyles'; -import Navigation from '@navigation/Navigation'; -import CardSectionUtils from '@pages/settings/Subscription/CardSection/utils'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import AccessOrNotFoundWrapper from './AccessOrNotFoundWrapper'; -import withPolicy from './withPolicy'; -import type {WithPolicyProps} from './withPolicy'; - -type WorkspacePlanTypeItem = { - value: ValueOf<typeof CONST.POLICY.TYPE>; - text: string; - alternateText: string; - keyForList: ValueOf<typeof CONST.POLICY.TYPE>; - isSelected: boolean; -}; -function WorkspaceProfilePlanTypePage({policy}: WithPolicyProps) { - const [currentPlan, setCurrentPlan] = useState(policy?.type); - const policyID = policy?.id ?? '-1'; - const {translate} = useLocalize(); - const theme = useTheme(); - const styles = useThemeStyles(); - const [privateSubscription] = useOnyx(ONYXKEYS.NVP_PRIVATE_SUBSCRIPTION); - - const workspacePlanTypes = Object.values(CONST.POLICY.TYPE) - .filter((type) => type !== CONST.POLICY.TYPE.PERSONAL) - .map<WorkspacePlanTypeItem>((policyType) => ({ - value: policyType, - text: translate(`workspace.planTypePage.planTypes.${policyType as Exclude<typeof policyType, 'personal'>}.label`), - alternateText: translate(`workspace.planTypePage.planTypes.${policyType as Exclude<typeof policyType, 'personal'>}.description`), - keyForList: policyType, - isSelected: policyType === currentPlan, - })) - .reverse(); - - const isControl = policy?.type === CONST.POLICY.TYPE.CORPORATE; - const isAnnual = privateSubscription?.type === CONST.SUBSCRIPTION.TYPE.ANNUAL; - - const isPlanTypeLocked = isControl && isAnnual; - - const lockedIcon = (option: WorkspacePlanTypeItem) => - option.value === policy?.type ? ( - <Icon - src={Expensicons.Lock} - fill={theme.success} - /> - ) : null; - - const handleUpdatePlan = () => { - if (policy?.type === currentPlan) { - Navigation.goBack(); - return; - } - - if (policy?.type === CONST.POLICY.TYPE.TEAM && currentPlan === CONST.POLICY.TYPE.CORPORATE) { - Navigation.navigate(ROUTES.WORKSPACE_UPGRADE.getRoute(policyID)); - } - }; - - return ( - <AccessOrNotFoundWrapper - policyID={policyID} - accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]} - > - <ScreenWrapper - testID={WorkspaceProfilePlanTypePage.displayName} - shouldShowOfflineIndicatorInWideScreen - > - <HeaderWithBackButton title={translate('workspace.common.planType')} /> - {isPlanTypeLocked ? ( - <Text style={[styles.mh5, styles.mv3]}> - {translate('workspace.planTypePage.lockedPlanDescription', { - subscriptionUsersCount: privateSubscription?.userCount ?? 1, - annualSubscriptionEndDate: CardSectionUtils.getNextBillingDate(), - })}{' '} - <TextLink onPress={() => Navigation.navigate(ROUTES.SETTINGS_SUBSCRIPTION)}>{translate('workspace.planTypePage.subscriptions')}</TextLink>. - </Text> - ) : ( - <Text style={[styles.mh5, styles.mv3]}> - {translate('workspace.planTypePage.description')}{' '} - <TextLink href={CONST.PLAN_TYPES_AND_PRICING_HELP_URL}>{translate('workspace.planTypePage.subscriptionLink')}</TextLink>. - </Text> - )} - <SelectionList - shouldIgnoreFocus - sections={[{data: workspacePlanTypes, isDisabled: isPlanTypeLocked}]} - ListItem={RadioListItem} - onSelectRow={(option) => { - setCurrentPlan(option.value); - }} - rightHandSideComponent={isPlanTypeLocked ? lockedIcon : null} - shouldUpdateFocusedIndex - shouldSingleExecuteRowSelect - initiallyFocusedOptionKey={workspacePlanTypes.find((mode) => mode.isSelected)?.keyForList} - /> - <FixedFooter> - <Button - success - large - text={isPlanTypeLocked ? translate('common.buttonConfirm') : translate('common.save')} - style={styles.mt6} - onPress={handleUpdatePlan} - /> - </FixedFooter> - </ScreenWrapper> - </AccessOrNotFoundWrapper> - ); -} - -WorkspaceProfilePlanTypePage.displayName = 'WorkspaceProfilePlanTypePage'; - -export default withPolicy(WorkspaceProfilePlanTypePage); diff --git a/src/pages/workspace/WorkspacesListRow.tsx b/src/pages/workspace/WorkspacesListRow.tsx index 684f7a080e2e..5569d4fb3d70 100644 --- a/src/pages/workspace/WorkspacesListRow.tsx +++ b/src/pages/workspace/WorkspacesListRow.tsx @@ -1,4 +1,4 @@ -import React, {useRef, useState} from 'react'; +import React, {useMemo, useRef, useState} from 'react'; import {View} from 'react-native'; import type {StyleProp, ViewStyle} from 'react-native'; import type {ValueOf} from 'type-fest'; @@ -18,7 +18,6 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; -import {getUserFriendlyWorkspaceType} from '@libs/PolicyUtils'; import type {AvatarSource} from '@libs/UserUtils'; import type {AnchorPosition} from '@styles/index'; import variables from '@styles/variables'; @@ -117,6 +116,17 @@ function WorkspacesListRow({ const ownerDetails = ownerAccountID && PersonalDetailsUtils.getPersonalDetailsByIDs([ownerAccountID], currentUserPersonalDetails.accountID).at(0); + const userFriendlyWorkspaceType = useMemo(() => { + switch (workspaceType) { + case CONST.POLICY.TYPE.CORPORATE: + return translate('workspace.type.control'); + case CONST.POLICY.TYPE.TEAM: + return translate('workspace.type.collect'); + default: + return translate('workspace.type.free'); + } + }, [workspaceType, translate]); + if (layoutWidth === CONST.LAYOUT_WIDTH.NONE) { // To prevent layout from jumping or rendering for a split second, when // isWide is undefined we don't assume anything and simply return null. @@ -226,14 +236,12 @@ function WorkspacesListRow({ additionalStyles={styles.workspaceTypeWrapper} /> <View> - {!!workspaceType && ( - <Text - numberOfLines={1} - style={[styles.labelStrong, isDeleted ? styles.offlineFeedback.deleted : {}]} - > - {getUserFriendlyWorkspaceType(workspaceType)} - </Text> - )} + <Text + numberOfLines={1} + style={[styles.labelStrong, isDeleted ? styles.offlineFeedback.deleted : {}]} + > + {userFriendlyWorkspaceType} + </Text> <Text numberOfLines={1} style={[styles.textMicro, styles.textSupporting, isDeleted ? styles.offlineFeedback.deleted : {}]} diff --git a/src/pages/workspace/upgrade/GenericFeaturesView.tsx b/src/pages/workspace/upgrade/GenericFeaturesView.tsx deleted file mode 100644 index c181af37f483..000000000000 --- a/src/pages/workspace/upgrade/GenericFeaturesView.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from 'react'; -import {View} from 'react-native'; -import Button from '@components/Button'; -import Icon from '@components/Icon'; -import * as Illustrations from '@components/Icon/Illustrations'; -import Text from '@components/Text'; -import TextLink from '@components/TextLink'; -import useLocalize from '@hooks/useLocalize'; -import useResponsiveLayout from '@hooks/useResponsiveLayout'; -import useThemeStyles from '@hooks/useThemeStyles'; -import Navigation from '@libs/Navigation/Navigation'; -import ROUTES from '@src/ROUTES'; - -type GenericFeaturesViewProps = { - buttonDisabled?: boolean; - loading?: boolean; - onUpgrade: () => void; -}; - -function GenericFeaturesView({onUpgrade, buttonDisabled, loading}: GenericFeaturesViewProps) { - const styles = useThemeStyles(); - const {translate} = useLocalize(); - const {isExtraSmallScreenWidth} = useResponsiveLayout(); - - const benefits = [ - translate('workspace.upgrade.commonFeatures.benefits.benefit1'), - translate('workspace.upgrade.commonFeatures.benefits.benefit2'), - translate('workspace.upgrade.commonFeatures.benefits.benefit3'), - translate('workspace.upgrade.commonFeatures.benefits.benefit4'), - ]; - - return ( - <View style={[styles.m5, styles.workspaceUpgradeIntroBox({isExtraSmallScreenWidth})]}> - <View style={[styles.mb3]}> - <Icon - src={Illustrations.ShieldYellow} - width={48} - height={48} - /> - </View> - <View style={styles.mb5}> - <Text style={[styles.textHeadlineH1, styles.mb4]}>{translate('workspace.upgrade.commonFeatures.title')}</Text> - <Text style={[styles.textNormal, styles.textSupporting, styles.mb4]}>{translate('workspace.upgrade.commonFeatures.note')}</Text> - {benefits.map((benefit) => ( - <View - key={benefit} - style={[styles.pl2, styles.flexRow]} - > - <Text style={[styles.textNormal, styles.textSupporting]}>• </Text> - <Text style={[styles.textNormal, styles.textSupporting]}>{benefit}</Text> - </View> - ))} - <Text style={[styles.textNormal, styles.textSupporting, styles.mt4]}> - {translate('workspace.upgrade.commonFeatures.benefits.note')}{' '} - <TextLink - style={[styles.link]} - onPress={() => Navigation.navigate(ROUTES.SETTINGS_SUBSCRIPTION)} - > - {translate('workspace.upgrade.commonFeatures.benefits.learnMore')} - </TextLink>{' '} - {translate('workspace.upgrade.commonFeatures.benefits.pricing')} - </Text> - </View> - <Button - isLoading={loading} - text={translate('common.upgrade')} - success - onPress={onUpgrade} - isDisabled={buttonDisabled} - large - /> - </View> - ); -} -export default GenericFeaturesView; diff --git a/src/pages/workspace/upgrade/UpgradeIntro.tsx b/src/pages/workspace/upgrade/UpgradeIntro.tsx index df6306c79023..0483586f282e 100644 --- a/src/pages/workspace/upgrade/UpgradeIntro.tsx +++ b/src/pages/workspace/upgrade/UpgradeIntro.tsx @@ -15,12 +15,11 @@ import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; -import GenericFeaturesView from './GenericFeaturesView'; type Props = { buttonDisabled?: boolean; loading?: boolean; - feature?: ValueOf<typeof CONST.UPGRADE_FEATURE_INTRO_MAPPING>; + feature: ValueOf<typeof CONST.UPGRADE_FEATURE_INTRO_MAPPING>; onUpgrade: () => void; isCategorizing?: boolean; }; @@ -30,15 +29,6 @@ function UpgradeIntro({feature, onUpgrade, buttonDisabled, loading, isCategorizi const {isExtraSmallScreenWidth} = useResponsiveLayout(); const {translate} = useLocalize(); - if (!feature) { - return ( - <GenericFeaturesView - onUpgrade={onUpgrade} - buttonDisabled={buttonDisabled} - loading={loading} - /> - ); - } const isIllustration = feature.icon in Illustrations; const iconSrc = isIllustration ? Illustrations[feature.icon as keyof typeof Illustrations] : Expensicon[feature.icon as keyof typeof Expensicon]; const iconAdditionalStyles = feature.id === CONST.UPGRADE_FEATURE_INTRO_MAPPING.approvals.id ? styles.br0 : undefined; diff --git a/src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx b/src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx index ca1e9d6bd214..f9f90993d46a 100644 --- a/src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx +++ b/src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx @@ -41,7 +41,7 @@ function WorkspaceUpgradePage({route}: WorkspaceUpgradePageProps) { const styles = useThemeStyles(); const policyID = route.params.policyID; - const featureNameAlias = route.params.featureName && getFeatureNameAlias(route.params.featureName); + const featureNameAlias = getFeatureNameAlias(route.params.featureName); const feature = Object.values(CONST.UPGRADE_FEATURE_INTRO_MAPPING).find((f) => f.alias === featureNameAlias); const {translate} = useLocalize(); @@ -49,7 +49,7 @@ function WorkspaceUpgradePage({route}: WorkspaceUpgradePageProps) { const qboConfig = policy?.connections?.quickbooksOnline?.config; const {isOffline} = useNetwork(); - const canPerformUpgrade = !!policy && PolicyUtils.isPolicyAdmin(policy); + const canPerformUpgrade = !!feature && !!policy && PolicyUtils.isPolicyAdmin(policy); const isUpgraded = React.useMemo(() => PolicyUtils.isControlPolicy(policy), [policy]); const perDiemCustomUnit = PolicyUtils.getPerDiemCustomUnit(policy); @@ -57,7 +57,6 @@ function WorkspaceUpgradePage({route}: WorkspaceUpgradePageProps) { const goBack = useCallback(() => { if (!feature) { - Navigation.dismissModal(); return; } switch (feature.id) {