[MM-60072] Convert ./components/emoji/emoji_list_item/emoji_list_item.tsx from Class Component to Function Component (#27904)
* refactor: converted emoji_list_item to functional component * feat: added suggested changes * refactor: minor change --------- Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
@@ -1,7 +1,7 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
import React from 'react';
|
||||
import React, {useCallback, useMemo} from 'react';
|
||||
|
||||
import type {CustomEmoji} from '@mattermost/types/emojis';
|
||||
|
||||
@@ -22,72 +22,71 @@ export type Props = {
|
||||
actions: {
|
||||
deleteCustomEmoji: (emojiId: string) => void;
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export default class EmojiListItem extends React.PureComponent<Props> {
|
||||
static defaultProps = {
|
||||
emoji: {} as CustomEmoji,
|
||||
currentUserId: '',
|
||||
creatorDisplayName: '',
|
||||
};
|
||||
const DELETE_PERMISSION = [Permissions.DELETE_EMOJIS];
|
||||
const DELETE_OTHER_PERMISSION = [Permissions.DELETE_OTHERS_EMOJIS];
|
||||
|
||||
handleDelete = (): void => {
|
||||
if (!this.props.emoji) {
|
||||
const EmojiListItem = ({
|
||||
actions: {
|
||||
deleteCustomEmoji,
|
||||
},
|
||||
onDelete,
|
||||
emoji = {} as CustomEmoji,
|
||||
creatorUsername,
|
||||
currentUserId = '',
|
||||
creatorDisplayName = '',
|
||||
}: Props) => {
|
||||
const emoticonStyle = useMemo(() => {
|
||||
return {backgroundImage: `url(${Client4.getCustomEmojiImageUrl(emoji.id)})`};
|
||||
}, [emoji.id]);
|
||||
|
||||
const handleDelete = useCallback((): void => {
|
||||
if (!emoji) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.props.onDelete) {
|
||||
this.props.onDelete(this.props.emoji.id);
|
||||
if (onDelete) {
|
||||
onDelete(emoji.id);
|
||||
}
|
||||
deleteCustomEmoji(emoji.id);
|
||||
}, [deleteCustomEmoji, emoji, onDelete]);
|
||||
|
||||
this.props.actions.deleteCustomEmoji(this.props.emoji.id);
|
||||
};
|
||||
let displayName = creatorDisplayName;
|
||||
if (creatorUsername && creatorUsername !== displayName) {
|
||||
displayName += ' (@' + creatorUsername + ')';
|
||||
}
|
||||
|
||||
render(): JSX.Element {
|
||||
const emoji = this.props.emoji as CustomEmoji;
|
||||
const creatorUsername = this.props.creatorUsername;
|
||||
let creatorDisplayName = this.props.creatorDisplayName;
|
||||
let deleteButton = <DeleteEmojiButton onDelete={handleDelete}/>;
|
||||
|
||||
if (creatorUsername && creatorUsername !== creatorDisplayName) {
|
||||
creatorDisplayName += ' (@' + creatorUsername + ')';
|
||||
}
|
||||
|
||||
let deleteButton = <DeleteEmojiButton onDelete={this.handleDelete}/>;
|
||||
|
||||
if (emoji.creator_id === this.props.currentUserId) {
|
||||
deleteButton = (
|
||||
<AnyTeamPermissionGate permissions={[Permissions.DELETE_EMOJIS]}>
|
||||
if (emoji.creator_id === currentUserId) {
|
||||
deleteButton = (
|
||||
<AnyTeamPermissionGate permissions={DELETE_PERMISSION}>
|
||||
{deleteButton}
|
||||
</AnyTeamPermissionGate>
|
||||
);
|
||||
} else {
|
||||
deleteButton = (
|
||||
<AnyTeamPermissionGate permissions={DELETE_PERMISSION}>
|
||||
<AnyTeamPermissionGate permissions={DELETE_OTHER_PERMISSION}>
|
||||
{deleteButton}
|
||||
</AnyTeamPermissionGate>
|
||||
);
|
||||
} else {
|
||||
deleteButton = (
|
||||
<AnyTeamPermissionGate permissions={[Permissions.DELETE_EMOJIS]}>
|
||||
<AnyTeamPermissionGate permissions={[Permissions.DELETE_OTHERS_EMOJIS]}>
|
||||
{deleteButton}
|
||||
</AnyTeamPermissionGate>
|
||||
</AnyTeamPermissionGate>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<tr className='backstage-list__item'>
|
||||
<td className='emoji-list__name'>
|
||||
{':' + emoji.name + ':'}
|
||||
</td>
|
||||
<td className='emoji-list__image'>
|
||||
<span
|
||||
className='emoticon'
|
||||
style={{backgroundImage: 'url(' + Client4.getCustomEmojiImageUrl(emoji.id) + ')'}}
|
||||
/>
|
||||
</td>
|
||||
<td className='emoji-list__creator'>
|
||||
{creatorDisplayName}
|
||||
</td>
|
||||
<td className='emoji-list-item_actions'>
|
||||
{deleteButton}
|
||||
</td>
|
||||
</tr>
|
||||
</AnyTeamPermissionGate>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<tr className='backstage-list__item'>
|
||||
<td className='emoji-list__name'>{':' + emoji.name + ':'}</td>
|
||||
<td className='emoji-list__image'>
|
||||
<span
|
||||
className='emoticon'
|
||||
style={emoticonStyle}
|
||||
/>
|
||||
</td>
|
||||
<td className='emoji-list__creator'>{displayName}</td>
|
||||
<td className='emoji-list-item_actions'>{deleteButton}</td>
|
||||
</tr>
|
||||
);
|
||||
};
|
||||
|
||||
export default React.memo(EmojiListItem);
|
||||
|
||||
Ссылка в новой задаче
Block a user