From a956135ddd8685fb51d53c8651db68ac5498ec5c Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 21 Nov 2024 15:42:11 +0700 Subject: [PATCH 1/5] fix: copilot with removed access can still edit profile details --- .../Navigation/AppNavigator/AuthScreens.tsx | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index 137debc3b35a8..3d003e55e24c9 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -6,6 +6,7 @@ import Onyx, {withOnyx} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import ActiveGuidesEventListener from '@components/ActiveGuidesEventListener'; import ComposeProviders from '@components/ComposeProviders'; +import DelegateNoAccessModal from '@components/DelegateNoAccessModal'; import OptionsListContextProvider from '@components/OptionListContextProvider'; import {SearchContextProvider} from '@components/Search/SearchContext'; import {useSearchRouterContext} from '@components/Search/SearchRouter/SearchRouterContext'; @@ -17,6 +18,7 @@ import usePermissions from '@hooks/usePermissions'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; +import {disconnect} from '@libs/actions/Delegate'; import {READ_COMMANDS} from '@libs/API/types'; import HttpUtils from '@libs/HttpUtils'; import KeyboardShortcut from '@libs/KeyboardShortcut'; @@ -74,6 +76,8 @@ type AuthScreensProps = { /** Session of currently logged in user */ session: OnyxEntry; + account: OnyxEntry; + /** The report ID of the last opened public room as anonymous user */ lastOpenedPublicRoomID: OnyxEntry; @@ -224,7 +228,7 @@ const modalScreenListenersWithCancelSearch = { }, }; -function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDAppliedToClient}: AuthScreensProps) { +function AuthScreens({account, session, lastOpenedPublicRoomID, initialLastUpdateIDAppliedToClient}: AuthScreensProps) { const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); // We need to use isSmallScreenWidth for the root stack navigator @@ -242,6 +246,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie ); const modal = useRef({}); const [didPusherInit, setDidPusherInit] = useState(false); + const [isNoDelegateAccessMenuVisible, setIsNoDelegateAccessMenuVisible] = useState(false); const {isOnboardingCompleted} = useOnboardingFlowRouter(); const [initialReportID] = useState(() => { const currentURL = getCurrentUrl(); @@ -395,6 +400,17 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps }, []); + useEffect(() => { + const isActingAsDelegate = !!account?.delegatedAccess?.delegate; + const delegates = account?.delegatedAccess?.delegates ?? []; + const isAccessRemoved = delegates.findIndex((delegate) => delegate.email === session?.email) === -1; + if (!isActingAsDelegate || !isAccessRemoved) { + return; + } + disconnect(); + setIsNoDelegateAccessMenuVisible(true); + }, [account, session?.email]); + const CentralPaneScreenOptions = { headerShown: false, title: 'New Expensify', @@ -575,6 +591,11 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie + setIsNoDelegateAccessMenuVisible(false)} + delegatorEmail={account?.delegatedAccess?.delegate ?? ''} + /> {didPusherInit && } @@ -599,4 +620,7 @@ export default withOnyx({ initialLastUpdateIDAppliedToClient: { key: ONYXKEYS.ONYX_UPDATES_LAST_UPDATE_ID_APPLIED_TO_CLIENT, }, + account: { + key: ONYXKEYS.ACCOUNT, + }, })(AuthScreensMemoized); From deccf007391082d1ad9d4b5c1e302715760253be Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 25 Nov 2024 14:47:26 +0700 Subject: [PATCH 2/5] fix logic show delegate no access modal --- src/libs/Navigation/AppNavigator/AuthScreens.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index 5db1c40a22a0d..2072d93656598 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -3,6 +3,7 @@ import React, {memo, useEffect, useMemo, useRef, useState} from 'react'; import {NativeModules, View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import Onyx, {withOnyx} from 'react-native-onyx'; +import {useOnyx} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import ActiveGuidesEventListener from '@components/ActiveGuidesEventListener'; import ComposeProviders from '@components/ComposeProviders'; @@ -76,8 +77,6 @@ type AuthScreensProps = { /** Session of currently logged in user */ session: OnyxEntry; - account: OnyxEntry; - /** The report ID of the last opened public room as anonymous user */ lastOpenedPublicRoomID: OnyxEntry; @@ -228,7 +227,7 @@ const modalScreenListenersWithCancelSearch = { }, }; -function AuthScreens({account, session, lastOpenedPublicRoomID, initialLastUpdateIDAppliedToClient}: AuthScreensProps) { +function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDAppliedToClient}: AuthScreensProps) { const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); // We need to use isSmallScreenWidth for the root stack navigator @@ -238,6 +237,7 @@ function AuthScreens({account, session, lastOpenedPublicRoomID, initialLastUpdat const {canUseDefaultRooms} = usePermissions(); const {activeWorkspaceID} = useActiveWorkspace(); const {toggleSearchRouter} = useSearchRouterContext(); + const [account] = useOnyx(ONYXKEYS.ACCOUNT); const onboardingModalScreenOptions = useMemo(() => screenOptions.onboardingModalNavigator(onboardingIsMediumOrLargerScreenWidth), [screenOptions, onboardingIsMediumOrLargerScreenWidth]); const onboardingScreenOptions = useMemo( @@ -596,7 +596,10 @@ function AuthScreens({account, session, lastOpenedPublicRoomID, initialLastUpdat setIsNoDelegateAccessMenuVisible(false)} + onClose={() => { + setIsNoDelegateAccessMenuVisible(false); + Session.signOutAndRedirectToSignIn(true); + }} delegatorEmail={account?.delegatedAccess?.delegate ?? ''} /> @@ -623,7 +626,4 @@ export default withOnyx({ initialLastUpdateIDAppliedToClient: { key: ONYXKEYS.ONYX_UPDATES_LAST_UPDATE_ID_APPLIED_TO_CLIENT, }, - account: { - key: ONYXKEYS.ACCOUNT, - }, })(AuthScreensMemoized); From 20c32daa358b8c4fb6d671d041df11268df67b64 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Mon, 25 Nov 2024 15:07:54 +0700 Subject: [PATCH 3/5] fix lint --- src/libs/Navigation/AppNavigator/AuthScreens.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index 2072d93656598..a0d01c0f6ef35 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -2,8 +2,7 @@ import {findFocusedRoute} from '@react-navigation/native'; import React, {memo, useEffect, useMemo, useRef, useState} from 'react'; import {NativeModules, View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; -import Onyx, {withOnyx} from 'react-native-onyx'; -import {useOnyx} from 'react-native-onyx'; +import Onyx, {useOnyx, withOnyx} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import ActiveGuidesEventListener from '@components/ActiveGuidesEventListener'; import ComposeProviders from '@components/ComposeProviders'; From 36c3d37b7b3f451ad479f74f7de8a7b983ac1466 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 26 Nov 2024 15:52:16 +0700 Subject: [PATCH 4/5] fix: delegator email --- src/libs/Navigation/AppNavigator/AuthScreens.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index 3ff8dabcfe16e..03ee207f6c900 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -13,6 +13,7 @@ import {useSearchRouterContext} from '@components/Search/SearchRouter/SearchRout import SearchRouterModal from '@components/Search/SearchRouter/SearchRouterModal'; import TestToolsModal from '@components/TestToolsModal'; import useActiveWorkspace from '@hooks/useActiveWorkspace'; +import useDelegateUserDetails from '@hooks/useDelegateUserDetails'; import useOnboardingFlowRouter from '@hooks/useOnboardingFlow'; import usePermissions from '@hooks/usePermissions'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; @@ -250,6 +251,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie const [didPusherInit, setDidPusherInit] = useState(false); const [isNoDelegateAccessMenuVisible, setIsNoDelegateAccessMenuVisible] = useState(false); const {isOnboardingCompleted} = useOnboardingFlowRouter(); + const {delegatorEmail} = useDelegateUserDetails(); const [initialReportID] = useState(() => { const currentURL = getCurrentUrl(); const reportIdFromPath = currentURL && new URL(currentURL).pathname.match(CONST.REGEX.REPORT_ID_FROM_PATH)?.at(1); @@ -610,7 +612,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie setIsNoDelegateAccessMenuVisible(false); Session.signOutAndRedirectToSignIn(true); }} - delegatorEmail={account?.delegatedAccess?.delegate ?? ''} + delegatorEmail={delegatorEmail ?? ''} /> {didPusherInit && } From 20fd24dc8bc6458384fedc9b4cb995de645848a7 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Wed, 27 Nov 2024 11:59:55 +0700 Subject: [PATCH 5/5] update correct condition --- src/libs/Navigation/AppNavigator/AuthScreens.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index 10becfbc9a9ef..48de01ced887d 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -425,13 +425,13 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie useEffect(() => { const isActingAsDelegate = !!account?.delegatedAccess?.delegate; const delegates = account?.delegatedAccess?.delegates ?? []; - const isAccessRemoved = delegates.findIndex((delegate) => delegate.email === session?.email) === -1; + const isAccessRemoved = delegates.findIndex((delegate) => delegate.email === account?.delegatedAccess?.delegate) === -1; if (!isActingAsDelegate || !isAccessRemoved) { return; } disconnect(); setIsNoDelegateAccessMenuVisible(true); - }, [account, session?.email]); + }, [account]); const CentralPaneScreenOptions = { headerShown: false,