Skip to content

Commit 1028763

Browse files
authored
feat: add snackbar notification upon channels query pagination failure (#3179)
1 parent bcaf1f6 commit 1028763

14 files changed

Lines changed: 142 additions & 15 deletions

File tree

โ€Žsrc/components/ChannelList/__tests__/ChannelList.test.tsxโ€Ž

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,42 @@ describe('ChannelList', () => {
314314
expect(results).toHaveNoViolations();
315315
});
316316

317+
it('should add a notification when the first page of channels fails to load', async () => {
318+
useMockedApis(chatClient, [erroredPostApi()]);
319+
const addNotificationSpy = vi.spyOn(chatClient.notifications, 'add');
320+
vi.spyOn(console, 'warn').mockImplementation(() => null);
321+
322+
render(
323+
<Chat client={chatClient}>
324+
<WithComponents
325+
overrides={{
326+
ChannelListItemUI: ChannelPreviewComponent,
327+
ChannelListUI: ChannelListComponent,
328+
}}
329+
>
330+
<ChannelList
331+
filters={{}}
332+
options={{ presence: true, state: true, watch: true }}
333+
/>
334+
</WithComponents>
335+
</Chat>,
336+
);
337+
338+
await waitFor(() => {
339+
expect(addNotificationSpy).toHaveBeenCalledWith(
340+
expect.objectContaining({
341+
message: 'Failed to load channels',
342+
options: expect.objectContaining({
343+
severity: 'error',
344+
tags: expect.arrayContaining(['target:channel-list']),
345+
type: 'api:channel-list:load:failed',
346+
}),
347+
origin: { emitter: 'ChannelList' },
348+
}),
349+
);
350+
});
351+
});
352+
317353
it('provides the error object to LoadingErrorIndicator', async () => {
318354
useMockedApis(chatClient, [erroredPostApi()]);
319355
vi.spyOn(console, 'warn').mockImplementationOnce(() => null);
@@ -341,6 +377,54 @@ describe('ChannelList', () => {
341377
expect(screen.getByText('StreamChat error HTTP code: 500')).toBeInTheDocument();
342378
});
343379

380+
it('should keep loaded channels visible and add a notification when loading more fails', async () => {
381+
useMockedApis(chatClient, [queryChannelsApi([testChannel1, testChannel2])]);
382+
const addNotificationSpy = vi.spyOn(chatClient.notifications, 'add');
383+
vi.spyOn(console, 'warn').mockImplementation(() => null);
384+
385+
render(
386+
<Chat client={chatClient}>
387+
<WithComponents
388+
overrides={{
389+
ChannelListItemUI: ChannelPreviewComponent,
390+
ChannelListUI: ChannelListComponent,
391+
}}
392+
>
393+
<ChannelList filters={{}} options={{ limit: 2 }} />
394+
</WithComponents>
395+
</Chat>,
396+
);
397+
398+
await waitFor(() => {
399+
expect(screen.getByTestId(testChannel1.channel.id)).toBeInTheDocument();
400+
expect(screen.getByTestId(testChannel2.channel.id)).toBeInTheDocument();
401+
});
402+
403+
useMockedApis(chatClient, [erroredPostApi()]);
404+
405+
await act(() => {
406+
fireEvent.click(screen.getByTestId('load-more-button'));
407+
});
408+
409+
await waitFor(() => {
410+
expect(addNotificationSpy).toHaveBeenCalledWith(
411+
expect.objectContaining({
412+
message: 'Failed to load more channels',
413+
options: expect.objectContaining({
414+
severity: 'error',
415+
tags: expect.arrayContaining(['target:channel-list']),
416+
type: 'api:channel-list:load-more:failed',
417+
}),
418+
origin: { emitter: 'ChannelList' },
419+
}),
420+
);
421+
});
422+
423+
expect(screen.getByTestId(testChannel1.channel.id)).toBeInTheDocument();
424+
expect(screen.getByTestId(testChannel2.channel.id)).toBeInTheDocument();
425+
expect(screen.queryByTestId('error-indicator')).not.toBeInTheDocument();
426+
});
427+
344428
it('should render loading indicator before the first channel list load and on reload', async () => {
345429
const channelsQueryStatesHistory = [];
346430
const channelListMessengerLoadingHistory = [];

โ€Žsrc/components/ChannelList/hooks/usePaginatedChannels.tsโ€Ž

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import type {
1212
} from 'stream-chat';
1313

1414
import { useChatContext } from '../../../context/ChatContext';
15+
import { useTranslationContext } from '../../../context/TranslationContext';
16+
import { useNotificationApi } from '../../Notifications';
1517

1618
import type { ChannelsQueryState } from '../../Chat/hooks/useChannelsQueryState';
1719

@@ -44,9 +46,11 @@ export const usePaginatedChannels = (
4446
recoveryThrottleIntervalMs: number = RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS,
4547
customQueryChannels?: CustomQueryChannelsFn,
4648
) => {
49+
const { addNotification } = useNotificationApi();
4750
const {
4851
channelsQueryState: { error, setError, setQueryInProgress },
4952
} = useChatContext('usePaginatedChannels');
53+
const { t } = useTranslationContext();
5054
const [channels, setChannels] = useState<Array<Channel>>([]);
5155
const [hasNextPage, setHasNextPage] = useState(true);
5256
const lastRecoveryTimestamp = useRef<number | undefined>(undefined);
@@ -62,6 +66,8 @@ export const usePaginatedChannels = (
6266
// eslint-disable-next-line react-hooks/exhaustive-deps
6367
const queryChannels = async (queryType = 'load-more') => {
6468
setError(null);
69+
const offset = queryType === 'reload' ? 0 : channels.length;
70+
const isFirstPage = offset === 0;
6571

6672
if (queryType === 'reload') {
6773
setChannels([]);
@@ -77,8 +83,6 @@ export const usePaginatedChannels = (
7783
setHasNextPage,
7884
});
7985
} else {
80-
const offset = queryType === 'reload' ? 0 : channels.length;
81-
8286
const newOptions = {
8387
offset,
8488
...options,
@@ -105,7 +109,22 @@ export const usePaginatedChannels = (
105109
}
106110
} catch (error) {
107111
console.warn(error);
108-
setError(error as ErrorFromResponse<APIErrorResponse>);
112+
addNotification({
113+
emitter: 'ChannelList',
114+
error: error instanceof Error ? error : undefined,
115+
message: isFirstPage
116+
? t('Failed to load channels')
117+
: t('Failed to load more channels'),
118+
severity: 'error',
119+
targetPanels: ['channel-list'],
120+
type: isFirstPage
121+
? 'api:channel-list:load:failed'
122+
: 'api:channel-list:load-more:failed',
123+
});
124+
125+
if (isFirstPage) {
126+
setError(error as ErrorFromResponse<APIErrorResponse>);
127+
}
109128
}
110129

111130
setQueryInProgress(null);

โ€Žsrc/i18n/de.jsonโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@
9696
"aria/Mark Message Unread": "Als ungelesen markieren",
9797
"aria/Mark messages as read": "Nachrichten als gelesen markieren",
9898
"aria/Menu": "Menรผ",
99-
"aria/Message,": "Nachricht,",
10099
"aria/Message Actions": "Nachrichtenaktionen",
101100
"aria/Message from {{ user }},": "Nachricht von {{ user }},",
102101
"aria/Message Options": "Nachrichtenoptionen",
102+
"aria/Message,": "Nachricht,",
103103
"aria/Mute User": "Benutzer stummschalten",
104104
"aria/Notifications": "Benachrichtigungen",
105105
"aria/Open Attachment Selector": "Anhang-Auswahl รถffnen",
@@ -229,6 +229,8 @@
229229
"Failed to end the poll due to {{reason}}": "Umfrage konnte aufgrund von {{reason}} nicht beendet werden",
230230
"Failed to jump to the first unread message": "Fehler beim Springen zur ersten ungelesenen Nachricht",
231231
"Failed to leave channel": "Kanal konnte nicht verlassen werden",
232+
"Failed to load channels": "Kanรคle konnten nicht geladen werden",
233+
"Failed to load more channels": "Weitere Kanรคle konnten nicht geladen werden",
232234
"Failed to mark channel as read": "Fehler beim Markieren des Kanals als gelesen",
233235
"Failed to play the recording": "Wiedergabe der Aufnahme fehlgeschlagen",
234236
"Failed to retrieve location": "Standort konnte nicht abgerufen werden",

โ€Žsrc/i18n/en.jsonโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@
9696
"aria/Mark Message Unread": "Mark Message Unread",
9797
"aria/Mark messages as read": "Mark messages as read",
9898
"aria/Menu": "Menu",
99-
"aria/Message,": "Message,",
10099
"aria/Message Actions": "Message Actions",
101100
"aria/Message from {{ user }},": "Message from {{ user }},",
102101
"aria/Message Options": "Message Options",
102+
"aria/Message,": "Message,",
103103
"aria/Mute User": "Mute User",
104104
"aria/Notifications": "Notifications",
105105
"aria/Open Attachment Selector": "Open Attachment Selector",
@@ -229,6 +229,8 @@
229229
"Failed to end the poll due to {{reason}}": "Failed to end the poll due to {{reason}}",
230230
"Failed to jump to the first unread message": "Failed to jump to the first unread message",
231231
"Failed to leave channel": "Failed to leave channel",
232+
"Failed to load channels": "Failed to load channels",
233+
"Failed to load more channels": "Failed to load more channels",
232234
"Failed to mark channel as read": "Failed to mark channel as read",
233235
"Failed to play the recording": "Failed to play the recording",
234236
"Failed to retrieve location": "Failed to retrieve location",

โ€Žsrc/i18n/es.jsonโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,10 @@
104104
"aria/Mark Message Unread": "Marcar como no leรญdo",
105105
"aria/Mark messages as read": "Marcar mensajes como leรญdos",
106106
"aria/Menu": "Menรบ",
107-
"aria/Message,": "Mensaje,",
108107
"aria/Message Actions": "Acciones del mensaje",
109108
"aria/Message from {{ user }},": "Mensaje de {{ user }},",
110109
"aria/Message Options": "Opciones de mensaje",
110+
"aria/Message,": "Mensaje,",
111111
"aria/Mute User": "Silenciar usuario",
112112
"aria/Notifications": "Notificaciones",
113113
"aria/Open Attachment Selector": "Abrir selector de adjuntos",
@@ -237,6 +237,8 @@
237237
"Failed to end the poll due to {{reason}}": "No se pudo terminar la encuesta debido a {{reason}}",
238238
"Failed to jump to the first unread message": "Error al saltar al primer mensaje no leรญdo",
239239
"Failed to leave channel": "No se pudo salir del canal",
240+
"Failed to load channels": "No se pudieron cargar los canales",
241+
"Failed to load more channels": "No se pudieron cargar mรกs canales",
240242
"Failed to mark channel as read": "Error al marcar el canal como leรญdo",
241243
"Failed to play the recording": "No se pudo reproducir la grabaciรณn",
242244
"Failed to retrieve location": "No se pudo obtener la ubicaciรณn",

โ€Žsrc/i18n/fr.jsonโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,10 @@
104104
"aria/Mark Message Unread": "Marquer comme non lu",
105105
"aria/Mark messages as read": "Marquer les messages comme lus",
106106
"aria/Menu": "Menu",
107-
"aria/Message,": "Message,",
108107
"aria/Message Actions": "Actions du message",
109108
"aria/Message from {{ user }},": "Message de {{ user }},",
110109
"aria/Message Options": "Options du message",
110+
"aria/Message,": "Message,",
111111
"aria/Mute User": "Mettre en sourdine",
112112
"aria/Notifications": "Notifications",
113113
"aria/Open Attachment Selector": "Ouvrir le sรฉlecteur de piรจces jointes",
@@ -237,6 +237,8 @@
237237
"Failed to end the poll due to {{reason}}": "Impossible de terminer le sondage en raison de {{reason}}",
238238
"Failed to jump to the first unread message": "ร‰chec du saut vers le premier message non lu",
239239
"Failed to leave channel": "Impossible de quitter le canal",
240+
"Failed to load channels": "Impossible de charger les canaux",
241+
"Failed to load more channels": "Impossible de charger davantage de canaux",
240242
"Failed to mark channel as read": "ร‰chec du marquage du canal comme lu",
241243
"Failed to play the recording": "Impossible de lire l'enregistrement",
242244
"Failed to retrieve location": "Impossible de rรฉcupรฉrer l'emplacement",

โ€Žsrc/i18n/hi.jsonโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@
9696
"aria/Mark Message Unread": "เค…เคชเค เคฟเคค เคšเคฟเคนเฅเคจเคฟเคค เค•เคฐเฅ‡เค‚",
9797
"aria/Mark messages as read": "เคธเค‚เคฆเฅ‡เคถเฅ‹เค‚ เค•เฅ‹ เคชเคขเคผเคพ เคนเฅเค† เคšเคฟเคนเฅเคจเคฟเคค เค•เคฐเฅ‡เค‚",
9898
"aria/Menu": "เคฎเฅ‡เคจเฅเคฏเฅ‚",
99-
"aria/Message,": "เคธเค‚เคฆเฅ‡เคถ,",
10099
"aria/Message Actions": "เคธเค‚เคฆเฅ‡เคถ เค•เคพเคฐเฅเคฐเคตเคพเค‡เคฏเคพเค",
101100
"aria/Message from {{ user }},": "{{ user }} เค•เคพ เคธเค‚เคฆเฅ‡เคถ,",
102101
"aria/Message Options": "เคธเค‚เคฆเฅ‡เคถ เคตเคฟเค•เคฒเฅเคช",
102+
"aria/Message,": "เคธเค‚เคฆเฅ‡เคถ,",
103103
"aria/Mute User": "เค‰เคชเคฏเฅ‹เค—เค•เคฐเฅเคคเคพ เคฎเฅเคฏเฅ‚เคŸ เค•เคฐเฅ‡เค‚",
104104
"aria/Notifications": "เคธเฅ‚เคšเคจเคพเคเค‚",
105105
"aria/Open Attachment Selector": "เค…เคŸเฅˆเคšเคฎเฅ‡เค‚เคŸ เคšเคฏเคจเค•เคฐเฅเคคเคพ เค–เฅ‹เคฒเฅ‡เค‚",
@@ -230,6 +230,8 @@
230230
"Failed to end the poll due to {{reason}}": "{{reason}} เค•เฅ‡ เค•เคพเคฐเคฃ เคชเฅ‹เคฒ เคธเคฎเคพเคชเฅเคค เค•เคฐเคจเฅ‡ เคฎเฅ‡เค‚ เคตเคฟเคซเคฒ",
231231
"Failed to jump to the first unread message": "เคชเคนเคฒเฅ‡ เค…เคชเค เคฟเคค เคธเค‚เคฆเฅ‡เคถ เคชเคฐ เคœเคพเคจเฅ‡ เคฎเฅ‡เค‚ เคตเคฟเคซเคฒ",
232232
"Failed to leave channel": "เคšเฅˆเคจเคฒ เค›เฅ‹เคกเคผเคจเฅ‡ เคฎเฅ‡เค‚ เคตเคฟเคซเคฒ",
233+
"Failed to load channels": "เคšเฅˆเคจเคฒ เคฒเฅ‹เคก เค•เคฐเคจเฅ‡ เคฎเฅ‡เค‚ เคตเคฟเคซเคฒ",
234+
"Failed to load more channels": "เค”เคฐ เคšเฅˆเคจเคฒ เคฒเฅ‹เคก เค•เคฐเคจเฅ‡ เคฎเฅ‡เค‚ เคตเคฟเคซเคฒ",
233235
"Failed to mark channel as read": "เคšเฅˆเคจเคฒ เค•เฅ‹ เคชเคขเคผเคพ เคนเฅเค† เคšเคฟเคนเฅเคจเคฟเคค เค•เคฐเคจเฅ‡ เคฎเฅ‡เค‚ เคตเคฟเคซเคฒเฅค",
234236
"Failed to play the recording": "เคฐเฅ‡เค•เฅ‰เคฐเฅเคกเคฟเค‚เค— เคชเฅเคฒเฅ‡ เค•เคฐเคจเฅ‡ เคฎเฅ‡เค‚ เคตเคฟเคซเคฒ",
235237
"Failed to retrieve location": "เคธเฅเคฅเคพเคจ เคชเฅเคฐเคพเคชเฅเคค เค•เคฐเคจเฅ‡ เคฎเฅ‡เค‚ เคตเคฟเคซเคฒ",

โ€Žsrc/i18n/it.jsonโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,10 @@
104104
"aria/Mark Message Unread": "Contrassegna come non letto",
105105
"aria/Mark messages as read": "Segna i messaggi come letti",
106106
"aria/Menu": "Menu",
107-
"aria/Message,": "Messaggio,",
108107
"aria/Message Actions": "Azioni del messaggio",
109108
"aria/Message from {{ user }},": "Messaggio di {{ user }},",
110109
"aria/Message Options": "Opzioni di messaggio",
110+
"aria/Message,": "Messaggio,",
111111
"aria/Mute User": "Mute utente",
112112
"aria/Notifications": "Notifiche",
113113
"aria/Open Attachment Selector": "Apri selettore allegati",
@@ -237,6 +237,8 @@
237237
"Failed to end the poll due to {{reason}}": "Impossibile terminare il sondaggio a causa di {{reason}}",
238238
"Failed to jump to the first unread message": "Impossibile passare al primo messaggio non letto",
239239
"Failed to leave channel": "Impossibile lasciare il canale",
240+
"Failed to load channels": "Impossibile caricare i canali",
241+
"Failed to load more channels": "Impossibile caricare altri canali",
240242
"Failed to mark channel as read": "Impossibile contrassegnare il canale come letto",
241243
"Failed to play the recording": "Impossibile riprodurre la registrazione",
242244
"Failed to retrieve location": "Impossibile recuperare la posizione",

โ€Žsrc/i18n/ja.jsonโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,10 @@
9595
"aria/Mark Message Unread": "ๆœช่ชญใจใ—ใฆใƒžใƒผใ‚ฏ",
9696
"aria/Mark messages as read": "ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๆ—ข่ชญใซใ™ใ‚‹",
9797
"aria/Menu": "ใƒกใƒ‹ใƒฅใƒผ",
98-
"aria/Message,": "ใƒกใƒƒใ‚ปใƒผใ‚ธ,",
9998
"aria/Message Actions": "ใƒกใƒƒใ‚ปใƒผใ‚ธๆ“ไฝœ",
10099
"aria/Message from {{ user }},": "{{ user }}ใ•ใ‚“ใ‹ใ‚‰ใฎใƒกใƒƒใ‚ปใƒผใ‚ธ,",
101100
"aria/Message Options": "ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚ชใƒ—ใ‚ทใƒงใƒณ",
101+
"aria/Message,": "ใƒกใƒƒใ‚ปใƒผใ‚ธ,",
102102
"aria/Mute User": "ใƒฆใƒผใ‚ถใƒผใ‚’ใƒŸใƒฅใƒผใƒˆ",
103103
"aria/Notifications": "้€š็Ÿฅ",
104104
"aria/Open Attachment Selector": "ๆทปไป˜ใƒ•ใ‚กใ‚คใƒซ้ธๆŠžใ‚’้–‹ใ",
@@ -228,6 +228,8 @@
228228
"Failed to end the poll due to {{reason}}": "{{reason}}ใฎใŸใ‚ใ‚ขใƒณใ‚ฑใƒผใƒˆใฎ็ต‚ไบ†ใซๅคฑๆ•—ใ—ใพใ—ใŸ",
229229
"Failed to jump to the first unread message": "ๆœ€ๅˆใฎๆœช่ชญใƒกใƒƒใ‚ปใƒผใ‚ธใซใ‚ธใƒฃใƒณใƒ—ใงใใพใ›ใ‚“ใงใ—ใŸ",
230230
"Failed to leave channel": "ใƒใƒฃใƒณใƒใƒซใฎ้€€ๅ‡บใซๅคฑๆ•—ใ—ใพใ—ใŸ",
231+
"Failed to load channels": "ใƒใƒฃใƒณใƒใƒซใฎ่ชญใฟ่พผใฟใซๅคฑๆ•—ใ—ใพใ—ใŸ",
232+
"Failed to load more channels": "ใ•ใ‚‰ใซใƒใƒฃใƒณใƒใƒซใ‚’่ชญใฟ่พผใ‚ใพใ›ใ‚“ใงใ—ใŸ",
231233
"Failed to mark channel as read": "ใƒใƒฃใƒณใƒใƒซใ‚’ๆ—ข่ชญใซใ™ใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“ใงใ—ใŸ",
232234
"Failed to play the recording": "้Œฒ้Ÿณใฎๅ†็”Ÿใซๅคฑๆ•—ใ—ใพใ—ใŸ",
233235
"Failed to retrieve location": "ไฝ็ฝฎๆƒ…ๅ ฑใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ",

โ€Žsrc/i18n/ko.jsonโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,10 @@
9595
"aria/Mark Message Unread": "์ฝ์ง€ ์•Š์Œ์œผ๋กœ ํ‘œ์‹œ",
9696
"aria/Mark messages as read": "๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์Œ์œผ๋กœ ํ‘œ์‹œ",
9797
"aria/Menu": "๋ฉ”๋‰ด",
98-
"aria/Message,": "๋ฉ”์‹œ์ง€,",
9998
"aria/Message Actions": "๋ฉ”์‹œ์ง€ ์ž‘์—…",
10099
"aria/Message from {{ user }},": "{{ user }}์˜ ๋ฉ”์‹œ์ง€,",
101100
"aria/Message Options": "๋ฉ”์‹œ์ง€ ์˜ต์…˜",
101+
"aria/Message,": "๋ฉ”์‹œ์ง€,",
102102
"aria/Mute User": "์‚ฌ์šฉ์ž ์Œ์†Œ๊ฑฐ",
103103
"aria/Notifications": "์•Œ๋ฆผ",
104104
"aria/Open Attachment Selector": "์ฒจ๋ถ€ ํŒŒ์ผ ์„ ํƒ๊ธฐ ์—ด๊ธฐ",
@@ -228,6 +228,8 @@
228228
"Failed to end the poll due to {{reason}}": "{{reason}}(์œผ)๋กœ ์ธํ•ด ํˆฌํ‘œ ์ข…๋ฃŒ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค",
229229
"Failed to jump to the first unread message": "์ฒซ ๋ฒˆ์งธ ์ฝ์ง€ ์•Š์€ ๋ฉ”์‹œ์ง€๋กœ ์ด๋™ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค",
230230
"Failed to leave channel": "์ฑ„๋„ ๋‚˜๊ฐ€๊ธฐ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค",
231+
"Failed to load channels": "์ฑ„๋„์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค",
232+
"Failed to load more channels": "์ฑ„๋„์„ ๋” ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค",
231233
"Failed to mark channel as read": "์ฑ„๋„์„ ์ฝ์Œ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค",
232234
"Failed to play the recording": "๋…น์Œ์„ ์žฌ์ƒํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค",
233235
"Failed to retrieve location": "์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค",

0 commit comments

Comments
ย (0)