diff --git a/src/components/AvatarWithDisplayName.js b/src/components/AvatarWithDisplayName.js index 7889dcb0b703..181b2ff19146 100644 --- a/src/components/AvatarWithDisplayName.js +++ b/src/components/AvatarWithDisplayName.js @@ -7,6 +7,7 @@ import reportPropTypes from '../pages/reportPropTypes'; import participantPropTypes from './participantPropTypes'; import withWindowDimensions, {windowDimensionsPropTypes} from './withWindowDimensions'; import withLocalize, {withLocalizePropTypes} from './withLocalize'; +import UserDetailsTooltip from './UserDetailsTooltip'; import styles from '../styles/styles'; import themeColors from '../styles/themes/default'; import SubscriptAvatar from './SubscriptAvatar'; @@ -71,13 +72,17 @@ function AvatarWithDisplayName(props) { size={props.size} /> ) : ( - + + + + + )} {!_.isEmpty(subtitle) && ( - {props.fullTitle} + {props.shouldUseFullTitle + ? props.fullTitle + : _.map(props.displayNamesWithTooltips, ({displayName}, index) => ( + + {displayName} + {index < props.displayNamesWithTooltips.length - 1 && } + + ))} ); } diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index af79fd2b8132..fb63ad9c2e17 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -4,6 +4,7 @@ import {View} from 'react-native'; import PropTypes from 'prop-types'; import lodashGet from 'lodash/get'; import HeaderWithBackButton from './HeaderWithBackButton'; +import UserDetailsTooltip from './UserDetailsTooltip'; import iouReportPropTypes from '../pages/iouReportPropTypes'; import withLocalize, {withLocalizePropTypes} from './withLocalize'; import * as ReportUtils from '../libs/ReportUtils'; @@ -115,19 +116,33 @@ function MoneyRequestHeader(props) { {props.translate('common.to')} - + + + + + - - {payeeName} - + + + + {payeeName} + + + {isExpenseReport && ( { expect(displayNameTexts).toHaveLength(2); const firstReportOption = displayNameTexts[0]; expect(lodashGet(firstReportOption, ['props', 'style', 0, 'fontWeight'])).toBe(fontWeightBold); - expect(lodashGet(firstReportOption, ['props', 'children'])).toBe('C User'); + expect(firstReportOption).toHaveTextContent('C User'); const secondReportOption = displayNameTexts[1]; expect(lodashGet(secondReportOption, ['props', 'style', 0, 'fontWeight'])).toBe(fontWeightBold); - expect(lodashGet(secondReportOption, ['props', 'children'])).toBe('B User'); + expect(secondReportOption).toHaveTextContent('B User'); // Tap the new report option and navigate back to the sidebar again via the back button return navigateToSidebarOption(0); @@ -372,9 +372,9 @@ describe('Unread Indicators', () => { const displayNameTexts = screen.queryAllByLabelText(hintText); expect(displayNameTexts).toHaveLength(2); expect(lodashGet(displayNameTexts[0], ['props', 'style', 0, 'fontWeight'])).toBe(undefined); - expect(lodashGet(displayNameTexts[0], ['props', 'children'])).toBe('C User'); + expect(displayNameTexts[0]).toHaveTextContent('C User'); expect(lodashGet(displayNameTexts[1], ['props', 'style', 0, 'fontWeight'])).toBe(fontWeightBold); - expect(lodashGet(displayNameTexts[1], ['props', 'children'])).toBe('B User'); + expect(displayNameTexts[1]).toHaveTextContent('B User'); })); xit('Manually marking a chat message as unread shows the new line indicator and updates the LHN', () => diff --git a/tests/unit/SidebarFilterTest.js b/tests/unit/SidebarFilterTest.js index 927381177223..68f3d0107eae 100644 --- a/tests/unit/SidebarFilterTest.js +++ b/tests/unit/SidebarFilterTest.js @@ -1,6 +1,5 @@ import {cleanup, screen} from '@testing-library/react-native'; import Onyx from 'react-native-onyx'; -import lodashGet from 'lodash/get'; import * as LHNTestUtils from '../utils/LHNTestUtils'; import waitForPromisesToResolve from '../utils/waitForPromisesToResolve'; import CONST from '../../src/CONST'; @@ -331,7 +330,7 @@ describe('Sidebar', () => { const navigatesToChatHintText = Localize.translateLocal('accessibilityHints.navigatesToChat'); expect(screen.queryAllByAccessibilityHint(navigatesToChatHintText)).toHaveLength(1); expect(displayNames).toHaveLength(1); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('Three, Four'); } else { // Both reports visible const navigatesToChatHintText = Localize.translateLocal('accessibilityHints.navigatesToChat'); @@ -371,8 +370,8 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(2); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('One, Two'); + expect(displayNames[1]).toHaveTextContent('Three, Four'); }) // When report3 becomes unread @@ -440,8 +439,8 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(2); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Three, Four'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('One, Two'); + expect(displayNames[0]).toHaveTextContent('Three, Four'); + expect(displayNames[1]).toHaveTextContent('One, Two'); }) ); }); @@ -652,7 +651,7 @@ describe('Sidebar', () => { const navigatesToChatHintText = Localize.translateLocal('accessibilityHints.navigatesToChat'); expect(screen.queryAllByAccessibilityHint(navigatesToChatHintText)).toHaveLength(1); expect(displayNames).toHaveLength(1); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('Three, Four'); } else { // Both reports visible const navigatesToChatHintText = Localize.translateLocal('accessibilityHints.navigatesToChat'); diff --git a/tests/unit/SidebarOrderTest.js b/tests/unit/SidebarOrderTest.js index 3c3863c411b2..bfad3b925e8a 100644 --- a/tests/unit/SidebarOrderTest.js +++ b/tests/unit/SidebarOrderTest.js @@ -1,6 +1,5 @@ import Onyx from 'react-native-onyx'; import {cleanup, screen} from '@testing-library/react-native'; -import lodashGet from 'lodash/get'; import waitForPromisesToResolve from '../utils/waitForPromisesToResolve'; import * as LHNTestUtils from '../utils/LHNTestUtils'; import CONST from '../../src/CONST'; @@ -128,9 +127,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('Three, Four'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('One, Two'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('Three, Four'); + expect(displayNames[2]).toHaveTextContent('One, Two'); }) ); }); @@ -169,9 +168,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('One, Two'); // this has `hasDraft` flag enabled so it will be on top - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('One, Two'); // this has `hasDraft` flag enabled so it will be on top: ; + expect(displayNames[1]).toHaveTextContent('Five, Six'); + expect(displayNames[2]).toHaveTextContent('Three, Four'); }) ); }); @@ -210,9 +209,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('One, Two'); + expect(displayNames[1]).toHaveTextContent('Five, Six'); + expect(displayNames[2]).toHaveTextContent('Three, Four'); }) ); }); @@ -257,9 +256,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Three, Four'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('One, Two'); + expect(displayNames[0]).toHaveTextContent('Three, Four'); + expect(displayNames[1]).toHaveTextContent('Five, Six'); + expect(displayNames[2]).toHaveTextContent('One, Two'); }) ); }); @@ -395,10 +394,10 @@ describe('Sidebar', () => { expect(displayNames).toHaveLength(4); expect(screen.queryAllByTestId('Pin Icon')).toHaveLength(1); expect(screen.queryAllByTestId('Pencil Icon')).toHaveLength(1); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('Email Two owes $100.00'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [3, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('One, Two'); + expect(displayNames[1]).toHaveTextContent('Email Two owes $100.00'); + expect(displayNames[2]).toHaveTextContent('Five, Six'); + expect(displayNames[3]).toHaveTextContent('Three, Four'); }) ); }); @@ -441,9 +440,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('One, Two'); + expect(displayNames[2]).toHaveTextContent('Three, Four'); }) // When a new report is added @@ -454,10 +453,10 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(4); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Seven, Eight'); - expect(lodashGet(displayNames, [3, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('One, Two'); + expect(displayNames[2]).toHaveTextContent('Seven, Eight'); + expect(displayNames[3]).toHaveTextContent('Three, Four'); }) ); }); @@ -500,9 +499,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('One, Two'); + expect(displayNames[2]).toHaveTextContent('Three, Four'); }) // When a new report is added @@ -513,10 +512,10 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(4); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Seven, Eight'); - expect(lodashGet(displayNames, [3, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('One, Two'); + expect(displayNames[2]).toHaveTextContent('Seven, Eight'); + expect(displayNames[3]).toHaveTextContent('Three, Four'); }) ); }); @@ -554,9 +553,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('Three, Four'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Report (archived)'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('Three, Four'); + expect(displayNames[2]).toHaveTextContent('Report (archived)'); }) ); }); @@ -590,9 +589,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('One, Two'); + expect(displayNames[2]).toHaveTextContent('Three, Four'); }) // When a new report is added @@ -603,10 +602,10 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(4); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Seven, Eight'); - expect(lodashGet(displayNames, [3, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('One, Two'); + expect(displayNames[2]).toHaveTextContent('Seven, Eight'); + expect(displayNames[3]).toHaveTextContent('Three, Four'); }) ); }); @@ -644,9 +643,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('Three, Four'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Report (archived)'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('Three, Four'); + expect(displayNames[2]).toHaveTextContent('Report (archived)'); }) ); }); @@ -733,11 +732,11 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(5); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Email Two owes $100.00'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('Email Two owes $100.00'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Email Two owes $100.00'); - expect(lodashGet(displayNames, [3, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [4, 'props', 'children'])).toBe('One, Two'); + expect(displayNames[0]).toHaveTextContent('Email Two owes $100.00'); + expect(displayNames[1]).toHaveTextContent('Email Two owes $100.00'); + expect(displayNames[2]).toHaveTextContent('Email Two owes $100.00'); + expect(displayNames[3]).toHaveTextContent('Five, Six'); + expect(displayNames[4]).toHaveTextContent('One, Two'); }) ); }); @@ -777,9 +776,9 @@ describe('Sidebar', () => { const hintText = Localize.translateLocal('accessibilityHints.chatUserDisplayNames'); const displayNames = screen.queryAllByLabelText(hintText); expect(displayNames).toHaveLength(3); - expect(lodashGet(displayNames, [0, 'props', 'children'])).toBe('Five, Six'); - expect(lodashGet(displayNames, [1, 'props', 'children'])).toBe('One, Two'); - expect(lodashGet(displayNames, [2, 'props', 'children'])).toBe('Three, Four'); + expect(displayNames[0]).toHaveTextContent('Five, Six'); + expect(displayNames[1]).toHaveTextContent('One, Two'); + expect(displayNames[2]).toHaveTextContent('Three, Four'); }) ); });