From 5016c26c78be7ebdbc446ee29ee0fcac0aaf54db Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Tue, 28 Nov 2023 16:43:37 -0800 Subject: [PATCH] Create a wizard to send email messages --- .../project-[project]/messaging/+page.svelte | 54 +++--- .../project-[project]/messaging/create.svelte | 158 +++++++++++------- .../messaging/createMessageDropdown.svelte | 67 ++++++++ .../messaging/wizard/emailFormList.svelte | 127 ++++++++++++++ .../messaging/wizard/step1.svelte | 20 +++ .../messaging/wizard/step2.svelte | 99 +++++++++++ .../messaging/wizard/step3.svelte | 101 +++++++++++ .../messaging/wizard/store.ts | 52 ++++++ 8 files changed, 598 insertions(+), 80 deletions(-) create mode 100644 src/routes/console/project-[project]/messaging/createMessageDropdown.svelte create mode 100644 src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte create mode 100644 src/routes/console/project-[project]/messaging/wizard/step1.svelte create mode 100644 src/routes/console/project-[project]/messaging/wizard/step2.svelte create mode 100644 src/routes/console/project-[project]/messaging/wizard/step3.svelte create mode 100644 src/routes/console/project-[project]/messaging/wizard/store.ts diff --git a/src/routes/console/project-[project]/messaging/+page.svelte b/src/routes/console/project-[project]/messaging/+page.svelte index e4bc521af0..00979da33d 100644 --- a/src/routes/console/project-[project]/messaging/+page.svelte +++ b/src/routes/console/project-[project]/messaging/+page.svelte @@ -1,5 +1,4 @@ @@ -53,10 +49,7 @@
Messages
- +
@@ -70,10 +63,7 @@ hideView allowNoColumns showColsTextMobile /> - +
@@ -239,9 +229,33 @@ single href="https://appwrite.io/docs" target="message" - on:click={() => ($showCreate = true)} /> + on:click={() => ($showCreate = true)}> +
+ + Create your first message to get started. + +

+ Need a hand? Learn more in our documentation. +

+
+
+ + + + +
+ {/if} - - - diff --git a/src/routes/console/project-[project]/messaging/create.svelte b/src/routes/console/project-[project]/messaging/create.svelte index 49a81af91f..6a321940c1 100644 --- a/src/routes/console/project-[project]/messaging/create.svelte +++ b/src/routes/console/project-[project]/messaging/create.svelte @@ -1,73 +1,111 @@ - - - + onDestroy(() => { + console.log('destroy'); + }); + + const stepsComponents: WizardStepsType = new Map(); + stepsComponents.set(1, { + label: 'Message', + component: Step1 + }); + stepsComponents.set(2, { + label: 'Targets', + component: Step2 + }); + stepsComponents.set(3, { + label: 'Schedule', + component: Step3 + }); + - {#if !showCustomId} -
- (showCustomId = !showCustomId)}> - -
- {:else} - - {/if} -
- - - - -
+ diff --git a/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte b/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte new file mode 100644 index 0000000000..8df6c5bc42 --- /dev/null +++ b/src/routes/console/project-[project]/messaging/createMessageDropdown.svelte @@ -0,0 +1,67 @@ + + + + + + + + {#each Object.entries(providers) as [type, option]} + { + if ( + type !== ProviderTypes.Email && + type !== ProviderTypes.Sms && + type !== ProviderTypes.Push + ) + return; + $providerType = type; + $targetsById = {}; + const common = { + topics: [], + users: [], + targets: [] + }; + switch (type) { + case ProviderTypes.Email: + $messageParams[$providerType] = { + ...common, + subject: '', + content: '' + }; + break; + case ProviderTypes.Sms: + $messageParams[$providerType] = { + ...common, + content: '' + }; + break; + case ProviderTypes.Push: + $messageParams[$providerType] = { + ...common, + title: '', + body: '' + }; + break; + } + showCreateDropdown = false; + wizard.start(Create); + }}> + {option.name} + + {/each} + + diff --git a/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte b/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte new file mode 100644 index 0000000000..b678333762 --- /dev/null +++ b/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte @@ -0,0 +1,127 @@ + + + + + + + +
+ + + + + + + + + + Enter the email address to which te test message will be +
(selected = 'other')} + on:keyup|self={clickOnEnter} + role="button" + tabindex="0"> + +
+
+
+ + + + + +
+
+ {#if !showCustomId} +
+ (showCustomId = !showCustomId)} + > +
+ {:else} + + {/if} +
diff --git a/src/routes/console/project-[project]/messaging/wizard/step1.svelte b/src/routes/console/project-[project]/messaging/wizard/step1.svelte new file mode 100644 index 0000000000..01c7048733 --- /dev/null +++ b/src/routes/console/project-[project]/messaging/wizard/step1.svelte @@ -0,0 +1,20 @@ + + + + Message + + + Create an {providers[$providerType].text} that will be displayed to your subscribers. Learn more + in our documentation. + + + diff --git a/src/routes/console/project-[project]/messaging/wizard/step2.svelte b/src/routes/console/project-[project]/messaging/wizard/step2.svelte new file mode 100644 index 0000000000..6b1e625e63 --- /dev/null +++ b/src/routes/console/project-[project]/messaging/wizard/step2.svelte @@ -0,0 +1,99 @@ + + + + Targets + + Select users to whom this message should be directed. + {#if targetIdsLength == 0} + +
+ +
+ Select recipients to get started +
+
+
+ {:else} +
+ + + Target + + + + {#each Object.entries($targetsById) as [targetId, target] (targetId)} + + +
+ {target.name ? target.name : target.identifier} +
+
+ + +
+ +
+
+
+ {/each} +
+
+
+ + {/if} +
+ + diff --git a/src/routes/console/project-[project]/messaging/wizard/step3.svelte b/src/routes/console/project-[project]/messaging/wizard/step3.svelte new file mode 100644 index 0000000000..adeb74d12e --- /dev/null +++ b/src/routes/console/project-[project]/messaging/wizard/step3.svelte @@ -0,0 +1,101 @@ + + + + Schedule + + Schedule the time you want your users to receive this message. Learn more in our + documentation. + +
+ + + +
+
+ + {#if when === 'now'} + The message will be sent immediately + {:else if !dateTime || isNaN(dateTime.getTime())} + The message will be sent later + {:else} + The message will be sent at {dateTime.toLocaleString('en', formatOptions)} + {/if} + +
+ + diff --git a/src/routes/console/project-[project]/messaging/wizard/store.ts b/src/routes/console/project-[project]/messaging/wizard/store.ts new file mode 100644 index 0000000000..ad72953855 --- /dev/null +++ b/src/routes/console/project-[project]/messaging/wizard/store.ts @@ -0,0 +1,52 @@ +import { ProviderTypes } from '$lib/components/providerType.svelte'; +import type { Target } from '$lib/components/userTargetsModal.svelte'; +import { writable } from 'svelte/store'; + +export enum MessageStatuses { + DRAFT = 'draft', + PROCESSING = 'processing' +} + +export type MessageParams = { + messageId: string; + topics: string[]; + users: string[]; + targets: string[]; + description: string; + status: MessageStatuses; + deliveryTime?: string; +}; + +export type EmailMessageParams = MessageParams & { + subject: string; + content: string; + html: boolean; +}; + +export type SMSMessageParams = MessageParams & { + content: string; +}; + +export type PushMessageParams = MessageParams & { + title: string; + body: string; + data: Record; + action?: string; + icon?: string; + sound?: string; + color?: string; + tag?: string; + badge?: string; +}; + +export const providerType = writable(null); +export const targetsById = writable>({}); +export const messageParams = writable<{ + [ProviderTypes.Email]: Partial; + [ProviderTypes.Sms]: Partial; + [ProviderTypes.Push]: Partial; +}>({ + [ProviderTypes.Email]: null, + [ProviderTypes.Sms]: null, + [ProviderTypes.Push]: null +});