diff --git a/native/data/sqlite-context-provider.js b/native/data/sqlite-context-provider.js --- a/native/data/sqlite-context-provider.js +++ b/native/data/sqlite-context-provider.js @@ -7,7 +7,6 @@ import { setMessageStoreMessages } from 'lib/actions/message-actions.js'; import { setThreadStoreActionType } from 'lib/actions/thread-actions'; -import { isStaff } from 'lib/shared/user-utils'; import { loginActionSources } from 'lib/types/account-types'; import { fetchNewCookieFromNativeCredentials } from 'lib/utils/action-utils'; import { getMessageForException } from 'lib/utils/errors'; @@ -15,6 +14,7 @@ import { commCoreModule } from '../native-modules'; import { useSelector } from '../redux/redux-utils'; +import { useStaffCanSee } from '../utils/staff-utils'; import { SQLiteContext } from './sqlite-context'; type Props = { @@ -30,9 +30,7 @@ ); const cookie = useSelector(state => state.cookie); const urlPrefix = useSelector(state => state.urlPrefix); - const viewerID = useSelector( - state => state.currentUserInfo && state.currentUserInfo.id, - ); + const staffCanSee = useStaffCanSee(); React.useEffect(() => { if (storeLoaded || !rehydrateConcluded) { @@ -55,7 +53,7 @@ }); setStoreLoaded(true); } catch (setStoreException) { - if (__DEV__ || (viewerID && isStaff(viewerID))) { + if (staffCanSee) { Alert.alert( `Error setting threadStore or messageStore: ${ getMessageForException(setStoreException) ?? @@ -72,7 +70,7 @@ ); setStoreLoaded(true); } catch (fetchCookieException) { - if (__DEV__ || (viewerID && isStaff(viewerID))) { + if (staffCanSee) { Alert.alert( `Error fetching new cookie from native credentials: ${ getMessageForException(fetchCookieException) ?? @@ -85,7 +83,14 @@ } } })(); - }, [storeLoaded, urlPrefix, rehydrateConcluded, cookie, dispatch, viewerID]); + }, [ + cookie, + dispatch, + rehydrateConcluded, + staffCanSee, + storeLoaded, + urlPrefix, + ]); const contextValue = React.useMemo( () => ({ diff --git a/native/input/input-state-container.react.js b/native/input/input-state-container.react.js --- a/native/input/input-state-container.react.js +++ b/native/input/input-state-container.react.js @@ -37,7 +37,6 @@ createRealThreadFromPendingThread, threadIsPending, } from 'lib/shared/thread-utils'; -import { isStaff } from 'lib/shared/user-utils'; import type { CalendarQuery } from 'lib/types/entry-types'; import type { UploadMultimediaResult, @@ -89,6 +88,7 @@ import { displayActionResultModal } from '../navigation/action-result-modal'; import { useCalendarQuery } from '../navigation/nav-selectors'; import { useSelector } from '../redux/redux-utils'; +import { useStaffCanSee } from '../utils/staff-utils'; import { InputStateContext, type PendingMultimediaUploads, @@ -117,6 +117,7 @@ +mediaReportsEnabled: boolean, +calendarQuery: () => CalendarQuery, +dispatch: Dispatch, + +staffCanSee: boolean, +dispatchActionPromise: DispatchActionPromise, +uploadMultimedia: ( multimedia: Object, @@ -841,11 +842,11 @@ } mediaProcessConfig(localMessageID: string, localID: string) { - const { hasWiFi, viewerID } = this.props; + const { hasWiFi, staffCanSee } = this.props; const onTranscodingProgress = (percent: number) => { this.setProgress(localMessageID, localID, 'transcoding', percent); }; - if (__DEV__ || (viewerID && isStaff(viewerID))) { + if (staffCanSee) { return { hasWiFi, finalFileHeaderCheck: true, @@ -1400,6 +1401,7 @@ const dispatchActionPromise = useDispatchActionPromise(); const dispatch = useDispatch(); const mediaReportsEnabled = useIsReportEnabled('mediaReports'); + const staffCanSee = useStaffCanSee(); return ( ); }, diff --git a/native/profile/profile-screen.react.js b/native/profile/profile-screen.react.js --- a/native/profile/profile-screen.react.js +++ b/native/profile/profile-screen.react.js @@ -6,7 +6,6 @@ import { logOutActionTypes, logOut } from 'lib/actions/user-actions'; import { preRequestUserStateSelector } from 'lib/selectors/account-selectors'; import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors'; -import { isStaff } from 'lib/shared/user-utils'; import type { LogOutResult } from 'lib/types/account-types'; import { type PreRequestUserState } from 'lib/types/session-types'; import { type CurrentUserInfo } from 'lib/types/user-types'; @@ -35,23 +34,9 @@ } from '../navigation/route-names'; import { useSelector } from '../redux/redux-utils'; import { type Colors, useColors, useStyles } from '../themes/colors'; +import { useStaffCanSee } from '../utils/staff-utils'; import type { ProfileNavigationProp } from './profile.react'; -type BaseProps = { - +navigation: ProfileNavigationProp<'ProfileScreen'>, - +route: NavigationRoute<'ProfileScreen'>, -}; -type Props = { - ...BaseProps, - +currentUserInfo: ?CurrentUserInfo, - +preRequestUserState: PreRequestUserState, - +logOutLoading: boolean, - +colors: Colors, - +styles: typeof unboundStyles, - +dispatchActionPromise: DispatchActionPromise, - +logOut: (preRequestUserState: PreRequestUserState) => Promise, -}; - type ProfileRowProps = { +content: string, +onPress: () => void, @@ -68,6 +53,22 @@ ); } +type BaseProps = { + +navigation: ProfileNavigationProp<'ProfileScreen'>, + +route: NavigationRoute<'ProfileScreen'>, +}; +type Props = { + ...BaseProps, + +currentUserInfo: ?CurrentUserInfo, + +preRequestUserState: PreRequestUserState, + +logOutLoading: boolean, + +colors: Colors, + +styles: typeof unboundStyles, + +dispatchActionPromise: DispatchActionPromise, + +logOut: (preRequestUserState: PreRequestUserState) => Promise, + +staffCanSee: boolean, +}; + class ProfileScreen extends React.PureComponent { get username() { return this.props.currentUserInfo && !this.props.currentUserInfo.anonymous @@ -85,10 +86,8 @@ render() { let appearancePreferences, developerTools, defaultNotifications; - if ( - (this.props.currentUserInfo && isStaff(this.props.currentUserInfo.id)) || - __DEV__ - ) { + const { staffCanSee } = this.props; + if (staffCanSee) { appearancePreferences = ( ); @@ -355,6 +354,7 @@ const styles = useStyles(unboundStyles); const callLogOut = useServerCall(logOut); const dispatchActionPromise = useDispatchActionPromise(); + const staffCanSee = useStaffCanSee(); return ( ); }, diff --git a/native/utils/staff-utils.js b/native/utils/staff-utils.js new file mode 100644 --- /dev/null +++ b/native/utils/staff-utils.js @@ -0,0 +1,19 @@ +// @flow + +import { useSelector } from 'react-redux'; + +import { isStaff } from 'lib/shared/user-utils'; + +const isStaffRelease = false; + +function useStaffCanSee(): boolean { + const isCurrentUserStaff = useSelector( + state => + state.currentUserInfo && + state.currentUserInfo.id && + isStaff(state.currentUserInfo.id), + ); + return __DEV__ || isStaffRelease || isCurrentUserStaff; +} + +export { useStaffCanSee };