diff --git a/src/routes/(console)/project-[project]/messaging/message-[message]/+layout.ts b/src/routes/(console)/project-[project]/messaging/message-[message]/+layout.ts index 7e3985ea37..2d2cdb624c 100644 --- a/src/routes/(console)/project-[project]/messaging/message-[message]/+layout.ts +++ b/src/routes/(console)/project-[project]/messaging/message-[message]/+layout.ts @@ -41,13 +41,26 @@ export const load: LayoutLoad = async ({ params, depends }) => { }) ); - await Promise.allSettled(usersPromise); + const messageRecipients: Record> = {}; + const messageRecipientsPromise = Object.values(message.users).map((userId) => + sdk.forProject.users + .get(userId) + .then((user) => { + messageRecipients[user.$id] = user; + }) + .catch(() => { + messageRecipients[userId] = null; + }) + ); + + await Promise.allSettled([usersPromise, messageRecipientsPromise]); return { message, topicsById, targetsById, usersById, + messageRecipients, header: Header, breadcrumbs: Breadcrumbs }; diff --git a/src/routes/(console)/project-[project]/messaging/message-[message]/+page.svelte b/src/routes/(console)/project-[project]/messaging/message-[message]/+page.svelte index 878c47ffdc..26cfca0fd0 100644 --- a/src/routes/(console)/project-[project]/messaging/message-[message]/+page.svelte +++ b/src/routes/(console)/project-[project]/messaging/message-[message]/+page.svelte @@ -33,7 +33,10 @@ {/if} - + {#if $message.status !== 'processing'} {/if} diff --git a/src/routes/(console)/project-[project]/messaging/message-[message]/emailMessage.svelte b/src/routes/(console)/project-[project]/messaging/message-[message]/emailMessage.svelte index fc897c3984..36c479683b 100644 --- a/src/routes/(console)/project-[project]/messaging/message-[message]/emailMessage.svelte +++ b/src/routes/(console)/project-[project]/messaging/message-[message]/emailMessage.svelte @@ -60,25 +60,21 @@ subject === message.data.subject && content === message.data.content && html === ((message.data['html'] ?? false) as boolean); + + $: isDraft = message.status === 'draft';
- +
Message
- - + + Enable the HTML mode if your message contains HTML tags. diff --git a/src/routes/(console)/project-[project]/messaging/message-[message]/updateTargets.svelte b/src/routes/(console)/project-[project]/messaging/message-[message]/updateTargets.svelte index 8c112fba95..a4ef930090 100644 --- a/src/routes/(console)/project-[project]/messaging/message-[message]/updateTargets.svelte +++ b/src/routes/(console)/project-[project]/messaging/message-[message]/updateTargets.svelte @@ -8,7 +8,14 @@ TableHeader, TableRow } from '$lib/elements/table'; - import { CardGrid, Heading, Empty, PaginationInline, EmptySearch } from '$lib/components'; + import { + CardGrid, + Heading, + Empty, + PaginationInline, + EmptySearch, + Alert + } from '$lib/components'; import { onMount } from 'svelte'; import { sdk } from '$lib/stores/sdk'; import { invalidate } from '$app/navigation'; @@ -22,6 +29,7 @@ export let message: Models.Message & { data: Record }; export let selectedTargetsById: Record; + export let selectedRecipients: Record>; let providerType: MessagingProviderType; let offset = 0; @@ -93,20 +101,79 @@ } } + $: isDraft = message.status === 'draft'; + $: disabled = symmetricDifference(targetIds, Object.keys(selectedTargetsById)).length === 0; + + $: recipients = message.users.reduce((acc, userId) => { + const recipient = selectedRecipients[userId]; + if (recipient) { + const target = recipient.targets.find((t) => t.providerType === message.providerType); + + if (target) { + acc[userId] = { + $id: recipient.$id, + name: recipient.name, + identifier: target.identifier, + providerType: message.providerType + }; + } + } else { + // user id exists but the user is null means the user account was deleted. + acc[userId] = null; + } + return acc; + }, {}); + + $: recipientsAvailable = recipientsCount > 0; + $: recipientsCount = Object.keys(recipients).filter((user) => user !== null).length; + $: hasDeletedUsers = Object.values(recipients).some((source) => source == null); - + Targets - {@const sum = targetIds.length} - {#if sum} + {@const sum = targetIds.length || Object.values(recipients).length} + {@const dataSource = + targets.length > 0 + ? targets + : Object.values(recipients).filter((user) => user !== null)} + + {#if hasDeletedUsers} +
+ {#if hasDeletedUsers && !dataSource.length} + + There are no targets to show + This message was sent to users who are no longer available, so their information + cannot be displayed. + + {:else} + 0} + on:dismiss={() => (hasDeletedUsers = false)}> + This message was sent to users who are no longer available, so their + information cannot be displayed. + + {/if} +
+ {/if} + + {#if sum && dataSource.length}
-
+
Target + + {#if recipientsAvailable} + Identifier + + + + {/if}
- {#if message.status == 'draft'} + {#if isDraft}
+
- + + {#if recipientsAvailable} + + {/if} + + - {#each targets.slice(offset, offset + limit) as target (target.$id)} + + {#each dataSource.slice(offset, offset + limit) as source (source['$id'])}
- {#if target.providerType === MessagingProviderType.Push} - {target.name} + {#if source['providerType'] === MessagingProviderType.Push} + {source['name']} {:else} - {target.identifier} + {source['identifier']} {/if}
+ {#if recipientsAvailable} + + + {source['name']} + + + {/if} + - {#if message.status === 'draft'} + {#if isDraft}
@@ -151,8 +233,8 @@ text class="is-only-icon" ariaLabel="delete" - disabled={message.status != 'draft'} - on:click={() => removeTarget(target.$id)}> + disabled={!isDraft} + on:click={() => removeTarget(source['$id'])}>
- {:else if message.status == 'draft'} + {:else if isDraft} (showTargets = true)}>Add a target - {:else} + {:else if !sum && !hasDeletedUsers}
No targets have been selected.