Skip to content

Commit 27fded5

Browse files
authored
Merge pull request #1695 from appwrite/check-message-status
Update message status via polling
2 parents 2ff0b2c + cf48e43 commit 27fded5

File tree

5 files changed

+79
-6
lines changed

5 files changed

+79
-6
lines changed

src/routes/(console)/project-[project]/messaging/+page.svelte

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import type { Column } from '$lib/helpers/types';
4444
import { writable } from 'svelte/store';
4545
import { canWriteMessages } from '$lib/stores/roles';
46+
import { onDestroy, onMount } from 'svelte';
47+
import { stopPolling, pollMessagesStatus } from './helper';
4648
4749
export let data: PageData;
4850
let selected: string[] = [];
@@ -90,6 +92,16 @@
9092
showDelete = false;
9193
}
9294
}
95+
96+
onMount(() => {
97+
const processingMessages = data.messages.messages.filter(
98+
(message) => message.status === 'processing'
99+
);
100+
101+
pollMessagesStatus(processingMessages);
102+
});
103+
104+
onDestroy(stopPolling);
93105
</script>
94106

95107
<Container>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { sdk } from '$lib/stores/sdk';
2+
import { type Models } from '@appwrite.io/console';
3+
4+
/** Stores active polling intervals for messages. */
5+
const messageIntervals = new Map<string, ReturnType<typeof setInterval>>();
6+
7+
/** Checks the status of a message and stops polling if it's no longer processing. */
8+
function checkMessageStatus(message: Models.Message) {
9+
sdk.forProject.messaging
10+
.getMessage(message.$id)
11+
.then((msg) => {
12+
if (msg.status !== 'processing') {
13+
clearPolling(message.$id);
14+
message.status = msg.status;
15+
}
16+
})
17+
.catch(() => clearPolling(message.$id));
18+
}
19+
20+
/** Clears polling for a specific message. */
21+
function clearPolling(messageId: string) {
22+
const intervalID = messageIntervals.get(messageId);
23+
if (intervalID) {
24+
clearInterval(intervalID);
25+
messageIntervals.delete(messageId);
26+
}
27+
}
28+
29+
/** Stops polling for all messages. */
30+
export function stopPolling() {
31+
messageIntervals.forEach((_, messageId) => clearPolling(messageId));
32+
}
33+
34+
/** Starts polling message statuses. */
35+
export function pollMessagesStatus(messages: Models.Message[]) {
36+
messages.forEach((message) => {
37+
clearPolling(message.$id);
38+
checkMessageStatus(message);
39+
40+
const intervalID = setInterval(() => checkMessageStatus(message), 2000);
41+
messageIntervals.set(message.$id, intervalID);
42+
});
43+
}

src/routes/(console)/project-[project]/messaging/message-[message]/overview.svelte

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import SendModal from './sendModal.svelte';
1010
import ScheduleModal from './scheduleModal.svelte';
1111
import CancelModal from './cancelModal.svelte';
12+
import { onDestroy, onMount } from 'svelte';
13+
import { stopPolling, pollMessagesStatus } from '../helper';
1214
1315
export let message: Models.Message & { data: Record<string, string> };
1416
export let topics: Models.Topic[];
@@ -18,6 +20,14 @@
1820
let showCancel = false;
1921
let showFailed = false;
2022
let errors: string[] = [];
23+
24+
onDestroy(stopPolling);
25+
26+
onMount(() => {
27+
if (message.status === 'processing') {
28+
pollMessagesStatus([message]);
29+
}
30+
});
2131
</script>
2232

2333
<CardGrid hideFooter={['processing', 'sent'].includes(message.status)}>
@@ -70,7 +80,11 @@
7080

7181
<ScheduleModal bind:show={showSchedule} {message} {topics} />
7282

73-
<SendModal bind:show={showSend} {message} {topics} />
83+
<SendModal
84+
bind:show={showSend}
85+
{message}
86+
{topics}
87+
on:update={() => pollMessagesStatus([message])} />
7488

7589
<CancelModal bind:show={showCancel} {message} />
7690

src/routes/(console)/project-[project]/messaging/message-[message]/sendModal.svelte

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
88
import { MessagingProviderType, type Models } from '@appwrite.io/console';
99
import { Dependencies } from '$lib/constants';
10+
import { createEventDispatcher } from 'svelte';
1011
1112
export let show = false;
1213
export let message: Models.Message & { data: Record<string, unknown> };
1314
export let topics: Models.Topic[];
1415
15-
let totalTargets = message.targets?.length ?? 0;
16+
const dispatch = createEventDispatcher();
17+
$: totalTargets = message.targets?.length ?? 0;
1618
1719
for (const topic of topics) {
1820
if (message.providerType == MessagingProviderType.Push) {
@@ -80,6 +82,8 @@
8082
type: 'error'
8183
});
8284
trackError(error, Submit.MessagingMessageUpdate);
85+
} finally {
86+
dispatch('update');
8387
}
8488
};
8589
</script>

src/routes/(console)/project-[project]/messaging/message-[message]/updateTopics.svelte

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
</script>
8484

8585
<Form onSubmit={update}>
86-
<CardGrid hideFooter={message.status != 'draft'}>
86+
<CardGrid hideFooter={message.status !== 'draft'}>
8787
<Heading tag="h6" size="7" id="variables">Topics</Heading>
8888
<svelte:fragment slot="aside">
8989
{@const sum = topicIds.length}
@@ -92,7 +92,7 @@
9292
<div>
9393
<span class="eyebrow-heading-3">Topic</span>
9494
</div>
95-
{#if message.status == 'draft'}
95+
{#if message.status === 'draft'}
9696
<Button
9797
text
9898
noMargin
@@ -136,7 +136,7 @@
136136
text
137137
class="is-only-icon"
138138
ariaLabel="delete"
139-
disabled={message.status != 'draft'}
139+
disabled={message.status !== 'draft'}
140140
on:click={() => removeTopic(topic.$id)}>
141141
<span
142142
class="icon-x u-font-size-20"
@@ -154,7 +154,7 @@
154154
<PaginationInline {sum} {limit} bind:offset />
155155
</div>
156156
</div>
157-
{:else if message.status == 'draft'}
157+
{:else if message.status === 'draft'}
158158
<Empty on:click={() => (showTopics = true)}>Add a topic</Empty>
159159
{:else}
160160
<EmptySearch hidePagination>

0 commit comments

Comments
 (0)