diff --git a/package-lock.json b/package-lock.json index bc4a0b358..3cb51c8c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "@appwrite/console", "dependencies": { - "@appwrite.io/console": "^0.6.0-rc.12", + "@appwrite.io/console": "^0.6.0-rc.13", "@appwrite.io/pink": "0.4.0", "@appwrite.io/pink-icons": "0.4.0", "@popperjs/core": "^2.11.8", @@ -158,9 +158,9 @@ "integrity": "sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==" }, "node_modules/@appwrite.io/console": { - "version": "0.6.0-rc.12", - "resolved": "https://registry.npmjs.org/@appwrite.io/console/-/console-0.6.0-rc.12.tgz", - "integrity": "sha512-pDov75TCkBmJdUPrWuzRW7uM28HYqiMFtVFrUoavDd/lMPBS7RnPXL4sBHsGY8AUldHE3oBcGVPkNoQfEAgLlw==", + "version": "0.6.0-rc.13", + "resolved": "https://registry.npmjs.org/@appwrite.io/console/-/console-0.6.0-rc.13.tgz", + "integrity": "sha512-/c+HGkqdqWjjlzVgOmC6vb4t2jsHgbmX/aaDLoQHXFmaakEDWzK1cgVYRHoU3o14xIEpBupteh3KzOoqdLvvsQ==", "dependencies": { "cross-fetch": "3.1.5", "isomorphic-form-data": "2.0.0" diff --git a/package.json b/package.json index 0d826dea2..07f589ab2 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "e2e": "playwright test tests/e2e" }, "dependencies": { - "@appwrite.io/console": "^0.6.0-rc.12", + "@appwrite.io/console": "^0.6.0-rc.13", "@appwrite.io/pink": "0.4.0", "@appwrite.io/pink-icons": "0.4.0", "@popperjs/core": "^2.11.8", diff --git a/src/hooks.client.ts b/src/hooks.client.ts new file mode 100644 index 000000000..2345ffb2c --- /dev/null +++ b/src/hooks.client.ts @@ -0,0 +1,13 @@ +import { AppwriteException } from '@appwrite.io/console'; +import type { HandleClientError } from '@sveltejs/kit'; + +export const handleError: HandleClientError = async ({ error, message, status }) => { + if (error instanceof AppwriteException && error.code === 0) { + status = undefined; + message = error.message; + } + return { + message, + status + }; +}; diff --git a/src/lib/components/clickableListItem.svelte b/src/lib/components/clickableListItem.svelte index 78a4dbe08..03e6c294b 100644 --- a/src/lib/components/clickableListItem.svelte +++ b/src/lib/components/clickableListItem.svelte @@ -1,18 +1,39 @@
  • - - {#if $$slots.default} -
    - -
    - {/if} - {#if $$slots.desc} -
    -

    -
    - {/if} -
    + {#if href} + + {#if $$slots.default} +
    + +
    + {/if} + {#if $$slots.desc} +
    +

    +
    + {/if} +
    + {:else} + + {/if}
  • diff --git a/src/lib/components/collapsibleItem.svelte b/src/lib/components/collapsibleItem.svelte index 8397454dc..736f2fe21 100644 --- a/src/lib/components/collapsibleItem.svelte +++ b/src/lib/components/collapsibleItem.svelte @@ -6,7 +6,7 @@
  • -
    +
    -
    {#if column && operator && !operator?.hideInput} -
    +
      {#if column.type === 'integer' || column.type === 'double'} {:else if column.type === 'boolean'} @@ -150,7 +150,7 @@ {:else} {/if} -
    + {/if} diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index 4b3f68520..3919a26c3 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -13,9 +13,10 @@ export const ssr = false; export const load: LayoutLoad = async ({ depends, url }) => { depends(Dependencies.ACCOUNT); - redirectTo.set(url.searchParams.get('forceRedirect') || null); - - url.searchParams.delete('forceRedirect'); + if (url.searchParams.has('forceRedirect')) { + redirectTo.set(url.searchParams.get('forceRedirect') || null); + url.searchParams.delete('forceRedirect'); + } try { const account = await sdk.forConsole.account.get<{ organization?: string }>(); diff --git a/src/routes/console/+error.svelte b/src/routes/console/+error.svelte index 9a50e9be7..33d7695d1 100644 --- a/src/routes/console/+error.svelte +++ b/src/routes/console/+error.svelte @@ -6,7 +6,7 @@ - {$page.status} + {$page.error.status || 'Invalid Argument'} {$page.error.message} diff --git a/src/routes/console/organization-[organization]/+layout.ts b/src/routes/console/organization-[organization]/+layout.ts index cfd212057..79eba27f3 100644 --- a/src/routes/console/organization-[organization]/+layout.ts +++ b/src/routes/console/organization-[organization]/+layout.ts @@ -10,6 +10,7 @@ import { headerAlert } from '$lib/stores/headerAlert'; import ProjectsAtRisk from '$lib/components/billing/alerts/projectsAtRisk.svelte'; import { get } from 'svelte/store'; import { preferences } from '$lib/stores/preferences'; +import type { Organization } from '$lib/stores/organization'; export const load: LayoutLoad = async ({ params, depends }) => { depends(Dependencies.ORGANIZATION); @@ -37,7 +38,9 @@ export const load: LayoutLoad = async ({ params, depends }) => { return { header: Header, breadcrumbs: Breadcrumbs, - organization: await sdk.forConsole.teams.get(params.organization), + organization: await (sdk.forConsole.teams.get( + params.organization + ) as Promise), members: await sdk.forConsole.teams.listMemberships(params.organization) }; } catch (e) { diff --git a/src/routes/console/organization-[organization]/createMember.svelte b/src/routes/console/organization-[organization]/createMember.svelte index 338d08a3b..a0c4ff0dc 100644 --- a/src/routes/console/organization-[organization]/createMember.svelte +++ b/src/routes/console/organization-[organization]/createMember.svelte @@ -57,7 +57,7 @@ } - + {#if isCloud} {#if $organization?.billingPlan === BillingPlan.SCALE} diff --git a/src/routes/console/project-[project]/+error.svelte b/src/routes/console/project-[project]/+error.svelte index 243be6e42..be0053176 100644 --- a/src/routes/console/project-[project]/+error.svelte +++ b/src/routes/console/project-[project]/+error.svelte @@ -5,6 +5,6 @@ - {$page.status} + {$page.error.status || 'Invalid Argument'}

    {$page.error.message}

    diff --git a/src/routes/console/project-[project]/+layout.ts b/src/routes/console/project-[project]/+layout.ts index c25d0cd4c..156a24f34 100644 --- a/src/routes/console/project-[project]/+layout.ts +++ b/src/routes/console/project-[project]/+layout.ts @@ -5,6 +5,7 @@ import type { LayoutLoad } from './$types'; import { preferences } from '$lib/stores/preferences'; import { failedInvoice } from '$lib/stores/billing'; import { isCloud } from '$lib/system'; +import type { Organization } from '$lib/stores/organization'; export const load: LayoutLoad = async ({ params, depends }) => { depends(Dependencies.PROJECT); @@ -22,7 +23,7 @@ export const load: LayoutLoad = async ({ params, depends }) => { return { project, - organization: await sdk.forConsole.teams.get(project.teamId) + organization: await (sdk.forConsole.teams.get(project.teamId) as Promise) }; } catch (e) { error(e.code, e.message); diff --git a/src/routes/console/project-[project]/messaging/message-[message]/overview.svelte b/src/routes/console/project-[project]/messaging/message-[message]/overview.svelte index 54d4cec07..b9c95e2d8 100644 --- a/src/routes/console/project-[project]/messaging/message-[message]/overview.svelte +++ b/src/routes/console/project-[project]/messaging/message-[message]/overview.svelte @@ -32,7 +32,7 @@ } - +
    {providerType} @@ -51,15 +51,13 @@ - {#if $message.status === 'failed'} - - {/if} + diff --git a/src/routes/console/project-[project]/messaging/providers/create.svelte b/src/routes/console/project-[project]/messaging/providers/create.svelte index ce695d28e..53cdf91a4 100644 --- a/src/routes/console/project-[project]/messaging/providers/create.svelte +++ b/src/routes/console/project-[project]/messaging/providers/create.svelte @@ -129,6 +129,7 @@ $providerParams[$provider].authKeyId, $providerParams[$provider].teamId, $providerParams[$provider].bundleId, + $providerParams[$provider].sandbox, $providerParams[$provider].enabled ); break; 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 index d52288fff..93991d10e 100644 --- a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateName.svelte +++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateName.svelte @@ -69,13 +69,13 @@ ); break; case Providers.FCM: - response = await sdk.forProject.messaging.updateFCMProvider( + response = await sdk.forProject.messaging.updateFcmProvider( providerId, providerName ); break; case Providers.APNS: - response = await sdk.forProject.messaging.updateAPNSProvider( + response = await sdk.forProject.messaging.updateApnsProvider( providerId, providerName ); diff --git a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateSettings.svelte b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateSettings.svelte index 8d0d0c26c..fb806d134 100644 --- a/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateSettings.svelte +++ b/src/routes/console/project-[project]/messaging/providers/provider-[provider]/updateSettings.svelte @@ -160,7 +160,7 @@ ); break; case Providers.FCM: - response = await sdk.forProject.messaging.updateFCMProvider( + response = await sdk.forProject.messaging.updateFcmProvider( providerId, undefined, undefined, @@ -168,7 +168,7 @@ ); break; case Providers.APNS: - response = await sdk.forProject.messaging.updateAPNSProvider( + response = await sdk.forProject.messaging.updateApnsProvider( providerId, undefined, undefined, 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 ad9ff746c..6e62a27fc 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 @@ -94,14 +94,14 @@ ); break; case Providers.FCM: - response = await sdk.forProject.messaging.updateFCMProvider( + response = await sdk.forProject.messaging.updateFcmProvider( providerId, undefined, enabled ); break; case Providers.APNS: - response = await sdk.forProject.messaging.updateAPNSProvider( + response = await sdk.forProject.messaging.updateApnsProvider( providerId, undefined, enabled diff --git a/src/routes/console/project-[project]/messaging/providers/store.ts b/src/routes/console/project-[project]/messaging/providers/store.ts index 6e12e1f01..aff9dbc5a 100644 --- a/src/routes/console/project-[project]/messaging/providers/store.ts +++ b/src/routes/console/project-[project]/messaging/providers/store.ts @@ -1,7 +1,7 @@ import type { Column } from '$lib/helpers/types'; import { writable } from 'svelte/store'; import { Providers } from '../provider.svelte'; -import { MessagingProviderType, Encryption } from '@appwrite.io/console'; +import { MessagingProviderType, SmtpEncryption } from '@appwrite.io/console'; export const columns = writable([ { id: '$id', title: 'Provider ID', type: 'string', show: true }, @@ -162,6 +162,12 @@ export const providers: ProvidersMap = { }, alt: 'Screenshot of where to download the Authentication Key in the Apple Developer Member Center' } + }, + { + label: 'Sandbox', + name: 'sandbox', + type: 'switch', + description: 'Use the development APNS server.' } ] } @@ -348,9 +354,9 @@ export const providers: ProvidersMap = { name: 'encryption', type: 'select', options: [ - { label: 'None', value: Encryption.None }, - { label: 'SSL', value: Encryption.Ssl }, - { label: 'TLS', value: Encryption.Tls } + { label: 'None', value: SmtpEncryption.None }, + { label: 'SSL', value: SmtpEncryption.Ssl }, + { label: 'TLS', value: SmtpEncryption.Tls } ] }, { @@ -559,7 +565,6 @@ type ProviderParams = { /** * SMS providers */ - export type TwilioProviderParams = ProviderParams & { accountSid: string; authToken: string; @@ -593,7 +598,6 @@ export type VonageProviderParams = ProviderParams & { /** * Email providers */ - export type MailgunProviderParams = ProviderParams & { fromEmail: string; fromName: string; @@ -621,7 +625,7 @@ export type SMTPProviderParams = ProviderParams & { port: number; username: string; password: string; - encryption: Encryption; + encryption: SmtpEncryption; autoTLS: boolean; mailer: string; }; @@ -629,7 +633,6 @@ export type SMTPProviderParams = ProviderParams & { /** * Push providers */ - export type FCMProviderParams = ProviderParams & { serviceAccountJSON: string; }; @@ -639,6 +642,7 @@ export type APNSProviderParams = ProviderParams & { authKeyId: string; teamId: string; bundleId: string; + sandbox: boolean; }; export type MQTTProviderParams = ProviderParams & { diff --git a/src/routes/console/project-[project]/messaging/providers/wizard/provider.svelte b/src/routes/console/project-[project]/messaging/providers/wizard/provider.svelte index 90650fe50..ec43fac46 100644 --- a/src/routes/console/project-[project]/messaging/providers/wizard/provider.svelte +++ b/src/routes/console/project-[project]/messaging/providers/wizard/provider.svelte @@ -6,7 +6,7 @@ import { FormList, InputText } from '$lib/elements/forms'; import { Pill } from '$lib/elements'; import { Providers } from '../../provider.svelte'; - import { Encryption } from '@appwrite.io/console'; + import { SmtpEncryption } from '@appwrite.io/console'; let name = ''; let showCustomId = false; @@ -100,7 +100,7 @@ username: '', password: '', autoTLS: true, - encryption: Encryption.Tls, + encryption: SmtpEncryption.Tls, mailer: '', fromEmail: '', fromName: '', @@ -124,7 +124,8 @@ authKey: '', authKeyId: '', teamId: '', - bundleId: '' + bundleId: '', + sandbox: false }; break; } diff --git a/src/routes/console/project-[project]/messaging/providers/wizard/settings.svelte b/src/routes/console/project-[project]/messaging/providers/wizard/settings.svelte index 0ecd205ec..57908ad4b 100644 --- a/src/routes/console/project-[project]/messaging/providers/wizard/settings.svelte +++ b/src/routes/console/project-[project]/messaging/providers/wizard/settings.svelte @@ -4,17 +4,21 @@ import { providers } from '../store'; import { providerType, provider, providerParams } from './store'; import SettingsFormList from '../settingsFormList.svelte'; - import { Table, TableBody, TableCell, TableRowButton, TableRowLink } from '$lib/elements/table'; import { newMemberModal } from '$lib/stores/organization'; import CreateMember from '$routes/console/organization-[organization]/createMember.svelte'; - import Collapsible from '$lib/components/collapsible.svelte'; - import CollapsibleItem from '$lib/components/collapsibleItem.svelte'; import Provider from '../../provider.svelte'; import { MessagingProviderType } from '@appwrite.io/console'; import ProviderTypeComponent from '$routes/console/project-[project]/messaging/providerType.svelte'; + import { + Collapsible, + CollapsibleItem, + ClickableList, + ClickableListItem + } from '$lib/components'; let files: Record = {}; const inputs = providers[$providerType].providers[$provider].configure; + let open = false; onMount(() => { for (const input of inputs) { @@ -55,81 +59,115 @@

    Need a hand?

    - {#if providers[$providerType].providers[$provider].needAHand} - {@const needAHand = providers[$providerType].providers[$provider].needAHand} -
    - - - -
    -
    -
    diff --git a/src/routes/console/project-[project]/messaging/providers/wizard/store.ts b/src/routes/console/project-[project]/messaging/providers/wizard/store.ts index d384e401f..41741b3ce 100644 --- a/src/routes/console/project-[project]/messaging/providers/wizard/store.ts +++ b/src/routes/console/project-[project]/messaging/providers/wizard/store.ts @@ -2,16 +2,16 @@ import type { MessagingProviderType } from '@appwrite.io/console'; import { writable } from 'svelte/store'; import type { Providers } from '../../provider.svelte'; import type { - TwilioProviderParams, + APNSProviderParams, + FCMProviderParams, + MailgunProviderParams, Msg91ProviderParams, + SMTPProviderParams, + SendgridProviderParams, TelesignProviderParams, TextmagicProviderParams, - VonageProviderParams, - MailgunProviderParams, - SendgridProviderParams, - SMTPProviderParams, - FCMProviderParams, - APNSProviderParams + TwilioProviderParams, + VonageProviderParams } from '../store'; export const providerType = writable(null); diff --git a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.svelte b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.svelte index 08d6fd58a..c5c308a5e 100644 --- a/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.svelte +++ b/src/routes/console/project-[project]/messaging/topics/topic-[topic]/subscribers/+page.svelte @@ -46,9 +46,14 @@ const targetIds = Object.keys($targetsById).filter( (targetId) => !(targetId in subscribersByTargetId) ); - const promises = targetIds.map((targetId) => - sdk.forProject.messaging.createSubscriber($page.params.topic, ID.unique(), targetId) - ); + const promises = targetIds.map(async (targetId) => { + const subscriber = await sdk.forProject.messaging.createSubscriber( + $page.params.topic, + ID.unique(), + targetId + ); + subscribersByTargetId[targetId] = subscriber; + }); try { await Promise.all(promises); diff --git a/src/routes/console/project-[project]/messaging/topicsModal.svelte b/src/routes/console/project-[project]/messaging/topicsModal.svelte index 95a03b79c..377b5d1bd 100644 --- a/src/routes/console/project-[project]/messaging/topicsModal.svelte +++ b/src/routes/console/project-[project]/messaging/topicsModal.svelte @@ -121,7 +121,7 @@ - ({getTotal(topic)} subscribers) + ({getTotal(topic)} targets)
    diff --git a/src/routes/console/project-[project]/settings/usage/[[invoice]]/+page.ts b/src/routes/console/project-[project]/settings/usage/[[invoice]]/+page.ts index d29b1e799..2cb455ae0 100644 --- a/src/routes/console/project-[project]/settings/usage/[[invoice]]/+page.ts +++ b/src/routes/console/project-[project]/settings/usage/[[invoice]]/+page.ts @@ -1,24 +1,22 @@ +import type { Aggregation, Invoice } from '$lib/sdk/billing'; +import { accumulateUsage } from '$lib/sdk/usage'; import { getSdkForProject, sdk } from '$lib/stores/sdk'; import { Query } from '@appwrite.io/console'; import type { PageLoad } from './$types'; -import type { Organization } from '$lib/stores/organization'; -import type { Aggregation, Invoice } from '$lib/sdk/billing'; -import { accumulateUsage } from '$lib/sdk/usage'; export const load: PageLoad = async ({ params, parent }) => { const { invoice, project } = params; - const parentData = await parent(); - const org = parentData.organization as Organization; + const { organization } = await parent(); - let startDate: string = org.billingCurrentInvoiceDate; - let endDate: string = org.billingNextInvoiceDate; + let startDate: string = organization.billingCurrentInvoiceDate; + let endDate: string = organization.billingNextInvoiceDate; let currentInvoice: Invoice = undefined; let currentAggregation: Aggregation = undefined; if (invoice) { - currentInvoice = await sdk.forConsole.billing.getInvoice(org.$id, invoice); + currentInvoice = await sdk.forConsole.billing.getInvoice(organization.$id, invoice); currentAggregation = await sdk.forConsole.billing.getAggregation( - org.$id, + organization.$id, currentInvoice.aggregationId ); @@ -27,7 +25,7 @@ export const load: PageLoad = async ({ params, parent }) => { } const [invoices, usage] = await Promise.all([ - sdk.forConsole.billing.listInvoices(org.$id, [Query.orderDesc('from')]), + sdk.forConsole.billing.listInvoices(organization.$id, [Query.orderDesc('from')]), /** * Workaround because project id might not be populated yet. */ diff --git a/src/routes/login/+page.svelte b/src/routes/login/+page.svelte index 4d49845ae..e60e5811b 100644 --- a/src/routes/login/+page.svelte +++ b/src/routes/login/+page.svelte @@ -75,7 +75,6 @@ OAuthProvider.Github, window.location.origin + url, window.location.origin, - undefined, ['read:user', 'user:email'] ); } diff --git a/src/routes/mfa/+page.svelte b/src/routes/mfa/+page.svelte index 1e804f5d4..eedc50900 100644 --- a/src/routes/mfa/+page.svelte +++ b/src/routes/mfa/+page.svelte @@ -16,7 +16,7 @@ async function verify() { try { disabled = true; - const challenge = await sdk.forConsole.account.create2FAChallenge( + const challenge = await sdk.forConsole.account.createChallenge( AuthenticationFactor.Totp ); await sdk.forConsole.account.updateChallenge(challenge.$id, code); diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte index 5344cea31..ccc179174 100644 --- a/src/routes/register/+page.svelte +++ b/src/routes/register/+page.svelte @@ -64,7 +64,6 @@ OAuthProvider.Github, window.location.origin, window.location.origin, - undefined, ['read:user', 'user:email'] ); }