Skip to content

Commit f8bd0ad

Browse files
authored
feat(fuselage): Message preview component (#553)
1 parent 23e7eea commit f8bd0ad

File tree

47 files changed

+1048
-303
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1048
-303
lines changed

packages/fuselage-ui-kit/src/stories/Message.stories.tsx

+34-22
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
/* eslint-disable new-cap */
2-
import { Message, Avatar } from '@rocket.chat/fuselage';
2+
import {
3+
Message,
4+
Avatar,
5+
MessageLeftContainer,
6+
MessageHeader,
7+
MessageContainer,
8+
MessageName,
9+
MessageUsername,
10+
MessageRole,
11+
MessageTimestamp,
12+
MessageToolbox,
13+
MessageBody,
14+
} from '@rocket.chat/fuselage';
315
import * as UiKit from '@rocket.chat/ui-kit';
416
import { action } from '@storybook/addon-actions';
517
import React from 'react';
@@ -23,7 +35,7 @@ const createStory = (blocks: readonly UiKit.LayoutBlock[]) => {
2335
errors: Record<string, string>;
2436
}) => (
2537
<Message clickable>
26-
<Message.LeftContainer>
38+
<MessageLeftContainer>
2739
<Avatar
2840
url='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC
2941
4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
@@ -38,17 +50,17 @@ const createStory = (blocks: readonly UiKit.LayoutBlock[]) => {
3850
UH2oorkV10pRc7b1zXb/hZOzuJvM86QWEXeELxOzHSIPcmiiiunVlF2RNTpRkrs//Z'
3951
size={'x36'}
4052
/>
41-
</Message.LeftContainer>
42-
<Message.Container>
43-
<Message.Header>
44-
<Message.Name>Haylie George</Message.Name>
45-
<Message.Username>@haylie.george</Message.Username>
46-
<Message.Role>Admin</Message.Role>
47-
<Message.Role>User</Message.Role>
48-
<Message.Role>Owner</Message.Role>
49-
<Message.Timestamp>12:00 PM</Message.Timestamp>
50-
</Message.Header>
51-
<Message.Body>
53+
</MessageLeftContainer>
54+
<MessageContainer>
55+
<MessageHeader>
56+
<MessageName>Haylie George</MessageName>
57+
<MessageUsername>@haylie.george</MessageUsername>
58+
<MessageRole>Admin</MessageRole>
59+
<MessageRole>User</MessageRole>
60+
<MessageRole>Owner</MessageRole>
61+
<MessageTimestamp>12:00 PM</MessageTimestamp>
62+
</MessageHeader>
63+
<MessageBody>
5264
<kitContext.Provider
5365
value={{
5466
action: action('action'),
@@ -60,15 +72,15 @@ const createStory = (blocks: readonly UiKit.LayoutBlock[]) => {
6072
>
6173
{UiKitMessage(blocks)}
6274
</kitContext.Provider>
63-
</Message.Body>
64-
</Message.Container>
65-
<Message.Toolbox.Wrapper>
66-
<Message.Toolbox>
67-
<Message.Toolbox.Item icon='quote' />
68-
<Message.Toolbox.Item icon='clock' />
69-
<Message.Toolbox.Item icon='thread' />
70-
</Message.Toolbox>
71-
</Message.Toolbox.Wrapper>
75+
</MessageBody>
76+
</MessageContainer>
77+
<MessageToolbox.Wrapper>
78+
<MessageToolbox>
79+
<MessageToolbox.Item icon='quote' />
80+
<MessageToolbox.Item icon='clock' />
81+
<MessageToolbox.Item icon='thread' />
82+
</MessageToolbox>
83+
</MessageToolbox.Wrapper>
7284
</Message>
7385
);
7486
story.args = {
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export default '0.29.0';
1+
export default '0.30.0';
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

packages/fuselage/src/components/Message/Message.tsx

+74-66
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ import './Messages.styles.scss';
1010

1111
import { prependClassName } from '../../helpers/prependClassName';
1212
import { Tag } from '../Tag';
13-
import { Divider } from './Divider';
14-
import { Metrics } from './Metrics';
15-
import { Toolbox } from './Toolbox';
13+
import { MessageDivider } from './MessageDivider';
14+
import { MessageMetrics } from './MessageMetrics';
15+
import { MessageToolbox } from './MessageToolbox';
1616

17-
const Container: FC = function Container(props) {
17+
export const MessageContainer: FC = function MessageContainer(props) {
1818
return (
1919
<div className='rcx-box rcx-box--full rcx-message-container' {...props} />
2020
);
2121
};
2222

23-
const ContainerFixed: FC = function Container(props) {
23+
export const MessageContainerFixed: FC = function MessageContainerFixed(props) {
2424
return (
2525
<div
2626
className='rcx-box rcx-box--full rcx-message-container rcx-message-container--fixed'
@@ -42,7 +42,7 @@ export const MessageLeftContainer = (
4242
/>
4343
);
4444

45-
const Header: FC = function Header({ children }) {
45+
export const MessageHeader: FC = function MessageHeader({ children }) {
4646
return (
4747
<div className='rcx-box rcx-box--full rcx-message-header'>
4848
<div className='rcx-box rcx-box--full rcx-message-header__wrapper'>
@@ -56,7 +56,7 @@ type MessageBodyProps = AllHTMLAttributes<HTMLDivElement> & {
5656
clamp?: 2 | 3 | 4;
5757
};
5858

59-
const MessageBody = ({
59+
export const MessageBody = ({
6060
clamp,
6161
className,
6262
...props
@@ -99,61 +99,69 @@ type MessageProps = AllHTMLAttributes<HTMLDivElement> & {
9999
sequential?: boolean;
100100
};
101101

102-
const Message = forwardRef<HTMLDivElement, MessageProps>(function Message(
103-
{
104-
// is: Tag = 'div',
105-
className,
106-
clickable,
107-
sequential,
108-
...props
109-
},
110-
ref
111-
) {
112-
return (
113-
<div
114-
ref={ref}
115-
className={prependClassName(
116-
className,
117-
[
118-
'rcx-message',
119-
(clickable || props.onClick) && 'rcx-message--clickable',
120-
sequential && 'rcx-message--sequential',
121-
]
122-
.filter(Boolean)
123-
.join(' ')
124-
)}
125-
{...props}
126-
/>
127-
);
128-
});
129-
130-
const Timestamp: FC<{ children: string }> = function Timestamp(props) {
131-
return (
132-
<span
133-
className='rcx-box rcx-box--full rcx-message-header__time'
134-
{...props}
135-
/>
136-
);
137-
};
102+
export const Message = forwardRef<HTMLDivElement, MessageProps>(
103+
function Message(
104+
{
105+
// is: Tag = 'div',
106+
className,
107+
clickable,
108+
sequential,
109+
...props
110+
},
111+
ref
112+
) {
113+
return (
114+
<div
115+
ref={ref}
116+
className={prependClassName(
117+
className,
118+
[
119+
'rcx-message',
120+
(clickable || props.onClick) && 'rcx-message--clickable',
121+
sequential && 'rcx-message--sequential',
122+
]
123+
.filter(Boolean)
124+
.join(' ')
125+
)}
126+
{...props}
127+
/>
128+
);
129+
}
130+
);
138131

139-
const Name: FC<{ children: string }> = function Name(props) {
132+
export const MessageTimestamp: FC<{ children: string }> =
133+
function MessageTimestamp(props) {
134+
return (
135+
<span
136+
className='rcx-box rcx-box--full rcx-message-header__time'
137+
{...props}
138+
/>
139+
);
140+
};
141+
142+
export const MessageName: FC<{ children: string }> = function MessageName(
143+
props
144+
) {
140145
return (
141146
<span
142147
className='rcx-box rcx-box--full rcx-message-header__name'
143148
{...props}
144149
/>
145150
);
146151
};
147-
const Username: FC<{ children: string }> = function Name(props) {
148-
return (
149-
<span
150-
className='rcx-box rcx-box--full rcx-message-header__username'
151-
{...props}
152-
/>
153-
);
154-
};
155-
156-
const Role: FC<{ children: string }> = function Role(props) {
152+
export const MessageUsername: FC<{ children: string }> =
153+
function MessageUsername(props) {
154+
return (
155+
<span
156+
className='rcx-box rcx-box--full rcx-message-header__username'
157+
{...props}
158+
/>
159+
);
160+
};
161+
162+
export const MessageRole: FC<{ children: string }> = function MessageRole(
163+
props
164+
) {
157165
return (
158166
<Tag
159167
onClick={undefined}
@@ -165,7 +173,7 @@ const Role: FC<{ children: string }> = function Role(props) {
165173
);
166174
};
167175

168-
const Roles: FC = function Role(props) {
176+
export const MessageRoles: FC = function MessageRoles(props) {
169177
return (
170178
<div
171179
className='rcx-box rcx-box--full rcx-message-header__roles'
@@ -175,18 +183,18 @@ const Roles: FC = function Role(props) {
175183
};
176184

177185
export default Object.assign(Message, {
178-
Metrics,
179-
Toolbox,
180-
Container,
181-
ContainerFixed,
186+
Metrics: MessageMetrics,
187+
Toolbox: MessageToolbox,
188+
Container: MessageContainer,
189+
ContainerFixed: MessageContainerFixed,
182190
LeftContainer: MessageLeftContainer,
183-
Header,
191+
Header: MessageHeader,
184192
Body: MessageBody,
185193
Block: MessageBlock,
186-
Timestamp,
187-
Name,
188-
Username,
189-
Roles,
190-
Role,
191-
Divider,
194+
Timestamp: MessageTimestamp,
195+
Name: MessageName,
196+
Username: MessageUsername,
197+
Roles: MessageRoles,
198+
Role: MessageRole,
199+
Divider: MessageDivider,
192200
});
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Meta, Canvas, ArgsTable, Story } from '@storybook/addon-docs/blocks';
22

3-
import { Divider } from '.';
3+
import { MessageDivider } from '.';
44
import { Box } from '../..';
55

66
<Meta title='Messages/Divider' parameters={{ jest: ['Divider/spec'] }} />
@@ -10,11 +10,11 @@ import { Box } from '../..';
1010
<Canvas>
1111
<Story name='Default'>
1212
<Box>
13-
<Divider>Text</Divider>
14-
<Divider unreadLabel={'Unread'}>Text</Divider>
15-
<Divider unreadLabel={'Unread'} />
13+
<MessageDivider>Text</MessageDivider>
14+
<MessageDivider unreadLabel={'Unread'}>Text</MessageDivider>
15+
<MessageDivider unreadLabel={'Unread'} />
1616
</Box>
1717
</Story>
1818
</Canvas>
1919

20-
<ArgsTable of={Divider} />
20+
<ArgsTable of={MessageDivider} />

packages/fuselage/src/components/Message/Divider/index.tsx packages/fuselage/src/components/Message/MessageDivider/index.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { FC } from 'react';
22

3-
const Divider: FC<{
3+
const MessageDivider: FC<{
44
unreadLabel?: string;
55
}> = ({ children, unreadLabel, ...props }) => (
66
<div
@@ -27,4 +27,4 @@ const Divider: FC<{
2727
</div>
2828
</div>
2929
);
30-
export { Divider };
30+
export { MessageDivider };

packages/fuselage/src/components/Message/Metrics/index.tsx packages/fuselage/src/components/Message/MessageMetrics/index.tsx

+9-9
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ const MetricsItemLabel: FC = (props) => (
2121
<div className='rcx-message-metrics__item-label' {...props} />
2222
);
2323

24-
const MetricsItem: FC & {
24+
export const MessageMetricsItem: FC & {
2525
Icon: FC<IconProps>;
2626
Label: FC<BoxProps>;
2727
} = (props) => <div className='rcx-message-metrics__item' {...props} />;
2828

29-
export const Metrics: FC & {
29+
export const MessageMetrics: FC & {
3030
Item: FC<BoxProps> & { Icon: FC<IconProps>; Label: FC<BoxProps> };
3131
Following: FC<FollowingProps>;
3232
Reply: FC<ButtonProps>;
@@ -42,15 +42,15 @@ const MetricsFollowing: FC<FollowingProps> = ({ name }) => (
4242
);
4343

4444
export const Reply: FC<ComponentProps<typeof Button>> = (props) => (
45-
<MetricsItem>
45+
<MessageMetricsItem>
4646
<Button {...props} {...{ small: true, primary: true }} />
47-
</MetricsItem>
47+
</MessageMetricsItem>
4848
);
4949

50-
Metrics.Reply = Reply;
50+
MessageMetrics.Reply = Reply;
5151

52-
Metrics.Item = MetricsItem;
53-
Metrics.Following = MetricsFollowing;
52+
MessageMetrics.Item = MessageMetricsItem;
53+
MessageMetrics.Following = MetricsFollowing;
5454

55-
MetricsItem.Label = MetricsItemLabel;
56-
MetricsItem.Icon = MetricsItemIcon;
55+
MessageMetricsItem.Label = MetricsItemLabel;
56+
MessageMetricsItem.Icon = MetricsItemIcon;

0 commit comments

Comments
 (0)