From adf4099fd9f8ee95411a268d028b04565ff1d2ed Mon Sep 17 00:00:00 2001 From: dragnoir Date: Fri, 10 May 2024 22:21:37 +0100 Subject: [PATCH 01/10] Fix: ws options available from all devices for same user --- src/libs/PolicyUtils.ts | 4 ++-- src/pages/workspace/WorkspaceInitialPage.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index adc0bd295ee5..0f031c8ed521 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -131,8 +131,8 @@ function isExpensifyTeam(email: string | undefined): boolean { /** * Checks if the current user is an admin of the policy. */ -const isPolicyAdmin = (policy: OnyxEntry | EmptyObject): boolean => policy?.role === CONST.POLICY.ROLE.ADMIN; - +const isPolicyAdmin = (policy: OnyxEntry | EmptyObject): boolean => + policy?.role === CONST.POLICY.ROLE.ADMIN || policy?.employeeList?.[policy?.owner]?.role === CONST.POLICY.ROLE.ADMIN; /** * Checks if the policy is a free group policy. */ diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index ec33a1ab2aa7..aee812402e77 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -142,7 +142,7 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAcc const hasMembersError = PolicyUtils.hasEmployeeListError(policy); const hasPolicyCategoryError = PolicyUtils.hasPolicyCategoriesError(policyCategories); const hasGeneralSettingsError = !isEmptyObject(policy?.errorFields?.generalSettings ?? {}) || !isEmptyObject(policy?.errorFields?.avatarURL ?? {}); - const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policy); + const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policyProp); const isPaidGroupPolicy = PolicyUtils.isPaidGroupPolicy(policy); const isFreeGroupPolicy = PolicyUtils.isFreeGroupPolicy(policy); const [featureStates, setFeatureStates] = useState(policyFeatureStates); From 16145e9c80624ec5e098be7674d9950a438a15b6 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Mon, 20 May 2024 09:58:17 +0100 Subject: [PATCH 02/10] revert isPolicyAdmin --- src/libs/PolicyUtils.ts | 88 +++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index 4cf205cdcf71..b704efe04441 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -10,7 +10,9 @@ import type {PolicyFeatureName, Rate, Tenant} from '@src/types/onyx/Policy'; import type PolicyEmployee from '@src/types/onyx/PolicyEmployee'; import type {EmptyObject} from '@src/types/utils/EmptyObject'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import Navigation from './Navigation/Navigation'; +import getPolicyIDFromState from './Navigation/getPolicyIDFromState'; +import Navigation, {navigationRef} from './Navigation/Navigation'; +import type {RootStackParamList, State} from './Navigation/types'; import * as NetworkStore from './Network/NetworkStore'; import {getAccountIDsByLogins, getLoginsByAccountIDs, getPersonalDetailByEmail} from './PersonalDetailsUtils'; @@ -129,8 +131,7 @@ function isExpensifyTeam(email: string | undefined): boolean { /** * Checks if the current user is an admin of the policy. */ -const isPolicyAdmin = (policy: OnyxEntry | EmptyObject): boolean => - policy?.role === CONST.POLICY.ROLE.ADMIN || policy?.employeeList?.[policy?.owner]?.role === CONST.POLICY.ROLE.ADMIN; +const isPolicyAdmin = (policy: OnyxEntry | EmptyObject): boolean => policy?.role === CONST.POLICY.ROLE.ADMIN; /** * Checks if the policy is a free group policy. */ @@ -209,7 +210,7 @@ function getTagListName(policyTagList: OnyxEntry, orderWeight: nu /** * Gets all tag lists of a policy */ -function getTagLists(policyTagList: OnyxEntry): Array> { +function getTagLists(policyTagList: OnyxEntry): Array { if (isEmptyObject(policyTagList)) { return []; } @@ -222,7 +223,7 @@ function getTagLists(policyTagList: OnyxEntry): Array, tagIndex: number): ValueOf { +function getTagList(policyTagList: OnyxEntry, tagIndex: number): PolicyTagList[keyof PolicyTagList] { const tagLists = getTagLists(policyTagList); return ( @@ -365,6 +366,13 @@ function getPersonalPolicy() { return Object.values(allPolicies ?? {}).find((policy) => policy?.type === CONST.POLICY.TYPE.PERSONAL); } +/** + * Get the currently selected policy ID stored in the navigation state. + */ +function getPolicyIDFromNavigationState() { + return getPolicyIDFromState(navigationRef.getRootState() as State); +} + function getAdminEmployees(policy: OnyxEntry): PolicyEmployee[] { return Object.values(policy?.employeeList ?? {}).filter((employee) => employee.role === CONST.POLICY.ROLE.ADMIN); } @@ -404,58 +412,54 @@ function findCurrentXeroOrganization(tenants: Tenant[] | undefined, organization return tenants?.find((tenant) => tenant.id === organizationID); } -function getCurrentXeroOrganizationName(policy: Policy | undefined): string | undefined { - return findCurrentXeroOrganization(getXeroTenants(policy), policy?.connections?.xero?.config?.tenantID)?.name; -} - export { - canEditTaxRate, - extractPolicyIDFromPath, getActivePolicies, - getAdminEmployees, - getCleanedTagName, - getCountOfEnabledTagsOfList, - getIneligibleInvitees, - getMemberAccountIDsForWorkspace, - getNumericValue, - isMultiLevelTags, - getPathWithoutPolicyID, - getPersonalPolicy, - getPolicy, - getPolicyBrickRoadIndicatorStatus, - getPolicyEmployeeListByIdWithoutCurrentUser, - getSortedTagKeys, - getSubmitToAccountID, - getTagList, - getTagListName, - getTagLists, - getTaxByID, - getUnitRateValue, - goBackFromInvalidPolicy, hasAccountingConnections, - hasCustomUnitsError, hasEmployeeListError, - hasPolicyCategoriesError, hasPolicyError, hasPolicyErrorFields, - hasTaxRateError, + hasCustomUnitsError, + getNumericValue, + getUnitRateValue, + getPolicyBrickRoadIndicatorStatus, + shouldShowPolicy, isExpensifyTeam, - isFreeGroupPolicy, isInstantSubmitEnabled, - isPaidGroupPolicy, - isPendingDeletePolicy, + isFreeGroupPolicy, isPolicyAdmin, + isTaxTrackingEnabled, + isSubmitAndClose, + getMemberAccountIDsForWorkspace, + getIneligibleInvitees, + getTagLists, + getTagListName, + getSortedTagKeys, + canEditTaxRate, + getTagList, + getCleanedTagName, + getCountOfEnabledTagsOfList, + isMultiLevelTags, + isPendingDeletePolicy, isPolicyEmployee, - isPolicyFeatureEnabled, isPolicyOwner, - isSubmitAndClose, - isTaxTrackingEnabled, - shouldShowPolicy, + isPaidGroupPolicy, + extractPolicyIDFromPath, + getPathWithoutPolicyID, + getPolicyEmployeeListByIdWithoutCurrentUser, + goBackFromInvalidPolicy, + getPersonalPolicy, + isPolicyFeatureEnabled, + hasTaxRateError, + getTaxByID, + hasPolicyCategoriesError, + getPolicyIDFromNavigationState, + getSubmitToAccountID, + getAdminEmployees, + getPolicy, getActiveAdminWorkspaces, canSendInvoice, getXeroTenants, findCurrentXeroOrganization, - getCurrentXeroOrganizationName, }; export type {MemberEmailsToAccountIDs}; From 67e0f08c2151a65789f194743c1e49caf4f8a575 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Mon, 20 May 2024 10:19:12 +0100 Subject: [PATCH 03/10] fix policyUtility --- src/libs/PolicyUtils.ts | 86 ++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 45 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index b704efe04441..6a26b1a6cfc2 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -10,9 +10,7 @@ import type {PolicyFeatureName, Rate, Tenant} from '@src/types/onyx/Policy'; import type PolicyEmployee from '@src/types/onyx/PolicyEmployee'; import type {EmptyObject} from '@src/types/utils/EmptyObject'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import getPolicyIDFromState from './Navigation/getPolicyIDFromState'; -import Navigation, {navigationRef} from './Navigation/Navigation'; -import type {RootStackParamList, State} from './Navigation/types'; +import Navigation from './Navigation/Navigation'; import * as NetworkStore from './Network/NetworkStore'; import {getAccountIDsByLogins, getLoginsByAccountIDs, getPersonalDetailByEmail} from './PersonalDetailsUtils'; @@ -132,6 +130,7 @@ function isExpensifyTeam(email: string | undefined): boolean { * Checks if the current user is an admin of the policy. */ const isPolicyAdmin = (policy: OnyxEntry | EmptyObject): boolean => policy?.role === CONST.POLICY.ROLE.ADMIN; + /** * Checks if the policy is a free group policy. */ @@ -210,7 +209,7 @@ function getTagListName(policyTagList: OnyxEntry, orderWeight: nu /** * Gets all tag lists of a policy */ -function getTagLists(policyTagList: OnyxEntry): Array { +function getTagLists(policyTagList: OnyxEntry): Array> { if (isEmptyObject(policyTagList)) { return []; } @@ -223,7 +222,7 @@ function getTagLists(policyTagList: OnyxEntry): Array, tagIndex: number): PolicyTagList[keyof PolicyTagList] { +function getTagList(policyTagList: OnyxEntry, tagIndex: number): ValueOf { const tagLists = getTagLists(policyTagList); return ( @@ -366,13 +365,6 @@ function getPersonalPolicy() { return Object.values(allPolicies ?? {}).find((policy) => policy?.type === CONST.POLICY.TYPE.PERSONAL); } -/** - * Get the currently selected policy ID stored in the navigation state. - */ -function getPolicyIDFromNavigationState() { - return getPolicyIDFromState(navigationRef.getRootState() as State); -} - function getAdminEmployees(policy: OnyxEntry): PolicyEmployee[] { return Object.values(policy?.employeeList ?? {}).filter((employee) => employee.role === CONST.POLICY.ROLE.ADMIN); } @@ -412,54 +404,58 @@ function findCurrentXeroOrganization(tenants: Tenant[] | undefined, organization return tenants?.find((tenant) => tenant.id === organizationID); } +function getCurrentXeroOrganizationName(policy: Policy | undefined): string | undefined { + return findCurrentXeroOrganization(getXeroTenants(policy), policy?.connections?.xero?.config?.tenantID)?.name; +} + export { + canEditTaxRate, + extractPolicyIDFromPath, getActivePolicies, + getAdminEmployees, + getCleanedTagName, + getCountOfEnabledTagsOfList, + getIneligibleInvitees, + getMemberAccountIDsForWorkspace, + getNumericValue, + isMultiLevelTags, + getPathWithoutPolicyID, + getPersonalPolicy, + getPolicy, + getPolicyBrickRoadIndicatorStatus, + getPolicyEmployeeListByIdWithoutCurrentUser, + getSortedTagKeys, + getSubmitToAccountID, + getTagList, + getTagListName, + getTagLists, + getTaxByID, + getUnitRateValue, + goBackFromInvalidPolicy, hasAccountingConnections, + hasCustomUnitsError, hasEmployeeListError, + hasPolicyCategoriesError, hasPolicyError, hasPolicyErrorFields, - hasCustomUnitsError, - getNumericValue, - getUnitRateValue, - getPolicyBrickRoadIndicatorStatus, - shouldShowPolicy, + hasTaxRateError, isExpensifyTeam, - isInstantSubmitEnabled, isFreeGroupPolicy, - isPolicyAdmin, - isTaxTrackingEnabled, - isSubmitAndClose, - getMemberAccountIDsForWorkspace, - getIneligibleInvitees, - getTagLists, - getTagListName, - getSortedTagKeys, - canEditTaxRate, - getTagList, - getCleanedTagName, - getCountOfEnabledTagsOfList, - isMultiLevelTags, + isInstantSubmitEnabled, + isPaidGroupPolicy, isPendingDeletePolicy, + isPolicyAdmin, isPolicyEmployee, - isPolicyOwner, - isPaidGroupPolicy, - extractPolicyIDFromPath, - getPathWithoutPolicyID, - getPolicyEmployeeListByIdWithoutCurrentUser, - goBackFromInvalidPolicy, - getPersonalPolicy, isPolicyFeatureEnabled, - hasTaxRateError, - getTaxByID, - hasPolicyCategoriesError, - getPolicyIDFromNavigationState, - getSubmitToAccountID, - getAdminEmployees, - getPolicy, + isPolicyOwner, + isSubmitAndClose, + isTaxTrackingEnabled, + shouldShowPolicy, getActiveAdminWorkspaces, canSendInvoice, getXeroTenants, findCurrentXeroOrganization, + getCurrentXeroOrganizationName, }; export type {MemberEmailsToAccountIDs}; From 7eaeda0835c59fc2918e48d4d12be0f2266afbff Mon Sep 17 00:00:00 2001 From: dragnoir Date: Mon, 20 May 2024 10:28:59 +0100 Subject: [PATCH 04/10] fix role not available --- src/pages/workspace/WorkspaceInitialPage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index 1563d06d591e..90558429b859 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -13,6 +13,7 @@ import * as Expensicons from '@components/Icon/Expensicons'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; +import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import usePermissions from '@hooks/usePermissions'; @@ -142,7 +143,8 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAcc const hasMembersError = PolicyUtils.hasEmployeeListError(policy); const hasPolicyCategoryError = PolicyUtils.hasPolicyCategoriesError(policyCategories); const hasGeneralSettingsError = !isEmptyObject(policy?.errorFields?.generalSettings ?? {}) || !isEmptyObject(policy?.errorFields?.avatarURL ?? {}); - const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policyProp); + const currentUserPersonalDetails = useCurrentUserPersonalDetails(); + const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policyProp) || currentUserPersonalDetails.login === policyProp?.owner; const isPaidGroupPolicy = PolicyUtils.isPaidGroupPolicy(policy); const isFreeGroupPolicy = PolicyUtils.isFreeGroupPolicy(policy); const [featureStates, setFeatureStates] = useState(policyFeatureStates); From 9ec30aca6bb35b62f8ab1e6c3386e69a9f6f05a8 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Mon, 20 May 2024 10:59:28 +0100 Subject: [PATCH 05/10] fix admin when not on policy --- src/pages/workspace/WorkspaceInitialPage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index 90558429b859..3acbcfd2ef32 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -144,7 +144,8 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAcc const hasPolicyCategoryError = PolicyUtils.hasPolicyCategoriesError(policyCategories); const hasGeneralSettingsError = !isEmptyObject(policy?.errorFields?.generalSettings ?? {}) || !isEmptyObject(policy?.errorFields?.avatarURL ?? {}); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); - const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policyProp) || currentUserPersonalDetails.login === policyProp?.owner; + const employee = policyProp?.employeeList?.[currentUserPersonalDetails.login ?? ''] ?? {}; + const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policyProp) || (employee && employee.role === CONST.POLICY.ROLE.ADMIN); const isPaidGroupPolicy = PolicyUtils.isPaidGroupPolicy(policy); const isFreeGroupPolicy = PolicyUtils.isFreeGroupPolicy(policy); const [featureStates, setFeatureStates] = useState(policyFeatureStates); From 349b220331a7edc7e1002d1de8bb22599c7b6991 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Wed, 22 May 2024 12:12:32 +0100 Subject: [PATCH 06/10] move employe check into isPolicyAdmin --- src/libs/PolicyUtils.ts | 3 ++- src/pages/workspace/WorkspaceInitialPage.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index 6a26b1a6cfc2..9be3c3e3edaa 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -129,7 +129,8 @@ function isExpensifyTeam(email: string | undefined): boolean { /** * Checks if the current user is an admin of the policy. */ -const isPolicyAdmin = (policy: OnyxEntry | EmptyObject): boolean => policy?.role === CONST.POLICY.ROLE.ADMIN; +const isPolicyAdmin = (policy: OnyxEntry | EmptyObject, currentUserLogin?: string): boolean => + policy?.role === CONST.POLICY.ROLE.ADMIN || (!!currentUserLogin && currentUserLogin === CONST.POLICY.ROLE.ADMIN); /** * Checks if the policy is a free group policy. diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index 3acbcfd2ef32..b5ca5a37c5a0 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -145,7 +145,7 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAcc const hasGeneralSettingsError = !isEmptyObject(policy?.errorFields?.generalSettings ?? {}) || !isEmptyObject(policy?.errorFields?.avatarURL ?? {}); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const employee = policyProp?.employeeList?.[currentUserPersonalDetails.login ?? ''] ?? {}; - const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policyProp) || (employee && employee.role === CONST.POLICY.ROLE.ADMIN); + const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policyProp, employee.role); const isPaidGroupPolicy = PolicyUtils.isPaidGroupPolicy(policy); const isFreeGroupPolicy = PolicyUtils.isFreeGroupPolicy(policy); const [featureStates, setFeatureStates] = useState(policyFeatureStates); From 64a9e26f9d3ee2e3318c1e07aff4bf9774a87033 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Wed, 22 May 2024 18:14:47 +0100 Subject: [PATCH 07/10] better approach --- src/libs/PolicyUtils.ts | 2 +- src/pages/workspace/WorkspaceInitialPage.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index 9be3c3e3edaa..210564ae1594 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -130,7 +130,7 @@ function isExpensifyTeam(email: string | undefined): boolean { * Checks if the current user is an admin of the policy. */ const isPolicyAdmin = (policy: OnyxEntry | EmptyObject, currentUserLogin?: string): boolean => - policy?.role === CONST.POLICY.ROLE.ADMIN || (!!currentUserLogin && currentUserLogin === CONST.POLICY.ROLE.ADMIN); + (policy?.role ?? (currentUserLogin && policy?.employeeList?.[currentUserLogin]?.role)) === CONST.POLICY.ROLE.ADMIN; /** * Checks if the policy is a free group policy. diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index b5ca5a37c5a0..597fb22f6cf3 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -144,8 +144,8 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAcc const hasPolicyCategoryError = PolicyUtils.hasPolicyCategoriesError(policyCategories); const hasGeneralSettingsError = !isEmptyObject(policy?.errorFields?.generalSettings ?? {}) || !isEmptyObject(policy?.errorFields?.avatarURL ?? {}); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); - const employee = policyProp?.employeeList?.[currentUserPersonalDetails.login ?? ''] ?? {}; - const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policyProp, employee.role); + const {login} = useCurrentUserPersonalDetails(); + const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policy, login); const isPaidGroupPolicy = PolicyUtils.isPaidGroupPolicy(policy); const isFreeGroupPolicy = PolicyUtils.isFreeGroupPolicy(policy); const [featureStates, setFeatureStates] = useState(policyFeatureStates); From 1aeaaee94af7a54092ff29bdcaf96f5a02b6923c Mon Sep 17 00:00:00 2001 From: dragnoir Date: Wed, 22 May 2024 18:21:38 +0100 Subject: [PATCH 08/10] fix lint --- src/pages/workspace/WorkspaceInitialPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index 597fb22f6cf3..4bf7bec8b5e5 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -143,7 +143,6 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, reimbursementAcc const hasMembersError = PolicyUtils.hasEmployeeListError(policy); const hasPolicyCategoryError = PolicyUtils.hasPolicyCategoriesError(policyCategories); const hasGeneralSettingsError = !isEmptyObject(policy?.errorFields?.generalSettings ?? {}) || !isEmptyObject(policy?.errorFields?.avatarURL ?? {}); - const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const {login} = useCurrentUserPersonalDetails(); const shouldShowProtectedItems = PolicyUtils.isPolicyAdmin(policy, login); const isPaidGroupPolicy = PolicyUtils.isPaidGroupPolicy(policy); From 2f349db0e7b09f5627cf39a85f600f8603f4f794 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Thu, 30 May 2024 12:52:05 +0100 Subject: [PATCH 09/10] same logic for AccessOrNotFoundWrapper --- src/pages/workspace/AccessOrNotFoundWrapper.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pages/workspace/AccessOrNotFoundWrapper.tsx b/src/pages/workspace/AccessOrNotFoundWrapper.tsx index cbc94ad37f03..cfabad927f4f 100644 --- a/src/pages/workspace/AccessOrNotFoundWrapper.tsx +++ b/src/pages/workspace/AccessOrNotFoundWrapper.tsx @@ -5,6 +5,7 @@ import {withOnyx} from 'react-native-onyx'; import type {FullPageNotFoundViewProps} from '@components/BlockingViews/FullPageNotFoundView'; import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import FullscreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; +import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import Navigation from '@libs/Navigation/Navigation'; import * as PolicyUtils from '@libs/PolicyUtils'; import NotFoundPage from '@pages/ErrorPage/NotFoundPage'; @@ -19,8 +20,8 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject'; const POLICY_ACCESS_VARIANTS = { [CONST.POLICY.ACCESS_VARIANTS.PAID]: (policy: OnyxEntry) => PolicyUtils.isPaidGroupPolicy(policy) && !!policy?.isPolicyExpenseChatEnabled, - [CONST.POLICY.ACCESS_VARIANTS.ADMIN]: (policy: OnyxEntry) => PolicyUtils.isPolicyAdmin(policy), -} as const satisfies Record boolean>; + [CONST.POLICY.ACCESS_VARIANTS.ADMIN]: (policy: OnyxEntry, login: string) => PolicyUtils.isPolicyAdmin(policy, login), +} as const satisfies Record boolean>; type PolicyAccessVariant = keyof typeof POLICY_ACCESS_VARIANTS; type AccessOrNotFoundWrapperOnyxProps = { @@ -73,7 +74,7 @@ function PageNotFoundFallback({policyID, shouldShowFullScreenFallback, fullPageN function AccessOrNotFoundWrapper({accessVariants = [], fullPageNotFoundViewProps, shouldBeBlocked, ...props}: AccessOrNotFoundWrapperProps) { const {policy, policyID, featureName, isLoadingReportData} = props; - + const {login = ''} = useCurrentUserPersonalDetails(); const isPolicyIDInRoute = !!policyID?.length; useEffect(() => { @@ -92,7 +93,7 @@ function AccessOrNotFoundWrapper({accessVariants = [], fullPageNotFoundViewProps const isPageAccessible = accessVariants.reduce((acc, variant) => { const accessFunction = POLICY_ACCESS_VARIANTS[variant]; - return acc && accessFunction(policy); + return acc && accessFunction(policy, login); }, true); const shouldShowNotFoundPage = From ca4d45f4497e7818f4e5222114b614a30b012181 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Thu, 30 May 2024 18:45:51 +0100 Subject: [PATCH 10/10] fix ts --- src/pages/workspace/AccessOrNotFoundWrapper.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pages/workspace/AccessOrNotFoundWrapper.tsx b/src/pages/workspace/AccessOrNotFoundWrapper.tsx index 781cc2a65e58..4afd3e1b31dd 100644 --- a/src/pages/workspace/AccessOrNotFoundWrapper.tsx +++ b/src/pages/workspace/AccessOrNotFoundWrapper.tsx @@ -24,13 +24,19 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject'; const ACCESS_VARIANTS = { [CONST.POLICY.ACCESS_VARIANTS.PAID]: (policy: OnyxEntry) => PolicyUtils.isPaidGroupPolicy(policy) && !!policy?.isPolicyExpenseChatEnabled, [CONST.POLICY.ACCESS_VARIANTS.ADMIN]: (policy: OnyxEntry, login: string) => PolicyUtils.isPolicyAdmin(policy, login), - [CONST.IOU.ACCESS_VARIANTS.CREATE]: (policy: OnyxEntry, report: OnyxEntry, allPolicies: OnyxCollection, iouType?: IOUType) => + [CONST.IOU.ACCESS_VARIANTS.CREATE]: ( + policy: OnyxEntry, + login: string, + report: OnyxEntry, + allPolicies: OnyxCollection, + iouType?: IOUType, + ) => !!iouType && IOUUtils.isValidMoneyRequestType(iouType) && // Allow the user to submit the expense if we are submitting the expense in global menu or the report can create the expense (isEmptyObject(report?.reportID) || ReportUtils.canCreateRequest(report, policy, iouType)) && (iouType !== CONST.IOU.TYPE.INVOICE || PolicyUtils.canSendInvoice(allPolicies)), -} as const satisfies Record, iouType?: IOUType, login: string) => boolean>; +} as const satisfies Record, iouType?: IOUType) => boolean>; type AccessVariant = keyof typeof ACCESS_VARIANTS; type AccessOrNotFoundWrapperOnyxProps = { @@ -116,7 +122,7 @@ function AccessOrNotFoundWrapper({accessVariants = [], fullPageNotFoundViewProps const isPageAccessible = accessVariants.reduce((acc, variant) => { const accessFunction = ACCESS_VARIANTS[variant]; - return acc && accessFunction(policy, report, allPolicies ?? null, iouType, login); + return acc && accessFunction(policy, login, report, allPolicies ?? null, iouType); }, true); const isPolicyNotAccessible = isEmptyObject(policy) || (Object.keys(policy).length === 1 && !isEmptyObject(policy.errors)) || !policy?.id;