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 @@
Preview
- +
- + + 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<{