From 8a1b552f8dbc3a9b321d888f4a7e9dc9af2922cf Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Fri, 22 Jan 2021 23:51:57 -0300 Subject: [PATCH] fix: Pass appId and blockId from blocks to elements (#366) --- .../src/blocks/ActionsBlock.js | 32 +++++++++++------- .../src/blocks/ContextBlock.js | 27 ++++++++++----- .../src/blocks/DividerBlock.js | 4 +-- .../fuselage-ui-kit/src/blocks/ImageBlock.js | 22 ++++++------ .../fuselage-ui-kit/src/blocks/InputBlock.js | 23 ++++++++----- .../src/blocks/SectionBlock.js | 12 +++---- .../src/elements/ButtonElement.js | 4 +-- .../src/elements/DatePickerElement.js | 4 +-- .../src/elements/MultiStaticSelectElement.js | 4 +-- .../src/elements/OverflowElement.js | 4 +-- .../src/elements/PlainInputElement.js | 4 +-- .../src/elements/StaticSelectElement.js | 4 +-- packages/fuselage-ui-kit/src/hooks.js | 4 +-- packages/fuselage-ui-kit/src/renderers.js | 27 ++++++--------- ...one7_Forms_Inputs_AutoComplete_Example.png | Bin 1047 -> 967 bytes ...ptop_Forms_Inputs_AutoComplete_Example.png | Bin 535 -> 503 bytes 16 files changed, 95 insertions(+), 80 deletions(-) diff --git a/packages/fuselage-ui-kit/src/blocks/ActionsBlock.js b/packages/fuselage-ui-kit/src/blocks/ActionsBlock.js index 3b1c6f6b33..035ce09ae1 100644 --- a/packages/fuselage-ui-kit/src/blocks/ActionsBlock.js +++ b/packages/fuselage-ui-kit/src/blocks/ActionsBlock.js @@ -1,12 +1,12 @@ import { Box, Button } from '@rocket.chat/fuselage'; import { BlockContext, ElementType } from '@rocket.chat/ui-kit'; -import React, { useCallback, useState } from 'react'; +import React, { memo, useCallback, useMemo, useState } from 'react'; import { useSurfaceType } from '../surfaces/SurfaceContext'; -const Action = ({ blockId, appId, element, parser }) => { +const Action = ({ element, parser }) => { const renderedElement = parser.renderActions( - { blockId, appId, ...element }, + element, BlockContext.ACTION, parser ); @@ -27,9 +27,11 @@ const Action = ({ blockId, appId, element, parser }) => { ); }; -const ActionsBlock = ({ className, blockId, appId, elements, parser }) => { +const ActionsBlock = ({ className, blockElement, parser }) => { const surfaceType = useSurfaceType(); + const { appId, blockId, elements } = blockElement; + const [showMoreVisible, setShowMoreVisible] = useState( () => elements.length > 5 && surfaceType !== 'banner' ); @@ -38,16 +40,20 @@ const ActionsBlock = ({ className, blockId, appId, elements, parser }) => { setShowMoreVisible(false); }, []); + const actionElements = useMemo( + () => + (showMoreVisible ? elements.slice(0, 5) : elements).map((element) => ({ + appId, + blockId, + ...element, + })), + [appId, blockId, elements, showMoreVisible] + ); + return ( - {(showMoreVisible ? elements.slice(0, 5) : elements).map((element, i) => ( - + {actionElements.map((element, i) => ( + ))} {showMoreVisible && ( @@ -64,4 +70,4 @@ const ActionsBlock = ({ className, blockId, appId, elements, parser }) => { ); }; -export default ActionsBlock; +export default memo(ActionsBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/ContextBlock.js b/packages/fuselage-ui-kit/src/blocks/ContextBlock.js index bc717a79d1..cea005300b 100644 --- a/packages/fuselage-ui-kit/src/blocks/ContextBlock.js +++ b/packages/fuselage-ui-kit/src/blocks/ContextBlock.js @@ -1,6 +1,6 @@ import { Box } from '@rocket.chat/fuselage'; import { BlockContext, ElementType } from '@rocket.chat/ui-kit'; -import React from 'react'; +import React, { memo, useMemo } from 'react'; const Item = ({ element, parser }) => { const renderedElement = parser.renderContext( @@ -27,12 +27,21 @@ const Item = ({ element, parser }) => { } }; -const ContextBlock = ({ className, elements, parser }) => ( - - {elements.map((element, i) => ( - - ))} - -); +const ContextBlock = ({ className, blockElement, parser }) => { + const { appId, blockId, elements } = blockElement; -export default ContextBlock; + const itemElements = useMemo( + () => elements.map((element) => ({ appId, blockId, ...element })), + [appId, blockId, elements] + ); + + return ( + + {itemElements.map((element, i) => ( + + ))} + + ); +}; + +export default memo(ContextBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/DividerBlock.js b/packages/fuselage-ui-kit/src/blocks/DividerBlock.js index 0038050c52..e982ebd23c 100644 --- a/packages/fuselage-ui-kit/src/blocks/DividerBlock.js +++ b/packages/fuselage-ui-kit/src/blocks/DividerBlock.js @@ -1,8 +1,8 @@ import { Divider } from '@rocket.chat/fuselage'; -import React from 'react'; +import React, { memo } from 'react'; const DividerBlock = ({ className }) => ( ); -export default DividerBlock; +export default memo(DividerBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/ImageBlock.js b/packages/fuselage-ui-kit/src/blocks/ImageBlock.js index 6856022459..47d0c24ba9 100644 --- a/packages/fuselage-ui-kit/src/blocks/ImageBlock.js +++ b/packages/fuselage-ui-kit/src/blocks/ImageBlock.js @@ -1,5 +1,5 @@ import { Box, Skeleton } from '@rocket.chat/fuselage'; -import React, { useEffect, useMemo, useState } from 'react'; +import React, { memo, useEffect, useMemo, useState } from 'react'; import { useSurfaceType } from '../surfaces/SurfaceContext'; @@ -28,7 +28,7 @@ const fetchImageState = (img) => { }; }; -const ImageBlock = ({ className, element, parser }) => { +const ImageBlock = ({ className, blockElement, parser }) => { const surface = useSurfaceType(); const alignment = @@ -36,7 +36,7 @@ const ImageBlock = ({ className, element, parser }) => { const [{ loading, width, height }, setState] = useState(() => { const img = document.createElement('img'); - img.src = element.imageUrl; + img.src = blockElement.imageUrl; return fetchImageState(img); }); @@ -48,7 +48,7 @@ const ImageBlock = ({ className, element, parser }) => { }; img.addEventListener('load', handleLoad); - img.src = element.imageUrl; + img.src = blockElement.imageUrl; if (img.complete) { img.removeEventListener('load', handleLoad); @@ -58,7 +58,7 @@ const ImageBlock = ({ className, element, parser }) => { return () => { img.removeEventListener('load', handleLoad); }; - }, [element.imageUrl]); + }, [blockElement.imageUrl]); const style = useMemo( () => ({ @@ -67,9 +67,9 @@ const ImageBlock = ({ className, element, parser }) => { backgroundPosition: '50%', backgroundSize: 'cover', backgroundColor: 'rgba(204, 204, 204, 38%)', - backgroundImage: `url(${element.imageUrl})`, + backgroundImage: `url(${blockElement.imageUrl})`, }), - [element.imageUrl] + [blockElement.imageUrl] ); return ( @@ -81,9 +81,9 @@ const ImageBlock = ({ className, element, parser }) => { alignItems={alignment} > - {element.title && ( + {blockElement.title && ( - {parser.plainText(element.title, -1, 0)} + {parser.plainText(blockElement.title, -1, 0)} )} {loading ? ( @@ -95,7 +95,7 @@ const ImageBlock = ({ className, element, parser }) => { width={width} height={height} style={style} - aria-label={element.altText} + aria-label={blockElement.altText} /> )} @@ -103,4 +103,4 @@ const ImageBlock = ({ className, element, parser }) => { ); }; -export default ImageBlock; +export default memo(ImageBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/InputBlock.js b/packages/fuselage-ui-kit/src/blocks/InputBlock.js index 9fdbfe3cde..f6bb621dda 100644 --- a/packages/fuselage-ui-kit/src/blocks/InputBlock.js +++ b/packages/fuselage-ui-kit/src/blocks/InputBlock.js @@ -1,22 +1,27 @@ import { Field } from '@rocket.chat/fuselage'; import { BlockContext } from '@rocket.chat/ui-kit'; -import React, { memo } from 'react'; +import React, { memo, useMemo } from 'react'; -import { useBlockContext } from '../hooks'; +import { useUiKitState } from '../hooks'; -const InputBlock = ({ className, element, parser, context }) => { - const [{ error }] = useBlockContext(element.element, context); +const InputBlock = ({ className, blockElement, parser, context }) => { + const { appId, blockId, element, label, hint } = blockElement; + const inputElement = useMemo(() => ({ appId, blockId, ...element }), [ + appId, + blockId, + element, + ]); + + const [{ error }] = useUiKitState(inputElement, context); return ( - {element.label && ( - {parser.plainText(element.label)} - )} + {label && {parser.plainText(label)}} - {parser.renderInputs(element.element, BlockContext.FORM, parser, 0)} + {parser.renderInputs(inputElement, BlockContext.FORM, parser, 0)} {error && {error}} - {element.hint && {element.hint}} + {hint && {hint}} ); }; diff --git a/packages/fuselage-ui-kit/src/blocks/SectionBlock.js b/packages/fuselage-ui-kit/src/blocks/SectionBlock.js index 48e6b33f42..a021a799c2 100644 --- a/packages/fuselage-ui-kit/src/blocks/SectionBlock.js +++ b/packages/fuselage-ui-kit/src/blocks/SectionBlock.js @@ -1,6 +1,6 @@ import { Box, Flex, Grid } from '@rocket.chat/fuselage'; import { BlockContext } from '@rocket.chat/ui-kit'; -import React, { useMemo } from 'react'; +import React, { memo, useMemo } from 'react'; const Accessory = ({ blockId, appId, element, parser }) => parser.renderAccessories( @@ -27,12 +27,12 @@ const Fields = ({ fields, parser }) => ( ); -const SectionBlock = ({ className, element, parser }) => { - const { blockId, appId, text, fields, accessory } = element; +const SectionBlock = ({ className, blockElement, parser }) => { + const { blockId, appId, text, fields, accessory } = blockElement; - const accessoryElement = useMemo(() => ({ blockId, appId, ...accessory }), [ - blockId, + const accessoryElement = useMemo(() => ({ appId, blockId, ...accessory }), [ appId, + blockId, accessory, ]); @@ -57,4 +57,4 @@ const SectionBlock = ({ className, element, parser }) => { ); }; -export default SectionBlock; +export default memo(SectionBlock); diff --git a/packages/fuselage-ui-kit/src/elements/ButtonElement.js b/packages/fuselage-ui-kit/src/elements/ButtonElement.js index 4060aa5e72..0390832376 100644 --- a/packages/fuselage-ui-kit/src/elements/ButtonElement.js +++ b/packages/fuselage-ui-kit/src/elements/ButtonElement.js @@ -1,10 +1,10 @@ import { Button, Throbber } from '@rocket.chat/fuselage'; import React from 'react'; -import { useBlockContext } from '../hooks'; +import { useUiKitState } from '../hooks'; const ButtonElement = ({ element, context, parser }) => { - const [{ loading }, action] = useBlockContext(element, context); + const [{ loading }, action] = useUiKitState(element, context); return (