From cc304039429e9ab9bd91f41110a866ea79de905f Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 31 May 2023 20:40:31 +0100 Subject: [PATCH 1/9] set initial task title and description values from Onyx if present --- src/pages/tasks/NewTaskDetailsPage.js | 30 +++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/pages/tasks/NewTaskDetailsPage.js b/src/pages/tasks/NewTaskDetailsPage.js index b390066529d9..e90f340b89ab 100644 --- a/src/pages/tasks/NewTaskDetailsPage.js +++ b/src/pages/tasks/NewTaskDetailsPage.js @@ -1,4 +1,4 @@ -import React, {useRef} from 'react'; +import React, {useEffect, useRef, useState} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import PropTypes from 'prop-types'; @@ -20,15 +20,33 @@ const propTypes = { /** Beta features list */ betas: PropTypes.arrayOf(PropTypes.string), + /** Task title and description data */ + task: PropTypes.shape({ + title: PropTypes.string, + description: PropTypes.string, + }), + ...withLocalizePropTypes, }; const defaultProps = { betas: [], + task: {}, }; const NewTaskPage = (props) => { const inputRef = useRef(); + const [taskTitle, setTaskTitle] = useState(props.task.title); + const [taskDescription, setTaskDescription] = useState(props.task.description); + + useEffect(() => { + if (taskTitle !== props.task.title) { + setTaskTitle(props.task.title); + } + if (taskDescription !== props.task.description) { + setTaskDescription(props.task.description); + } + }, [props.task, taskTitle, taskDescription]); /** * @param {Object} values - form input values passed by the Form component @@ -80,13 +98,18 @@ const NewTaskPage = (props) => { ref={(el) => (inputRef.current = el)} inputID="taskTitle" label={props.translate('newTaskPage.title')} + defaultValue={props.task.title} + value={taskTitle} + onChangeText={(text) => setTaskTitle(text)} /> setTaskDescription(text)} /> @@ -103,6 +126,9 @@ export default compose( betas: { key: ONYXKEYS.BETAS, }, + task: { + key: ONYXKEYS.TASK, + }, }), withLocalize, )(NewTaskPage); From 18b6d64e7f3b6ca6d8b6f47447431fbd67bb1340 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Thu, 1 Jun 2023 22:40:46 +0100 Subject: [PATCH 2/9] clear out task data when the assign task flow is explicitly closed --- src/pages/tasks/NewTaskDescriptionPage.js | 5 ++++- src/pages/tasks/NewTaskDetailsPage.js | 6 ++++-- src/pages/tasks/NewTaskPage.js | 5 ++++- src/pages/tasks/NewTaskTitlePage.js | 5 ++++- src/pages/tasks/TaskDescriptionPage.js | 5 ++++- src/pages/tasks/TaskTitlePage.js | 5 ++++- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/pages/tasks/NewTaskDescriptionPage.js b/src/pages/tasks/NewTaskDescriptionPage.js index 0d2c7ff7fff4..d8e154cdf522 100644 --- a/src/pages/tasks/NewTaskDescriptionPage.js +++ b/src/pages/tasks/NewTaskDescriptionPage.js @@ -70,7 +70,10 @@ const NewTaskDescriptionPage = (props) => { > Navigation.dismissModal()} + onCloseButtonPress={() => { + Navigation.dismissModal(); + TaskUtils.clearOutTaskInfo(); + }} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} /> diff --git a/src/pages/tasks/NewTaskDetailsPage.js b/src/pages/tasks/NewTaskDetailsPage.js index e90f340b89ab..e7305bfedb9c 100644 --- a/src/pages/tasks/NewTaskDetailsPage.js +++ b/src/pages/tasks/NewTaskDetailsPage.js @@ -81,7 +81,10 @@ const NewTaskPage = (props) => { > Navigation.dismissModal()} + onCloseButtonPress={() => { + Navigation.dismissModal(); + TaskUtils.clearOutTaskInfo(); + }} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} /> @@ -98,7 +101,6 @@ const NewTaskPage = (props) => { ref={(el) => (inputRef.current = el)} inputID="taskTitle" label={props.translate('newTaskPage.title')} - defaultValue={props.task.title} value={taskTitle} onChangeText={(text) => setTaskTitle(text)} /> diff --git a/src/pages/tasks/NewTaskPage.js b/src/pages/tasks/NewTaskPage.js index d6e13218423d..de63453817e9 100644 --- a/src/pages/tasks/NewTaskPage.js +++ b/src/pages/tasks/NewTaskPage.js @@ -121,7 +121,10 @@ const NewTaskPage = (props) => { Navigation.dismissModal()} + onCloseButtonPress={() => { + Navigation.dismissModal(); + TaskUtils.clearOutTaskInfo(); + }} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} /> diff --git a/src/pages/tasks/NewTaskTitlePage.js b/src/pages/tasks/NewTaskTitlePage.js index 09d082fba080..b39fdc2a9c3f 100644 --- a/src/pages/tasks/NewTaskTitlePage.js +++ b/src/pages/tasks/NewTaskTitlePage.js @@ -78,7 +78,10 @@ const NewTaskTitlePage = (props) => { > Navigation.dismissModal()} + onCloseButtonPress={() => { + Navigation.dismissModal(); + TaskUtils.clearOutTaskInfo(); + }} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} /> diff --git a/src/pages/tasks/TaskDescriptionPage.js b/src/pages/tasks/TaskDescriptionPage.js index d96682151f18..0e70ae8380ee 100644 --- a/src/pages/tasks/TaskDescriptionPage.js +++ b/src/pages/tasks/TaskDescriptionPage.js @@ -75,7 +75,10 @@ function TaskDescriptionPage(props) { title={props.translate('newTaskPage.task')} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} - onCloseButtonPress={() => Navigation.dismissModal(true)} + onCloseButtonPress={() => { + Navigation.dismissModal(true) + TaskUtils.clearOutTaskInfo(); + }} />
Navigation.goBack()} - onCloseButtonPress={() => Navigation.dismissModal(true)} + onCloseButtonPress={() => { + Navigation.dismissModal(true); + TaskUtils.clearOutTaskInfo(); + }} /> Date: Fri, 2 Jun 2023 21:12:15 +0100 Subject: [PATCH 3/9] add a utility method to dismiss the task modal and clear the task data in the store --- src/libs/actions/Task.js | 9 +++++++++ src/pages/tasks/NewTaskDescriptionPage.js | 5 +---- src/pages/tasks/NewTaskDetailsPage.js | 5 +---- src/pages/tasks/NewTaskPage.js | 5 +---- src/pages/tasks/NewTaskTitlePage.js | 5 +---- src/pages/tasks/TaskDescriptionPage.js | 5 +---- src/pages/tasks/TaskTitlePage.js | 5 +---- 7 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index da751e4209a8..1a9467a45c20 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -585,6 +585,14 @@ function isTaskCanceled(taskReport) { return taskReport.stateNum === CONST.REPORT.STATE_NUM.SUBMITTED && taskReport.statusNum === CONST.REPORT.STATUS.CLOSED; } +/** + * Closes the current open task modal and clears out the task info from the store. + */ +function dismissModalAndClearOutTaskInfo() { + Navigation.dismissModal(); + clearOutTaskInfo(); +} + export { createTaskAndNavigate, editTaskAndNavigate, @@ -602,4 +610,5 @@ export { getShareDestination, cancelTask, isTaskCanceled, + dismissModalAndClearOutTaskInfo, }; diff --git a/src/pages/tasks/NewTaskDescriptionPage.js b/src/pages/tasks/NewTaskDescriptionPage.js index d8e154cdf522..55b401ba6962 100644 --- a/src/pages/tasks/NewTaskDescriptionPage.js +++ b/src/pages/tasks/NewTaskDescriptionPage.js @@ -70,10 +70,7 @@ const NewTaskDescriptionPage = (props) => { > { - Navigation.dismissModal(); - TaskUtils.clearOutTaskInfo(); - }} + onCloseButtonPress={() => TaskUtils.dismissModalAndClearOutTaskInfo()} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} /> diff --git a/src/pages/tasks/NewTaskDetailsPage.js b/src/pages/tasks/NewTaskDetailsPage.js index e7305bfedb9c..aed618edacb7 100644 --- a/src/pages/tasks/NewTaskDetailsPage.js +++ b/src/pages/tasks/NewTaskDetailsPage.js @@ -81,10 +81,7 @@ const NewTaskPage = (props) => { > { - Navigation.dismissModal(); - TaskUtils.clearOutTaskInfo(); - }} + onCloseButtonPress={() => TaskUtils.dismissModalAndClearOutTaskInfo()} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} /> diff --git a/src/pages/tasks/NewTaskPage.js b/src/pages/tasks/NewTaskPage.js index de63453817e9..2bfa898a88e9 100644 --- a/src/pages/tasks/NewTaskPage.js +++ b/src/pages/tasks/NewTaskPage.js @@ -121,10 +121,7 @@ const NewTaskPage = (props) => { { - Navigation.dismissModal(); - TaskUtils.clearOutTaskInfo(); - }} + onCloseButtonPress={() => TaskUtils.dismissModalAndClearOutTaskInfo()} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} /> diff --git a/src/pages/tasks/NewTaskTitlePage.js b/src/pages/tasks/NewTaskTitlePage.js index b39fdc2a9c3f..d2764b1a09b8 100644 --- a/src/pages/tasks/NewTaskTitlePage.js +++ b/src/pages/tasks/NewTaskTitlePage.js @@ -78,10 +78,7 @@ const NewTaskTitlePage = (props) => { > { - Navigation.dismissModal(); - TaskUtils.clearOutTaskInfo(); - }} + onCloseButtonPress={() => TaskUtils.dismissModalAndClearOutTaskInfo()} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} /> diff --git a/src/pages/tasks/TaskDescriptionPage.js b/src/pages/tasks/TaskDescriptionPage.js index 0e70ae8380ee..afb93a32af10 100644 --- a/src/pages/tasks/TaskDescriptionPage.js +++ b/src/pages/tasks/TaskDescriptionPage.js @@ -75,10 +75,7 @@ function TaskDescriptionPage(props) { title={props.translate('newTaskPage.task')} shouldShowBackButton onBackButtonPress={() => Navigation.goBack()} - onCloseButtonPress={() => { - Navigation.dismissModal(true) - TaskUtils.clearOutTaskInfo(); - }} + onCloseButtonPress={() => TaskUtils.dismissModalAndClearOutTaskInfo()} /> Navigation.goBack()} - onCloseButtonPress={() => { - Navigation.dismissModal(true); - TaskUtils.clearOutTaskInfo(); - }} + onCloseButtonPress={() => TaskUtils.dismissModalAndClearOutTaskInfo()} /> Date: Sun, 4 Jun 2023 16:51:10 +0100 Subject: [PATCH 4/9] remove unnecessary defaultValue prop --- src/pages/tasks/NewTaskDetailsPage.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/tasks/NewTaskDetailsPage.js b/src/pages/tasks/NewTaskDetailsPage.js index aed618edacb7..7b595e04af1a 100644 --- a/src/pages/tasks/NewTaskDetailsPage.js +++ b/src/pages/tasks/NewTaskDetailsPage.js @@ -105,7 +105,6 @@ const NewTaskPage = (props) => { setTaskDescription(text)} From 546850bf734d49582a51e5f0fe2317ee969b5630 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 4 Jun 2023 18:18:43 +0100 Subject: [PATCH 5/9] fix useEffect for setting initial task title and description --- src/pages/tasks/NewTaskDetailsPage.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/pages/tasks/NewTaskDetailsPage.js b/src/pages/tasks/NewTaskDetailsPage.js index 7b595e04af1a..650da079f1a2 100644 --- a/src/pages/tasks/NewTaskDetailsPage.js +++ b/src/pages/tasks/NewTaskDetailsPage.js @@ -40,13 +40,9 @@ const NewTaskPage = (props) => { const [taskDescription, setTaskDescription] = useState(props.task.description); useEffect(() => { - if (taskTitle !== props.task.title) { - setTaskTitle(props.task.title); - } - if (taskDescription !== props.task.description) { - setTaskDescription(props.task.description); - } - }, [props.task, taskTitle, taskDescription]); + setTaskTitle(props.task.title); + setTaskDescription(props.task.description); + }, [props.task]); /** * @param {Object} values - form input values passed by the Form component From cb52bf5c0e695a6f3f4167c6e6da54a2d6b29e39 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 4 Jun 2023 19:31:26 +0100 Subject: [PATCH 6/9] clear out task data if the back button is pressed on the initial assign task page --- src/pages/tasks/NewTaskDetailsPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/tasks/NewTaskDetailsPage.js b/src/pages/tasks/NewTaskDetailsPage.js index 650da079f1a2..4fbaee47a5ad 100644 --- a/src/pages/tasks/NewTaskDetailsPage.js +++ b/src/pages/tasks/NewTaskDetailsPage.js @@ -79,7 +79,7 @@ const NewTaskPage = (props) => { title={props.translate('newTaskPage.assignTask')} onCloseButtonPress={() => TaskUtils.dismissModalAndClearOutTaskInfo()} shouldShowBackButton - onBackButtonPress={() => Navigation.goBack()} + onBackButtonPress={() => TaskUtils.dismissModalAndClearOutTaskInfo()} /> Date: Sun, 4 Jun 2023 20:10:39 +0100 Subject: [PATCH 7/9] restore defaultValue for description input --- src/pages/tasks/NewTaskDetailsPage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/tasks/NewTaskDetailsPage.js b/src/pages/tasks/NewTaskDetailsPage.js index 4fbaee47a5ad..862a22dcff4e 100644 --- a/src/pages/tasks/NewTaskDetailsPage.js +++ b/src/pages/tasks/NewTaskDetailsPage.js @@ -101,6 +101,7 @@ const NewTaskPage = (props) => { setTaskDescription(text)} From b89a14fb2feaa14513b67ad9008d33abf78437c8 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 4 Jun 2023 20:25:34 +0100 Subject: [PATCH 8/9] avoid setting undefined for description input --- src/pages/tasks/NewTaskDetailsPage.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pages/tasks/NewTaskDetailsPage.js b/src/pages/tasks/NewTaskDetailsPage.js index 862a22dcff4e..f07a7371d603 100644 --- a/src/pages/tasks/NewTaskDetailsPage.js +++ b/src/pages/tasks/NewTaskDetailsPage.js @@ -1,3 +1,4 @@ +import _ from 'underscore'; import React, {useEffect, useRef, useState} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; @@ -16,6 +17,7 @@ import Permissions from '../../libs/Permissions'; import ROUTES from '../../ROUTES'; import * as TaskUtils from '../../libs/actions/Task'; + const propTypes = { /** Beta features list */ betas: PropTypes.arrayOf(PropTypes.string), @@ -37,11 +39,13 @@ const defaultProps = { const NewTaskPage = (props) => { const inputRef = useRef(); const [taskTitle, setTaskTitle] = useState(props.task.title); - const [taskDescription, setTaskDescription] = useState(props.task.description); + const [taskDescription, setTaskDescription] = useState(props.task.description || ''); useEffect(() => { setTaskTitle(props.task.title); - setTaskDescription(props.task.description); + if (_.isString(props.task.description)) { + setTaskDescription(props.task.description); + } }, [props.task]); /** @@ -101,7 +105,6 @@ const NewTaskPage = (props) => { setTaskDescription(text)} From f3df1080c9170d0ecdb59e02c1ad78b75d7b3732 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 4 Jun 2023 20:36:53 +0100 Subject: [PATCH 9/9] cleanup, onChangeText --> onValueChange --- src/pages/tasks/NewTaskDetailsPage.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/pages/tasks/NewTaskDetailsPage.js b/src/pages/tasks/NewTaskDetailsPage.js index f07a7371d603..1d2a66be87e5 100644 --- a/src/pages/tasks/NewTaskDetailsPage.js +++ b/src/pages/tasks/NewTaskDetailsPage.js @@ -1,4 +1,3 @@ -import _ from 'underscore'; import React, {useEffect, useRef, useState} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; @@ -17,7 +16,6 @@ import Permissions from '../../libs/Permissions'; import ROUTES from '../../ROUTES'; import * as TaskUtils from '../../libs/actions/Task'; - const propTypes = { /** Beta features list */ betas: PropTypes.arrayOf(PropTypes.string), @@ -43,9 +41,7 @@ const NewTaskPage = (props) => { useEffect(() => { setTaskTitle(props.task.title); - if (_.isString(props.task.description)) { - setTaskDescription(props.task.description); - } + setTaskDescription(props.task.description || ''); }, [props.task]); /** @@ -99,7 +95,7 @@ const NewTaskPage = (props) => { inputID="taskTitle" label={props.translate('newTaskPage.title')} value={taskTitle} - onChangeText={(text) => setTaskTitle(text)} + onValueChange={(value) => setTaskTitle(value)} /> @@ -107,7 +103,7 @@ const NewTaskPage = (props) => { inputID="taskDescription" label={props.translate('newTaskPage.descriptionOptional')} value={taskDescription} - onChangeText={(text) => setTaskDescription(text)} + onValueChange={(value) => setTaskDescription(value)} />