Skip to content

Commit 1682be4

Browse files
authored
Merge pull request #31655 from esh-g/duplicate-room-error
Duplicate room name error when room created
2 parents 414c08c + b91ca76 commit 1682be4

File tree

2 files changed

+95
-32
lines changed

2 files changed

+95
-32
lines changed

src/libs/actions/Report.js

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,32 +1540,9 @@ function navigateToConciergeChat(ignoreConciergeReportID = false) {
15401540
/**
15411541
* Add a policy report (workspace room) optimistically and navigate to it.
15421542
*
1543-
* @param {String} policyID
1544-
* @param {String} reportName
1545-
* @param {String} visibility
1546-
* @param {String} writeCapability
1547-
* @param {String} welcomeMessage
1548-
*/
1549-
function addPolicyReport(policyID, reportName, visibility, writeCapability = CONST.REPORT.WRITE_CAPABILITIES.ALL, welcomeMessage = '') {
1550-
const participants = [currentUserAccountID];
1551-
const parsedWelcomeMessage = ReportUtils.getParsedComment(welcomeMessage);
1552-
const policyReport = ReportUtils.buildOptimisticChatReport(
1553-
participants,
1554-
reportName,
1555-
CONST.REPORT.CHAT_TYPE.POLICY_ROOM,
1556-
policyID,
1557-
CONST.REPORT.OWNER_ACCOUNT_ID_FAKE,
1558-
false,
1559-
'',
1560-
visibility,
1561-
writeCapability,
1562-
1563-
// The room might contain all policy members so notifying always should be opt-in only.
1564-
CONST.REPORT.NOTIFICATION_PREFERENCE.DAILY,
1565-
'',
1566-
'',
1567-
parsedWelcomeMessage,
1568-
);
1543+
* @param {Object} policyReport
1544+
*/
1545+
function addPolicyReport(policyReport) {
15691546
const createdReportAction = ReportUtils.buildOptimisticCreatedReportAction(CONST.POLICY.OWNER_EMAIL_FAKE);
15701547

15711548
// Onyx.set is used on the optimistic data so that it is present before navigating to the workspace room. With Onyx.merge the workspace room reportID is not present when
@@ -1587,6 +1564,11 @@ function addPolicyReport(policyID, reportName, visibility, writeCapability = CON
15871564
key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${policyReport.reportID}`,
15881565
value: {[createdReportAction.reportActionID]: createdReportAction},
15891566
},
1567+
{
1568+
onyxMethod: Onyx.METHOD.MERGE,
1569+
key: ONYXKEYS.FORMS.NEW_ROOM_FORM,
1570+
value: {isLoading: true},
1571+
},
15901572
];
15911573
const successData = [
15921574
{
@@ -1607,6 +1589,11 @@ function addPolicyReport(policyID, reportName, visibility, writeCapability = CON
16071589
},
16081590
},
16091591
},
1592+
{
1593+
onyxMethod: Onyx.METHOD.MERGE,
1594+
key: ONYXKEYS.FORMS.NEW_ROOM_FORM,
1595+
value: {isLoading: false},
1596+
},
16101597
];
16111598
const failureData = [
16121599
{
@@ -1618,22 +1605,26 @@ function addPolicyReport(policyID, reportName, visibility, writeCapability = CON
16181605
},
16191606
},
16201607
},
1608+
{
1609+
onyxMethod: Onyx.METHOD.MERGE,
1610+
key: ONYXKEYS.FORMS.NEW_ROOM_FORM,
1611+
value: {isLoading: false},
1612+
},
16211613
];
16221614

16231615
API.write(
16241616
'AddWorkspaceRoom',
16251617
{
16261618
policyID: policyReport.policyID,
1627-
reportName,
1628-
visibility,
1619+
reportName: policyReport.reportName,
1620+
visibility: policyReport.visibility,
16291621
reportID: policyReport.reportID,
16301622
createdReportActionID: createdReportAction.reportActionID,
1631-
writeCapability,
1632-
welcomeMessage: parsedWelcomeMessage,
1623+
writeCapability: policyReport.writeCapability,
1624+
welcomeMessage: policyReport.welcomeMessage,
16331625
},
16341626
{optimisticData, successData, failureData},
16351627
);
1636-
Navigation.dismissModal(policyReport.reportID);
16371628
}
16381629

16391630
/**
@@ -2502,6 +2493,13 @@ function searchInServer(searchInput) {
25022493
debouncedSearchInServer(searchInput);
25032494
}
25042495

2496+
function clearNewRoomFormError() {
2497+
Onyx.set(ONYXKEYS.FORMS.NEW_ROOM_FORM, {
2498+
isLoading: false,
2499+
errorFields: {},
2500+
});
2501+
}
2502+
25052503
export {
25062504
searchInServer,
25072505
addComment,
@@ -2563,4 +2561,5 @@ export {
25632561
openRoomMembersPage,
25642562
savePrivateNotesDraft,
25652563
getDraftPrivateNote,
2564+
clearNewRoomFormError,
25662565
};

src/pages/workspace/WorkspaceNewRoomPage.js

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ import withNavigationFocus from '@components/withNavigationFocus';
1717
import useAutoFocusInput from '@hooks/useAutoFocusInput';
1818
import useLocalize from '@hooks/useLocalize';
1919
import useNetwork from '@hooks/useNetwork';
20+
import usePrevious from '@hooks/usePrevious';
2021
import useWindowDimensions from '@hooks/useWindowDimensions';
2122
import compose from '@libs/compose';
2223
import * as ErrorUtils from '@libs/ErrorUtils';
24+
import Navigation from '@libs/Navigation/Navigation';
2325
import Permissions from '@libs/Permissions';
2426
import * as PolicyUtils from '@libs/PolicyUtils';
2527
import * as ReportUtils from '@libs/ReportUtils';
@@ -63,11 +65,33 @@ const propTypes = {
6365

6466
/** Whether navigation is focused */
6567
isFocused: PropTypes.bool.isRequired,
68+
69+
/** Form state for NEW_ROOM_FORM */
70+
formState: PropTypes.shape({
71+
/** Loading state for the form */
72+
isLoading: PropTypes.bool,
73+
74+
/** Field errors in the form */
75+
errorFields: PropTypes.objectOf(PropTypes.objectOf(PropTypes.string)),
76+
}),
77+
78+
/** Session details for the user */
79+
session: PropTypes.shape({
80+
/** accountID of current user */
81+
accountID: PropTypes.number,
82+
}),
6683
};
6784
const defaultProps = {
6885
betas: [],
6986
reports: {},
7087
policies: {},
88+
formState: {
89+
isLoading: false,
90+
errorFields: {},
91+
},
92+
session: {
93+
accountID: 0,
94+
},
7195
};
7296

7397
function WorkspaceNewRoomPage(props) {
@@ -78,6 +102,7 @@ function WorkspaceNewRoomPage(props) {
78102
const [visibility, setVisibility] = useState(CONST.REPORT.VISIBILITY.RESTRICTED);
79103
const [policyID, setPolicyID] = useState(null);
80104
const [writeCapability, setWriteCapability] = useState(CONST.REPORT.WRITE_CAPABILITIES.ALL);
105+
const wasLoading = usePrevious(props.formState.isLoading);
81106
const visibilityDescription = useMemo(() => translate(`newRoomPage.${visibility}Description`), [translate, visibility]);
82107
const isPolicyAdmin = useMemo(() => {
83108
if (!policyID) {
@@ -86,14 +111,47 @@ function WorkspaceNewRoomPage(props) {
86111

87112
return ReportUtils.isPolicyAdmin(policyID, props.policies);
88113
}, [policyID, props.policies]);
114+
const [newRoomReportID, setNewRoomReportID] = useState(undefined);
89115

90116
/**
91117
* @param {Object} values - form input values passed by the Form component
92118
*/
93119
const submit = (values) => {
94-
Report.addPolicyReport(policyID, values.roomName, visibility, writeCapability, values.welcomeMessage);
120+
const participants = [props.session.accountID];
121+
const parsedWelcomeMessage = ReportUtils.getParsedComment(values.welcomeMessage);
122+
const policyReport = ReportUtils.buildOptimisticChatReport(
123+
participants,
124+
values.roomName,
125+
CONST.REPORT.CHAT_TYPE.POLICY_ROOM,
126+
policyID,
127+
CONST.REPORT.OWNER_ACCOUNT_ID_FAKE,
128+
false,
129+
'',
130+
visibility,
131+
writeCapability || CONST.REPORT.WRITE_CAPABILITIES.ALL,
132+
133+
// The room might contain all policy members so notifying always should be opt-in only.
134+
CONST.REPORT.NOTIFICATION_PREFERENCE.DAILY,
135+
'',
136+
'',
137+
parsedWelcomeMessage,
138+
);
139+
setNewRoomReportID(policyReport.reportID);
140+
Report.addPolicyReport(policyReport);
95141
};
96142

143+
useEffect(() => {
144+
Report.clearNewRoomFormError();
145+
}, []);
146+
147+
useEffect(() => {
148+
if (!(((wasLoading && !props.formState.isLoading) || (isOffline && props.formState.isLoading)) && _.isEmpty(props.formState.errorFields))) {
149+
return;
150+
}
151+
Navigation.dismissModal(newRoomReportID);
152+
// eslint-disable-next-line react-hooks/exhaustive-deps -- we just want this to update on changing the form State
153+
}, [props.formState]);
154+
97155
useEffect(() => {
98156
if (isPolicyAdmin) {
99157
return;
@@ -270,5 +328,11 @@ export default compose(
270328
reports: {
271329
key: ONYXKEYS.COLLECTION.REPORT,
272330
},
331+
formState: {
332+
key: ONYXKEYS.FORMS.NEW_ROOM_FORM,
333+
},
334+
session: {
335+
key: ONYXKEYS.SESSION,
336+
},
273337
}),
274338
)(WorkspaceNewRoomPage);

0 commit comments

Comments
 (0)