diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 16da364f43..890c78c8e6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -18,7 +18,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 - name: Audit dependencies run: npm audit --audit-level low - name: Install dependencies diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 2bcc603663..e58e30f826 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -237,7 +237,8 @@ export const scopes: { }, { scope: 'subscribers.write', - description: "Access to create, update, and delete your project's messaging topic subscribers", + description: + "Access to create, update, and delete your project's messaging topic subscribers", category: 'Messaging' }, { diff --git a/src/lib/helpers/types.ts b/src/lib/helpers/types.ts index 35e8214c9b..d3107faa14 100644 --- a/src/lib/helpers/types.ts +++ b/src/lib/helpers/types.ts @@ -29,3 +29,10 @@ export type Column = { */ filter?: boolean; }; + +export function isValueOfStringEnum>( + enumType: T, + value: string +): value is T[keyof T] { + return Object.values(enumType).includes(value); +} diff --git a/src/routes/console/project-[project]/auth/user-[user]/targets/+page.ts b/src/routes/console/project-[project]/auth/user-[user]/targets/+page.ts index 3638d63b5f..fd44677de0 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/targets/+page.ts +++ b/src/routes/console/project-[project]/auth/user-[user]/targets/+page.ts @@ -1,9 +1,9 @@ -import { Query, type Models } from '@appwrite.io/console'; -import { sdk } from '$lib/stores/sdk'; -import { getLimit, getPage, getQuery, getSearch, pageToOffset } from '$lib/helpers/load'; +import { queries, queryParamToMap } from '$lib/components/filters'; import { Dependencies, PAGE_LIMIT } from '$lib/constants'; +import { getLimit, getPage, getQuery, getSearch, pageToOffset } from '$lib/helpers/load'; +import { sdk } from '$lib/stores/sdk'; +import { Query, type Models } from '@appwrite.io/console'; import type { PageLoad } from './$types'; -import { queryParamToMap, queries } from '$lib/components/filters'; export const load: PageLoad = async ({ params, url, route, depends }) => { depends(Dependencies.USER_TARGETS); @@ -42,7 +42,7 @@ export const load: PageLoad = async ({ params, url, route, depends }) => { payload ); - const promisesById: Record> = {}; + const promisesById: Record> = {}; targets.targets.forEach((target) => { if (target.providerId && !promisesById[target.providerId]) { promisesById[target.providerId] = sdk.forProject.client.call( diff --git a/src/routes/console/project-[project]/messaging/+page.ts b/src/routes/console/project-[project]/messaging/+page.ts index 683b4a8b17..acf2ff7258 100644 --- a/src/routes/console/project-[project]/messaging/+page.ts +++ b/src/routes/console/project-[project]/messaging/+page.ts @@ -1,3 +1,5 @@ +import { queries, queryParamToMap } from '$lib/components/filters'; +import { CARD_LIMIT } from '$lib/constants'; import { View, getLimit, @@ -7,11 +9,9 @@ import { getView, pageToOffset } from '$lib/helpers/load'; -import { CARD_LIMIT } from '$lib/constants'; -import type { PageLoad } from './$types'; -import { Query, type Models } from '@appwrite.io/console'; import { sdk } from '$lib/stores/sdk'; -import { queries, queryParamToMap } from '$lib/components/filters'; +import { Query, type Models } from '@appwrite.io/console'; +import type { PageLoad } from './$types'; export const load: PageLoad = async ({ url, route }) => { const page = getPage(url); @@ -26,7 +26,10 @@ export const load: PageLoad = async ({ url, route }) => { // TODO: remove when the API is ready with data // This allows us to mock w/ data and when search returns 0 results - let messages: { messages: Models.Message[]; total: number } = { messages: [], total: 0 }; + let messages: { + messages: ({ data: Record } & Models.Message)[]; + total: number; + } = { messages: [], total: 0 }; const params = { queries: [ Query.limit(limit), 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 3db50213c1..20dfb2905b 100644 --- a/src/routes/console/project-[project]/messaging/message-[message]/+page.svelte +++ b/src/routes/console/project-[project]/messaging/message-[message]/+page.svelte @@ -18,10 +18,14 @@ import { wizard } from '$lib/stores/wizard'; import Wizard from '../wizard.svelte'; import type { PageData } from './$types'; + import { isValueOfStringEnum } from '$lib/helpers/types'; export let data: PageData; async function onEdit() { + if (!isValueOfStringEnum(ProviderTypes, $message.providerType)) { + throw new Error(`Invalid provider type: ${$message.providerType}`); + } $operation = 'update'; $providerType = $message.providerType; $topicsById = {}; @@ -35,7 +39,6 @@ topics: $message.topics, users: $message.users, targets: $message.targets, - description: $message.description, status: MessageStatuses.DRAFT, scheduledAt: $message.scheduledAt }; 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 53e85bf58c..c6d5e051d7 100644 --- a/src/routes/console/project-[project]/messaging/message-[message]/emailPreview.svelte +++ b/src/routes/console/project-[project]/messaging/message-[message]/emailPreview.svelte @@ -3,7 +3,7 @@ import { Button, FormList, InputText, InputTextarea } from '$lib/elements/forms'; import type { Models } from '@appwrite.io/console'; - export let message: Models.Message & { data: Record; }; + export let message: Models.Message & { data: Record }; export let onEdit: () => void = null; 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 067ea20039..956bdc8de2 100644 --- a/src/routes/console/project-[project]/messaging/message-[message]/pushPreview.svelte +++ b/src/routes/console/project-[project]/messaging/message-[message]/pushPreview.svelte @@ -4,7 +4,7 @@ import type { Models } from '@appwrite.io/console'; import PushPhone from '../pushPhone.svelte'; - export let message: Models.Message & { data: Record; }; + export let message: Models.Message & { data: Record }; export let onEdit: () => void = null; 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 b6458a55c4..8e6e772bb4 100644 --- a/src/routes/console/project-[project]/messaging/message-[message]/smsPreview.svelte +++ b/src/routes/console/project-[project]/messaging/message-[message]/smsPreview.svelte @@ -4,7 +4,7 @@ import type { Models } from '@appwrite.io/console'; import SMSPhone from '../smsPhone.svelte'; - export let message: Models.Message & { data: Record; }; + export let message: Models.Message & { data: Record }; export let onEdit: () => void = null; diff --git a/src/routes/console/project-[project]/messaging/message-[message]/store.ts b/src/routes/console/project-[project]/messaging/message-[message]/store.ts index 2c15e9dd95..6cbce74b94 100644 --- a/src/routes/console/project-[project]/messaging/message-[message]/store.ts +++ b/src/routes/console/project-[project]/messaging/message-[message]/store.ts @@ -2,4 +2,7 @@ import { derived } from 'svelte/store'; import { page } from '$app/stores'; import type { Models } from '@appwrite.io/console'; -export const message = derived(page, ($page) => $page.data.message as Models.Message); +export const message = derived( + page, + ($page) => $page.data.message as Models.Message & { data: Record } +); diff --git a/src/routes/console/project-[project]/messaging/providerType.svelte b/src/routes/console/project-[project]/messaging/providerType.svelte index 8d70392d93..6d5ed9ebc6 100644 --- a/src/routes/console/project-[project]/messaging/providerType.svelte +++ b/src/routes/console/project-[project]/messaging/providerType.svelte @@ -7,7 +7,7 @@ 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 index e6ef74f4e1..d4134dc73b 100644 --- a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateStatus.svelte +++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateStatus.svelte @@ -1,19 +1,20 @@
- diff --git a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/updateDescription.svelte b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/updateDescription.svelte deleted file mode 100644 index 137e7944c1..0000000000 --- a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/updateDescription.svelte +++ /dev/null @@ -1,65 +0,0 @@ - - -
- - Description - - -
    - -
-
- - - - -
-
diff --git a/src/routes/console/project-[project]/messaging/wizard.svelte b/src/routes/console/project-[project]/messaging/wizard.svelte index 61956df099..51dda10650 100644 --- a/src/routes/console/project-[project]/messaging/wizard.svelte +++ b/src/routes/console/project-[project]/messaging/wizard.svelte @@ -81,29 +81,33 @@ ); break; case ProviderTypes.Push: - const customData: Record = {}; - const { data } = $messageParams[ProviderTypes.Push]; - if (data && data.length > 0) { - data.forEach((item) => { - if (item[0] === '') return; - customData[item[0]] = item[1]; - }); - } - - response = await sdk.forProject.client.call( - 'POST', - new URL(sdk.forProject.client.config.endpoint + '/messaging/messages/push'), - { - 'X-Appwrite-Project': sdk.forProject.client.config.project, - 'content-type': 'application/json', - 'X-Appwrite-Mode': 'admin' - }, - { - ...payload, - data: customData, - messageId + { + const customData: Record = {}; + const { data } = $messageParams[ProviderTypes.Push]; + if (data && data.length > 0) { + data.forEach((item) => { + if (item[0] === '') return; + customData[item[0]] = item[1]; + }); } - ); + + response = await sdk.forProject.client.call( + 'POST', + new URL( + sdk.forProject.client.config.endpoint + '/messaging/messages/push' + ), + { + 'X-Appwrite-Project': sdk.forProject.client.config.project, + 'content-type': 'application/json', + 'X-Appwrite-Mode': 'admin' + }, + { + ...payload, + data: customData, + messageId + } + ); + } break; } wizard.hide(); @@ -198,31 +202,33 @@ ); break; case ProviderTypes.Push: - const customData: Record = {}; - const { data } = $messageParams[ProviderTypes.Push]; - if (data && data.length > 0) { - data.forEach((item) => { - if (item[0] === '') return; - customData[item[0]] = item[1]; - }); - } - - response = await sdk.forProject.client.call( - 'PATCH', - new URL( - `${sdk.forProject.client.config.endpoint}/messaging/messages/push/${messageId}` - ), - { - 'X-Appwrite-Project': sdk.forProject.client.config.project, - 'content-type': 'application/json', - 'X-Appwrite-Mode': 'admin' - }, - { - ...payload, - data: customData, - messageId + { + const customData: Record = {}; + const { data } = $messageParams[ProviderTypes.Push]; + if (data && data.length > 0) { + data.forEach((item) => { + if (item[0] === '') return; + customData[item[0]] = item[1]; + }); } - ); + + response = await sdk.forProject.client.call( + 'PATCH', + new URL( + `${sdk.forProject.client.config.endpoint}/messaging/messages/push/${messageId}` + ), + { + 'X-Appwrite-Project': sdk.forProject.client.config.project, + 'content-type': 'application/json', + 'X-Appwrite-Mode': 'admin' + }, + { + ...payload, + data: customData, + messageId + } + ); + } break; } wizard.hide(); diff --git a/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte b/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte index 50a3d47344..4b17e43e19 100644 --- a/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte +++ b/src/routes/console/project-[project]/messaging/wizard/emailFormList.svelte @@ -52,7 +52,6 @@ createEmailMessage({ topics: $messageParams[ProviderTypes.Email]?.topics || [], targets: $messageParams[ProviderTypes.Email]?.targets || [], - description: $messageParams[ProviderTypes.Email]?.description || 'Test message', status: MessageStatuses.PROCESSING, messageId: ID.unique(), // TODO: properly handle the test email address @@ -126,13 +125,6 @@ Enable the HTML mode if your message contains HTML tags. - - {#if $operation === 'create'} {#if !showCustomId}
diff --git a/src/routes/console/project-[project]/messaging/wizard/pushFormList.svelte b/src/routes/console/project-[project]/messaging/wizard/pushFormList.svelte index 452d204140..8102bd3338 100644 --- a/src/routes/console/project-[project]/messaging/wizard/pushFormList.svelte +++ b/src/routes/console/project-[project]/messaging/wizard/pushFormList.svelte @@ -86,7 +86,6 @@ createPushMessage({ topics: $messageParams[ProviderTypes.Push]?.topics || [], targets: $messageParams[ProviderTypes.Push]?.targets || [], - description: $messageParams[ProviderTypes.Push]?.description || 'Test push', status: MessageStatuses.PROCESSING, messageId: ID.unique(), // TODO: properly handle the test email address @@ -224,13 +223,6 @@
- - {#if $operation === 'create'} {#if !showCustomId}
diff --git a/src/routes/console/project-[project]/messaging/wizard/smsFormList.svelte b/src/routes/console/project-[project]/messaging/wizard/smsFormList.svelte index 946558e536..fdd60d4690 100644 --- a/src/routes/console/project-[project]/messaging/wizard/smsFormList.svelte +++ b/src/routes/console/project-[project]/messaging/wizard/smsFormList.svelte @@ -23,14 +23,7 @@ MessageStatuses, operation } from './store'; - import { - Button, - FormList, - InputEmail, - InputRadio, - InputText, - InputTextarea - } from '$lib/elements/forms'; + import { Button, FormList, InputEmail, InputRadio, InputTextarea } from '$lib/elements/forms'; import { Pill } from '$lib/elements'; import { CustomId, Modal } from '$lib/components'; import { user } from '$lib/stores/user'; @@ -51,7 +44,6 @@ createSMSMessage({ topics: $messageParams[ProviderTypes.Email]?.topics || [], targets: $messageParams[ProviderTypes.Email]?.targets || [], - description: $messageParams[ProviderTypes.Email]?.description || 'Test message', status: MessageStatuses.PROCESSING, messageId: ID.unique(), // TODO: properly handle the test email address @@ -115,13 +107,6 @@
- - {#if $operation === 'create'} {#if !showCustomId}
diff --git a/src/routes/console/project-[project]/messaging/wizard/step3.svelte b/src/routes/console/project-[project]/messaging/wizard/step3.svelte index f23390bea6..d7499bff31 100644 --- a/src/routes/console/project-[project]/messaging/wizard/step3.svelte +++ b/src/routes/console/project-[project]/messaging/wizard/step3.svelte @@ -100,4 +100,3 @@ --> - diff --git a/src/routes/console/project-[project]/messaging/wizard/store.ts b/src/routes/console/project-[project]/messaging/wizard/store.ts index 0af938e70b..f651df27d8 100644 --- a/src/routes/console/project-[project]/messaging/wizard/store.ts +++ b/src/routes/console/project-[project]/messaging/wizard/store.ts @@ -1,6 +1,6 @@ import type { Models } from '@appwrite.io/console'; -import { ProviderTypes } from '../providerType.svelte'; import { writable } from 'svelte/store'; +import { ProviderTypes } from '../providerType.svelte'; export enum MessageStatuses { DRAFT = 'draft', @@ -15,7 +15,6 @@ export type MessageParams = { topics: string[]; users: string[]; targets: string[]; - description: string; status: MessageStatuses; scheduledAt?: string; };