diff --git a/webapp/channels/src/components/emoji/__snapshots__/emoji_page.test.tsx.snap b/webapp/channels/src/components/emoji/__snapshots__/emoji_page.test.tsx.snap new file mode 100644 index 0000000000..7aa057b9a9 --- /dev/null +++ b/webapp/channels/src/components/emoji/__snapshots__/emoji_page.test.tsx.snap @@ -0,0 +1,43 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EmojiPage should render without crashing 1`] = ` +
+
+

+ +

+ + + + + +
+ +
+`; diff --git a/webapp/channels/src/components/emoji/emoji_page.test.tsx b/webapp/channels/src/components/emoji/emoji_page.test.tsx new file mode 100644 index 0000000000..45b7f605bb --- /dev/null +++ b/webapp/channels/src/components/emoji/emoji_page.test.tsx @@ -0,0 +1,62 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import type {ShallowWrapper} from 'enzyme'; +import {shallow} from 'enzyme'; +import React from 'react'; +import {Link} from 'react-router-dom'; + +import type {Theme} from 'mattermost-redux/selectors/entities/preferences'; + +import AnyTeamPermissionGate from 'components/permissions_gates/any_team_permission_gate'; + +import EmojiList from './emoji_list'; +import EmojiPage from './emoji_page'; + +jest.mock('utils/utils', () => ({ + localizeMessage: jest.fn().mockReturnValue('Custom Emoji'), + resetTheme: jest.fn(), + applyTheme: jest.fn(), +})); + +describe('EmojiPage', () => { + const mockLoadRolesIfNeeded = jest.fn(); + const mockScrollToTop = jest.fn(); + const mockCurrentTheme = {} as Theme; + + const defaultProps = { + teamName: 'team', + teamDisplayName: 'Team Display Name', + siteName: 'Site Name', + scrollToTop: mockScrollToTop, + currentTheme: mockCurrentTheme, + actions: { + loadRolesIfNeeded: mockLoadRolesIfNeeded, + }, + }; + + it('should render without crashing', () => { + const wrapper: ShallowWrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); + + it('should render the emoji list and the add button with permission', () => { + const wrapper: ShallowWrapper = shallow(); + expect(wrapper.find(EmojiList).exists()).toBe(true); + expect(wrapper.find(AnyTeamPermissionGate).exists()).toBe(true); + expect(wrapper.find(Link).prop('to')).toBe('/team/emoji/add'); + }); + + it('should not render the add button if permission is not granted', () => { + const wrapper: ShallowWrapper = shallow( + , + ).setProps({teamName: '', actions: {loadRolesIfNeeded: mockLoadRolesIfNeeded}}); + expect(wrapper.find(AnyTeamPermissionGate).exists()).toBe(true); + expect(wrapper.find(Link).exists()).toBe(true); // Update this to match your permission setup + }); + + it('should render EmojiList component', () => { + const wrapper = shallow(); + expect(wrapper.find(EmojiList).exists()).toBe(true); + }); +}); diff --git a/webapp/channels/src/components/emoji/emoji_page.tsx b/webapp/channels/src/components/emoji/emoji_page.tsx index 07d2b13b1c..0f5b1f246b 100644 --- a/webapp/channels/src/components/emoji/emoji_page.tsx +++ b/webapp/channels/src/components/emoji/emoji_page.tsx @@ -1,8 +1,8 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import React from 'react'; -import {FormattedMessage} from 'react-intl'; +import React, {useEffect} from 'react'; +import {FormattedMessage, useIntl} from 'react-intl'; import {Link} from 'react-router-dom'; import Permissions from 'mattermost-redux/constants/permissions'; @@ -25,62 +25,64 @@ type Props = { }; } -export default class EmojiPage extends React.PureComponent { - static defaultProps = { - teamName: '', - teamDisplayName: '', - siteName: '', - }; +const CREATE_EMOJIS_PERMISSIONS = [Permissions.CREATE_EMOJIS]; +const ROLES = ['system_admin', 'team_admin', 'system_user', 'team_user']; - componentDidMount() { - this.updateTitle(); - this.props.actions.loadRolesIfNeeded(['system_admin', 'team_admin', 'system_user', 'team_user']); +export default function EmojiPage({ + teamDisplayName = '', + teamName = '', + siteName = '', + scrollToTop, + currentTheme, + actions, +}: Props) { + const intl = useIntl(); + + useEffect(() => { + updateTitle(); + actions.loadRolesIfNeeded(ROLES); Utils.resetTheme(); - } - componentWillUnmount() { - Utils.applyTheme(this.props.currentTheme); - } + return () => { + Utils.applyTheme(currentTheme); + }; + }, []); - updateTitle = () => { - document.title = Utils.localizeMessage('custom_emoji.header', 'Custom Emoji') + ' - ' + this.props.teamDisplayName + ' ' + this.props.siteName; + useEffect(() => { + updateTitle(); + }, [siteName]); + + const updateTitle = () => { + document.title = intl.formatMessage({id: 'custom_emoji.header', defaultMessage: 'Custom Emoji'}) + ' - ' + teamDisplayName + ' ' + siteName; }; - componentDidUpdate(prevProps: Props) { - if (this.props.siteName !== prevProps.siteName) { - this.updateTitle(); - } - } - - render() { - return ( -
-
-

- -

- - +
+

+ +

+ + + - - -
- + + + +
- ); - } + +
+ ); }