Skip to content

Commit 8a1b552

Browse files
authored
fix: Pass appId and blockId from blocks to elements (#366)
1 parent 218a8b3 commit 8a1b552

16 files changed

+95
-80
lines changed

packages/fuselage-ui-kit/src/blocks/ActionsBlock.js

+19-13
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { Box, Button } from '@rocket.chat/fuselage';
22
import { BlockContext, ElementType } from '@rocket.chat/ui-kit';
3-
import React, { useCallback, useState } from 'react';
3+
import React, { memo, useCallback, useMemo, useState } from 'react';
44

55
import { useSurfaceType } from '../surfaces/SurfaceContext';
66

7-
const Action = ({ blockId, appId, element, parser }) => {
7+
const Action = ({ element, parser }) => {
88
const renderedElement = parser.renderActions(
9-
{ blockId, appId, ...element },
9+
element,
1010
BlockContext.ACTION,
1111
parser
1212
);
@@ -27,9 +27,11 @@ const Action = ({ blockId, appId, element, parser }) => {
2727
);
2828
};
2929

30-
const ActionsBlock = ({ className, blockId, appId, elements, parser }) => {
30+
const ActionsBlock = ({ className, blockElement, parser }) => {
3131
const surfaceType = useSurfaceType();
3232

33+
const { appId, blockId, elements } = blockElement;
34+
3335
const [showMoreVisible, setShowMoreVisible] = useState(
3436
() => elements.length > 5 && surfaceType !== 'banner'
3537
);
@@ -38,16 +40,20 @@ const ActionsBlock = ({ className, blockId, appId, elements, parser }) => {
3840
setShowMoreVisible(false);
3941
}, []);
4042

43+
const actionElements = useMemo(
44+
() =>
45+
(showMoreVisible ? elements.slice(0, 5) : elements).map((element) => ({
46+
appId,
47+
blockId,
48+
...element,
49+
})),
50+
[appId, blockId, elements, showMoreVisible]
51+
);
52+
4153
return (
4254
<Box className={className} display='flex' flexWrap='wrap' margin={-4}>
43-
{(showMoreVisible ? elements.slice(0, 5) : elements).map((element, i) => (
44-
<Action
45-
key={i}
46-
blockId={blockId}
47-
appId={appId}
48-
element={element}
49-
parser={parser}
50-
/>
55+
{actionElements.map((element, i) => (
56+
<Action key={i} element={element} parser={parser} />
5157
))}
5258
{showMoreVisible && (
5359
<Box display='flex' margin={4}>
@@ -64,4 +70,4 @@ const ActionsBlock = ({ className, blockId, appId, elements, parser }) => {
6470
);
6571
};
6672

67-
export default ActionsBlock;
73+
export default memo(ActionsBlock);

packages/fuselage-ui-kit/src/blocks/ContextBlock.js

+18-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Box } from '@rocket.chat/fuselage';
22
import { BlockContext, ElementType } from '@rocket.chat/ui-kit';
3-
import React from 'react';
3+
import React, { memo, useMemo } from 'react';
44

55
const Item = ({ element, parser }) => {
66
const renderedElement = parser.renderContext(
@@ -27,12 +27,21 @@ const Item = ({ element, parser }) => {
2727
}
2828
};
2929

30-
const ContextBlock = ({ className, elements, parser }) => (
31-
<Box className={className} display='flex' alignItems='center' margin={-4}>
32-
{elements.map((element, i) => (
33-
<Item key={i} element={element} parser={parser} />
34-
))}
35-
</Box>
36-
);
30+
const ContextBlock = ({ className, blockElement, parser }) => {
31+
const { appId, blockId, elements } = blockElement;
3732

38-
export default ContextBlock;
33+
const itemElements = useMemo(
34+
() => elements.map((element) => ({ appId, blockId, ...element })),
35+
[appId, blockId, elements]
36+
);
37+
38+
return (
39+
<Box className={className} display='flex' alignItems='center' margin={-4}>
40+
{itemElements.map((element, i) => (
41+
<Item key={i} element={element} parser={parser} />
42+
))}
43+
</Box>
44+
);
45+
};
46+
47+
export default memo(ContextBlock);
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Divider } from '@rocket.chat/fuselage';
2-
import React from 'react';
2+
import React, { memo } from 'react';
33

44
const DividerBlock = ({ className }) => (
55
<Divider className={className} marginBlock='x24' />
66
);
77

8-
export default DividerBlock;
8+
export default memo(DividerBlock);

packages/fuselage-ui-kit/src/blocks/ImageBlock.js

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Box, Skeleton } from '@rocket.chat/fuselage';
2-
import React, { useEffect, useMemo, useState } from 'react';
2+
import React, { memo, useEffect, useMemo, useState } from 'react';
33

44
import { useSurfaceType } from '../surfaces/SurfaceContext';
55

@@ -28,15 +28,15 @@ const fetchImageState = (img) => {
2828
};
2929
};
3030

31-
const ImageBlock = ({ className, element, parser }) => {
31+
const ImageBlock = ({ className, blockElement, parser }) => {
3232
const surface = useSurfaceType();
3333

3434
const alignment =
3535
surface === 'banner' || surface === 'message' ? 'flex-start' : 'center';
3636

3737
const [{ loading, width, height }, setState] = useState(() => {
3838
const img = document.createElement('img');
39-
img.src = element.imageUrl;
39+
img.src = blockElement.imageUrl;
4040
return fetchImageState(img);
4141
});
4242

@@ -48,7 +48,7 @@ const ImageBlock = ({ className, element, parser }) => {
4848
};
4949

5050
img.addEventListener('load', handleLoad);
51-
img.src = element.imageUrl;
51+
img.src = blockElement.imageUrl;
5252

5353
if (img.complete) {
5454
img.removeEventListener('load', handleLoad);
@@ -58,7 +58,7 @@ const ImageBlock = ({ className, element, parser }) => {
5858
return () => {
5959
img.removeEventListener('load', handleLoad);
6060
};
61-
}, [element.imageUrl]);
61+
}, [blockElement.imageUrl]);
6262

6363
const style = useMemo(
6464
() => ({
@@ -67,9 +67,9 @@ const ImageBlock = ({ className, element, parser }) => {
6767
backgroundPosition: '50%',
6868
backgroundSize: 'cover',
6969
backgroundColor: 'rgba(204, 204, 204, 38%)',
70-
backgroundImage: `url(${element.imageUrl})`,
70+
backgroundImage: `url(${blockElement.imageUrl})`,
7171
}),
72-
[element.imageUrl]
72+
[blockElement.imageUrl]
7373
);
7474

7575
return (
@@ -81,9 +81,9 @@ const ImageBlock = ({ className, element, parser }) => {
8181
alignItems={alignment}
8282
>
8383
<Box overflow='hidden' width={width}>
84-
{element.title && (
84+
{blockElement.title && (
8585
<Box fontScale='c1' color='info' withTruncatedText marginBlockEnd={4}>
86-
{parser.plainText(element.title, -1, 0)}
86+
{parser.plainText(blockElement.title, -1, 0)}
8787
</Box>
8888
)}
8989
{loading ? (
@@ -95,12 +95,12 @@ const ImageBlock = ({ className, element, parser }) => {
9595
width={width}
9696
height={height}
9797
style={style}
98-
aria-label={element.altText}
98+
aria-label={blockElement.altText}
9999
/>
100100
)}
101101
</Box>
102102
</Box>
103103
);
104104
};
105105

106-
export default ImageBlock;
106+
export default memo(ImageBlock);

packages/fuselage-ui-kit/src/blocks/InputBlock.js

+14-9
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
import { Field } from '@rocket.chat/fuselage';
22
import { BlockContext } from '@rocket.chat/ui-kit';
3-
import React, { memo } from 'react';
3+
import React, { memo, useMemo } from 'react';
44

5-
import { useBlockContext } from '../hooks';
5+
import { useUiKitState } from '../hooks';
66

7-
const InputBlock = ({ className, element, parser, context }) => {
8-
const [{ error }] = useBlockContext(element.element, context);
7+
const InputBlock = ({ className, blockElement, parser, context }) => {
8+
const { appId, blockId, element, label, hint } = blockElement;
9+
const inputElement = useMemo(() => ({ appId, blockId, ...element }), [
10+
appId,
11+
blockId,
12+
element,
13+
]);
14+
15+
const [{ error }] = useUiKitState(inputElement, context);
916

1017
return (
1118
<Field className={className}>
12-
{element.label && (
13-
<Field.Label>{parser.plainText(element.label)}</Field.Label>
14-
)}
19+
{label && <Field.Label>{parser.plainText(label)}</Field.Label>}
1520
<Field.Row>
16-
{parser.renderInputs(element.element, BlockContext.FORM, parser, 0)}
21+
{parser.renderInputs(inputElement, BlockContext.FORM, parser, 0)}
1722
</Field.Row>
1823
{error && <Field.Error>{error}</Field.Error>}
19-
{element.hint && <Field.Hint>{element.hint}</Field.Hint>}
24+
{hint && <Field.Hint>{hint}</Field.Hint>}
2025
</Field>
2126
);
2227
};

packages/fuselage-ui-kit/src/blocks/SectionBlock.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Box, Flex, Grid } from '@rocket.chat/fuselage';
22
import { BlockContext } from '@rocket.chat/ui-kit';
3-
import React, { useMemo } from 'react';
3+
import React, { memo, useMemo } from 'react';
44

55
const Accessory = ({ blockId, appId, element, parser }) =>
66
parser.renderAccessories(
@@ -27,12 +27,12 @@ const Fields = ({ fields, parser }) => (
2727
</Grid>
2828
);
2929

30-
const SectionBlock = ({ className, element, parser }) => {
31-
const { blockId, appId, text, fields, accessory } = element;
30+
const SectionBlock = ({ className, blockElement, parser }) => {
31+
const { blockId, appId, text, fields, accessory } = blockElement;
3232

33-
const accessoryElement = useMemo(() => ({ blockId, appId, ...accessory }), [
34-
blockId,
33+
const accessoryElement = useMemo(() => ({ appId, blockId, ...accessory }), [
3534
appId,
35+
blockId,
3636
accessory,
3737
]);
3838

@@ -57,4 +57,4 @@ const SectionBlock = ({ className, element, parser }) => {
5757
);
5858
};
5959

60-
export default SectionBlock;
60+
export default memo(SectionBlock);

packages/fuselage-ui-kit/src/elements/ButtonElement.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { Button, Throbber } from '@rocket.chat/fuselage';
22
import React from 'react';
33

4-
import { useBlockContext } from '../hooks';
4+
import { useUiKitState } from '../hooks';
55

66
const ButtonElement = ({ element, context, parser }) => {
7-
const [{ loading }, action] = useBlockContext(element, context);
7+
const [{ loading }, action] = useUiKitState(element, context);
88

99
return (
1010
<Button

packages/fuselage-ui-kit/src/elements/DatePickerElement.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { InputBox } from '@rocket.chat/fuselage';
22
import React from 'react';
33

4-
import { useBlockContext } from '../hooks';
4+
import { useUiKitState } from '../hooks';
55

66
const DatePickerElement = ({ element, context, parser }) => {
7-
const [{ loading, value, error }, action] = useBlockContext(element, context);
7+
const [{ loading, value, error }, action] = useUiKitState(element, context);
88
const { actionId, placeholder } = element;
99
return (
1010
<InputBox

packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { MultiSelectFiltered } from '@rocket.chat/fuselage';
22
import React, { memo, useCallback, useMemo } from 'react';
33

4-
import { useBlockContext } from '../hooks';
4+
import { useUiKitState } from '../hooks';
55

66
export const MultiStaticSelectElement = ({ element, context, parser }) => {
7-
const [{ loading, value, error }, action] = useBlockContext(element, context);
7+
const [{ loading, value, error }, action] = useUiKitState(element, context);
88

99
const { options, placeholder } = element;
1010

packages/fuselage-ui-kit/src/elements/OverflowElement.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import {
77
} from '@rocket.chat/fuselage';
88
import React, { useRef, useCallback } from 'react';
99

10-
import { useBlockContext } from '../hooks';
10+
import { useUiKitState } from '../hooks';
1111

1212
const convertOptions = (options, parser) =>
1313
options.map(({ text, value }) => [value, parser(text)]);
1414

1515
const OverflowElement = ({ element, context, parser }) => {
16-
const [{ loading }, action] = useBlockContext(element, context);
16+
const [{ loading }, action] = useUiKitState(element, context);
1717

1818
const { options } = element;
1919

packages/fuselage-ui-kit/src/elements/PlainInputElement.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { TextAreaInput, TextInput } from '@rocket.chat/fuselage';
22
import React, { memo } from 'react';
33

4-
import { useBlockContext } from '../hooks';
4+
import { useUiKitState } from '../hooks';
55

66
const PlainInputElement = ({ element, context, parser }) => {
7-
const [{ loading, value, error }, action] = useBlockContext(element, context);
7+
const [{ loading, value, error }, action] = useUiKitState(element, context);
88
const { multiline, actionId, placeholder } = element;
99
const Component = multiline ? TextAreaInput : TextInput;
1010
return (

packages/fuselage-ui-kit/src/elements/StaticSelectElement.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { SelectFiltered } from '@rocket.chat/fuselage';
22
import React, { memo, useCallback, useMemo } from 'react';
33

4-
import { useBlockContext } from '../hooks';
4+
import { useUiKitState } from '../hooks';
55

66
export const StaticSelectElement = ({ element, context, parser }) => {
7-
const [{ loading, value, error }, action] = useBlockContext(element, context);
7+
const [{ loading, value, error }, action] = useUiKitState(element, context);
88

99
const { options, placeholder } = element;
1010

packages/fuselage-ui-kit/src/hooks.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const defaultContext = {
1111

1212
export const kitContext = createContext(defaultContext);
1313

14-
export const useBlockContext = (
14+
export const useUiKitState = (
1515
{ blockId, actionId, appId, initialValue },
1616
context
1717
) => {
@@ -45,7 +45,7 @@ export const useBlockContext = (
4545

4646
const stateFunction = useMutableCallback(async ({ target: { value } }) => {
4747
setValue(value);
48-
await state({ blockId, appId, actionId, value });
48+
await state({ blockId, appId: appId || appIdFromContext, actionId, value });
4949
});
5050

5151
const result = useMemo(() => ({ loading, setLoading, error, value }), [

0 commit comments

Comments
 (0)