stream-chat-react-native-core 9.4.0-beta.5 → 9.4.0-beta.7
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/ChannelDetails/hooks/useChannelDetailsActionItems.js +2 -1
- package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsActionItems.js.map +1 -1
- package/lib/commonjs/components/ChannelList/ChannelList.js +4 -1
- package/lib/commonjs/components/ChannelList/ChannelList.js.map +1 -1
- package/lib/commonjs/components/ChannelList/hooks/useCreateChannelsContext.js +5 -3
- package/lib/commonjs/components/ChannelList/hooks/useCreateChannelsContext.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreview.js +3 -0
- package/lib/commonjs/components/ChannelPreview/ChannelPreview.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewPinnedStatus.js +30 -0
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewPinnedStatus.js.map +1 -0
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js +8 -3
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelSwipableWrapper.js +2 -1
- package/lib/commonjs/components/ChannelPreview/ChannelSwipableWrapper.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/index.js +11 -0
- package/lib/commonjs/components/ChannelPreview/hooks/index.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewData.js +3 -0
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewData.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useIsChannelPinned.js +11 -0
- package/lib/commonjs/components/ChannelPreview/hooks/useIsChannelPinned.js.map +1 -0
- package/lib/commonjs/components/index.js +11 -0
- package/lib/commonjs/components/index.js.map +1 -1
- package/lib/commonjs/contexts/channelsContext/ChannelsContext.js.map +1 -1
- package/lib/commonjs/contexts/componentsContext/defaultComponents.js +2 -0
- package/lib/commonjs/contexts/componentsContext/defaultComponents.js.map +1 -1
- package/lib/commonjs/contexts/themeContext/utils/theme.js +1 -0
- package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
- package/lib/commonjs/hooks/actions/useChannelActionItems.js +20 -1
- package/lib/commonjs/hooks/actions/useChannelActionItems.js.map +1 -1
- package/lib/commonjs/hooks/actions/useChannelActionItemsById.js +3 -1
- package/lib/commonjs/hooks/actions/useChannelActionItemsById.js.map +1 -1
- package/lib/commonjs/i18n/ar.json +6 -1
- package/lib/commonjs/i18n/en.json +5 -0
- package/lib/commonjs/i18n/es.json +6 -1
- package/lib/commonjs/i18n/fr.json +6 -1
- package/lib/commonjs/i18n/he.json +6 -1
- package/lib/commonjs/i18n/hi.json +6 -1
- package/lib/commonjs/i18n/it.json +6 -1
- package/lib/commonjs/i18n/ja.json +6 -1
- package/lib/commonjs/i18n/ko.json +6 -1
- package/lib/commonjs/i18n/nl.json +6 -1
- package/lib/commonjs/i18n/pt-br.json +6 -1
- package/lib/commonjs/i18n/ru.json +6 -1
- package/lib/commonjs/i18n/tr.json +6 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/ChannelDetails/hooks/useChannelDetailsActionItems.js +2 -1
- package/lib/module/components/ChannelDetails/hooks/useChannelDetailsActionItems.js.map +1 -1
- package/lib/module/components/ChannelList/ChannelList.js +4 -1
- package/lib/module/components/ChannelList/ChannelList.js.map +1 -1
- package/lib/module/components/ChannelList/hooks/useCreateChannelsContext.js +5 -3
- package/lib/module/components/ChannelList/hooks/useCreateChannelsContext.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreview.js +3 -0
- package/lib/module/components/ChannelPreview/ChannelPreview.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreviewPinnedStatus.js +30 -0
- package/lib/module/components/ChannelPreview/ChannelPreviewPinnedStatus.js.map +1 -0
- package/lib/module/components/ChannelPreview/ChannelPreviewView.js +8 -3
- package/lib/module/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelSwipableWrapper.js +2 -1
- package/lib/module/components/ChannelPreview/ChannelSwipableWrapper.js.map +1 -1
- package/lib/module/components/ChannelPreview/hooks/index.js +11 -0
- package/lib/module/components/ChannelPreview/hooks/index.js.map +1 -1
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewData.js +3 -0
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewData.js.map +1 -1
- package/lib/module/components/ChannelPreview/hooks/useIsChannelPinned.js +11 -0
- package/lib/module/components/ChannelPreview/hooks/useIsChannelPinned.js.map +1 -0
- package/lib/module/components/index.js +11 -0
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/contexts/channelsContext/ChannelsContext.js.map +1 -1
- package/lib/module/contexts/componentsContext/defaultComponents.js +2 -0
- package/lib/module/contexts/componentsContext/defaultComponents.js.map +1 -1
- package/lib/module/contexts/themeContext/utils/theme.js +1 -0
- package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
- package/lib/module/hooks/actions/useChannelActionItems.js +20 -1
- package/lib/module/hooks/actions/useChannelActionItems.js.map +1 -1
- package/lib/module/hooks/actions/useChannelActionItemsById.js +3 -1
- package/lib/module/hooks/actions/useChannelActionItemsById.js.map +1 -1
- package/lib/module/i18n/ar.json +6 -1
- package/lib/module/i18n/en.json +5 -0
- package/lib/module/i18n/es.json +6 -1
- package/lib/module/i18n/fr.json +6 -1
- package/lib/module/i18n/he.json +6 -1
- package/lib/module/i18n/hi.json +6 -1
- package/lib/module/i18n/it.json +6 -1
- package/lib/module/i18n/ja.json +6 -1
- package/lib/module/i18n/ko.json +6 -1
- package/lib/module/i18n/nl.json +6 -1
- package/lib/module/i18n/pt-br.json +6 -1
- package/lib/module/i18n/ru.json +6 -1
- package/lib/module/i18n/tr.json +6 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/ChannelList/ChannelList.d.ts +1 -1
- package/lib/typescript/components/ChannelList/ChannelList.d.ts.map +1 -1
- package/lib/typescript/components/ChannelList/hooks/useCreateChannelsContext.d.ts +1 -1
- package/lib/typescript/components/ChannelList/hooks/useCreateChannelsContext.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/ChannelPreview.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/ChannelPreviewPinnedStatus.d.ts +6 -0
- package/lib/typescript/components/ChannelPreview/ChannelPreviewPinnedStatus.d.ts.map +1 -0
- package/lib/typescript/components/ChannelPreview/ChannelPreviewView.d.ts +3 -1
- package/lib/typescript/components/ChannelPreview/ChannelPreviewView.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/ChannelSwipableWrapper.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/hooks/index.d.ts +1 -0
- package/lib/typescript/components/ChannelPreview/hooks/index.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/hooks/useChannelPreviewData.d.ts +1 -0
- package/lib/typescript/components/ChannelPreview/hooks/useChannelPreviewData.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/hooks/useIsChannelPinned.d.ts +3 -0
- package/lib/typescript/components/ChannelPreview/hooks/useIsChannelPinned.d.ts.map +1 -0
- package/lib/typescript/components/index.d.ts +1 -0
- package/lib/typescript/components/index.d.ts.map +1 -1
- package/lib/typescript/contexts/channelsContext/ChannelsContext.d.ts +1 -0
- package/lib/typescript/contexts/channelsContext/ChannelsContext.d.ts.map +1 -1
- package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts +1 -0
- package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts.map +1 -1
- package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +1 -0
- package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
- package/lib/typescript/contexts/themeContext/utils/theme.d.ts +1 -0
- package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
- package/lib/typescript/hooks/actions/useChannelActionItems.d.ts +35 -2
- package/lib/typescript/hooks/actions/useChannelActionItems.d.ts.map +1 -1
- package/lib/typescript/hooks/actions/useChannelActionItemsById.d.ts +3 -2
- package/lib/typescript/hooks/actions/useChannelActionItemsById.d.ts.map +1 -1
- package/lib/typescript/i18n/ar.json +6 -1
- package/lib/typescript/i18n/en.json +5 -0
- package/lib/typescript/i18n/es.json +6 -1
- package/lib/typescript/i18n/fr.json +6 -1
- package/lib/typescript/i18n/he.json +6 -1
- package/lib/typescript/i18n/hi.json +6 -1
- package/lib/typescript/i18n/it.json +6 -1
- package/lib/typescript/i18n/ja.json +6 -1
- package/lib/typescript/i18n/ko.json +6 -1
- package/lib/typescript/i18n/nl.json +6 -1
- package/lib/typescript/i18n/pt-br.json +6 -1
- package/lib/typescript/i18n/ru.json +6 -1
- package/lib/typescript/i18n/tr.json +6 -1
- package/lib/typescript/types/types.d.ts +0 -9
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/utils/i18n/Streami18n.d.ts +5 -0
- package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/ChannelDetails/__tests__/useChannelDetailsActionItems.test.tsx +6 -2
- package/src/components/ChannelDetails/hooks/useChannelDetailsActionItems.ts +1 -1
- package/src/components/ChannelList/ChannelList.tsx +3 -0
- package/src/components/ChannelList/hooks/useCreateChannelsContext.ts +3 -0
- package/src/components/ChannelPreview/ChannelPreview.tsx +21 -3
- package/src/components/ChannelPreview/ChannelPreviewPinnedStatus.tsx +25 -0
- package/src/components/ChannelPreview/ChannelPreviewView.tsx +18 -2
- package/src/components/ChannelPreview/ChannelSwipableWrapper.tsx +5 -1
- package/src/components/ChannelPreview/hooks/__tests__/useIsChannelPinned.test.tsx +35 -0
- package/src/components/ChannelPreview/hooks/index.ts +1 -0
- package/src/components/ChannelPreview/hooks/useChannelPreviewData.ts +3 -1
- package/src/components/ChannelPreview/hooks/useIsChannelPinned.ts +8 -0
- package/src/components/index.ts +1 -0
- package/src/contexts/channelsContext/ChannelsContext.tsx +1 -0
- package/src/contexts/componentsContext/defaultComponents.ts +2 -0
- package/src/contexts/themeContext/utils/theme.ts +2 -0
- package/src/hooks/actions/__tests__/useChannelActionItems.test.tsx +137 -14
- package/src/hooks/actions/__tests__/useChannelActionItemsById.test.tsx +3 -1
- package/src/hooks/actions/useChannelActionItems.tsx +60 -2
- package/src/hooks/actions/useChannelActionItemsById.ts +8 -1
- package/src/i18n/ar.json +6 -1
- package/src/i18n/en.json +5 -0
- package/src/i18n/es.json +6 -1
- package/src/i18n/fr.json +6 -1
- package/src/i18n/he.json +6 -1
- package/src/i18n/hi.json +6 -1
- package/src/i18n/it.json +6 -1
- package/src/i18n/ja.json +6 -1
- package/src/i18n/ko.json +6 -1
- package/src/i18n/nl.json +6 -1
- package/src/i18n/pt-br.json +6 -1
- package/src/i18n/ru.json +6 -1
- package/src/i18n/tr.json +6 -1
- package/src/types/types.ts +0 -9
- package/src/version.json +1 -1
|
@@ -99,32 +99,45 @@ describe('useChannelActionItems', () => {
|
|
|
99
99
|
});
|
|
100
100
|
|
|
101
101
|
it('returns default channel action items', () => {
|
|
102
|
-
const { result } = renderHook(() => useChannelActionItems({ channel }));
|
|
102
|
+
const { result } = renderHook(() => useChannelActionItems({ channel, surface: 'list' }));
|
|
103
103
|
|
|
104
|
-
expect(result.current).toHaveLength(
|
|
104
|
+
expect(result.current).toHaveLength(4);
|
|
105
105
|
expect(result.current.map((item) => item.action)).toEqual([
|
|
106
106
|
channelActions.muteChannel,
|
|
107
|
+
channelActions.pin,
|
|
107
108
|
channelActions.leave,
|
|
108
109
|
expect.any(Function),
|
|
109
110
|
]);
|
|
110
|
-
expect(result.current.map((item) => item.id)).toEqual([
|
|
111
|
+
expect(result.current.map((item) => item.id)).toEqual([
|
|
112
|
+
'mute',
|
|
113
|
+
'pin',
|
|
114
|
+
'leave',
|
|
115
|
+
'deleteChannel',
|
|
116
|
+
]);
|
|
111
117
|
expect(result.current.map((item) => item.type)).toEqual([
|
|
118
|
+
'standard',
|
|
112
119
|
'standard',
|
|
113
120
|
'destructive',
|
|
114
121
|
'destructive',
|
|
115
122
|
]);
|
|
116
|
-
expect(result.current.map((item) => item.placement)).toEqual([
|
|
123
|
+
expect(result.current.map((item) => item.placement)).toEqual([
|
|
124
|
+
'swipe',
|
|
125
|
+
'sheet',
|
|
126
|
+
'sheet',
|
|
127
|
+
'sheet',
|
|
128
|
+
]);
|
|
117
129
|
});
|
|
118
130
|
|
|
119
131
|
it('returns muteUser only in direct chats', () => {
|
|
120
132
|
jest.spyOn(useIsDirectChatModule, 'useIsDirectChat').mockReturnValue(true);
|
|
121
133
|
|
|
122
|
-
const { result } = renderHook(() => useChannelActionItems({ channel }));
|
|
134
|
+
const { result } = renderHook(() => useChannelActionItems({ channel, surface: 'list' }));
|
|
123
135
|
|
|
124
136
|
expect(result.current.map((item) => item.id)).toEqual([
|
|
125
137
|
'mute',
|
|
126
138
|
'muteUser',
|
|
127
139
|
'block',
|
|
140
|
+
'pin',
|
|
128
141
|
'leave',
|
|
129
142
|
'deleteChannel',
|
|
130
143
|
]);
|
|
@@ -143,7 +156,7 @@ describe('useChannelActionItems', () => {
|
|
|
143
156
|
});
|
|
144
157
|
jest.spyOn(useMutedUsersModule, 'useMutedUsers').mockReturnValue([] as Mute[]);
|
|
145
158
|
|
|
146
|
-
const { result } = renderHook(() => useChannelActionItems({ channel }));
|
|
159
|
+
const { result } = renderHook(() => useChannelActionItems({ channel, surface: 'list' }));
|
|
147
160
|
|
|
148
161
|
const muteItem = result.current.find((item) => item.id === 'mute');
|
|
149
162
|
const muteUserItem = result.current.find((item) => item.id === 'muteUser');
|
|
@@ -152,7 +165,7 @@ describe('useChannelActionItems', () => {
|
|
|
152
165
|
});
|
|
153
166
|
|
|
154
167
|
it('forwards options from item.action to the underlying channel action', async () => {
|
|
155
|
-
const { result } = renderHook(() => useChannelActionItems({ channel }));
|
|
168
|
+
const { result } = renderHook(() => useChannelActionItems({ channel, surface: 'list' }));
|
|
156
169
|
|
|
157
170
|
const muteItem = result.current.find((item) => item.id === 'mute');
|
|
158
171
|
expect(muteItem).toBeDefined();
|
|
@@ -165,7 +178,7 @@ describe('useChannelActionItems', () => {
|
|
|
165
178
|
it('marks block as destructive when user is not blocked', () => {
|
|
166
179
|
jest.spyOn(useIsDirectChatModule, 'useIsDirectChat').mockReturnValue(true);
|
|
167
180
|
|
|
168
|
-
const { result } = renderHook(() => useChannelActionItems({ channel }));
|
|
181
|
+
const { result } = renderHook(() => useChannelActionItems({ channel, surface: 'list' }));
|
|
169
182
|
|
|
170
183
|
const blockItem = result.current.find((item) => item.id === 'block');
|
|
171
184
|
expect(blockItem?.type).toBe('destructive');
|
|
@@ -175,7 +188,9 @@ describe('useChannelActionItems', () => {
|
|
|
175
188
|
jest.spyOn(useIsDirectChatModule, 'useIsDirectChat').mockReturnValue(true);
|
|
176
189
|
const blockedChannel = createChannelMock({ blockedUserIds: ['other-user-id'] });
|
|
177
190
|
|
|
178
|
-
const { result } = renderHook(() =>
|
|
191
|
+
const { result } = renderHook(() =>
|
|
192
|
+
useChannelActionItems({ channel: blockedChannel, surface: 'list' }),
|
|
193
|
+
);
|
|
179
194
|
|
|
180
195
|
const blockItem = result.current.find((item) => item.id === 'block');
|
|
181
196
|
expect(blockItem?.type).toBe('standard');
|
|
@@ -190,6 +205,7 @@ describe('useChannelActionItems', () => {
|
|
|
190
205
|
useChannelActionItems({
|
|
191
206
|
channel,
|
|
192
207
|
getChannelActionItems: customGetChannelActionItems,
|
|
208
|
+
surface: 'list',
|
|
193
209
|
}),
|
|
194
210
|
);
|
|
195
211
|
|
|
@@ -202,6 +218,7 @@ describe('useChannelActionItems', () => {
|
|
|
202
218
|
isBlocked: undefined,
|
|
203
219
|
isDirectChat: false,
|
|
204
220
|
isPinned: false,
|
|
221
|
+
surface: 'list',
|
|
205
222
|
t: expect.any(Function),
|
|
206
223
|
userMuteActive: false,
|
|
207
224
|
},
|
|
@@ -228,6 +245,7 @@ describe('getChannelActionItems', () => {
|
|
|
228
245
|
isBlocked: undefined,
|
|
229
246
|
isDirectChat: false,
|
|
230
247
|
isPinned: false,
|
|
248
|
+
surface: 'list',
|
|
231
249
|
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
232
250
|
userMuteActive: false,
|
|
233
251
|
});
|
|
@@ -240,6 +258,7 @@ describe('getChannelActionItems', () => {
|
|
|
240
258
|
isBlocked: undefined,
|
|
241
259
|
isDirectChat: false,
|
|
242
260
|
isPinned: false,
|
|
261
|
+
surface: 'list',
|
|
243
262
|
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
244
263
|
userMuteActive: false,
|
|
245
264
|
},
|
|
@@ -248,11 +267,13 @@ describe('getChannelActionItems', () => {
|
|
|
248
267
|
|
|
249
268
|
expect(actionItems.map((item) => item.action)).toEqual([
|
|
250
269
|
channelActions.muteChannel,
|
|
270
|
+
channelActions.pin,
|
|
251
271
|
channelActions.leave,
|
|
252
272
|
expect.any(Function),
|
|
253
273
|
]);
|
|
254
|
-
expect(actionItems.map((item) => item.id)).toEqual(['mute', 'leave', 'deleteChannel']);
|
|
274
|
+
expect(actionItems.map((item) => item.id)).toEqual(['mute', 'pin', 'leave', 'deleteChannel']);
|
|
255
275
|
expect(actionItems.map((item) => item.type)).toEqual([
|
|
276
|
+
'standard',
|
|
256
277
|
'standard',
|
|
257
278
|
'destructive',
|
|
258
279
|
'destructive',
|
|
@@ -269,6 +290,7 @@ describe('getChannelActionItems', () => {
|
|
|
269
290
|
isBlocked: true,
|
|
270
291
|
isDirectChat: true,
|
|
271
292
|
isPinned: false,
|
|
293
|
+
surface: 'list',
|
|
272
294
|
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
273
295
|
userMuteActive: true,
|
|
274
296
|
});
|
|
@@ -277,6 +299,7 @@ describe('getChannelActionItems', () => {
|
|
|
277
299
|
'mute',
|
|
278
300
|
'muteUser',
|
|
279
301
|
'block',
|
|
302
|
+
'pin',
|
|
280
303
|
'leave',
|
|
281
304
|
'deleteChannel',
|
|
282
305
|
]);
|
|
@@ -284,6 +307,7 @@ describe('getChannelActionItems', () => {
|
|
|
284
307
|
channelActions.unmuteChannel,
|
|
285
308
|
channelActions.unmuteUser,
|
|
286
309
|
channelActions.unblockUser,
|
|
310
|
+
channelActions.pin,
|
|
287
311
|
channelActions.leave,
|
|
288
312
|
expect.any(Function),
|
|
289
313
|
]);
|
|
@@ -291,6 +315,7 @@ describe('getChannelActionItems', () => {
|
|
|
291
315
|
'Unmute Chat',
|
|
292
316
|
'Unmute User',
|
|
293
317
|
'Unblock User',
|
|
318
|
+
'Pin Chat',
|
|
294
319
|
'Leave Chat',
|
|
295
320
|
'Delete Chat',
|
|
296
321
|
]);
|
|
@@ -300,6 +325,7 @@ describe('getChannelActionItems', () => {
|
|
|
300
325
|
'sheet',
|
|
301
326
|
'sheet',
|
|
302
327
|
'sheet',
|
|
328
|
+
'sheet',
|
|
303
329
|
]);
|
|
304
330
|
});
|
|
305
331
|
|
|
@@ -312,6 +338,7 @@ describe('getChannelActionItems', () => {
|
|
|
312
338
|
isBlocked: undefined,
|
|
313
339
|
isDirectChat: false,
|
|
314
340
|
isPinned: false,
|
|
341
|
+
surface: 'list',
|
|
315
342
|
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
316
343
|
userMuteActive: false,
|
|
317
344
|
});
|
|
@@ -328,11 +355,12 @@ describe('getChannelActionItems', () => {
|
|
|
328
355
|
isBlocked: undefined,
|
|
329
356
|
isDirectChat: false,
|
|
330
357
|
isPinned: false,
|
|
358
|
+
surface: 'list',
|
|
331
359
|
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
332
360
|
userMuteActive: false,
|
|
333
361
|
});
|
|
334
362
|
|
|
335
|
-
expect(actionItems.map((item) => item.id)).toEqual(['mute', 'leave']);
|
|
363
|
+
expect(actionItems.map((item) => item.id)).toEqual(['mute', 'pin', 'leave']);
|
|
336
364
|
});
|
|
337
365
|
|
|
338
366
|
it('uses group mute variants for labels and placements', () => {
|
|
@@ -345,6 +373,7 @@ describe('getChannelActionItems', () => {
|
|
|
345
373
|
isBlocked: undefined,
|
|
346
374
|
isDirectChat: false,
|
|
347
375
|
isPinned: false,
|
|
376
|
+
surface: 'list',
|
|
348
377
|
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
349
378
|
userMuteActive: false,
|
|
350
379
|
});
|
|
@@ -353,9 +382,101 @@ describe('getChannelActionItems', () => {
|
|
|
353
382
|
expect(actionItems[0].label).toBe('Unmute Group');
|
|
354
383
|
expect(actionItems[0].placement).toBe('swipe');
|
|
355
384
|
|
|
356
|
-
|
|
357
|
-
expect(
|
|
358
|
-
expect(
|
|
385
|
+
const leaveItem = actionItems.find((item) => item.id === 'leave');
|
|
386
|
+
expect(leaveItem?.action).toBe(channelActions.leave);
|
|
387
|
+
expect(leaveItem?.label).toBe('Leave Group');
|
|
388
|
+
expect(leaveItem?.placement).toBe('sheet');
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
it('pin item toggles to unpin when channel is pinned', () => {
|
|
392
|
+
const channelActions = createChannelActions();
|
|
393
|
+
const actionItems = buildDefaultChannelActionItems({
|
|
394
|
+
actions: channelActions,
|
|
395
|
+
channel,
|
|
396
|
+
channelMuteActive: false,
|
|
397
|
+
isArchived: false,
|
|
398
|
+
isBlocked: undefined,
|
|
399
|
+
isDirectChat: false,
|
|
400
|
+
isPinned: true,
|
|
401
|
+
surface: 'list',
|
|
402
|
+
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
403
|
+
userMuteActive: false,
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
const pinItem = actionItems.find((item) => item.id === 'pin');
|
|
407
|
+
expect(pinItem?.action).toBe(channelActions.unpin);
|
|
408
|
+
expect(pinItem?.label).toBe('Unpin Group');
|
|
409
|
+
expect(pinItem?.placement).toBe('sheet');
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
it('pin item uses direct-chat label variant', () => {
|
|
413
|
+
const channelActions = createChannelActions();
|
|
414
|
+
const actionItems = buildDefaultChannelActionItems({
|
|
415
|
+
actions: channelActions,
|
|
416
|
+
channel,
|
|
417
|
+
channelMuteActive: false,
|
|
418
|
+
isArchived: false,
|
|
419
|
+
isBlocked: undefined,
|
|
420
|
+
isDirectChat: true,
|
|
421
|
+
isPinned: false,
|
|
422
|
+
surface: 'list',
|
|
423
|
+
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
424
|
+
userMuteActive: false,
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
const pinItem = actionItems.find((item) => item.id === 'pin');
|
|
428
|
+
expect(pinItem?.action).toBe(channelActions.pin);
|
|
429
|
+
expect(pinItem?.label).toBe('Pin Chat');
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
it('omits the pin item when building for the details surface', () => {
|
|
433
|
+
const actionItems = buildDefaultChannelActionItems({
|
|
434
|
+
actions: createChannelActions(),
|
|
435
|
+
channel,
|
|
436
|
+
channelMuteActive: false,
|
|
437
|
+
isArchived: false,
|
|
438
|
+
isBlocked: undefined,
|
|
439
|
+
isDirectChat: false,
|
|
440
|
+
isPinned: false,
|
|
441
|
+
surface: 'details',
|
|
442
|
+
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
443
|
+
userMuteActive: false,
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
expect(actionItems.map((item) => item.id)).not.toContain('pin');
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
it('includes the pin item when building for the list surface', () => {
|
|
450
|
+
const actionItems = buildDefaultChannelActionItems({
|
|
451
|
+
actions: createChannelActions(),
|
|
452
|
+
channel,
|
|
453
|
+
channelMuteActive: false,
|
|
454
|
+
isArchived: false,
|
|
455
|
+
isBlocked: undefined,
|
|
456
|
+
isDirectChat: false,
|
|
457
|
+
isPinned: false,
|
|
458
|
+
surface: 'list',
|
|
459
|
+
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
460
|
+
userMuteActive: false,
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
expect(actionItems.map((item) => item.id)).toContain('pin');
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
it('applies no surface-specific filtering when surface is omitted', () => {
|
|
467
|
+
const actionItems = buildDefaultChannelActionItems({
|
|
468
|
+
actions: createChannelActions(),
|
|
469
|
+
channel,
|
|
470
|
+
channelMuteActive: false,
|
|
471
|
+
isArchived: false,
|
|
472
|
+
isBlocked: undefined,
|
|
473
|
+
isDirectChat: false,
|
|
474
|
+
isPinned: false,
|
|
475
|
+
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
476
|
+
userMuteActive: false,
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
expect(actionItems.map((item) => item.id)).toEqual(['mute', 'pin', 'leave', 'deleteChannel']);
|
|
359
480
|
});
|
|
360
481
|
|
|
361
482
|
it('mute and muteUser reflect their respective active states independently', () => {
|
|
@@ -368,6 +489,7 @@ describe('getChannelActionItems', () => {
|
|
|
368
489
|
isBlocked: undefined,
|
|
369
490
|
isDirectChat: true,
|
|
370
491
|
isPinned: false,
|
|
492
|
+
surface: 'list',
|
|
371
493
|
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
372
494
|
userMuteActive: true,
|
|
373
495
|
});
|
|
@@ -393,6 +515,7 @@ describe('getChannelActionItems', () => {
|
|
|
393
515
|
isBlocked: undefined,
|
|
394
516
|
isDirectChat: false,
|
|
395
517
|
isPinned: false,
|
|
518
|
+
surface: 'list',
|
|
396
519
|
t: ((value: string) => value) as TranslationContextValue['t'],
|
|
397
520
|
userMuteActive: false,
|
|
398
521
|
});
|
|
@@ -41,7 +41,7 @@ describe('useChannelActionItemsById', () => {
|
|
|
41
41
|
.spyOn(useChannelActionItemsModule, 'useChannelActionItems')
|
|
42
42
|
.mockReturnValue(channelActionItems);
|
|
43
43
|
|
|
44
|
-
const { result } = renderHook(() => useChannelActionItemsById({ channel }));
|
|
44
|
+
const { result } = renderHook(() => useChannelActionItemsById({ channel, surface: 'list' }));
|
|
45
45
|
|
|
46
46
|
expect(result.current.pin).toBe(channelActionItems[0]);
|
|
47
47
|
expect(result.current.deleteChannel).toBe(channelActionItems[1]);
|
|
@@ -59,12 +59,14 @@ describe('useChannelActionItemsById', () => {
|
|
|
59
59
|
useChannelActionItemsById({
|
|
60
60
|
channel,
|
|
61
61
|
getChannelActionItems,
|
|
62
|
+
surface: 'list',
|
|
62
63
|
}),
|
|
63
64
|
);
|
|
64
65
|
|
|
65
66
|
expect(useChannelActionItemsSpy).toHaveBeenCalledWith({
|
|
66
67
|
channel,
|
|
67
68
|
getChannelActionItems,
|
|
69
|
+
surface: 'list',
|
|
68
70
|
});
|
|
69
71
|
});
|
|
70
72
|
});
|
|
@@ -15,18 +15,50 @@ import { useIsChannelMuted } from '../../components/ChannelPreview/hooks/useIsCh
|
|
|
15
15
|
import { useUserMuteActive } from '../../components/Message/hooks/useUserMuteActive';
|
|
16
16
|
import { useTheme, useTranslationContext } from '../../contexts';
|
|
17
17
|
import type { TranslationContextValue } from '../../contexts/translationContext/TranslationContext';
|
|
18
|
-
import { IconProps, Mute, BlockUser, Delete, Sound } from '../../icons';
|
|
18
|
+
import { IconProps, Mute, BlockUser, Delete, Pin, Sound, Unpin } from '../../icons';
|
|
19
19
|
import { ArrowBoxLeft } from '../../icons/leave';
|
|
20
20
|
import { useChannelMembershipState } from '../useChannelMembershipState';
|
|
21
21
|
import { useIsDirectChat } from '../useIsDirectChat';
|
|
22
22
|
import { useStateStore } from '../useStateStore';
|
|
23
23
|
|
|
24
24
|
export type ChannelActionItem = ActionItem<
|
|
25
|
-
'mute' | 'muteUser' | 'block' | 'leave' | 'deleteChannel' | string
|
|
25
|
+
'mute' | 'muteUser' | 'block' | 'leave' | 'deleteChannel' | 'pin' | string
|
|
26
26
|
> & {
|
|
27
|
+
/**
|
|
28
|
+
* Per item routing **within a channel preview interaction** (swipe row vs
|
|
29
|
+
* the sheet that opens from it). Only meaningful when the items are consumed
|
|
30
|
+
* from `<ChannelSwipableWrapper>`:
|
|
31
|
+
*
|
|
32
|
+
* - `'swipe'`: shown only in the swipe-row chips.
|
|
33
|
+
* - `'sheet'`: shown only in the swipe-triggered options sheet.
|
|
34
|
+
* - `'both'`: shown in both swipe row and sheet.
|
|
35
|
+
*
|
|
36
|
+
* The standalone Channel Details screen does **not** filter by `placement` -
|
|
37
|
+
* use {@link ChannelActionSurface} (`surface`) instead to vary items between
|
|
38
|
+
* the channel list and the Channel Details screen.
|
|
39
|
+
*/
|
|
27
40
|
placement: 'both' | 'sheet' | 'swipe';
|
|
28
41
|
};
|
|
29
42
|
|
|
43
|
+
/**
|
|
44
|
+
* Identifies which top level UI surface is requesting channel action items.
|
|
45
|
+
* Passed verbatim into {@link ChannelActionItemsParams} so the default builder
|
|
46
|
+
* and any integrator supplied `getChannelActionItems` can branch on it - i.e.
|
|
47
|
+
* to drop or relabel an item on a specific surface or to provide an entirely
|
|
48
|
+
* different builder per surface.
|
|
49
|
+
*
|
|
50
|
+
* - `'list'`: anything driven by a ChannelList interaction, the swipe row
|
|
51
|
+
* chips on a channel preview and the bottom sheet that opens from them.
|
|
52
|
+
* Subrouting between the swipe row and the sheet is handled by the per item
|
|
53
|
+
* {@link ChannelActionItem.placement} field.
|
|
54
|
+
* - `'details'`: items for the standalone Channel Details screen.
|
|
55
|
+
*
|
|
56
|
+
* `surface` operates at the call site level (which UI is asking). It is
|
|
57
|
+
* optional and when omitted, the default builder applies no surface specific
|
|
58
|
+
* filtering and returns every item it would otherwise produce.
|
|
59
|
+
*/
|
|
60
|
+
export type ChannelActionSurface = 'list' | 'details';
|
|
61
|
+
|
|
30
62
|
export type ChannelActionItemsParams = {
|
|
31
63
|
actions: ChannelActions;
|
|
32
64
|
channel: Channel;
|
|
@@ -35,6 +67,7 @@ export type ChannelActionItemsParams = {
|
|
|
35
67
|
isBlocked: boolean | undefined;
|
|
36
68
|
isDirectChat: boolean;
|
|
37
69
|
isPinned: boolean;
|
|
70
|
+
surface?: ChannelActionSurface;
|
|
38
71
|
t: TranslationContextValue['t'];
|
|
39
72
|
userMuteActive: boolean;
|
|
40
73
|
};
|
|
@@ -67,10 +100,14 @@ export const buildDefaultChannelActionItems: BuildDefaultChannelActionItems = (
|
|
|
67
100
|
unmuteUser,
|
|
68
101
|
blockUser,
|
|
69
102
|
unblockUser,
|
|
103
|
+
pin,
|
|
104
|
+
unpin,
|
|
70
105
|
},
|
|
71
106
|
channelMuteActive,
|
|
72
107
|
isBlocked,
|
|
73
108
|
isDirectChat,
|
|
109
|
+
isPinned,
|
|
110
|
+
surface,
|
|
74
111
|
userMuteActive,
|
|
75
112
|
t,
|
|
76
113
|
channel,
|
|
@@ -135,6 +172,23 @@ export const buildDefaultChannelActionItems: BuildDefaultChannelActionItems = (
|
|
|
135
172
|
});
|
|
136
173
|
}
|
|
137
174
|
|
|
175
|
+
if (surface !== 'details') {
|
|
176
|
+
actionItems.push({
|
|
177
|
+
action: isPinned ? unpin : pin,
|
|
178
|
+
Icon: (props) => <ChannelActionsIcon Icon={isPinned ? Unpin : Pin} {...props} />,
|
|
179
|
+
id: 'pin',
|
|
180
|
+
label: isDirectChat
|
|
181
|
+
? isPinned
|
|
182
|
+
? t('Unpin Chat')
|
|
183
|
+
: t('Pin Chat')
|
|
184
|
+
: isPinned
|
|
185
|
+
? t('Unpin Group')
|
|
186
|
+
: t('Pin Group'),
|
|
187
|
+
placement: 'sheet',
|
|
188
|
+
type: 'standard',
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
138
192
|
actionItems.push({
|
|
139
193
|
action: leave,
|
|
140
194
|
Icon: (props) => <ChannelActionsIcon Icon={ArrowBoxLeft} {...props} />,
|
|
@@ -186,6 +240,7 @@ export const getChannelActionItems: GetChannelActionItems = ({ defaultItems }) =
|
|
|
186
240
|
|
|
187
241
|
type UseChannelActionItemsParams = {
|
|
188
242
|
channel: Channel;
|
|
243
|
+
surface?: ChannelActionSurface;
|
|
189
244
|
getChannelActionItems?: GetChannelActionItems;
|
|
190
245
|
};
|
|
191
246
|
|
|
@@ -194,6 +249,7 @@ const blockedUsersStateSelector = (state: BlockedUsersState) =>
|
|
|
194
249
|
|
|
195
250
|
export const useChannelActionItems = ({
|
|
196
251
|
channel,
|
|
252
|
+
surface,
|
|
197
253
|
getChannelActionItems: getChannelActionItemsProp = getChannelActionItems,
|
|
198
254
|
}: UseChannelActionItemsParams) => {
|
|
199
255
|
const { t } = useTranslationContext();
|
|
@@ -225,6 +281,7 @@ export const useChannelActionItems = ({
|
|
|
225
281
|
isBlocked,
|
|
226
282
|
isDirectChat,
|
|
227
283
|
isPinned,
|
|
284
|
+
surface,
|
|
228
285
|
t,
|
|
229
286
|
userMuteActive,
|
|
230
287
|
}),
|
|
@@ -236,6 +293,7 @@ export const useChannelActionItems = ({
|
|
|
236
293
|
isBlocked,
|
|
237
294
|
isDirectChat,
|
|
238
295
|
isPinned,
|
|
296
|
+
surface,
|
|
239
297
|
t,
|
|
240
298
|
userMuteActive,
|
|
241
299
|
],
|
|
@@ -2,23 +2,30 @@ import { useMemo } from 'react';
|
|
|
2
2
|
|
|
3
3
|
import type { Channel } from 'stream-chat';
|
|
4
4
|
|
|
5
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
ChannelActionItem,
|
|
7
|
+
ChannelActionSurface,
|
|
8
|
+
GetChannelActionItems,
|
|
9
|
+
} from './useChannelActionItems';
|
|
6
10
|
import { useChannelActionItems } from './useChannelActionItems';
|
|
7
11
|
|
|
8
12
|
export type ChannelActionItemsById = Partial<Record<ChannelActionItem['id'], ChannelActionItem>>;
|
|
9
13
|
|
|
10
14
|
type UseChannelActionItemsByIdParams = {
|
|
11
15
|
channel: Channel;
|
|
16
|
+
surface?: ChannelActionSurface;
|
|
12
17
|
getChannelActionItems?: GetChannelActionItems;
|
|
13
18
|
};
|
|
14
19
|
|
|
15
20
|
export const useChannelActionItemsById = ({
|
|
16
21
|
channel,
|
|
22
|
+
surface,
|
|
17
23
|
getChannelActionItems,
|
|
18
24
|
}: UseChannelActionItemsByIdParams) => {
|
|
19
25
|
const channelActionItems = useChannelActionItems({
|
|
20
26
|
channel,
|
|
21
27
|
getChannelActionItems,
|
|
28
|
+
surface,
|
|
22
29
|
});
|
|
23
30
|
|
|
24
31
|
return useMemo(
|
package/src/i18n/ar.json
CHANGED
|
@@ -274,6 +274,7 @@
|
|
|
274
274
|
"a11y/Loading failed": "Loading failed",
|
|
275
275
|
"a11y/Message actions": "Message actions",
|
|
276
276
|
"a11y/Muted": "مكتوم",
|
|
277
|
+
"a11y/Pinned": "مثبت",
|
|
277
278
|
"a11y/New message from {{user}}": "New message from {{user}}",
|
|
278
279
|
"a11y/Offline": "Offline",
|
|
279
280
|
"a11y/Open message actions": "Open message actions",
|
|
@@ -435,5 +436,9 @@
|
|
|
435
436
|
"a11y/Message from {{sender}}": "رسالة من {{sender}}",
|
|
436
437
|
"a11y/Gallery Image": "صورة من المعرض",
|
|
437
438
|
"a11y/Gallery Video": "فيديو من المعرض",
|
|
438
|
-
"a11y/{{position}} of {{count}}": "{{position}} من {{count}}"
|
|
439
|
+
"a11y/{{position}} of {{count}}": "{{position}} من {{count}}",
|
|
440
|
+
"Pin Chat": "تثبيت الدردشة",
|
|
441
|
+
"Pin Group": "تثبيت المجموعة",
|
|
442
|
+
"Unpin Chat": "إلغاء تثبيت الدردشة",
|
|
443
|
+
"Unpin Group": "إلغاء تثبيت المجموعة"
|
|
439
444
|
}
|
package/src/i18n/en.json
CHANGED
|
@@ -246,6 +246,8 @@
|
|
|
246
246
|
"Leave Group": "Leave Group",
|
|
247
247
|
"Mute Chat": "Mute Chat",
|
|
248
248
|
"Mute Group": "Mute Group",
|
|
249
|
+
"Pin Chat": "Pin Chat",
|
|
250
|
+
"Pin Group": "Pin Group",
|
|
249
251
|
"Admin": "Admin",
|
|
250
252
|
"Moderator": "Moderator",
|
|
251
253
|
"Offline": "Offline",
|
|
@@ -255,6 +257,8 @@
|
|
|
255
257
|
"Unarchive Group": "Unarchive Group",
|
|
256
258
|
"Unmute Chat": "Unmute Chat",
|
|
257
259
|
"Unmute Group": "Unmute Group",
|
|
260
|
+
"Unpin Chat": "Unpin Chat",
|
|
261
|
+
"Unpin Group": "Unpin Group",
|
|
258
262
|
"{{memberCount}} members, {{onlineCount}} online_one": "{{memberCount}} member, {{onlineCount}} online",
|
|
259
263
|
"{{memberCount}} members, {{onlineCount}} online_other": "{{memberCount}} members, {{onlineCount}} online",
|
|
260
264
|
"{{memberCount}} members, {{onlineCount}} online_many": "{{memberCount}} members, {{onlineCount}} online",
|
|
@@ -284,6 +288,7 @@
|
|
|
284
288
|
"a11y/Message from you": "Message from you",
|
|
285
289
|
"a11y/Message from {{sender}}": "Message from {{sender}}",
|
|
286
290
|
"a11y/Muted": "Muted",
|
|
291
|
+
"a11y/Pinned": "Pinned",
|
|
287
292
|
"a11y/New message from {{user}}": "New message from {{user}}",
|
|
288
293
|
"a11y/Offline": "Offline",
|
|
289
294
|
"a11y/Open message actions": "Open message actions",
|
package/src/i18n/es.json
CHANGED
|
@@ -274,6 +274,7 @@
|
|
|
274
274
|
"a11y/Loading failed": "Error al cargar",
|
|
275
275
|
"a11y/Message actions": "Acciones del mensaje",
|
|
276
276
|
"a11y/Muted": "Silenciado",
|
|
277
|
+
"a11y/Pinned": "Fijado",
|
|
277
278
|
"a11y/New message from {{user}}": "Nuevo mensaje de {{user}}",
|
|
278
279
|
"a11y/Offline": "Sin conexión",
|
|
279
280
|
"a11y/Open message actions": "Abrir acciones del mensaje",
|
|
@@ -435,5 +436,9 @@
|
|
|
435
436
|
"a11y/Message from {{sender}}": "Mensaje de {{sender}}",
|
|
436
437
|
"a11y/Gallery Image": "Imagen de la galería",
|
|
437
438
|
"a11y/Gallery Video": "Vídeo de la galería",
|
|
438
|
-
"a11y/{{position}} of {{count}}": "{{position}} de {{count}}"
|
|
439
|
+
"a11y/{{position}} of {{count}}": "{{position}} de {{count}}",
|
|
440
|
+
"Pin Chat": "Fijar chat",
|
|
441
|
+
"Pin Group": "Fijar grupo",
|
|
442
|
+
"Unpin Chat": "Desfijar chat",
|
|
443
|
+
"Unpin Group": "Desfijar grupo"
|
|
439
444
|
}
|
package/src/i18n/fr.json
CHANGED
|
@@ -274,6 +274,7 @@
|
|
|
274
274
|
"a11y/Loading failed": "Échec du chargement",
|
|
275
275
|
"a11y/Message actions": "Actions du message",
|
|
276
276
|
"a11y/Muted": "Mis en sourdine",
|
|
277
|
+
"a11y/Pinned": "Épinglé",
|
|
277
278
|
"a11y/New message from {{user}}": "Nouveau message de {{user}}",
|
|
278
279
|
"a11y/Offline": "Hors ligne",
|
|
279
280
|
"a11y/Open message actions": "Ouvrir les actions du message",
|
|
@@ -435,5 +436,9 @@
|
|
|
435
436
|
"a11y/Message from {{sender}}": "Message de {{sender}}",
|
|
436
437
|
"a11y/Gallery Image": "Image de la galerie",
|
|
437
438
|
"a11y/Gallery Video": "Vidéo de la galerie",
|
|
438
|
-
"a11y/{{position}} of {{count}}": "{{position}} sur {{count}}"
|
|
439
|
+
"a11y/{{position}} of {{count}}": "{{position}} sur {{count}}",
|
|
440
|
+
"Pin Chat": "Épingler la discussion",
|
|
441
|
+
"Pin Group": "Épingler le groupe",
|
|
442
|
+
"Unpin Chat": "Détacher la discussion",
|
|
443
|
+
"Unpin Group": "Détacher le groupe"
|
|
439
444
|
}
|
package/src/i18n/he.json
CHANGED
|
@@ -274,6 +274,7 @@
|
|
|
274
274
|
"a11y/Loading failed": "הטעינה נכשלה",
|
|
275
275
|
"a11y/Message actions": "פעולות הודעה",
|
|
276
276
|
"a11y/Muted": "מושתק",
|
|
277
|
+
"a11y/Pinned": "מוצמד",
|
|
277
278
|
"a11y/New message from {{user}}": "הודעה חדשה מ-{{user}}",
|
|
278
279
|
"a11y/Offline": "לא מקוון",
|
|
279
280
|
"a11y/Open message actions": "פתח פעולות הודעה",
|
|
@@ -435,5 +436,9 @@
|
|
|
435
436
|
"a11y/Message from {{sender}}": "הודעה מאת {{sender}}",
|
|
436
437
|
"a11y/Gallery Image": "תמונה מהגלריה",
|
|
437
438
|
"a11y/Gallery Video": "סרטון מהגלריה",
|
|
438
|
-
"a11y/{{position}} of {{count}}": "{{position}} מתוך {{count}}"
|
|
439
|
+
"a11y/{{position}} of {{count}}": "{{position}} מתוך {{count}}",
|
|
440
|
+
"Pin Chat": "הצמד/י צ'אט",
|
|
441
|
+
"Pin Group": "הצמד/י קבוצה",
|
|
442
|
+
"Unpin Chat": "בטל/י הצמדת צ'אט",
|
|
443
|
+
"Unpin Group": "בטל/י הצמדת קבוצה"
|
|
439
444
|
}
|
package/src/i18n/hi.json
CHANGED
|
@@ -274,6 +274,7 @@
|
|
|
274
274
|
"a11y/Loading failed": "लोड नहीं हो सका",
|
|
275
275
|
"a11y/Message actions": "संदेश की कार्रवाइयां",
|
|
276
276
|
"a11y/Muted": "म्यूट किया गया",
|
|
277
|
+
"a11y/Pinned": "पिन किया गया",
|
|
277
278
|
"a11y/New message from {{user}}": "{{user}} से नया संदेश",
|
|
278
279
|
"a11y/Offline": "ऑफलाइन",
|
|
279
280
|
"a11y/Open message actions": "संदेश की कार्रवाइयां खोलें",
|
|
@@ -435,5 +436,9 @@
|
|
|
435
436
|
"a11y/Message from {{sender}}": "{{sender}} से संदेश",
|
|
436
437
|
"a11y/Gallery Image": "गैलरी छवि",
|
|
437
438
|
"a11y/Gallery Video": "गैलरी वीडियो",
|
|
438
|
-
"a11y/{{position}} of {{count}}": "{{count}} में से {{position}}"
|
|
439
|
+
"a11y/{{position}} of {{count}}": "{{count}} में से {{position}}",
|
|
440
|
+
"Pin Chat": "चैट पिन करें",
|
|
441
|
+
"Pin Group": "ग्रुप पिन करें",
|
|
442
|
+
"Unpin Chat": "चैट अनपिन करें",
|
|
443
|
+
"Unpin Group": "ग्रुप अनपिन करें"
|
|
439
444
|
}
|
package/src/i18n/it.json
CHANGED
|
@@ -274,6 +274,7 @@
|
|
|
274
274
|
"a11y/Loading failed": "Caricamento non riuscito",
|
|
275
275
|
"a11y/Message actions": "Azioni del messaggio",
|
|
276
276
|
"a11y/Muted": "Silenziato",
|
|
277
|
+
"a11y/Pinned": "Fissato",
|
|
277
278
|
"a11y/New message from {{user}}": "Nuovo messaggio da {{user}}",
|
|
278
279
|
"a11y/Offline": "Offline",
|
|
279
280
|
"a11y/Open message actions": "Apri azioni del messaggio",
|
|
@@ -435,5 +436,9 @@
|
|
|
435
436
|
"a11y/Message from {{sender}}": "Messaggio da {{sender}}",
|
|
436
437
|
"a11y/Gallery Image": "Immagine della galleria",
|
|
437
438
|
"a11y/Gallery Video": "Video della galleria",
|
|
438
|
-
"a11y/{{position}} of {{count}}": "{{position}} di {{count}}"
|
|
439
|
+
"a11y/{{position}} of {{count}}": "{{position}} di {{count}}",
|
|
440
|
+
"Pin Chat": "Fissa chat",
|
|
441
|
+
"Pin Group": "Fissa gruppo",
|
|
442
|
+
"Unpin Chat": "Sfissa chat",
|
|
443
|
+
"Unpin Group": "Sfissa gruppo"
|
|
439
444
|
}
|
package/src/i18n/ja.json
CHANGED
|
@@ -274,6 +274,7 @@
|
|
|
274
274
|
"a11y/Loading failed": "読み込みに失敗しました",
|
|
275
275
|
"a11y/Message actions": "メッセージの操作",
|
|
276
276
|
"a11y/Muted": "ミュート中",
|
|
277
|
+
"a11y/Pinned": "ピン留め中",
|
|
277
278
|
"a11y/New message from {{user}}": "{{user}}からの新しいメッセージ",
|
|
278
279
|
"a11y/Offline": "オフライン",
|
|
279
280
|
"a11y/Open message actions": "メッセージの操作を開く",
|
|
@@ -435,5 +436,9 @@
|
|
|
435
436
|
"a11y/Message from {{sender}}": "{{sender}}からのメッセージ",
|
|
436
437
|
"a11y/Gallery Image": "ギャラリー画像",
|
|
437
438
|
"a11y/Gallery Video": "ギャラリービデオ",
|
|
438
|
-
"a11y/{{position}} of {{count}}": "{{count}} 中 {{position}}"
|
|
439
|
+
"a11y/{{position}} of {{count}}": "{{count}} 中 {{position}}",
|
|
440
|
+
"Pin Chat": "チャットをピン留め",
|
|
441
|
+
"Pin Group": "グループをピン留め",
|
|
442
|
+
"Unpin Chat": "チャットのピン留めを解除",
|
|
443
|
+
"Unpin Group": "グループのピン留めを解除"
|
|
439
444
|
}
|