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.
Files changed (72) hide show
  1. package/lib/commonjs/components/Attachment/Attachment.js +6 -1
  2. package/lib/commonjs/components/Attachment/Attachment.js.map +1 -1
  3. package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js +1 -1
  4. package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
  5. package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js +1 -1
  6. package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
  7. package/lib/commonjs/components/Message/MessageItemView/MessageFooter.js +1 -1
  8. package/lib/commonjs/components/Message/MessageItemView/MessageFooter.js.map +1 -1
  9. package/lib/commonjs/components/MessageInput/MessageComposer.js +1 -1
  10. package/lib/commonjs/components/MessageInput/MessageComposer.js.map +1 -1
  11. package/lib/commonjs/components/MessageInput/SendMessageDisallowedIndicator.js +1 -1
  12. package/lib/commonjs/components/MessageInput/SendMessageDisallowedIndicator.js.map +1 -1
  13. package/lib/commonjs/components/Poll/components/CreatePollHeader.js +4 -3
  14. package/lib/commonjs/components/Poll/components/CreatePollHeader.js.map +1 -1
  15. package/lib/commonjs/components/Poll/components/PollModalHeader.js +3 -3
  16. package/lib/commonjs/components/Poll/components/PollModalHeader.js.map +1 -1
  17. package/lib/commonjs/components/ui/Avatar/AvatarStack.js +20 -1
  18. package/lib/commonjs/components/ui/Avatar/AvatarStack.js.map +1 -1
  19. package/lib/commonjs/contexts/themeContext/utils/theme.js +3 -0
  20. package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
  21. package/lib/commonjs/icons/arrow-left.js +40 -0
  22. package/lib/commonjs/icons/arrow-left.js.map +1 -0
  23. package/lib/commonjs/version.json +1 -1
  24. package/lib/module/components/Attachment/Attachment.js +6 -1
  25. package/lib/module/components/Attachment/Attachment.js.map +1 -1
  26. package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js +1 -1
  27. package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
  28. package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js +1 -1
  29. package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
  30. package/lib/module/components/Message/MessageItemView/MessageFooter.js +1 -1
  31. package/lib/module/components/Message/MessageItemView/MessageFooter.js.map +1 -1
  32. package/lib/module/components/MessageInput/MessageComposer.js +1 -1
  33. package/lib/module/components/MessageInput/MessageComposer.js.map +1 -1
  34. package/lib/module/components/MessageInput/SendMessageDisallowedIndicator.js +1 -1
  35. package/lib/module/components/MessageInput/SendMessageDisallowedIndicator.js.map +1 -1
  36. package/lib/module/components/Poll/components/CreatePollHeader.js +4 -3
  37. package/lib/module/components/Poll/components/CreatePollHeader.js.map +1 -1
  38. package/lib/module/components/Poll/components/PollModalHeader.js +3 -3
  39. package/lib/module/components/Poll/components/PollModalHeader.js.map +1 -1
  40. package/lib/module/components/ui/Avatar/AvatarStack.js +20 -1
  41. package/lib/module/components/ui/Avatar/AvatarStack.js.map +1 -1
  42. package/lib/module/contexts/themeContext/utils/theme.js +3 -0
  43. package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
  44. package/lib/module/icons/arrow-left.js +40 -0
  45. package/lib/module/icons/arrow-left.js.map +1 -0
  46. package/lib/module/version.json +1 -1
  47. package/lib/typescript/components/Poll/components/CreatePollHeader.d.ts.map +1 -1
  48. package/lib/typescript/components/ui/Avatar/AvatarStack.d.ts.map +1 -1
  49. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +3 -0
  50. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
  51. package/lib/typescript/contexts/themeContext/utils/theme.d.ts +3 -0
  52. package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
  53. package/lib/typescript/icons/arrow-left.d.ts +4 -0
  54. package/lib/typescript/icons/arrow-left.d.ts.map +1 -0
  55. package/package.json +1 -1
  56. package/src/components/Attachment/Attachment.tsx +8 -3
  57. package/src/components/Attachment/__tests__/Attachment.test.tsx +100 -4
  58. package/src/components/ImageGallery/components/ImageGalleryFooter.tsx +1 -1
  59. package/src/components/ImageGallery/components/ImageGalleryHeader.tsx +1 -1
  60. package/src/components/Message/MessageItemView/MessageFooter.tsx +1 -1
  61. package/src/components/MessageInput/MessageComposer.tsx +1 -1
  62. package/src/components/MessageInput/SendMessageDisallowedIndicator.tsx +1 -1
  63. package/src/components/MessageList/__tests__/__snapshots__/TypingIndicator.test.tsx.snap +10 -2
  64. package/src/components/Poll/components/CreatePollHeader.tsx +4 -3
  65. package/src/components/Poll/components/PollModalHeader.tsx +3 -3
  66. package/src/components/Poll/components/__tests__/CreatePollHeader.test.tsx +94 -0
  67. package/src/components/Poll/components/__tests__/PollModalHeader.test.tsx +126 -0
  68. package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +5 -5
  69. package/src/components/ui/Avatar/AvatarStack.tsx +32 -2
  70. package/src/contexts/themeContext/utils/theme.ts +6 -0
  71. package/src/icons/arrow-left.tsx +23 -0
  72. 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": 8,
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": 8,
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": 8,
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": 8,
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
- "borderColor": "#d5dbe1",
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 <UserAvatar key={user.id} user={user} size={avatarSize} showBorder />;
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
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "9.2.1-beta.1"
2
+ "version": "9.2.1-beta.2"
3
3
  }