diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts
index 44ad9b0da0..0afba8018e 100644
--- a/src/lib/actions/analytics.ts
+++ b/src/lib/actions/analytics.ts
@@ -294,6 +294,7 @@ export enum Submit {
MessagingProviderDelete = 'submit_messaging_provider_delete',
MessagingProviderUpdate = 'submit_messaging_provider_update',
MessagingMessageCreate = 'submit_messaging_message_create',
+ MessagingMessageUpdate = 'submit_messaging_message_update',
MessagingMessageDelete = 'submit_messaging_message_delete',
MessagingTopicCreate = 'submit_messaging_topic_create',
MessagingTopicDelete = 'submit_messaging_topic_delete',
diff --git a/src/routes/console/project-[project]/messaging/create.svelte b/src/routes/console/project-[project]/messaging/create.svelte
deleted file mode 100644
index 52e96a0292..0000000000
--- a/src/routes/console/project-[project]/messaging/create.svelte
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
diff --git a/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte b/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte
index 7a596496af..7cd6d5814c 100644
--- a/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte
+++ b/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte
@@ -3,8 +3,8 @@
import { Button } from '$lib/elements/forms';
import { wizard } from '$lib/stores/wizard';
import { providers } from './providers/store';
- import Create from './create.svelte';
- import { messageParams, providerType, targetsById } from './wizard/store';
+ import Wizard from './wizard.svelte';
+ import { messageParams, operation, providerType, targetsById } from './wizard/store';
import { ProviderTypes } from './providerType.svelte';
import { topicsById } from './store';
@@ -30,6 +30,7 @@
)
return;
$providerType = type;
+ $operation = 'create';
$topicsById = {};
$targetsById = {};
const common = {
@@ -60,7 +61,7 @@
break;
}
showCreateDropdown = false;
- wizard.start(Create);
+ wizard.start(Wizard);
}}>
{option.name}
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 21e6f6aad6..909278a261 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/+layout.ts
+++ b/src/routes/console/project-[project]/messaging/message-[message]/+layout.ts
@@ -22,7 +22,51 @@ export const load: LayoutLoad = async ({ params, depends }) => {
}
);
+ const topicsById = {};
+ const topicsPromise = Promise.allSettled(
+ response.topics.map((topicId) => {
+ return sdk.forProject.client.call(
+ 'GET',
+ new URL(`${sdk.forProject.client.config.endpoint}/messaging/topics/${topicId}`),
+ {
+ 'X-Appwrite-Project': sdk.forProject.client.config.project,
+ 'content-type': 'application/json',
+ 'X-Appwrite-Mode': 'admin'
+ }
+ );
+ })
+ ).then((results) => {
+ results.forEach((result) => {
+ if (result.status === 'fulfilled') {
+ topicsById[result.value.$id] = result.value;
+ }
+ });
+ });
+
+ const targetsById = {};
+ const targetsPromise = sdk.forProject.client
+ .call(
+ 'GET',
+ new URL(
+ `${sdk.forProject.client.config.endpoint}/messaging/messages/${params.message}/targets`
+ ),
+ {
+ 'X-Appwrite-Project': sdk.forProject.client.config.project,
+ 'content-type': 'application/json',
+ 'X-Appwrite-Mode': 'admin'
+ }
+ )
+ .then((response) => {
+ response.targets.forEach((target) => {
+ targetsById[target.$id] = target;
+ });
+ });
+
+ await Promise.allSettled([topicsPromise, targetsPromise]);
+
return {
+ topicsById,
+ targetsById,
header: Header,
breadcrumbs: Breadcrumbs,
message: response
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 c949eba855..3db50213c1 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/+page.svelte
+++ b/src/routes/console/project-[project]/messaging/message-[message]/+page.svelte
@@ -7,16 +7,107 @@
import { ProviderTypes } from '../providerType.svelte';
import SMSPreview from './smsPreview.svelte';
import PushPreview from './pushPreview.svelte';
+ import {
+ MessageStatuses,
+ messageParams,
+ operation,
+ providerType,
+ targetsById
+ } from '../wizard/store';
+ import { topicsById } from '../store';
+ import { wizard } from '$lib/stores/wizard';
+ import Wizard from '../wizard.svelte';
+ import type { PageData } from './$types';
+
+ export let data: PageData;
+
+ async function onEdit() {
+ $operation = 'update';
+ $providerType = $message.providerType;
+ $topicsById = {};
+ $targetsById = {};
+
+ $topicsById = data.topicsById;
+ $targetsById = data.targetsById;
+
+ $messageParams[$providerType] = {
+ messageId: $message.$id,
+ topics: $message.topics,
+ users: $message.users,
+ targets: $message.targets,
+ description: $message.description,
+ status: MessageStatuses.DRAFT,
+ scheduledAt: $message.scheduledAt
+ };
+
+ switch ($providerType) {
+ case ProviderTypes.Email:
+ {
+ const { data } = $message;
+ const params = ['subject', 'content', 'html'];
+ params.forEach((key) => {
+ if (typeof data[key] !== 'undefined') {
+ $messageParams[$providerType][key] = data[key];
+ }
+ });
+ }
+ break;
+ case ProviderTypes.Sms:
+ {
+ const { data } = $message;
+ const params = ['content'];
+ params.forEach((key) => {
+ if (typeof data[key] !== 'undefined') {
+ $messageParams[$providerType][key] = data[key];
+ }
+ });
+ }
+ break;
+ case ProviderTypes.Push:
+ {
+ const { data } = $message;
+ const params = [
+ 'title',
+ 'body',
+ 'action',
+ 'icon',
+ 'sound',
+ 'color',
+ 'tag',
+ 'badge'
+ ];
+ params.forEach((key) => {
+ if (typeof data[key] !== 'undefined') {
+ $messageParams[$providerType][key] = data[key];
+ }
+ });
+ const dataEntries: [string, string][] = [];
+ Object.entries(data['data'] ?? {}).forEach(([key, value]) => {
+ dataEntries.push([key, value.toString()]);
+ });
+ $messageParams[$providerType]['data'] = dataEntries || [['', '']];
+ }
+ break;
+ }
+
+ wizard.start(Wizard);
+ }
{#if $message.providerType === ProviderTypes.Email}
-
+
{:else if $message.providerType === ProviderTypes.Sms}
-
+
{:else if $message.providerType === ProviderTypes.Push}
-
+
{/if}
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/emailPreview.svelte b/src/routes/console/project-[project]/messaging/message-[message]/emailPreview.svelte
index 153a14def8..f3914e6d09 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/emailPreview.svelte
+++ b/src/routes/console/project-[project]/messaging/message-[message]/emailPreview.svelte
@@ -1,7 +1,10 @@
@@ -14,20 +17,17 @@
id="subject"
label="Subject"
disabled={true}
- bind:value={$message.data.subject}>
+ bind:value={message.data.subject}>
+ bind:value={message.data.content}>
+
+
+
-
-
-
-
-
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/pushPreview.svelte b/src/routes/console/project-[project]/messaging/message-[message]/pushPreview.svelte
index b5695ed3fb..f83000aed9 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/pushPreview.svelte
+++ b/src/routes/console/project-[project]/messaging/message-[message]/pushPreview.svelte
@@ -1,33 +1,33 @@
-
+
+ bind:value={message.data.body}>
+
+
+
-
-
-
-
-
diff --git a/src/routes/console/project-[project]/messaging/message-[message]/smsPreview.svelte b/src/routes/console/project-[project]/messaging/message-[message]/smsPreview.svelte
index 5648c9bf23..b5c9bc6ba9 100644
--- a/src/routes/console/project-[project]/messaging/message-[message]/smsPreview.svelte
+++ b/src/routes/console/project-[project]/messaging/message-[message]/smsPreview.svelte
@@ -1,14 +1,17 @@
Preview
-
+
@@ -16,14 +19,11 @@
id="message"
label="Message"
disabled={true}
- bind:value={$message.data.content}>
+ bind:value={message.data.content}>
+
+
+
-
-
-
-
-
diff --git a/src/routes/console/project-[project]/messaging/store.ts b/src/routes/console/project-[project]/messaging/store.ts
index 839c0526b2..3f39d4a3c7 100644
--- a/src/routes/console/project-[project]/messaging/store.ts
+++ b/src/routes/console/project-[project]/messaging/store.ts
@@ -38,6 +38,14 @@ export type Message = {
body?: string;
subject?: string;
title?: string;
+ html?: boolean;
+ data?: Record;
+ action?: string;
+ icon?: string;
+ sound?: string;
+ color?: string;
+ tag?: string;
+ badge?: string;
};
};
diff --git a/src/routes/console/project-[project]/messaging/wizard.svelte b/src/routes/console/project-[project]/messaging/wizard.svelte
new file mode 100644
index 0000000000..61956df099
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/wizard.svelte
@@ -0,0 +1,306 @@
+
+
+
diff --git a/src/routes/console/project-[project]/messaging/wizard/store.ts b/src/routes/console/project-[project]/messaging/wizard/store.ts
index 3b02644524..6607c2aaa6 100644
--- a/src/routes/console/project-[project]/messaging/wizard/store.ts
+++ b/src/routes/console/project-[project]/messaging/wizard/store.ts
@@ -4,7 +4,10 @@ import type { Target } from '../store';
export enum MessageStatuses {
DRAFT = 'draft',
- PROCESSING = 'processing'
+ SCHEDULED = 'scheduled',
+ PROCESSING = 'processing',
+ SENT = 'sent',
+ FAILED = 'failed'
}
export type MessageParams = {
@@ -39,6 +42,7 @@ export type PushMessageParams = MessageParams & {
badge?: string;
};
+export const operation = writable<'create' | 'update'>('create');
export const providerType = writable(null);
export const targetsById = writable>({});
export const messageParams = writable<{