stream-chat-react-native-core 9.4.1-beta.1 → 9.5.0-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/README.md +1 -1
- package/lib/commonjs/a11y/hooks/useScreenReaderMountFocus.js +16 -0
- package/lib/commonjs/a11y/hooks/useScreenReaderMountFocus.js.map +1 -0
- package/lib/commonjs/a11y/hooks/useSetAccessibilityFocus.js +46 -0
- package/lib/commonjs/a11y/hooks/useSetAccessibilityFocus.js.map +1 -0
- package/lib/commonjs/a11y/index.js +22 -0
- package/lib/commonjs/a11y/index.js.map +1 -1
- package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembers.js +7 -4
- package/lib/commonjs/components/ChannelDetails/components/members/ChannelAddMembers.js.map +1 -1
- package/lib/commonjs/components/ChannelDetails/components/members/ChannelAllMembersModal.js +2 -23
- package/lib/commonjs/components/ChannelDetails/components/members/ChannelAllMembersModal.js.map +1 -1
- package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberList.js +124 -22
- package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberList.js.map +1 -1
- package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js +1 -1
- package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js.map +1 -1
- package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageList.js +1 -1
- package/lib/commonjs/components/ChannelDetails/components/navigation-section/PinnedMessageList.js.map +1 -1
- package/lib/commonjs/components/ChannelDetails/hooks/members/index.js +0 -11
- package/lib/commonjs/components/ChannelDetails/hooks/members/index.js.map +1 -1
- package/lib/commonjs/components/MessageInput/MessageComposer.js +2 -0
- package/lib/commonjs/components/MessageInput/MessageComposer.js.map +1 -1
- package/lib/commonjs/components/UIComponents/SearchInput.js +1 -3
- package/lib/commonjs/components/UIComponents/SearchInput.js.map +1 -1
- package/lib/commonjs/contexts/channelMemberListContext/ChannelMemberListContext.js +63 -0
- package/lib/commonjs/contexts/channelMemberListContext/ChannelMemberListContext.js.map +1 -0
- package/lib/commonjs/contexts/index.js +11 -0
- package/lib/commonjs/contexts/index.js.map +1 -1
- package/lib/commonjs/contexts/themeContext/utils/theme.js +8 -0
- package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
- package/lib/commonjs/i18n/ar.json +3 -1
- package/lib/commonjs/i18n/en.json +2 -0
- package/lib/commonjs/i18n/es.json +3 -1
- package/lib/commonjs/i18n/fr.json +3 -1
- package/lib/commonjs/i18n/he.json +3 -1
- package/lib/commonjs/i18n/hi.json +3 -1
- package/lib/commonjs/i18n/it.json +3 -1
- package/lib/commonjs/i18n/ja.json +3 -1
- package/lib/commonjs/i18n/ko.json +3 -1
- package/lib/commonjs/i18n/nl.json +3 -1
- package/lib/commonjs/i18n/pt-br.json +3 -1
- package/lib/commonjs/i18n/ru.json +3 -1
- package/lib/commonjs/i18n/tr.json +3 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/a11y/hooks/useScreenReaderMountFocus.js +16 -0
- package/lib/module/a11y/hooks/useScreenReaderMountFocus.js.map +1 -0
- package/lib/module/a11y/hooks/useSetAccessibilityFocus.js +46 -0
- package/lib/module/a11y/hooks/useSetAccessibilityFocus.js.map +1 -0
- package/lib/module/a11y/index.js +22 -0
- package/lib/module/a11y/index.js.map +1 -1
- package/lib/module/components/ChannelDetails/components/members/ChannelAddMembers.js +7 -4
- package/lib/module/components/ChannelDetails/components/members/ChannelAddMembers.js.map +1 -1
- package/lib/module/components/ChannelDetails/components/members/ChannelAllMembersModal.js +2 -23
- package/lib/module/components/ChannelDetails/components/members/ChannelAllMembersModal.js.map +1 -1
- package/lib/module/components/ChannelDetails/components/members/ChannelMemberList.js +124 -22
- package/lib/module/components/ChannelDetails/components/members/ChannelMemberList.js.map +1 -1
- package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js +1 -1
- package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageItem.js.map +1 -1
- package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageList.js +1 -1
- package/lib/module/components/ChannelDetails/components/navigation-section/PinnedMessageList.js.map +1 -1
- package/lib/module/components/ChannelDetails/hooks/members/index.js +0 -11
- package/lib/module/components/ChannelDetails/hooks/members/index.js.map +1 -1
- package/lib/module/components/MessageInput/MessageComposer.js +2 -0
- package/lib/module/components/MessageInput/MessageComposer.js.map +1 -1
- package/lib/module/components/UIComponents/SearchInput.js +1 -3
- package/lib/module/components/UIComponents/SearchInput.js.map +1 -1
- package/lib/module/contexts/channelMemberListContext/ChannelMemberListContext.js +63 -0
- package/lib/module/contexts/channelMemberListContext/ChannelMemberListContext.js.map +1 -0
- package/lib/module/contexts/index.js +11 -0
- package/lib/module/contexts/index.js.map +1 -1
- package/lib/module/contexts/themeContext/utils/theme.js +8 -0
- package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
- package/lib/module/i18n/ar.json +3 -1
- package/lib/module/i18n/en.json +2 -0
- package/lib/module/i18n/es.json +3 -1
- package/lib/module/i18n/fr.json +3 -1
- package/lib/module/i18n/he.json +3 -1
- package/lib/module/i18n/hi.json +3 -1
- package/lib/module/i18n/it.json +3 -1
- package/lib/module/i18n/ja.json +3 -1
- package/lib/module/i18n/ko.json +3 -1
- package/lib/module/i18n/nl.json +3 -1
- package/lib/module/i18n/pt-br.json +3 -1
- package/lib/module/i18n/ru.json +3 -1
- package/lib/module/i18n/tr.json +3 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/a11y/hooks/useScreenReaderMountFocus.d.ts +8 -0
- package/lib/typescript/a11y/hooks/useScreenReaderMountFocus.d.ts.map +1 -0
- package/lib/typescript/a11y/hooks/useSetAccessibilityFocus.d.ts +28 -0
- package/lib/typescript/a11y/hooks/useSetAccessibilityFocus.d.ts.map +1 -0
- package/lib/typescript/a11y/index.d.ts +2 -0
- package/lib/typescript/a11y/index.d.ts.map +1 -1
- package/lib/typescript/components/ChannelDetails/components/members/ChannelAddMembers.d.ts.map +1 -1
- package/lib/typescript/components/ChannelDetails/components/members/ChannelAllMembersModal.d.ts +1 -1
- package/lib/typescript/components/ChannelDetails/components/members/ChannelAllMembersModal.d.ts.map +1 -1
- package/lib/typescript/components/ChannelDetails/components/members/ChannelMemberList.d.ts +4 -2
- package/lib/typescript/components/ChannelDetails/components/members/ChannelMemberList.d.ts.map +1 -1
- package/lib/typescript/components/ChannelDetails/hooks/members/index.d.ts +0 -1
- package/lib/typescript/components/ChannelDetails/hooks/members/index.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/MessageComposer.d.ts.map +1 -1
- package/lib/typescript/contexts/channelMemberListContext/ChannelMemberListContext.d.ts +21 -0
- package/lib/typescript/contexts/channelMemberListContext/ChannelMemberListContext.d.ts.map +1 -0
- package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts +1 -1
- package/lib/typescript/contexts/index.d.ts +1 -0
- package/lib/typescript/contexts/index.d.ts.map +1 -1
- package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +8 -0
- package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
- package/lib/typescript/contexts/themeContext/utils/theme.d.ts +8 -0
- package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
- package/lib/typescript/i18n/ar.json +3 -1
- package/lib/typescript/i18n/en.json +2 -0
- package/lib/typescript/i18n/es.json +3 -1
- package/lib/typescript/i18n/fr.json +3 -1
- package/lib/typescript/i18n/he.json +3 -1
- package/lib/typescript/i18n/hi.json +3 -1
- package/lib/typescript/i18n/it.json +3 -1
- package/lib/typescript/i18n/ja.json +3 -1
- package/lib/typescript/i18n/ko.json +3 -1
- package/lib/typescript/i18n/nl.json +3 -1
- package/lib/typescript/i18n/pt-br.json +3 -1
- package/lib/typescript/i18n/ru.json +3 -1
- package/lib/typescript/i18n/tr.json +3 -1
- package/lib/typescript/utils/i18n/Streami18n.d.ts +2 -0
- package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/a11y/hooks/useScreenReaderMountFocus.ts +21 -0
- package/src/a11y/hooks/useSetAccessibilityFocus.ts +80 -0
- package/src/a11y/index.ts +2 -0
- package/src/components/ChannelDetails/__tests__/members/ChannelMemberList.test.tsx +265 -151
- package/src/components/ChannelDetails/components/members/ChannelAddMembers.tsx +10 -4
- package/src/components/ChannelDetails/components/members/ChannelAllMembersModal.tsx +4 -25
- package/src/components/ChannelDetails/components/members/ChannelMemberList.tsx +137 -23
- package/src/components/ChannelDetails/components/navigation-section/PinnedMessageItem.tsx +1 -1
- package/src/components/ChannelDetails/components/navigation-section/PinnedMessageList.tsx +1 -1
- package/src/components/ChannelDetails/hooks/members/index.ts +0 -1
- package/src/components/MessageInput/MessageComposer.tsx +5 -0
- package/src/components/UIComponents/SearchInput.tsx +1 -3
- package/src/contexts/channelMemberListContext/ChannelMemberListContext.tsx +72 -0
- package/src/contexts/index.ts +1 -0
- package/src/contexts/themeContext/utils/theme.ts +16 -0
- package/src/i18n/ar.json +3 -1
- package/src/i18n/en.json +2 -0
- package/src/i18n/es.json +3 -1
- package/src/i18n/fr.json +3 -1
- package/src/i18n/he.json +3 -1
- package/src/i18n/hi.json +3 -1
- package/src/i18n/it.json +3 -1
- package/src/i18n/ja.json +3 -1
- package/src/i18n/ko.json +3 -1
- package/src/i18n/nl.json +3 -1
- package/src/i18n/pt-br.json +3 -1
- package/src/i18n/ru.json +3 -1
- package/src/i18n/tr.json +3 -1
- package/src/version.json +1 -1
- package/lib/commonjs/components/ChannelDetails/hooks/members/useChannelAllMembers.js +0 -139
- package/lib/commonjs/components/ChannelDetails/hooks/members/useChannelAllMembers.js.map +0 -1
- package/lib/module/components/ChannelDetails/hooks/members/useChannelAllMembers.js +0 -139
- package/lib/module/components/ChannelDetails/hooks/members/useChannelAllMembers.js.map +0 -1
- package/lib/typescript/components/ChannelDetails/hooks/members/useChannelAllMembers.d.ts +0 -14
- package/lib/typescript/components/ChannelDetails/hooks/members/useChannelAllMembers.d.ts.map +0 -1
- package/src/components/ChannelDetails/__tests__/members/useChannelAllMembers.test.tsx +0 -234
- package/src/components/ChannelDetails/hooks/members/useChannelAllMembers.ts +0 -131
|
@@ -1,16 +1,37 @@
|
|
|
1
|
-
import React, { useCallback,
|
|
2
|
-
import { ActivityIndicator, FlatList, type FlatListProps } from 'react-native';
|
|
1
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { ActivityIndicator, FlatList, type FlatListProps, StyleSheet, View } from 'react-native';
|
|
3
3
|
|
|
4
|
-
import type { ChannelMemberResponse } from 'stream-chat';
|
|
4
|
+
import type { ChannelMemberResponse, SearchSourceState } from 'stream-chat';
|
|
5
5
|
|
|
6
6
|
import { MemberListLoadingSkeleton } from './MemberListLoadingSkeleton';
|
|
7
7
|
|
|
8
8
|
import { useChannelDetailsContext } from '../../../../contexts/channelDetailsContext/channelDetailsContext';
|
|
9
|
+
import {
|
|
10
|
+
ChannelMemberListProvider,
|
|
11
|
+
useChannelMemberListContext,
|
|
12
|
+
} from '../../../../contexts/channelMemberListContext/ChannelMemberListContext';
|
|
9
13
|
import { useComponentsContext } from '../../../../contexts/componentsContext/ComponentsContext';
|
|
10
|
-
import {
|
|
14
|
+
import { useTheme } from '../../../../contexts/themeContext/ThemeContext';
|
|
15
|
+
import { useTranslationContext } from '../../../../contexts/translationContext/TranslationContext';
|
|
16
|
+
import { getNotificationErrorOptions } from '../../../../hooks/actions/useChannelActions';
|
|
17
|
+
import { useStateStore } from '../../../../hooks/useStateStore';
|
|
18
|
+
import { primitives } from '../../../../theme';
|
|
19
|
+
import { useNotificationApi } from '../../../Notifications/hooks/useNotificationApi';
|
|
20
|
+
import { NotificationList } from '../../../Notifications/NotificationList';
|
|
21
|
+
import { NotificationTargetProvider } from '../../../Notifications/NotificationTargetContext';
|
|
22
|
+
import { EmptySearchResult } from '../../../UIComponents/EmptySearchResult';
|
|
23
|
+
import { SearchInput, SearchInputProps } from '../../../UIComponents/SearchInput';
|
|
11
24
|
|
|
12
25
|
const keyExtractor = (member: ChannelMemberResponse) => member.user?.id ?? member.user_id ?? '';
|
|
13
26
|
|
|
27
|
+
const listStateSelector = (state: SearchSourceState<ChannelMemberResponse>) => ({
|
|
28
|
+
error: state.lastQueryError,
|
|
29
|
+
hasNext: state.hasNext,
|
|
30
|
+
loading: state.isLoading,
|
|
31
|
+
members: state.items,
|
|
32
|
+
searchQuery: state.searchQuery,
|
|
33
|
+
});
|
|
34
|
+
|
|
14
35
|
export type ChannelMemberListProps = {
|
|
15
36
|
/**
|
|
16
37
|
* Besides the existing default behavior of the members list, you can attach
|
|
@@ -19,18 +40,54 @@ export type ChannelMemberListProps = {
|
|
|
19
40
|
* See https://reactnative.dev/docs/flatlist#props for the full list.
|
|
20
41
|
*/
|
|
21
42
|
additionalFlatListProps?: Partial<FlatListProps<ChannelMemberResponse>>;
|
|
43
|
+
searchInputProps?: SearchInputProps;
|
|
22
44
|
};
|
|
23
45
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const {
|
|
46
|
+
const ChannelMemberListContent = ({
|
|
47
|
+
additionalFlatListProps,
|
|
48
|
+
searchInputProps,
|
|
49
|
+
}: ChannelMemberListProps) => {
|
|
50
|
+
const { t } = useTranslationContext();
|
|
51
|
+
const {
|
|
52
|
+
theme: {
|
|
53
|
+
channelDetails: { memberList },
|
|
54
|
+
},
|
|
55
|
+
} = useTheme();
|
|
56
|
+
const { onMemberPress } = useChannelDetailsContext();
|
|
30
57
|
const { ChannelMemberActionsSheet, ChannelMemberItem } = useComponentsContext();
|
|
31
|
-
const {
|
|
58
|
+
const { addNotification } = useNotificationApi();
|
|
59
|
+
|
|
60
|
+
const { channel, searchSource } = useChannelMemberListContext();
|
|
61
|
+
const { error, hasNext, loading, members, searchQuery } = useStateStore(
|
|
62
|
+
searchSource.state,
|
|
63
|
+
listStateSelector,
|
|
64
|
+
);
|
|
65
|
+
|
|
32
66
|
const [selectedMember, setSelectedMember] = useState<ChannelMemberResponse | null>(null);
|
|
33
67
|
|
|
68
|
+
const initialized = useRef(false);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (!initialized.current) {
|
|
71
|
+
initialized.current = true;
|
|
72
|
+
searchSource.search();
|
|
73
|
+
}
|
|
74
|
+
}, [searchSource]);
|
|
75
|
+
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (!error) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
addNotification({
|
|
81
|
+
message: t('Failed to load members'),
|
|
82
|
+
options: {
|
|
83
|
+
...getNotificationErrorOptions(error),
|
|
84
|
+
severity: 'error',
|
|
85
|
+
type: 'api:channel:query-members:failed',
|
|
86
|
+
},
|
|
87
|
+
origin: { context: { channel }, emitter: 'ChannelMemberList' },
|
|
88
|
+
});
|
|
89
|
+
}, [error, addNotification, channel, t]);
|
|
90
|
+
|
|
34
91
|
const handleMemberActionsClose = useCallback(() => setSelectedMember(null), []);
|
|
35
92
|
|
|
36
93
|
const handleMemberPress = useCallback(
|
|
@@ -51,24 +108,46 @@ export const ChannelMemberList = ({ additionalFlatListProps }: ChannelMemberList
|
|
|
51
108
|
[ChannelMemberItem, handleMemberPress],
|
|
52
109
|
);
|
|
53
110
|
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
111
|
+
const loadMore = useCallback(() => {
|
|
112
|
+
// hasNext is true by default, !!members prevents calling search on initial load
|
|
113
|
+
if (hasNext && !!members) {
|
|
114
|
+
searchSource.search();
|
|
115
|
+
}
|
|
116
|
+
}, [hasNext, members, searchSource]);
|
|
58
117
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
118
|
+
const emptyState =
|
|
119
|
+
loading && !members ? (
|
|
120
|
+
<MemberListLoadingSkeleton />
|
|
121
|
+
) : (
|
|
122
|
+
<EmptySearchResult label={t('No members found')} />
|
|
123
|
+
);
|
|
62
124
|
|
|
63
125
|
return (
|
|
64
|
-
|
|
126
|
+
<View style={[styles.container, memberList.container]}>
|
|
127
|
+
<SearchInput
|
|
128
|
+
accessibilityLabel={t('a11y/Search members')}
|
|
129
|
+
onChangeText={(text) => {
|
|
130
|
+
searchSource.state.partialNext({ searchQuery: text });
|
|
131
|
+
searchSource.search(text);
|
|
132
|
+
}}
|
|
133
|
+
value={searchQuery}
|
|
134
|
+
{...searchInputProps}
|
|
135
|
+
/>
|
|
65
136
|
<FlatList
|
|
66
|
-
|
|
137
|
+
contentContainerStyle={[styles.listContent, memberList.listContent]}
|
|
138
|
+
data={members}
|
|
139
|
+
keyboardDismissMode='interactive'
|
|
140
|
+
keyboardShouldPersistTaps='handled'
|
|
67
141
|
keyExtractor={keyExtractor}
|
|
68
|
-
|
|
69
|
-
|
|
142
|
+
ListEmptyComponent={emptyState}
|
|
143
|
+
ListFooterComponent={
|
|
144
|
+
loading && members && members.length > 0 ? <ActivityIndicator /> : null
|
|
145
|
+
}
|
|
146
|
+
onEndReached={loadMore}
|
|
70
147
|
onEndReachedThreshold={0.2}
|
|
71
148
|
renderItem={renderItem}
|
|
149
|
+
style={[styles.list, memberList.list]}
|
|
150
|
+
testID='channel-member-list'
|
|
72
151
|
{...additionalFlatListProps}
|
|
73
152
|
/>
|
|
74
153
|
{selectedMember ? (
|
|
@@ -78,6 +157,41 @@ export const ChannelMemberList = ({ additionalFlatListProps }: ChannelMemberList
|
|
|
78
157
|
visible
|
|
79
158
|
/>
|
|
80
159
|
) : null}
|
|
81
|
-
|
|
160
|
+
<NotificationList />
|
|
161
|
+
</View>
|
|
162
|
+
);
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Lists all channel members with the ability to search them.
|
|
167
|
+
* @experimental This component is experimental and is subject to change.
|
|
168
|
+
*/
|
|
169
|
+
export const ChannelMemberList = (props: ChannelMemberListProps = {}) => {
|
|
170
|
+
const { channel } = useChannelDetailsContext();
|
|
171
|
+
const notificationHostId = channel?.cid ? `channel-member-list:${channel.cid}` : undefined;
|
|
172
|
+
|
|
173
|
+
if (!notificationHostId) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return (
|
|
178
|
+
<ChannelMemberListProvider channel={channel}>
|
|
179
|
+
<NotificationTargetProvider hostId={notificationHostId} panel='channel-details'>
|
|
180
|
+
<ChannelMemberListContent {...props} />
|
|
181
|
+
</NotificationTargetProvider>
|
|
182
|
+
</ChannelMemberListProvider>
|
|
82
183
|
);
|
|
83
184
|
};
|
|
185
|
+
|
|
186
|
+
const styles = StyleSheet.create({
|
|
187
|
+
container: {
|
|
188
|
+
flex: 1,
|
|
189
|
+
},
|
|
190
|
+
list: {
|
|
191
|
+
flex: 1,
|
|
192
|
+
},
|
|
193
|
+
listContent: {
|
|
194
|
+
flexGrow: 1,
|
|
195
|
+
paddingBottom: primitives.spacing3xl,
|
|
196
|
+
},
|
|
197
|
+
});
|
|
@@ -16,6 +16,8 @@ import { MicPositionProvider } from './contexts/MicPositionContext';
|
|
|
16
16
|
|
|
17
17
|
import { audioRecorderSelector } from './utils/audioRecorderSelectors';
|
|
18
18
|
|
|
19
|
+
import { useScreenReaderMountFocus } from '../../a11y';
|
|
20
|
+
|
|
19
21
|
import {
|
|
20
22
|
ChatContextValue,
|
|
21
23
|
useAttachmentPickerContext,
|
|
@@ -287,6 +289,9 @@ const MessageComposerWithContext = (props: MessageComposerPropsWithContext) => {
|
|
|
287
289
|
return result;
|
|
288
290
|
};
|
|
289
291
|
|
|
292
|
+
// immediately focus the screen reader to the input on mount if a11y is enabled.
|
|
293
|
+
useScreenReaderMountFocus(inputBoxRef);
|
|
294
|
+
|
|
290
295
|
const isFocused = inputBoxRef.current?.isFocused();
|
|
291
296
|
|
|
292
297
|
const micPositionX = useSharedValue(0);
|
|
@@ -83,9 +83,7 @@ SearchInput.displayName = 'SearchInput{searchInput}';
|
|
|
83
83
|
|
|
84
84
|
const styles = StyleSheet.create({
|
|
85
85
|
container: {
|
|
86
|
-
|
|
87
|
-
paddingHorizontal: primitives.spacingMd,
|
|
88
|
-
paddingTop: primitives.spacingXs,
|
|
86
|
+
padding: primitives.spacingMd,
|
|
89
87
|
},
|
|
90
88
|
input: {
|
|
91
89
|
borderRadius: primitives.radiusMax,
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import React, { PropsWithChildren, useContext, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Channel, ChannelMemberSearchSource } from 'stream-chat';
|
|
4
|
+
|
|
5
|
+
import { DEFAULT_BASE_CONTEXT_VALUE } from '../utils/defaultBaseContextValue';
|
|
6
|
+
import { isTestEnvironment } from '../utils/isTestEnvironment';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @experimental This API is experimental and is subject to change.
|
|
10
|
+
*/
|
|
11
|
+
export type ChannelMemberListContextValue = {
|
|
12
|
+
channel: Channel;
|
|
13
|
+
searchSource: ChannelMemberSearchSource;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const ChannelMemberListContext = React.createContext(
|
|
17
|
+
DEFAULT_BASE_CONTEXT_VALUE as ChannelMemberListContextValue,
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @experimental This API is experimental and is subject to change.
|
|
22
|
+
*/
|
|
23
|
+
export const ChannelMemberListProvider = ({
|
|
24
|
+
channel,
|
|
25
|
+
children,
|
|
26
|
+
}: PropsWithChildren<{ channel: Channel }>) => {
|
|
27
|
+
const [searchSource] = useState(() => {
|
|
28
|
+
const source = new ChannelMemberSearchSource(
|
|
29
|
+
channel,
|
|
30
|
+
{
|
|
31
|
+
allowEmptySearchString: true,
|
|
32
|
+
pageSize: 25,
|
|
33
|
+
resetOnNewSearchQuery: false,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
initialFilterConfig: {
|
|
37
|
+
$or: {
|
|
38
|
+
enabled: true,
|
|
39
|
+
generate: ({ searchQuery }) =>
|
|
40
|
+
searchQuery ? { name: { $autocomplete: searchQuery } } : {},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
);
|
|
45
|
+
source.sort = { name: 1 };
|
|
46
|
+
source.activate();
|
|
47
|
+
return source;
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<ChannelMemberListContext.Provider value={{ channel, searchSource }}>
|
|
52
|
+
{children}
|
|
53
|
+
</ChannelMemberListContext.Provider>
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @experimental This API is experimental and is subject to change.
|
|
59
|
+
*/
|
|
60
|
+
export const useChannelMemberListContext = () => {
|
|
61
|
+
const contextValue = useContext(
|
|
62
|
+
ChannelMemberListContext,
|
|
63
|
+
) as unknown as ChannelMemberListContextValue;
|
|
64
|
+
|
|
65
|
+
if (contextValue === DEFAULT_BASE_CONTEXT_VALUE && !isTestEnvironment()) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
'The useChannelMemberListContext hook was called outside of the ChannelMemberListContext provider. Render the member list UI inside a ChannelMemberListProvider.',
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return contextValue;
|
|
72
|
+
};
|
package/src/contexts/index.ts
CHANGED
|
@@ -34,6 +34,7 @@ export * from './channelAddMembersContext/ChannelAddMembersContext';
|
|
|
34
34
|
export * from './channelEditDetailsContext';
|
|
35
35
|
export * from './channelFileAttachmentListContext/ChannelFileAttachmentListContext';
|
|
36
36
|
export * from './channelPinnedMessageListContext/ChannelPinnedMessageListContext';
|
|
37
|
+
export * from './channelMemberListContext/ChannelMemberListContext';
|
|
37
38
|
export * from './channelMediaListContext/ChannelMediaListContext';
|
|
38
39
|
export * from './pollContext';
|
|
39
40
|
export * from './liveLocationManagerContext';
|
|
@@ -219,6 +219,11 @@ export type Theme = {
|
|
|
219
219
|
role: TextStyle;
|
|
220
220
|
status: TextStyle;
|
|
221
221
|
};
|
|
222
|
+
memberList: {
|
|
223
|
+
container: ViewStyle;
|
|
224
|
+
list: ViewStyle;
|
|
225
|
+
listContent: ViewStyle;
|
|
226
|
+
};
|
|
222
227
|
memberActionsSheet: {
|
|
223
228
|
actionsList: ViewStyle;
|
|
224
229
|
container: ViewStyle;
|
|
@@ -236,6 +241,9 @@ export type Theme = {
|
|
|
236
241
|
headerTitle: TextStyle;
|
|
237
242
|
};
|
|
238
243
|
addMembers: {
|
|
244
|
+
container: ViewStyle;
|
|
245
|
+
list: ViewStyle;
|
|
246
|
+
listContent: ViewStyle;
|
|
239
247
|
searchResultItem: {
|
|
240
248
|
alreadyMemberInfo: ViewStyle;
|
|
241
249
|
memberLabel: TextStyle;
|
|
@@ -1326,6 +1334,11 @@ export const defaultTheme: Theme = {
|
|
|
1326
1334
|
role: {},
|
|
1327
1335
|
status: {},
|
|
1328
1336
|
},
|
|
1337
|
+
memberList: {
|
|
1338
|
+
container: {},
|
|
1339
|
+
list: {},
|
|
1340
|
+
listContent: {},
|
|
1341
|
+
},
|
|
1329
1342
|
memberActionsSheet: {
|
|
1330
1343
|
actionsList: {},
|
|
1331
1344
|
container: {},
|
|
@@ -1343,6 +1356,9 @@ export const defaultTheme: Theme = {
|
|
|
1343
1356
|
headerTitle: {},
|
|
1344
1357
|
},
|
|
1345
1358
|
addMembers: {
|
|
1359
|
+
container: {},
|
|
1360
|
+
list: {},
|
|
1361
|
+
listContent: {},
|
|
1346
1362
|
searchResultItem: {
|
|
1347
1363
|
alreadyMemberInfo: {},
|
|
1348
1364
|
memberLabel: {},
|
package/src/i18n/ar.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "لن يتمكن/تتمكن من مراسلتك أو الاتصال بك. يمكنك إلغاء الحظر لاحقًا.",
|
|
464
464
|
"Leave": "مغادرة",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "ستتوقف عن تلقي الرسائل من {{ name }}. يمكنك الانضمام مجددًا في أي وقت.",
|
|
466
|
-
"group": "المجموعة"
|
|
466
|
+
"group": "المجموعة",
|
|
467
|
+
"No members found": "لم يتم العثور على أعضاء",
|
|
468
|
+
"a11y/Search members": "البحث عن الأعضاء"
|
|
467
469
|
}
|
package/src/i18n/en.json
CHANGED
|
@@ -99,6 +99,7 @@
|
|
|
99
99
|
"No chats here yet…": "No chats here yet…",
|
|
100
100
|
"No files": "No files",
|
|
101
101
|
"No items exist": "No items exist",
|
|
102
|
+
"No members found": "No members found",
|
|
102
103
|
"No photos or videos": "No photos or videos",
|
|
103
104
|
"No pinned messages": "No pinned messages",
|
|
104
105
|
"No threads here yet": "No threads here yet",
|
|
@@ -356,6 +357,7 @@
|
|
|
356
357
|
"a11y/Select image": "Select image",
|
|
357
358
|
"a11y/Select video": "Select video",
|
|
358
359
|
"a11y/Send voice recording": "Send voice recording",
|
|
360
|
+
"a11y/Search members": "Search members",
|
|
359
361
|
"a11y/Search pinned messages": "Search pinned messages",
|
|
360
362
|
"a11y/Search users to add": "Search users to add",
|
|
361
363
|
"a11y/Select {{name}}": "Select {{name}}",
|
package/src/i18n/es.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "No podrá enviarte mensajes ni llamarte. Puedes desbloquearlo más tarde.",
|
|
464
464
|
"Leave": "Salir",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "Dejarás de recibir mensajes de {{ name }}. Puedes volver a unirte cuando quieras.",
|
|
466
|
-
"group": "el grupo"
|
|
466
|
+
"group": "el grupo",
|
|
467
|
+
"No members found": "No se encontraron miembros",
|
|
468
|
+
"a11y/Search members": "Buscar miembros"
|
|
467
469
|
}
|
package/src/i18n/fr.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "Cette personne ne pourra plus vous envoyer de messages ni vous appeler. Vous pourrez la débloquer plus tard.",
|
|
464
464
|
"Leave": "Quitter",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "Vous ne recevrez plus de messages de {{ name }}. Vous pouvez rejoindre à tout moment.",
|
|
466
|
-
"group": "ce groupe"
|
|
466
|
+
"group": "ce groupe",
|
|
467
|
+
"No members found": "Aucun membre trouvé",
|
|
468
|
+
"a11y/Search members": "Rechercher des membres"
|
|
467
469
|
}
|
package/src/i18n/he.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "הוא/היא לא יוכל/תוכל לשלוח לך הודעות או להתקשר אליך. ניתן לבטל את החסימה מאוחר יותר.",
|
|
464
464
|
"Leave": "צא/י",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "תפסיק/תפסיקי לקבל הודעות מ-{{ name }}. ניתן להצטרף בחזרה בכל עת.",
|
|
466
|
-
"group": "הקבוצה"
|
|
466
|
+
"group": "הקבוצה",
|
|
467
|
+
"No members found": "לא נמצאו חברים",
|
|
468
|
+
"a11y/Search members": "חיפוש חברים"
|
|
467
469
|
}
|
package/src/i18n/hi.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "वे आपको संदेश या कॉल नहीं कर पाएंगे। आप उन्हें बाद में अनब्लॉक कर सकते हैं।",
|
|
464
464
|
"Leave": "छोड़ें",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "आपको {{ name }} से संदेश मिलना बंद हो जाएंगे। आप कभी भी दोबारा जुड़ सकते हैं।",
|
|
466
|
-
"group": "ग्रुप"
|
|
466
|
+
"group": "ग्रुप",
|
|
467
|
+
"No members found": "कोई सदस्य नहीं मिला",
|
|
468
|
+
"a11y/Search members": "सदस्य खोजें"
|
|
467
469
|
}
|
package/src/i18n/it.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "Non potrà inviarti messaggi né chiamarti. Potrai sbloccarlo in seguito.",
|
|
464
464
|
"Leave": "Esci",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "Non riceverai più messaggi da {{ name }}. Puoi rientrare in qualsiasi momento.",
|
|
466
|
-
"group": "il gruppo"
|
|
466
|
+
"group": "il gruppo",
|
|
467
|
+
"No members found": "Nessun membro trovato",
|
|
468
|
+
"a11y/Search members": "Cerca membri"
|
|
467
469
|
}
|
package/src/i18n/ja.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "メッセージや通話ができなくなります。あとでブロックを解除することもできます。",
|
|
464
464
|
"Leave": "退出",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "{{ name }} からのメッセージが届かなくなります。いつでも再参加できます。",
|
|
466
|
-
"group": "グループ"
|
|
466
|
+
"group": "グループ",
|
|
467
|
+
"No members found": "メンバーが見つかりません",
|
|
468
|
+
"a11y/Search members": "メンバーを検索"
|
|
467
469
|
}
|
package/src/i18n/ko.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "메시지를 보내거나 전화를 걸 수 없게 됩니다. 나중에 차단을 해제할 수 있습니다.",
|
|
464
464
|
"Leave": "나가기",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "{{ name }}에서 더 이상 메시지를 받지 않게 됩니다. 언제든지 다시 참여할 수 있습니다.",
|
|
466
|
-
"group": "그룹"
|
|
466
|
+
"group": "그룹",
|
|
467
|
+
"No members found": "멤버를 찾을 수 없습니다",
|
|
468
|
+
"a11y/Search members": "멤버 검색"
|
|
467
469
|
}
|
package/src/i18n/nl.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "Deze persoon kan je geen berichten sturen of bellen. Je kunt de blokkering later opheffen.",
|
|
464
464
|
"Leave": "Verlaten",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "Je ontvangt geen berichten meer van {{ name }}. Je kunt op elk moment opnieuw deelnemen.",
|
|
466
|
-
"group": "de groep"
|
|
466
|
+
"group": "de groep",
|
|
467
|
+
"No members found": "Geen leden gevonden",
|
|
468
|
+
"a11y/Search members": "Zoek leden"
|
|
467
469
|
}
|
package/src/i18n/pt-br.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "Essa pessoa não poderá enviar mensagens ou ligar para você. Você pode desbloqueá-la mais tarde.",
|
|
464
464
|
"Leave": "Sair",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "Você deixará de receber mensagens de {{ name }}. Pode entrar novamente a qualquer momento.",
|
|
466
|
-
"group": "o grupo"
|
|
466
|
+
"group": "o grupo",
|
|
467
|
+
"No members found": "Nenhum membro encontrado",
|
|
468
|
+
"a11y/Search members": "Pesquisar membros"
|
|
467
469
|
}
|
package/src/i18n/ru.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "Он не сможет писать вам и звонить. Вы сможете снять блокировку позже.",
|
|
464
464
|
"Leave": "Покинуть",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "Вы перестанете получать сообщения от {{ name }}. Вы можете присоединиться снова в любое время.",
|
|
466
|
-
"group": "группы"
|
|
466
|
+
"group": "группы",
|
|
467
|
+
"No members found": "Участники не найдены",
|
|
468
|
+
"a11y/Search members": "Поиск участников"
|
|
467
469
|
}
|
package/src/i18n/tr.json
CHANGED
|
@@ -463,5 +463,7 @@
|
|
|
463
463
|
"They won't be able to message or call you. You can unblock them later.": "Size mesaj gönderemez veya sizi arayamaz. Engeli daha sonra kaldırabilirsiniz.",
|
|
464
464
|
"Leave": "Ayrıl",
|
|
465
465
|
"You'll stop receiving messages from {{ name }}. You can rejoin anytime.": "{{ name }} kanalından mesaj almayı bırakacaksınız. İstediğiniz zaman tekrar katılabilirsiniz.",
|
|
466
|
-
"group": "grup"
|
|
466
|
+
"group": "grup",
|
|
467
|
+
"No members found": "Üye bulunamadı",
|
|
468
|
+
"a11y/Search members": "Üye ara"
|
|
467
469
|
}
|
package/src/version.json
CHANGED