From edf44e8ac2aa779e38cd3e80808b1165eef56a30 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sat, 22 Feb 2025 12:25:03 +0530 Subject: [PATCH 1/5] fix: poll message status when sent or already processing. --- .../message-[message]/overview.svelte | 34 ++++++++++++++++++- .../message-[message]/sendModal.svelte | 4 +++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[project]/messaging/message-[message]/overview.svelte b/src/routes/(console)/project-[project]/messaging/message-[message]/overview.svelte index c9bbe244f..37b351187 100644 --- a/src/routes/(console)/project-[project]/messaging/message-[message]/overview.svelte +++ b/src/routes/(console)/project-[project]/messaging/message-[message]/overview.svelte @@ -9,6 +9,8 @@ import SendModal from './sendModal.svelte'; import ScheduleModal from './scheduleModal.svelte'; import CancelModal from './cancelModal.svelte'; + import { sdk } from '$lib/stores/sdk'; + import { onDestroy, onMount } from 'svelte'; export let message: Models.Message & { data: Record }; export let topics: Models.Topic[]; @@ -18,6 +20,36 @@ let showCancel = false; let showFailed = false; let errors: string[] = []; + + let intervalID: ReturnType; + + function checkMessageStatus() { + sdk.forProject.messaging + .getMessage(message.$id) + .then((msg) => { + if (msg.status !== 'processing') { + clearInterval(intervalID); + message.status = msg.status; + } + }) + .catch(() => clearInterval(intervalID)); + } + + async function pollMessageStatus(update: boolean = true) { + if (update) message.status = 'processing'; + + checkMessageStatus(); + clearInterval(intervalID); + intervalID = setInterval(checkMessageStatus, 2000); + } + + onDestroy(() => clearInterval(intervalID)); + + onMount(() => { + if (message.status === 'processing') { + pollMessageStatus(false); + } + }); @@ -70,7 +102,7 @@ - + pollMessageStatus()} /> diff --git a/src/routes/(console)/project-[project]/messaging/message-[message]/sendModal.svelte b/src/routes/(console)/project-[project]/messaging/message-[message]/sendModal.svelte index fdfaa1d5c..9899b4ecf 100644 --- a/src/routes/(console)/project-[project]/messaging/message-[message]/sendModal.svelte +++ b/src/routes/(console)/project-[project]/messaging/message-[message]/sendModal.svelte @@ -7,11 +7,13 @@ import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; import { MessagingProviderType, type Models } from '@appwrite.io/console'; import { Dependencies } from '$lib/constants'; + import { createEventDispatcher } from 'svelte'; export let show = false; export let message: Models.Message & { data: Record }; export let topics: Models.Topic[]; + const dispatch = createEventDispatcher(); let totalTargets = message.targets?.length ?? 0; for (const topic of topics) { @@ -80,6 +82,8 @@ type: 'error' }); trackError(error, Submit.MessagingMessageUpdate); + } finally { + dispatch('update'); } }; From ee3ab70abeb9fc762f722a6893ef4b0431187665 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sat, 22 Feb 2025 13:24:45 +0530 Subject: [PATCH 2/5] update: apply polling on main page as well. --- .../project-[project]/messaging/+page.svelte | 12 +++++ .../project-[project]/messaging/helper.ts | 51 +++++++++++++++++++ .../message-[message]/overview.svelte | 34 +++---------- .../message-[message]/sendModal.svelte | 2 +- .../message-[message]/updateTopics.svelte | 8 +-- 5 files changed, 76 insertions(+), 31 deletions(-) create mode 100644 src/routes/(console)/project-[project]/messaging/helper.ts diff --git a/src/routes/(console)/project-[project]/messaging/+page.svelte b/src/routes/(console)/project-[project]/messaging/+page.svelte index efac29adc..5d518d5c8 100644 --- a/src/routes/(console)/project-[project]/messaging/+page.svelte +++ b/src/routes/(console)/project-[project]/messaging/+page.svelte @@ -43,6 +43,8 @@ import type { Column } from '$lib/helpers/types'; import { writable } from 'svelte/store'; import { canWriteMessages } from '$lib/stores/roles'; + import { onDestroy, onMount } from 'svelte'; + import { stopPolling, pollMessagesStatus } from './helper'; export let data: PageData; let selected: string[] = []; @@ -90,6 +92,16 @@ showDelete = false; } } + + onMount(() => { + const processingMessages = data.messages.messages.filter( + (message) => message.status === 'processing' + ); + + pollMessagesStatus(processingMessages); + }); + + onDestroy(stopPolling); diff --git a/src/routes/(console)/project-[project]/messaging/helper.ts b/src/routes/(console)/project-[project]/messaging/helper.ts new file mode 100644 index 000000000..e814eb54c --- /dev/null +++ b/src/routes/(console)/project-[project]/messaging/helper.ts @@ -0,0 +1,51 @@ +import { sdk } from '$lib/stores/sdk'; +import { type Models } from '@appwrite.io/console'; +import { invalidate } from '$app/navigation'; +import { Dependencies } from '$lib/constants'; + +/** Stores active polling intervals for messages. */ +const messageIntervals = new Map>(); + +/** Checks the status of a message and stops polling if it's no longer processing. */ +function checkMessageStatus(message: Models.Message) { + sdk.forProject.messaging + .getMessage(message.$id) + .then((msg) => { + if (msg.status !== 'processing') { + clearPolling(message.$id); + message.status = msg.status; + // noinspection JSIgnoredPromiseFromCall + invalidate(Dependencies.MESSAGING_MESSAGES); + } + }) + .catch(() => clearPolling(message.$id)); +} + +/** Clears polling for a specific message. */ +function clearPolling(messageId: string) { + const intervalID = messageIntervals.get(messageId); + if (intervalID) { + clearInterval(intervalID); + messageIntervals.delete(messageId); + } +} + +/** Stops polling for all messages. */ +export function stopPolling() { + messageIntervals.forEach((_, messageId) => clearPolling(messageId)); +} + +/** Starts polling message statuses, optionally marking them as processing. */ +export function pollMessagesStatus(messages: Models.Message[], update: boolean = true) { + messages.forEach((message) => { + if (update) { + message.status = 'processing'; + } + + clearPolling(message.$id); + checkMessageStatus(message); + + const intervalID = setInterval(() => checkMessageStatus(message), 2000); + messageIntervals.set(message.$id, intervalID); + }); +} diff --git a/src/routes/(console)/project-[project]/messaging/message-[message]/overview.svelte b/src/routes/(console)/project-[project]/messaging/message-[message]/overview.svelte index 37b351187..611259829 100644 --- a/src/routes/(console)/project-[project]/messaging/message-[message]/overview.svelte +++ b/src/routes/(console)/project-[project]/messaging/message-[message]/overview.svelte @@ -9,8 +9,8 @@ import SendModal from './sendModal.svelte'; import ScheduleModal from './scheduleModal.svelte'; import CancelModal from './cancelModal.svelte'; - import { sdk } from '$lib/stores/sdk'; import { onDestroy, onMount } from 'svelte'; + import { stopPolling, pollMessagesStatus } from '../helper'; export let message: Models.Message & { data: Record }; export let topics: Models.Topic[]; @@ -21,33 +21,11 @@ let showFailed = false; let errors: string[] = []; - let intervalID: ReturnType; - - function checkMessageStatus() { - sdk.forProject.messaging - .getMessage(message.$id) - .then((msg) => { - if (msg.status !== 'processing') { - clearInterval(intervalID); - message.status = msg.status; - } - }) - .catch(() => clearInterval(intervalID)); - } - - async function pollMessageStatus(update: boolean = true) { - if (update) message.status = 'processing'; - - checkMessageStatus(); - clearInterval(intervalID); - intervalID = setInterval(checkMessageStatus, 2000); - } - - onDestroy(() => clearInterval(intervalID)); + onDestroy(stopPolling); onMount(() => { if (message.status === 'processing') { - pollMessageStatus(false); + pollMessagesStatus([message]); } }); @@ -102,7 +80,11 @@ - pollMessageStatus()} /> + pollMessagesStatus([message], true)} /> diff --git a/src/routes/(console)/project-[project]/messaging/message-[message]/sendModal.svelte b/src/routes/(console)/project-[project]/messaging/message-[message]/sendModal.svelte index 9899b4ecf..c9b799d79 100644 --- a/src/routes/(console)/project-[project]/messaging/message-[message]/sendModal.svelte +++ b/src/routes/(console)/project-[project]/messaging/message-[message]/sendModal.svelte @@ -14,7 +14,7 @@ export let topics: Models.Topic[]; const dispatch = createEventDispatcher(); - let totalTargets = message.targets?.length ?? 0; + $: totalTargets = message.targets?.length ?? 0; for (const topic of topics) { if (message.providerType == MessagingProviderType.Push) { diff --git a/src/routes/(console)/project-[project]/messaging/message-[message]/updateTopics.svelte b/src/routes/(console)/project-[project]/messaging/message-[message]/updateTopics.svelte index be240b2d1..3d89ccccf 100644 --- a/src/routes/(console)/project-[project]/messaging/message-[message]/updateTopics.svelte +++ b/src/routes/(console)/project-[project]/messaging/message-[message]/updateTopics.svelte @@ -83,7 +83,7 @@
- + Topics {@const sum = topicIds.length} @@ -92,7 +92,7 @@
Topic
- {#if message.status == 'draft'} + {#if message.status === 'draft'}