diff --git a/src/pages/ReportDetailsPage.js b/src/pages/ReportDetailsPage.js index 6f1874eb3154..78876d9eb042 100644 --- a/src/pages/ReportDetailsPage.js +++ b/src/pages/ReportDetailsPage.js @@ -1,4 +1,4 @@ -import React, {Component} from 'react'; +import React, {useMemo} from 'react'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; @@ -57,146 +57,147 @@ const defaultProps = { personalDetails: {}, }; -class ReportDetailsPage extends Component { - getPolicy() { - return this.props.policies[`${ONYXKEYS.COLLECTION.POLICY}${this.props.report.policyID}`]; - } +const ReportDetailsPage = (props) => { + const policy = useMemo(() => props.policies[`${ONYXKEYS.COLLECTION.POLICY}${props.report.policyID}`], [props.policies, props.report.policyID]); + const isPolicyAdmin = useMemo(() => PolicyUtils.isPolicyAdmin(policy), [policy]); + const isPolicyExpenseChat = useMemo(() => ReportUtils.isPolicyExpenseChat(props.report), [props.report]); + const isChatRoom = useMemo(() => ReportUtils.isChatRoom(props.report), [props.report]); + const isThread = useMemo(() => ReportUtils.isThread(props.report), [props.report]); + const isUserCreatedPolicyRoom = useMemo(() => ReportUtils.isUserCreatedPolicyRoom(props.report), [props.report]); + const isArchivedRoom = useMemo(() => ReportUtils.isArchivedRoom(props.report), [props.report]); - getMenuItems() { - const menuItems = [ + // eslint-disable-next-line react-hooks/exhaustive-deps -- policy is a dependency because `getChatRoomSubtitle` calls `getPolicyName` which in turn retrieves the value from the `policy` value stored in Onyx + const chatRoomSubtitle = useMemo(() => ReportUtils.getChatRoomSubtitle(props.report), [props.report, policy]); + const canLeaveRoom = useMemo(() => ReportUtils.canLeaveRoom(props.report, !_.isEmpty(policy)), [policy, props.report]); + const participants = useMemo(() => lodashGet(props.report, 'participants', []), [props.report]); + + const menuItems = useMemo(() => { + if (isArchivedRoom) { + return []; + } + + const items = [ { key: CONST.REPORT_DETAILS_MENU_ITEM.SHARE_CODE, translationKey: 'common.shareCode', icon: Expensicons.QrCode, - action: () => Navigation.navigate(ROUTES.getReportShareCodeRoute(this.props.report.reportID)), + action: () => Navigation.navigate(ROUTES.getReportShareCodeRoute(props.report.reportID)), }, ]; - if (ReportUtils.isArchivedRoom(this.props.report)) { - return []; - } - - if (lodashGet(this.props.report, 'participants', []).length) { - menuItems.push({ + if (participants.length) { + items.push({ key: CONST.REPORT_DETAILS_MENU_ITEM.MEMBERS, translationKey: 'common.members', icon: Expensicons.Users, - subtitle: lodashGet(this.props.report, 'participants', []).length, + subtitle: participants.length, action: () => { - Navigation.navigate(ROUTES.getReportParticipantsRoute(this.props.report.reportID)); + Navigation.navigate(ROUTES.getReportParticipantsRoute(props.report.reportID)); }, }); } - if (ReportUtils.isPolicyExpenseChat(this.props.report) || ReportUtils.isChatRoom(this.props.report) || ReportUtils.isThread(this.props.report)) { - menuItems.push({ + if (isPolicyExpenseChat || isChatRoom || isThread) { + items.push({ key: CONST.REPORT_DETAILS_MENU_ITEM.SETTINGS, translationKey: 'common.settings', icon: Expensicons.Gear, action: () => { - Navigation.navigate(ROUTES.getReportSettingsRoute(this.props.report.reportID)); + Navigation.navigate(ROUTES.getReportSettingsRoute(props.report.reportID)); }, }); } - const policy = this.getPolicy(); - const isThread = ReportUtils.isThread(this.props.report); - if (ReportUtils.isUserCreatedPolicyRoom(this.props.report) || ReportUtils.canLeaveRoom(this.props.report, !_.isEmpty(policy)) || isThread) { - menuItems.push({ + if (isUserCreatedPolicyRoom || canLeaveRoom || isThread) { + items.push({ key: CONST.REPORT_DETAILS_MENU_ITEM.LEAVE_ROOM, translationKey: isThread ? 'common.leaveThread' : 'common.leaveRoom', icon: Expensicons.Exit, - action: () => Report.leaveRoom(this.props.report.reportID), + action: () => Report.leaveRoom(props.report.reportID), }); } - return menuItems; - } - - render() { - const isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(this.props.report); - const isChatRoom = ReportUtils.isChatRoom(this.props.report); - const isThread = ReportUtils.isThread(this.props.report); - const chatRoomSubtitle = ReportUtils.getChatRoomSubtitle(this.props.report); - const participants = lodashGet(this.props.report, 'participants', []); - const isMultipleParticipant = participants.length > 1; - const displayNamesWithTooltips = ReportUtils.getDisplayNamesWithTooltips( - OptionsListUtils.getPersonalDetailsForLogins(participants, this.props.personalDetails), - isMultipleParticipant, - ); - const menuItems = this.getMenuItems(); - const isPolicyAdmin = PolicyUtils.isPolicyAdmin(this.getPolicy()); - const chatRoomSubtitleText = ( - - {chatRoomSubtitle} - - ); - return ( - - - Navigation.goBack()} - onCloseButtonPress={() => Navigation.dismissModal()} - /> - - - - - - - - - - - {isPolicyAdmin ? ( - { - Navigation.navigate(ROUTES.getWorkspaceInitialRoute(this.props.report.policyID)); - }} - > - {chatRoomSubtitleText} - - ) : ( - chatRoomSubtitleText - )} + return items; + }, [props.report.reportID, participants, isArchivedRoom, isPolicyExpenseChat, isChatRoom, isThread, isUserCreatedPolicyRoom, canLeaveRoom]); + + const displayNamesWithTooltips = useMemo(() => { + const hasMultipleParticipants = participants.length > 1; + return ReportUtils.getDisplayNamesWithTooltips(OptionsListUtils.getPersonalDetailsForLogins(participants, props.personalDetails), hasMultipleParticipants); + }, [participants, props.personalDetails]); + + const chatRoomSubtitleText = ( + + {chatRoomSubtitle} + + ); + + return ( + + + Navigation.goBack()} + onCloseButtonPress={() => Navigation.dismissModal()} + /> + + + + + + + + + + {isPolicyAdmin ? ( + { + Navigation.navigate(ROUTES.getWorkspaceInitialRoute(props.report.policyID)); + }} + > + {chatRoomSubtitleText} + + ) : ( + chatRoomSubtitleText + )} - {_.map(menuItems, (item) => { - const brickRoadIndicator = - ReportUtils.hasReportNameError(this.props.report) && item.key === CONST.REPORT_DETAILS_MENU_ITEM.SETTINGS ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; - return ( - - ); - })} - - - - ); - } -} + + {_.map(menuItems, (item) => { + const brickRoadIndicator = + ReportUtils.hasReportNameError(props.report) && item.key === CONST.REPORT_DETAILS_MENU_ITEM.SETTINGS ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : ''; + return ( + + ); + })} + + + + ); +}; +ReportDetailsPage.displayName = 'ReportDetailsPage'; ReportDetailsPage.propTypes = propTypes; ReportDetailsPage.defaultProps = defaultProps; + export default compose( withLocalize, withReportOrNotFound,