Add standalone join message with user badge

This commit is contained in:
Gabe Kangas
2022-08-21 15:50:22 -07:00
parent 1954169ca1
commit 6cc184ea6f
8 changed files with 82 additions and 6 deletions

View File

@@ -11,8 +11,9 @@ import s from './ChatContainer.module.scss';
import { ChatMessage } from '../../../interfaces/chat-message.model'; import { ChatMessage } from '../../../interfaces/chat-message.model';
import { ChatTextField, ChatUserMessage } from '..'; import { ChatTextField, ChatUserMessage } from '..';
import ChatModeratorNotification from '../ChatModeratorNotification/ChatModeratorNotification'; import ChatModeratorNotification from '../ChatModeratorNotification/ChatModeratorNotification';
import ChatActionMessage from '../ChatAction/ChatActionMessage'; // import ChatActionMessage from '../ChatAction/ChatActionMessage';
import ChatSystemMessage from '../ChatSystemMessage/ChatSystemMessage'; import ChatSystemMessage from '../ChatSystemMessage/ChatSystemMessage';
import ChatJoinMessage from '../ChatJoinMessage/ChatJoinMessage';
interface Props { interface Props {
messages: ChatMessage[]; messages: ChatMessage[];
@@ -53,10 +54,12 @@ export default function ChatContainer(props: Props) {
const getUserJoinedMessage = (message: ChatMessage) => { const getUserJoinedMessage = (message: ChatMessage) => {
const { user } = message; const { user } = message;
const { displayName, displayColor } = user; const { displayName, displayColor } = user;
const color = `var(--theme-user-colors-${displayColor})`; const isAuthorModerator = checkIsModerator(message);
return ( return (
<ChatActionMessage <ChatJoinMessage
body={`<span style="color: ${color}">${displayName}</span> joined the chat.`} displayName={displayName}
userColor={displayColor}
isAuthorModerator={isAuthorModerator}
/> />
); );
}; };

View File

@@ -0,0 +1,4 @@
.join {
margin: 5px;
text-align: center;
}

View File

@@ -0,0 +1,27 @@
import s from './ChatJoinMessage.module.scss';
import ChatUserBadge from '../ChatUserBadge/ChatUserBadge';
interface Props {
isAuthorModerator: boolean;
userColor: number;
displayName: string;
}
export default function ChatJoinMessage(props: Props) {
const { isAuthorModerator, userColor, displayName } = props;
const color = `var(--theme-user-colors-${userColor})`;
return (
<div className={s.join}>
<span style={{ color }}>
{displayName}
{isAuthorModerator && (
<span>
<ChatUserBadge badge="mod" userColor={userColor} />
</span>
)}
</span>{' '}
joined the chat.
</div>
);
}

View File

@@ -7,7 +7,7 @@ import s from './ChatUserMessage.module.scss';
import { formatTimestamp } from './messageFmt'; import { formatTimestamp } from './messageFmt';
import { ChatMessage } from '../../../interfaces/chat-message.model'; import { ChatMessage } from '../../../interfaces/chat-message.model';
import ChatModerationActionMenu from '../ChatModerationActionMenu/ChatModerationActionMenu'; import ChatModerationActionMenu from '../ChatModerationActionMenu/ChatModerationActionMenu';
import ChatUserBadge from './ChatUserBadge'; import ChatUserBadge from '../ChatUserBadge/ChatUserBadge';
interface Props { interface Props {
message: ChatMessage; message: ChatMessage;

View File

@@ -0,0 +1,42 @@
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import ChatJoinMessage from '../components/chat/ChatJoinMessage/ChatJoinMessage';
import Mock from './assets/mocks/chatmessage-action.png';
export default {
title: 'owncast/Chat/Messages/Chat Join',
component: ChatJoinMessage,
argTypes: {
userColor: {
options: ['0', '1', '2', '3', '4', '5', '6', '7'],
control: { type: 'select' },
},
},
parameters: {
design: {
type: 'image',
url: Mock,
},
docs: {
description: {
component: `This is the message design an action takes place, such as a join or a name change.`,
},
},
},
} as ComponentMeta<typeof ChatJoinMessage>;
const Template: ComponentStory<typeof ChatJoinMessage> = args => <ChatJoinMessage {...args} />;
export const Regular = Template.bind({});
Regular.args = {
displayName: 'RandomChatter',
isAuthorModerator: false,
userColor: 3,
};
export const Moderator = Template.bind({});
Moderator.args = {
displayName: 'RandomChatter',
isAuthorModerator: true,
userColor: 2,
};

View File

@@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react'; import { ComponentStory, ComponentMeta } from '@storybook/react';
import ChatUserBadge from '../components/chat/ChatUserMessage/ChatUserBadge'; import ChatUserBadge from '../components/chat/ChatUserBadge/ChatUserBadge';
export default { export default {
title: 'owncast/Chat/Messages/User Flag', title: 'owncast/Chat/Messages/User Flag',