Skip to content

Commit 9e7b7ae

Browse files
feat: added tooltips for like and follow button (#799)
* feat: added tooltips for like and follow button * test: added test cases for like and follow buttons
1 parent ec800dd commit 9e7b7ae

File tree

2 files changed

+60
-20
lines changed

2 files changed

+60
-20
lines changed

src/discussions/common/HoverCard.jsx

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { useIntl } from '@edx/frontend-platform/i18n';
1414
import { ThreadType } from '../../data/constants';
1515
import { useHasLikePermission, useUserPostingEnabled } from '../data/hooks';
1616
import PostCommentsContext from '../post-comments/postCommentsContext';
17+
import messages from '../posts/post/messages';
1718
import ActionsDropdown from './ActionsDropdown';
1819
import DiscussionContext from './context';
1920

@@ -82,32 +83,48 @@ const HoverCard = ({
8283
</div>
8384
)}
8485
<div className="hover-button">
85-
<IconButton
86-
src={voted ? ThumbUpFilled : ThumbUpOutline}
87-
iconAs={Icon}
88-
size="sm"
89-
alt="Like"
90-
disabled={!userHasLikePermission}
91-
iconClassNames="like-icon-dimensions"
92-
onClick={(e) => {
93-
e.preventDefault();
94-
onLike();
95-
}}
96-
/>
97-
</div>
98-
{following !== undefined && (
99-
<div className="hover-button">
86+
<OverlayTrigger
87+
overlay={(
88+
<Tooltip>
89+
{intl.formatMessage(voted ? messages.removeLike : messages.like)}
90+
</Tooltip>
91+
)}
92+
>
10093
<IconButton
101-
src={following ? StarFilled : StarOutline}
94+
src={voted ? ThumbUpFilled : ThumbUpOutline}
10295
iconAs={Icon}
10396
size="sm"
104-
alt="Follow"
105-
iconClassNames="follow-icon-dimensions"
97+
alt="Like"
98+
disabled={!userHasLikePermission}
99+
iconClassNames="like-icon-dimensions"
106100
onClick={(e) => {
107101
e.preventDefault();
108-
onFollow();
102+
onLike();
109103
}}
110104
/>
105+
</OverlayTrigger>
106+
</div>
107+
{following !== undefined && (
108+
<div className="hover-button">
109+
<OverlayTrigger
110+
overlay={(
111+
<Tooltip>
112+
{intl.formatMessage(following ? messages.unFollow : messages.follow)}
113+
</Tooltip>
114+
)}
115+
>
116+
<IconButton
117+
src={following ? StarFilled : StarOutline}
118+
iconAs={Icon}
119+
size="sm"
120+
alt="Follow"
121+
iconClassNames="follow-icon-dimensions"
122+
onClick={(e) => {
123+
e.preventDefault();
124+
onFollow();
125+
}}
126+
/>
127+
</OverlayTrigger>
111128
</div>
112129
)}
113130
<div className="hover-button ml-auto">

src/discussions/common/HoverCard.test.jsx

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
render, screen, waitFor, within,
2+
fireEvent, render, screen, waitFor, within,
33
} from '@testing-library/react';
44
import MockAdapter from 'axios-mock-adapter';
55
import { IntlProvider } from 'react-intl';
@@ -138,4 +138,27 @@ describe('HoverCard', () => {
138138
expect(within(hoverCard).queryByRole('button', { name: /like/i })).toBeInTheDocument();
139139
expect(within(hoverCard).queryByRole('button', { name: /actions menu/i })).toBeInTheDocument();
140140
});
141+
142+
test('it should call onFollow when follow button is clicked', async () => {
143+
await waitFor(() => renderComponent(discussionPostId));
144+
const post = screen.getByTestId('post-thread-1');
145+
const hoverCard = within(post).getByTestId('hover-card-thread-1');
146+
147+
const followBtn = within(hoverCard).getByRole('button', { name: /follow/i });
148+
fireEvent.click(followBtn);
149+
150+
expect(followBtn).toBeEnabled();
151+
});
152+
153+
test('it should call onLike when Like button is clicked', async () => {
154+
await waitFor(() => renderComponent(discussionPostId));
155+
156+
const post = screen.getByTestId('post-thread-1');
157+
const hoverCard = within(post).getByTestId('hover-card-thread-1');
158+
159+
const likeBtn = within(hoverCard).getByRole('button', { name: /like/i });
160+
fireEvent.click(likeBtn);
161+
162+
expect(likeBtn).toBeEnabled();
163+
});
141164
});

0 commit comments

Comments
 (0)