diff --git a/src/pages/tasks/NewTaskPage.js b/src/pages/tasks/NewTaskPage.js index f1c04a82bb0a..f69ac83a89ff 100644 --- a/src/pages/tasks/NewTaskPage.js +++ b/src/pages/tasks/NewTaskPage.js @@ -1,4 +1,4 @@ -import React, {useEffect} from 'react'; +import React, {useEffect, useMemo} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; @@ -18,7 +18,9 @@ import MenuItem from '../../components/MenuItem'; import reportPropTypes from '../reportPropTypes'; import * as TaskUtils from '../../libs/actions/Task'; import * as OptionsListUtils from '../../libs/OptionsListUtils'; +import * as ReportUtils from '../../libs/ReportUtils'; import FormAlertWithSubmitButton from '../../components/FormAlertWithSubmitButton'; +import FullPageNotFoundView from '../../components/BlockingViews/FullPageNotFoundView'; const propTypes = { /** Task Creation Data */ @@ -72,6 +74,8 @@ function NewTaskPage(props) { const [errorMessage, setErrorMessage] = React.useState(''); const [parentReport, setParentReport] = React.useState({}); + const isAllowedToCreateTask = useMemo(() => _.isEmpty(parentReport) || ReportUtils.isAllowedToComment(parentReport), [parentReport]); + useEffect(() => { setErrorMessage(''); @@ -138,52 +142,59 @@ function NewTaskPage(props) { return ( - TaskUtils.dismissModalAndClearOutTaskInfo()} - shouldShowBackButton - onBackButtonPress={() => Navigation.goBack(ROUTES.NEW_TASK_DETAILS)} - /> - - - Navigation.navigate(ROUTES.NEW_TASK_TITLE)} - shouldShowRightIcon - /> - Navigation.navigate(ROUTES.NEW_TASK_DESCRIPTION)} - shouldShowRightIcon - /> - Navigation.navigate(ROUTES.NEW_TASK_ASSIGNEE)} - shouldShowRightIcon - /> - Navigation.navigate(ROUTES.NEW_TASK_SHARE_DESTINATION)} - shouldShowRightIcon + TaskUtils.dismissModalAndClearOutTaskInfo()} + > + TaskUtils.dismissModalAndClearOutTaskInfo()} + shouldShowBackButton + onBackButtonPress={() => { + Navigation.goBack(ROUTES.NEW_TASK_DETAILS); + }} + /> + + + Navigation.navigate(ROUTES.NEW_TASK_TITLE)} + shouldShowRightIcon + /> + Navigation.navigate(ROUTES.NEW_TASK_DESCRIPTION)} + shouldShowRightIcon + /> + Navigation.navigate(ROUTES.NEW_TASK_ASSIGNEE)} + shouldShowRightIcon + /> + Navigation.navigate(ROUTES.NEW_TASK_SHARE_DESTINATION)} + shouldShowRightIcon + /> + + onSubmit()} + enabledWhenOffline + buttonText={props.translate('newTaskPage.confirmTask')} + containerStyles={[styles.mh0, styles.mt5, styles.flex1, styles.ph5]} /> - onSubmit()} - enabledWhenOffline - buttonText={props.translate('newTaskPage.confirmTask')} - containerStyles={[styles.mh0, styles.mt5, styles.flex1, styles.ph5]} - /> - + ); } diff --git a/src/pages/tasks/TaskShareDestinationSelectorModal.js b/src/pages/tasks/TaskShareDestinationSelectorModal.js index 329f4a410ccf..60201d8b21e6 100644 --- a/src/pages/tasks/TaskShareDestinationSelectorModal.js +++ b/src/pages/tasks/TaskShareDestinationSelectorModal.js @@ -1,5 +1,6 @@ /* eslint-disable es/no-optional-chaining */ -import React, {useState, useEffect} from 'react'; +import React, {useState, useEffect, useMemo} from 'react'; +import _ from 'underscore'; import {View} from 'react-native'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; @@ -16,6 +17,7 @@ import compose from '../../libs/compose'; import personalDetailsPropType from '../personalDetailsPropType'; import reportPropTypes from '../reportPropTypes'; import * as TaskUtils from '../../libs/actions/Task'; +import * as ReportUtils from '../../libs/ReportUtils'; import ROUTES from '../../ROUTES'; const propTypes = { @@ -46,17 +48,29 @@ function TaskShareDestinationSelectorModal(props) { const [filteredPersonalDetails, setFilteredPersonalDetails] = useState([]); const [filteredUserToInvite, setFilteredUserToInvite] = useState(null); + // Filter out all the reports where user is not allowed to create task + const filteredReports = useMemo(() => { + const reports = {}; + _.keys(props.reports).forEach((reportKey) => { + if (!ReportUtils.isAllowedToComment(props.reports[reportKey])) { + return; + } + reports[reportKey] = props.reports[reportKey]; + }); + return reports; + }, [props.reports]); + useEffect(() => { - const results = OptionsListUtils.getShareDestinationOptions(props.reports, props.personalDetails, props.betas, '', [], CONST.EXPENSIFY_EMAILS, true); + const results = OptionsListUtils.getShareDestinationOptions(filteredReports, props.personalDetails, props.betas, '', [], CONST.EXPENSIFY_EMAILS, true); setFilteredUserToInvite(results.userToInvite); setFilteredRecentReports(results.recentReports); setFilteredPersonalDetails(results.personalDetails); - }, [props]); + }, [props, filteredReports]); useEffect(() => { const {recentReports, personalDetails, userToInvite} = OptionsListUtils.getShareDestinationOptions( - props.reports, + filteredReports, props.personalDetails, props.betas, searchValue.trim(), @@ -70,7 +84,7 @@ function TaskShareDestinationSelectorModal(props) { setFilteredUserToInvite(userToInvite); setFilteredRecentReports(recentReports); setFilteredPersonalDetails(personalDetails); - }, [props, searchValue]); + }, [props, searchValue, filteredReports]); const onChangeText = (newSearchTerm = '') => { setSearchValue(newSearchTerm);