diff --git a/src/lib/constants.ts b/src/lib/constants.ts
index a2107d03cd..04a4698004 100644
--- a/src/lib/constants.ts
+++ b/src/lib/constants.ts
@@ -42,7 +42,8 @@ export enum Dependencies {
MIGRATIONS = 'dependency:migrations',
COLLECTIONS = 'dependency:collections',
RUNTIMES = 'dependency:runtimes',
- CONSOLE_VARIABLES = 'dependency:console_variables'
+ CONSOLE_VARIABLES = 'dependency:console_variables',
+ MESSAGING_PROVIDER = 'dependency:messaging_provider'
}
export const scopes: {
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.svelte
new file mode 100644
index 0000000000..944197a93a
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.svelte
@@ -0,0 +1,5 @@
+
+ Provider - Appwrite
+
+
+
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.ts b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.ts
new file mode 100644
index 0000000000..afc8f83abc
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+layout.ts
@@ -0,0 +1,32 @@
+import type { LayoutLoad } from './$types';
+import Breadcrumbs from './breadcrumbs.svelte';
+import Header from './header.svelte';
+import { sdk } from '$lib/stores/sdk';
+import { Dependencies } from '$lib/constants';
+import { error } from '@sveltejs/kit';
+
+export const load: LayoutLoad = async ({ params, depends }) => {
+ depends(Dependencies.MESSAGING_PROVIDER);
+
+ const response = await sdk.forProject.client.call(
+ 'GET',
+ new URL(sdk.forProject.client.config.endpoint + '/messaging/providers/' + params.provider),
+ {
+ 'X-Appwrite-Project': sdk.forProject.client.config.project,
+ 'content-type': 'application/json',
+ 'X-Appwrite-Mode': 'admin'
+ }
+ );
+
+ console.log(response);
+
+ try {
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs,
+ provider: response
+ };
+ } catch (e) {
+ throw error(e.code, e.message);
+ }
+};
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+page.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+page.svelte
new file mode 100644
index 0000000000..2262f62ac1
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/+page.svelte
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/breadcrumbs.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/breadcrumbs.svelte
new file mode 100644
index 0000000000..5a3f26f90d
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/breadcrumbs.svelte
@@ -0,0 +1,27 @@
+
+
+
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/dangerZone.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/dangerZone.svelte
new file mode 100644
index 0000000000..7befc15c0e
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/dangerZone.svelte
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+ Delete provider
+
+ The provider's instance will be permanently deleted. This action is irreversible.
+
+
+
+ {$provider.name}
+
+
+ Last updated: {toLocaleDateTime($provider.$updatedAt)}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte
new file mode 100644
index 0000000000..e32cbf6aae
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte
@@ -0,0 +1,59 @@
+
+
+
+
+ Are you sure you want to delete {$provider.name} from '{$project.name}'?
+
+
+
+
+
+
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/header.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/header.svelte
new file mode 100644
index 0000000000..d78a0f0d43
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/header.svelte
@@ -0,0 +1,17 @@
+
+
+
+
+
+ {$provider?.name ? $provider?.name : '-'}
+
+ {$provider?.$id}
+
+
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/store.ts b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/store.ts
new file mode 100644
index 0000000000..a69272a70c
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/store.ts
@@ -0,0 +1,9 @@
+import { derived } from 'svelte/store';
+import { page } from '$app/stores';
+import type { Provider } from '../../store';
+
+export const provider = derived(
+ page,
+ // TODO: Set actual type
+ ($page) => $page.data.provider as Provider
+);
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateName.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateName.svelte
new file mode 100644
index 0000000000..f77b626ca1
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateName.svelte
@@ -0,0 +1,51 @@
+
+
+
diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateStatus.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateStatus.svelte
new file mode 100644
index 0000000000..8de26f1844
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateStatus.svelte
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+
+
+
Provider:
+
Channel:
+
Created: {toLocaleDateTime($provider.$createdAt)}
+
+
+
+
+
+
+
+
diff --git a/src/routes/console/project-[project]/messaging/providers/wizard/store.ts.bak b/src/routes/console/project-[project]/messaging/providers/wizard/store.ts.bak
new file mode 100644
index 0000000000..0ee3ba46ca
--- /dev/null
+++ b/src/routes/console/project-[project]/messaging/providers/wizard/store.ts.bak
@@ -0,0 +1,161 @@
+import { writable } from 'svelte/store';
+import type { Column } from '$lib/components/viewSelector.svelte';
+
+export let showCreate = writable(false);
+
+export const columns = writable([
+ { id: '$id', title: 'Provider ID', show: true },
+ { id: 'name', title: 'Name', show: true },
+ { id: 'provider', title: 'Provider', show: true },
+ { id: 'channel', title: 'Channel', show: true },
+ { id: 'status', title: 'Status', show: true }
+]);
+
+export type Instruction = {
+ text: string;
+ input: {
+ label: string;
+ name: string;
+ type: 'text' | 'domain' | 'email';
+ placeholder: string;
+ };
+};
+
+export const providers = {
+ sms: {
+ name: 'SMS',
+ text: 'SMS',
+ icon: 'annotation',
+ providers: {
+ twilio: {
+ imageIcon: 'twilio',
+ title: 'Twilio',
+ description: ''
+ },
+ msg91: {
+ imageIcon: 'msg91',
+ title: 'MSG91',
+ description: ''
+ },
+ telesign: {
+ imageIcon: 'telesign',
+ title: 'Telesign',
+ description: ''
+ },
+ textmagic: {
+ imageIcon: 'textmagic',
+ title: 'Textmagic',
+ description: ''
+ },
+ vonage: {
+ imageIcon: 'vonage',
+ title: 'Vonage',
+ description: ''
+ }
+ }
+ },
+ email: {
+ name: 'Email',
+ text: 'emails',
+ icon: 'mail',
+ providers: {
+ mailgun: {
+ imageIcon: 'mailgun',
+ title: 'Mailgun',
+ description: '',
+ initialize: [
+ {
+ text: 'Before you can create a Mailgun provider, you need to first create a Mailgun account.'
+ },
+ {
+ text: 'Head to your Profile > API Security.'
+ },
+ {
+ text: 'Generate a key and give it a name. Copy and paste it in the field below.',
+ input: {
+ label: 'API key',
+ name: 'apiKey',
+ type: 'text',
+ placeholder: 'Enter API key'
+ }
+ },
+ {
+ // TODO: Update link to domain verification
+ text: 'Head to Sending > Domains and click on \'Add New Domain\'. Verify your domain by following the instructions.',
+ input: {
+ label: 'Base URL',
+ name: 'baseUrl',
+ type: 'text',
+ placeholder: 'Enter base URL'
+ }
+ }
+ ],
+ configure: [
+ {
+ text: 'Provide a display name your recipient will see when they receive your emails.',
+ input: {
+ label: 'From',
+ name: 'from',
+ type: 'text',
+ placeholder: 'Enter name'
+ }
+ },
+ {
+ text: 'Provide an email address that will be visible to the recipient as the senders email address for this message.',
+ input: {
+ label: 'From email address',
+ name: 'email',
+ type: 'email',
+ placeholder: 'Enter email'
+ }
+ },
+ {
+ text: 'Provide an email address for users to use when replying to your emails.',
+ input: {
+ label: 'Reply to',
+ name: 'replyTo',
+ type: 'email',
+ placeholder: 'Enter email'
+ }
+ },
+ {
+ text: 'Provide the domain as it is registered on Mailgun.',
+ input: {
+ label: 'Domain',
+ name: 'domain',
+ type: 'domain',
+ placeholder: 'Enter domain'
+ }
+ }
+ ]
+ },
+ sendgrid: {
+ imageIcon: 'sendgrid',
+ title: 'Sendgrid',
+ description: ''
+ }
+ }
+ },
+ push: {
+ name: 'Push notification',
+ text: 'notifications',
+ icon: 'device-mobile',
+ providers: {
+ fcm: {
+ imageIcon: 'firebase',
+ title: 'FCM',
+ description: 'Firebase Cloud Messaging'
+ },
+ apns: {
+ imageIcon: 'apple',
+ title: 'APNS',
+ description: 'Apple Push Notification Service'
+ },
+ mqtt: {
+ imageIcon: 'mqtt',
+ title: 'MQTT',
+ description: 'Message Queuing Telemtry Transport'
+ }
+ }
+ }
+};