stream-chat-react-native-core 9.2.1-beta.1 → 9.2.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/components/Attachment/Attachment.js +6 -1
- package/lib/commonjs/components/Attachment/Attachment.js.map +1 -1
- package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js +1 -1
- package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
- package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js +1 -1
- package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
- package/lib/commonjs/components/Message/MessageItemView/MessageFooter.js +1 -1
- package/lib/commonjs/components/Message/MessageItemView/MessageFooter.js.map +1 -1
- package/lib/commonjs/components/MessageInput/MessageComposer.js +1 -1
- package/lib/commonjs/components/MessageInput/MessageComposer.js.map +1 -1
- package/lib/commonjs/components/MessageInput/SendMessageDisallowedIndicator.js +1 -1
- package/lib/commonjs/components/MessageInput/SendMessageDisallowedIndicator.js.map +1 -1
- package/lib/commonjs/components/Poll/components/CreatePollHeader.js +4 -3
- package/lib/commonjs/components/Poll/components/CreatePollHeader.js.map +1 -1
- package/lib/commonjs/components/Poll/components/PollModalHeader.js +3 -3
- package/lib/commonjs/components/Poll/components/PollModalHeader.js.map +1 -1
- package/lib/commonjs/components/ui/Avatar/AvatarStack.js +20 -1
- package/lib/commonjs/components/ui/Avatar/AvatarStack.js.map +1 -1
- package/lib/commonjs/contexts/themeContext/utils/theme.js +3 -0
- package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
- package/lib/commonjs/icons/arrow-left.js +40 -0
- package/lib/commonjs/icons/arrow-left.js.map +1 -0
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/Attachment/Attachment.js +6 -1
- package/lib/module/components/Attachment/Attachment.js.map +1 -1
- package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js +1 -1
- package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
- package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js +1 -1
- package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
- package/lib/module/components/Message/MessageItemView/MessageFooter.js +1 -1
- package/lib/module/components/Message/MessageItemView/MessageFooter.js.map +1 -1
- package/lib/module/components/MessageInput/MessageComposer.js +1 -1
- package/lib/module/components/MessageInput/MessageComposer.js.map +1 -1
- package/lib/module/components/MessageInput/SendMessageDisallowedIndicator.js +1 -1
- package/lib/module/components/MessageInput/SendMessageDisallowedIndicator.js.map +1 -1
- package/lib/module/components/Poll/components/CreatePollHeader.js +4 -3
- package/lib/module/components/Poll/components/CreatePollHeader.js.map +1 -1
- package/lib/module/components/Poll/components/PollModalHeader.js +3 -3
- package/lib/module/components/Poll/components/PollModalHeader.js.map +1 -1
- package/lib/module/components/ui/Avatar/AvatarStack.js +20 -1
- package/lib/module/components/ui/Avatar/AvatarStack.js.map +1 -1
- package/lib/module/contexts/themeContext/utils/theme.js +3 -0
- package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
- package/lib/module/icons/arrow-left.js +40 -0
- package/lib/module/icons/arrow-left.js.map +1 -0
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/Poll/components/CreatePollHeader.d.ts.map +1 -1
- package/lib/typescript/components/ui/Avatar/AvatarStack.d.ts.map +1 -1
- package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +3 -0
- package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
- package/lib/typescript/contexts/themeContext/utils/theme.d.ts +3 -0
- package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
- package/lib/typescript/icons/arrow-left.d.ts +4 -0
- package/lib/typescript/icons/arrow-left.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/components/Attachment/Attachment.tsx +8 -3
- package/src/components/Attachment/__tests__/Attachment.test.tsx +100 -4
- package/src/components/ImageGallery/components/ImageGalleryFooter.tsx +1 -1
- package/src/components/ImageGallery/components/ImageGalleryHeader.tsx +1 -1
- package/src/components/Message/MessageItemView/MessageFooter.tsx +1 -1
- package/src/components/MessageInput/MessageComposer.tsx +1 -1
- package/src/components/MessageInput/SendMessageDisallowedIndicator.tsx +1 -1
- package/src/components/MessageList/__tests__/__snapshots__/TypingIndicator.test.tsx.snap +10 -2
- package/src/components/Poll/components/CreatePollHeader.tsx +4 -3
- package/src/components/Poll/components/PollModalHeader.tsx +3 -3
- package/src/components/Poll/components/__tests__/CreatePollHeader.test.tsx +94 -0
- package/src/components/Poll/components/__tests__/PollModalHeader.test.tsx +126 -0
- package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +5 -5
- package/src/components/ui/Avatar/AvatarStack.tsx +32 -2
- package/src/contexts/themeContext/utils/theme.ts +6 -0
- package/src/icons/arrow-left.tsx +23 -0
- package/src/version.json +1 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
import { Platform, StyleProp, StyleSheet, ViewStyle } from 'react-native';
|
|
4
|
+
|
|
5
|
+
import { render, screen } from '@testing-library/react-native';
|
|
6
|
+
|
|
7
|
+
import { ThemeProvider } from '../../../../contexts';
|
|
8
|
+
import { PollModalHeader } from '../PollModalHeader';
|
|
9
|
+
|
|
10
|
+
const originalPlatform = Platform.OS;
|
|
11
|
+
|
|
12
|
+
const setPlatform = (os: typeof Platform.OS) => {
|
|
13
|
+
Object.defineProperty(Platform, 'OS', {
|
|
14
|
+
configurable: true,
|
|
15
|
+
get: () => os,
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const getCloseButtonWrapperStyle = () => {
|
|
20
|
+
let node = screen.getByTestId('poll-results-close-button');
|
|
21
|
+
|
|
22
|
+
while (node.parent) {
|
|
23
|
+
const style = StyleSheet.flatten(node.parent.props.style as StyleProp<ViewStyle>);
|
|
24
|
+
if (style?.height === 40 && style.width === 40) {
|
|
25
|
+
return style;
|
|
26
|
+
}
|
|
27
|
+
node = node.parent;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
throw new Error('Poll modal header close button wrapper not found');
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const collectPathData = (node: unknown): string[] => {
|
|
34
|
+
if (!node || typeof node !== 'object') {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (Array.isArray(node)) {
|
|
39
|
+
return node.reduce<string[]>((acc, child) => [...acc, ...collectPathData(child)], []);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const { children, props } = node as {
|
|
43
|
+
children?: unknown;
|
|
44
|
+
props?: { d?: unknown };
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return [...(typeof props?.d === 'string' ? [props.d] : []), ...collectPathData(children)];
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const collectTransforms = (node: unknown): string[] => {
|
|
51
|
+
if (!node || typeof node !== 'object') {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (Array.isArray(node)) {
|
|
56
|
+
return node.reduce<string[]>((acc, child) => [...acc, ...collectTransforms(child)], []);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const { children, props } = node as {
|
|
60
|
+
children?: unknown;
|
|
61
|
+
props?: { style?: StyleProp<ViewStyle>; transform?: unknown };
|
|
62
|
+
};
|
|
63
|
+
const style = StyleSheet.flatten(props?.style);
|
|
64
|
+
const styleTransforms = Array.isArray(style?.transform)
|
|
65
|
+
? style.transform.flatMap((transform) => {
|
|
66
|
+
if (
|
|
67
|
+
transform &&
|
|
68
|
+
typeof transform === 'object' &&
|
|
69
|
+
'rotate' in transform &&
|
|
70
|
+
typeof transform.rotate === 'string'
|
|
71
|
+
) {
|
|
72
|
+
return [transform.rotate];
|
|
73
|
+
}
|
|
74
|
+
return [];
|
|
75
|
+
})
|
|
76
|
+
: [];
|
|
77
|
+
|
|
78
|
+
return [
|
|
79
|
+
...(typeof props?.transform === 'string' ? [props.transform] : []),
|
|
80
|
+
...styleTransforms,
|
|
81
|
+
...collectTransforms(children),
|
|
82
|
+
];
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const renderPollModalHeader = () =>
|
|
86
|
+
render(
|
|
87
|
+
<ThemeProvider>
|
|
88
|
+
<PollModalHeader onPress={jest.fn()} title='Poll Results' />
|
|
89
|
+
</ThemeProvider>,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
describe('PollModalHeader', () => {
|
|
93
|
+
afterEach(() => {
|
|
94
|
+
setPlatform(originalPlatform);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('renders a secondary ghost arrow-left button outside Android', () => {
|
|
98
|
+
setPlatform('ios');
|
|
99
|
+
|
|
100
|
+
renderPollModalHeader();
|
|
101
|
+
|
|
102
|
+
const style = getCloseButtonWrapperStyle();
|
|
103
|
+
expect(style.backgroundColor).toBeUndefined();
|
|
104
|
+
expect(style.borderWidth).toBeUndefined();
|
|
105
|
+
expect(style.borderColor).toBeUndefined();
|
|
106
|
+
expect(collectPathData(screen.toJSON())).toContain(
|
|
107
|
+
'M10 16.875V3.125M10 3.125L4.375 8.75M10 3.125L15.625 8.75',
|
|
108
|
+
);
|
|
109
|
+
expect(collectTransforms(screen.toJSON())).toContain('-90deg');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('renders a secondary ghost arrow-left button on Android', () => {
|
|
113
|
+
setPlatform('android');
|
|
114
|
+
|
|
115
|
+
renderPollModalHeader();
|
|
116
|
+
|
|
117
|
+
const style = getCloseButtonWrapperStyle();
|
|
118
|
+
expect(style.backgroundColor).toBeUndefined();
|
|
119
|
+
expect(style.borderWidth).toBeUndefined();
|
|
120
|
+
expect(style.borderColor).toBeUndefined();
|
|
121
|
+
expect(collectPathData(screen.toJSON())).toContain(
|
|
122
|
+
'M10 16.875V3.125M10 3.125L4.375 8.75M10 3.125L15.625 8.75',
|
|
123
|
+
);
|
|
124
|
+
expect(collectTransforms(screen.toJSON())).toContain('-90deg');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -603,7 +603,7 @@ exports[`Thread should match thread snapshot 1`] = `
|
|
|
603
603
|
{
|
|
604
604
|
"alignItems": "center",
|
|
605
605
|
"flexDirection": "row",
|
|
606
|
-
"gap":
|
|
606
|
+
"gap": 4,
|
|
607
607
|
"justifyContent": "center",
|
|
608
608
|
"maxWidth": "100%",
|
|
609
609
|
"paddingVertical": 4,
|
|
@@ -946,7 +946,7 @@ exports[`Thread should match thread snapshot 1`] = `
|
|
|
946
946
|
{
|
|
947
947
|
"alignItems": "center",
|
|
948
948
|
"flexDirection": "row",
|
|
949
|
-
"gap":
|
|
949
|
+
"gap": 4,
|
|
950
950
|
"justifyContent": "center",
|
|
951
951
|
"maxWidth": "100%",
|
|
952
952
|
"paddingVertical": 4,
|
|
@@ -1322,7 +1322,7 @@ exports[`Thread should match thread snapshot 1`] = `
|
|
|
1322
1322
|
{
|
|
1323
1323
|
"alignItems": "center",
|
|
1324
1324
|
"flexDirection": "row",
|
|
1325
|
-
"gap":
|
|
1325
|
+
"gap": 4,
|
|
1326
1326
|
"justifyContent": "center",
|
|
1327
1327
|
"maxWidth": "100%",
|
|
1328
1328
|
"paddingVertical": 4,
|
|
@@ -1656,7 +1656,7 @@ exports[`Thread should match thread snapshot 1`] = `
|
|
|
1656
1656
|
{
|
|
1657
1657
|
"alignItems": "center",
|
|
1658
1658
|
"flexDirection": "row",
|
|
1659
|
-
"gap":
|
|
1659
|
+
"gap": 4,
|
|
1660
1660
|
"justifyContent": "center",
|
|
1661
1661
|
"maxWidth": "100%",
|
|
1662
1662
|
"paddingVertical": 4,
|
|
@@ -1768,7 +1768,7 @@ exports[`Thread should match thread snapshot 1`] = `
|
|
|
1768
1768
|
},
|
|
1769
1769
|
{
|
|
1770
1770
|
"backgroundColor": "#ffffff",
|
|
1771
|
-
"
|
|
1771
|
+
"borderTopColor": "#ebeef1",
|
|
1772
1772
|
"borderTopWidth": 1,
|
|
1773
1773
|
"paddingBottom": 16,
|
|
1774
1774
|
},
|
|
@@ -7,6 +7,8 @@ import { avatarSizes } from './constants';
|
|
|
7
7
|
|
|
8
8
|
import { UserAvatar } from './UserAvatar';
|
|
9
9
|
|
|
10
|
+
import { useTheme } from '../../../contexts/themeContext/ThemeContext';
|
|
11
|
+
import { primitives } from '../../../theme';
|
|
10
12
|
import { BadgeCount } from '../Badge';
|
|
11
13
|
|
|
12
14
|
export type AvatarStackProps = {
|
|
@@ -85,12 +87,21 @@ export const UserAvatarStack = ({
|
|
|
85
87
|
overlap,
|
|
86
88
|
users,
|
|
87
89
|
}: UserAvatarStackProps) => {
|
|
90
|
+
const styles = useUserAvatarStackStyles();
|
|
88
91
|
const items = useMemo(
|
|
89
92
|
() =>
|
|
90
93
|
users.map((user) => {
|
|
91
|
-
return
|
|
94
|
+
return (
|
|
95
|
+
<UserAvatar
|
|
96
|
+
key={user.id}
|
|
97
|
+
style={styles.userAvatarWrapper}
|
|
98
|
+
user={user}
|
|
99
|
+
size={avatarSize}
|
|
100
|
+
showBorder
|
|
101
|
+
/>
|
|
102
|
+
);
|
|
92
103
|
}),
|
|
93
|
-
[avatarSize, users],
|
|
104
|
+
[avatarSize, styles.userAvatarWrapper, users],
|
|
94
105
|
);
|
|
95
106
|
|
|
96
107
|
return (
|
|
@@ -98,6 +109,25 @@ export const UserAvatarStack = ({
|
|
|
98
109
|
);
|
|
99
110
|
};
|
|
100
111
|
|
|
112
|
+
const useUserAvatarStackStyles = () => {
|
|
113
|
+
const {
|
|
114
|
+
theme: { avatarStack, semantics },
|
|
115
|
+
} = useTheme();
|
|
116
|
+
|
|
117
|
+
return useMemo(
|
|
118
|
+
() =>
|
|
119
|
+
StyleSheet.create({
|
|
120
|
+
userAvatarWrapper: {
|
|
121
|
+
borderWidth: 2,
|
|
122
|
+
borderColor: semantics.borderCoreInverse,
|
|
123
|
+
borderRadius: primitives.radiusMax,
|
|
124
|
+
...avatarStack.userAvatarWrapper,
|
|
125
|
+
},
|
|
126
|
+
}),
|
|
127
|
+
[avatarStack.userAvatarWrapper, semantics.borderCoreInverse],
|
|
128
|
+
);
|
|
129
|
+
};
|
|
130
|
+
|
|
101
131
|
const useStyles = () => {
|
|
102
132
|
return useMemo(
|
|
103
133
|
() =>
|
|
@@ -145,6 +145,9 @@ export type Theme = {
|
|
|
145
145
|
presenceIndicator: CircleProps;
|
|
146
146
|
presenceIndicatorContainer: ViewStyle;
|
|
147
147
|
};
|
|
148
|
+
avatarStack: {
|
|
149
|
+
userAvatarWrapper: ViewStyle;
|
|
150
|
+
};
|
|
148
151
|
bottomSheetModal: {
|
|
149
152
|
container: ViewStyle;
|
|
150
153
|
contentContainer: ViewStyle;
|
|
@@ -1095,6 +1098,9 @@ export const defaultTheme: Theme = {
|
|
|
1095
1098
|
},
|
|
1096
1099
|
presenceIndicatorContainer: {},
|
|
1097
1100
|
},
|
|
1101
|
+
avatarStack: {
|
|
1102
|
+
userAvatarWrapper: {},
|
|
1103
|
+
},
|
|
1098
1104
|
bottomSheetModal: {
|
|
1099
1105
|
container: {},
|
|
1100
1106
|
contentContainer: {},
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { I18nManager } from 'react-native';
|
|
3
|
+
import Svg, { Path } from 'react-native-svg';
|
|
4
|
+
|
|
5
|
+
import { IconProps } from './utils/base';
|
|
6
|
+
|
|
7
|
+
export const ArrowLeft = ({ height, size, style, width, ...rest }: IconProps) => (
|
|
8
|
+
<Svg
|
|
9
|
+
fill='none'
|
|
10
|
+
height={height ?? size}
|
|
11
|
+
style={[style, { transform: [{ rotate: I18nManager.isRTL ? '90deg' : '-90deg' }] }]}
|
|
12
|
+
viewBox='0 0 20 20'
|
|
13
|
+
width={width ?? size}
|
|
14
|
+
>
|
|
15
|
+
<Path
|
|
16
|
+
d='M10 16.875V3.125M10 3.125L4.375 8.75M10 3.125L15.625 8.75'
|
|
17
|
+
strokeLinecap='round'
|
|
18
|
+
strokeLinejoin='round'
|
|
19
|
+
strokeWidth={1.5}
|
|
20
|
+
{...rest}
|
|
21
|
+
/>
|
|
22
|
+
</Svg>
|
|
23
|
+
);
|
package/src/version.json
CHANGED