Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Message Preview #587

Merged
merged 33 commits into from
Dec 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
a11b9ba
Component
ggazzo Jun 22, 2021
19cd83b
WIP
ggazzo Jun 22, 2021
106caab
Merge branch 'develop' into feat/preview
ggazzo Jun 22, 2021
18930c2
export message blocks
ggazzo Jun 30, 2021
f6898d4
Context Preview
ggazzo Jul 7, 2021
cc3736d
fix build
ggazzo Jul 7, 2021
182574e
context styles
ggazzo Jul 7, 2021
819ef38
fix thumb
ggazzo Jul 7, 2021
0036c18
build: Set version field on resolve-workspace-deps #552
dougfabris Oct 1, 2021
e33344c
Merge remote-tracking branch 'origin/develop' into feat/preview
ggazzo Oct 6, 2021
47fe3e8
.
ggazzo Oct 6, 2021
fe16c10
Message preview
ggazzo Oct 7, 2021
355a876
Loki
ggazzo Oct 7, 2021
8d7308c
fix lint
ggazzo Oct 7, 2021
c53dbfd
WIP
ggazzo Oct 7, 2021
7f1368b
Merge remote-tracking branch 'origin/develop' into feat/message-preview
ggazzo Dec 2, 2021
4065078
Merge remote-tracking branch 'origin/develop' into feat/message-preview
ggazzo Dec 3, 2021
e371d1b
Merge remote-tracking branch 'origin/develop' into feat/preview
ggazzo Dec 3, 2021
c9a289b
Message status indicator
ggazzo Dec 6, 2021
5b64cf5
typing adjustments
ggazzo Dec 6, 2021
9376341
WIP
ggazzo Dec 10, 2021
25562c7
Merge remote-tracking branch 'origin/develop' into feat/message-preview
ggazzo Dec 10, 2021
bc7e91a
Merge branch 'feat/preview' into 123
ggazzo Dec 13, 2021
0233566
loki
ggazzo Dec 13, 2021
8fa126f
lint
ggazzo Dec 13, 2021
9d9cb76
lint
ggazzo Dec 13, 2021
c706b20
Fix options
ggazzo Dec 13, 2021
4f18fd1
loki
ggazzo Dec 13, 2021
7183aa8
Loki
ggazzo Dec 13, 2021
2cca0b4
fuselage-ui-kit loki
ggazzo Dec 14, 2021
b594be7
fix: review
dougfabris Dec 15, 2021
a246771
loki
ggazzo Dec 15, 2021
a507705
ops
ggazzo Dec 15, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
90 changes: 90 additions & 0 deletions packages/fuselage-ui-kit/src/blocks/PreviewBlock.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import {
MessageGenericPreview,
MessageGenericPreviewContent,
MessageGenericPreviewDescription,
MessageGenericPreviewImage,
MessageGenericPreviewTitle,
MessageGenericPreviewFooter,
MessageGenericPreviewThumb,
Box,
} from '@rocket.chat/fuselage';
import * as UiKit from '@rocket.chat/ui-kit';
import {
isPreviewBlockWithThumb,
isPreviewBlockWithPreview,
} from '@rocket.chat/ui-kit';
import React, { memo, ReactElement } from 'react';

import { BlockProps } from '../utils/BlockProps';
import ContextBlock from './ContextBlock';

type PreviewBlockProps = BlockProps<UiKit.PreviewBlock>;

const PreviewBlock = ({
block,
surfaceRenderer,
}: PreviewBlockProps): ReactElement => (
<Box>
<MessageGenericPreview>
{isPreviewBlockWithPreview(block) && block.preview?.dimensions && (
<MessageGenericPreviewImage
width={block.preview.dimensions.width}
height={block.preview.dimensions.height}
url={block.preview.url}
/>
)}
<MessageGenericPreviewContent
thumb={
isPreviewBlockWithThumb(block) ? (
<MessageGenericPreviewThumb>
<MessageGenericPreviewImage
height={192}
width={368}
url={block.thumb.url}
/>
</MessageGenericPreviewThumb>
) : undefined
}
>
{Array.isArray(block.title) ? (
<MessageGenericPreviewTitle
externalUrl={
isPreviewBlockWithPreview(block) ? block.externalUrl : undefined
}
>
{block.title.map((title) =>
surfaceRenderer.renderTextObject(
title,
0,
UiKit.BlockContext.NONE
)
)}
</MessageGenericPreviewTitle>
) : null}
{Array.isArray(block.description) ? (
<MessageGenericPreviewDescription clamp>
{block.description.map((description) =>
surfaceRenderer.renderTextObject(
description,
0,
UiKit.BlockContext.NONE
)
)}
</MessageGenericPreviewDescription>
) : null}
{block.footer && (
<MessageGenericPreviewFooter>
<ContextBlock
block={block.footer}
surfaceRenderer={surfaceRenderer}
context={UiKit.BlockContext.BLOCK}
index={0}
/>
</MessageGenericPreviewFooter>
)}
</MessageGenericPreviewContent>
</MessageGenericPreview>
</Box>
);

export default memo(PreviewBlock);
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Box } from '@rocket.chat/fuselage';
import * as UiKit from '@rocket.chat/ui-kit';
import React, { FC } from 'react';

import { BlockProps } from '../../utils/BlockProps';
import { ContextElementItem } from './ContextElementItem';

type ContextElementProps = BlockProps<UiKit.ContextBlock>;

export const ContextElement: FC<ContextElementProps> = ({
block,
surfaceRenderer,
className,
}) => (
<Box
className={className}
display='flex'
alignItems='center'
margin={-4}
withTruncatedText
>
{block.elements.map((element, i) => (
<ContextElementItem
index={i}
key={i}
element={element}
surfaceRenderer={surfaceRenderer}
/>
))}
</Box>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { Box } from '@rocket.chat/fuselage';
import * as UiKit from '@rocket.chat/ui-kit';
import { BlockContext, ElementType } from '@rocket.chat/ui-kit';
import React, { FC } from 'react';

import { BlockProps } from '../../utils/BlockProps';

type ContextElementProps = BlockProps<UiKit.ContextBlock>;

export const ContextElementItem: FC<{
element: ContextElementProps['block']['elements'][number];
surfaceRenderer: ContextElementProps['surfaceRenderer'];
index: number;
}> = ({ element, surfaceRenderer, index }) => {
const renderedElement = surfaceRenderer.renderContext(
element,
BlockContext.CONTEXT,
undefined,
index
);

if (!renderedElement) {
return null;
}

switch (element.type) {
case ElementType.PLAIN_TEXT:
case ElementType.MARKDOWN:
return (
<Box is='span' withTruncatedText fontScale='c1' color='info' margin={4}>
{renderedElement}
</Box>
);

default:
return <>{renderedElement}</>;
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './ContextElement';
61 changes: 27 additions & 34 deletions packages/fuselage-ui-kit/src/stories/Message.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,5 @@
/* eslint-disable new-cap */
import {
Message,
Avatar,
MessageLeftContainer,
MessageHeader,
MessageContainer,
MessageName,
MessageUsername,
MessageRole,
MessageTimestamp,
MessageToolbox,
MessageBody,
} from '@rocket.chat/fuselage';
import { Message, Avatar } from '@rocket.chat/fuselage';
import * as UiKit from '@rocket.chat/ui-kit';
import { action } from '@storybook/addon-actions';
import React from 'react';
Expand All @@ -35,7 +23,7 @@ const createStory = (blocks: readonly UiKit.LayoutBlock[]) => {
errors: Record<string, string>;
}) => (
<Message clickable>
<MessageLeftContainer>
<Message.LeftContainer>
<Avatar
url='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC
4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
Expand All @@ -50,17 +38,17 @@ const createStory = (blocks: readonly UiKit.LayoutBlock[]) => {
UH2oorkV10pRc7b1zXb/hZOzuJvM86QWEXeELxOzHSIPcmiiiunVlF2RNTpRkrs//Z'
size={'x36'}
/>
</MessageLeftContainer>
<MessageContainer>
<MessageHeader>
<MessageName>Haylie George</MessageName>
<MessageUsername>@haylie.george</MessageUsername>
<MessageRole>Admin</MessageRole>
<MessageRole>User</MessageRole>
<MessageRole>Owner</MessageRole>
<MessageTimestamp>12:00 PM</MessageTimestamp>
</MessageHeader>
<MessageBody>
</Message.LeftContainer>
<Message.Container>
<Message.Header>
<Message.Name>Haylie George</Message.Name>
<Message.Username>@haylie.george</Message.Username>
<Message.Role>Admin</Message.Role>
<Message.Role>User</Message.Role>
<Message.Role>Owner</Message.Role>
<Message.Timestamp>12:00 PM</Message.Timestamp>
</Message.Header>
<Message.Body>
<kitContext.Provider
value={{
action: action('action'),
Expand All @@ -72,15 +60,15 @@ const createStory = (blocks: readonly UiKit.LayoutBlock[]) => {
>
{UiKitMessage(blocks)}
</kitContext.Provider>
</MessageBody>
</MessageContainer>
<MessageToolbox.Wrapper>
<MessageToolbox>
<MessageToolbox.Item icon='quote' />
<MessageToolbox.Item icon='clock' />
<MessageToolbox.Item icon='thread' />
</MessageToolbox>
</MessageToolbox.Wrapper>
</Message.Body>
</Message.Container>
<Message.Toolbox.Wrapper>
<Message.Toolbox>
<Message.Toolbox.Item icon='quote' />
<Message.Toolbox.Item icon='clock' />
<Message.Toolbox.Item icon='thread' />
</Message.Toolbox>
</Message.Toolbox.Wrapper>
</Message>
);
story.args = {
Expand Down Expand Up @@ -151,3 +139,8 @@ export const ContextWithTextAndImages = createStory(
);

export const Conditional = createStory(payloads.conditional);

export const Preview = createStory(payloads.preview);
export const PreviewWithExternalUrl = createStory(
payloads.previewWithExternalUrl
);
3 changes: 3 additions & 0 deletions packages/fuselage-ui-kit/src/stories/payloads/img.ts

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions packages/fuselage-ui-kit/src/stories/payloads/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ export * from './divider';
export * from './image';
export * from './input';
export * from './section';
export * from './preview';
66 changes: 66 additions & 0 deletions packages/fuselage-ui-kit/src/stories/payloads/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// import * as UiKit from '@rocket.chat/ui-kit';
import { PreviewBlock } from '@rocket.chat/ui-kit';

import img from './img';

export const preview: PreviewBlock[] = [
{
type: 'preview',
title: [
{
type: 'plain_text',
text: 'I Need a Marg',
emoji: true,
},
],
description: [
{
type: 'plain_text',
text: 'I Need a Description',
emoji: true,
},
],
thumb: { url: img },
footer: {
type: 'context',
elements: [
{
type: 'plain_text',
text: 'google.com',
},
],
},
},
];

export const previewWithExternalUrl: PreviewBlock[] = [
{
type: 'preview',
title: [
{
type: 'plain_text',
text: 'I Need a Marg',
emoji: true,
},
],
description: [
{
type: 'plain_text',
text: 'I Need a Description',
emoji: true,
},
],
// thumb: { url: img },
footer: {
type: 'context',
elements: [
{
type: 'plain_text',
text: 'google.com',
},
],
},
externalUrl:
'https://rocketchat.github.io/Rocket.Chat.Fuselage/?path=/story/*',
},
];
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import ContextBlock from '../blocks/ContextBlock';
import DividerBlock from '../blocks/DividerBlock';
import ImageBlock from '../blocks/ImageBlock';
import InputBlock from '../blocks/InputBlock';
import PreviewBlock from '../blocks/PreviewBlock';
import SectionBlock from '../blocks/SectionBlock';
import ButtonElement from '../elements/ButtonElement';
import DatePickerElement from '../elements/DatePickerElement';
Expand All @@ -18,7 +19,15 @@ import StaticSelectElement from '../elements/StaticSelectElement';

export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer<ReactElement> {
public constructor() {
super(['actions', 'context', 'divider', 'image', 'input', 'section']);
super([
'actions',
'context',
'divider',
'image',
'input',
'section',
'preview',
]);
}

public plain_text(
Expand Down Expand Up @@ -65,6 +74,25 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer<ReactElement>
return null;
}

preview(
block: UiKit.PreviewBlock,
context: UiKit.BlockContext,
index: number
): ReactElement | null {
if (context !== UiKit.BlockContext.BLOCK) {
return null;
}
return (
<PreviewBlock
key={index}
block={block}
context={context}
index={index}
surfaceRenderer={this}
/>
);
}

context(
block: UiKit.ContextBlock,
context: UiKit.BlockContext,
Expand Down
Loading