diff --git a/src/routes/(console)/project-[region]-[project]/auth/templates/emailVerificationTemplate.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/emailVerificationTemplate.svelte
index 0bc34c9b6..1c3a8e547 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/templates/emailVerificationTemplate.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/templates/emailVerificationTemplate.svelte
@@ -9,14 +9,15 @@
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
import { Layout, Card } from '@appwrite.io/pink-svelte';
- const projectId = page.params.project;
+ export let loading = false;
let locale = 'en';
- let loading = false;
+ let isUpdating = false;
+ const projectId = page.params.project;
async function onLocaleChange() {
const timeout = setTimeout(() => {
- loading = true;
+ isUpdating = true;
}, 1000);
try {
const template = await loadEmailTemplate(projectId, 'verification', locale);
@@ -31,7 +32,7 @@
});
} finally {
clearTimeout(timeout);
- loading = false;
+ isUpdating = false;
}
}
@@ -39,7 +40,7 @@
-
+
{'{{user}}'}
{'{{project}}'}
{'{{redirect}}'}
diff --git a/src/routes/(console)/project-[region]-[project]/auth/templates/store.ts b/src/routes/(console)/project-[region]-[project]/auth/templates/store.ts
index 3ddf494d3..4173fd0b7 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/templates/store.ts
+++ b/src/routes/(console)/project-[region]-[project]/auth/templates/store.ts
@@ -1,6 +1,14 @@
import { page } from '$app/stores';
-import type { Models } from '@appwrite.io/console';
import { derived, writable } from 'svelte/store';
+import type { Models } from '@appwrite.io/console';
+
+// component imports
+import Email2FaTemplate from './email2FATemplate.svelte';
+import EmailInviteTemplate from './emailInviteTemplate.svelte';
+import EmailRecoveryTemplate from './emailRecoveryTemplate.svelte';
+import EmailMagicUrlTemplate from './emailMagicUrlTemplate.svelte';
+import EmailVerificationTemplate from './emailVerificationTemplate.svelte';
+import EmailSessionAlertTemplate from './emailSessionAlertTemplate.svelte';
export const localeCodes = derived(page, ($page) => $page.data.localeCodes as Models.LocaleCode[]);
@@ -29,8 +37,56 @@ export const smsTemplate = writable({
locale: null,
message: null
});
+
export const baseSmsTemplate = writable({
type: null,
locale: null,
message: null
});
+
+export const templates = [
+ {
+ key: 'verification',
+ title: 'Verification',
+ description:
+ 'Send a verification email to users that sign in with their email and password.',
+ component: EmailVerificationTemplate
+ },
+ {
+ key: 'magicSession',
+ title: 'Magic URL',
+ description: 'Send an email to users that sign in with a magic URL.',
+ component: EmailMagicUrlTemplate
+ },
+ {
+ key: 'otpSession',
+ title: 'OTP session',
+ description: 'Send an email to users that sign in with a email OTP.',
+ component: EmailMagicUrlTemplate
+ },
+ {
+ key: 'recovery',
+ title: 'Reset password',
+ description: 'Send a recovery email to users that forget their password.',
+ component: EmailRecoveryTemplate
+ },
+ {
+ key: 'invitation',
+ title: 'Invite user',
+ description: 'Send an invitation email to become a member of your project.',
+ component: EmailInviteTemplate
+ },
+ {
+ key: 'mfaChallenge',
+ title: '2FA verification',
+ description: 'Send a two-factor authentication email to a user.',
+ component: Email2FaTemplate
+ },
+ {
+ key: 'sessionAlert',
+ title: 'Session alert',
+ description: 'Send an email to users when a new session is created.',
+ component: EmailSessionAlertTemplate,
+ hideDivider: true
+ }
+];
diff --git a/src/routes/(console)/project-[region]-[project]/auth/templates/templateSkeleton.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/templateSkeleton.svelte
new file mode 100644
index 000000000..15e70c25a
--- /dev/null
+++ b/src/routes/(console)/project-[region]-[project]/auth/templates/templateSkeleton.svelte
@@ -0,0 +1,22 @@
+
+
+
+ {#each Array.from({ length: count }) as _}
+
+
+
+
+ {/each}
+
+ {#if textArea}
+
+
+
+
+ {/if}
+
diff --git a/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts
index 57ff9ed91..5c3b01d12 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts
@@ -2,15 +2,10 @@ import { isValueOfStringEnum } from '$lib/helpers/types';
import { sdk } from '$lib/stores/sdk';
import { UserUsageRange } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-import { error } from '@sveltejs/kit';
export const load: PageLoad = async ({ params }) => {
const period = isValueOfStringEnum(UserUsageRange, params.period)
? params.period
: UserUsageRange.ThirtyDays;
- try {
- return sdk.forProject(params.region, params.project).users.getUsage(period);
- } catch (e) {
- error(e.code, e.message);
- }
+ return sdk.forProject(params.region, params.project).users.getUsage(period);
};
diff --git a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.ts b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.ts
index 698ceaab5..4a712271d 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/+layout.ts
@@ -3,24 +3,19 @@ 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.USER);
- try {
- const [user, userFactors] = await Promise.all([
- sdk.forProject(params.region, params.project).users.get(params.user),
- sdk.forProject(params.region, params.project).users.listMfaFactors(params.user)
- ]);
+ const [user, userFactors] = await Promise.all([
+ sdk.forProject(params.region, params.project).users.get(params.user),
+ sdk.forProject(params.region, params.project).users.listMfaFactors(params.user)
+ ]);
- return {
- header: Header,
- breadcrumbs: Breadcrumbs,
- user,
- userFactors
- };
- } catch (e) {
- error(e.code, e.message);
- }
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs,
+ user,
+ userFactors
+ };
};
diff --git a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/dangerZone.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/dangerZone.svelte
index 97eda9f42..30ecb4d7a 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/dangerZone.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/dangerZone.svelte
@@ -1,11 +1,13 @@
@@ -15,10 +17,7 @@
import { writable } from 'svelte/store';
import DeleteUser from './deleteUser.svelte';
import { user } from './store';
- import { goto } from '$app/navigation';
- import { project } from '../../store';
import { toLocaleDate } from '$lib/helpers/date';
- import { base } from '$app/paths';
$: accessedAt = ($user as unknown as { accessedAt: string }).accessedAt;
diff --git a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/identities/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/identities/+page.svelte
index c1d02a90f..b87b1f3e3 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/identities/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/identities/+page.svelte
@@ -13,18 +13,23 @@
export let data;
const columns = writable([
- { id: '$id', title: 'Identity ID', type: 'string', width: 200 },
- { id: 'provider', title: 'Provider', type: 'string', width: 80 },
- { id: 'providerUid', title: 'Provider UID', type: 'string', hide: true, width: 80 },
- { id: 'providerEmail', title: 'Email', type: 'string', width: 80 },
+ { id: '$id', title: 'Identity ID', type: 'string', width: { min: 200 } },
+ { id: 'provider', title: 'Provider', type: 'string', width: { min: 80 } },
+ {
+ id: 'providerUid',
+ title: 'Provider UID',
+ type: 'string',
+ hide: true,
+ width: { min: 80 }
+ },
+ { id: 'providerEmail', title: 'Email', type: 'string', width: { min: 80 } },
{
id: 'providerAccessTokenExpiry',
title: 'Expiry Date',
- type: 'datetime',
- width: 60
+ type: 'datetime'
},
- { id: '$createdAt', title: 'Created', type: 'datetime', width: 80 },
- { id: '$updatedAt', title: 'Updated', type: 'datetime', hide: true, width: 80 }
+ { id: '$createdAt', title: 'Created', type: 'datetime', width: { min: 80 } },
+ { id: '$updatedAt', title: 'Updated', type: 'datetime', hide: true, width: { min: 80 } }
]);
diff --git a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/identities/table.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/identities/table.svelte
index fa8d43c06..e48b29b72 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/identities/table.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/identities/table.svelte
@@ -59,7 +59,7 @@
{/each}
{#each data.identities.identities as identity (identity.$id)}
-
+
{#each columns as column}
{#if column.id === '$id'}
diff --git a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/memberships/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/memberships/+page.svelte
index 13ca40706..ea18ea0ca 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/memberships/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/memberships/+page.svelte
@@ -15,6 +15,7 @@
let selectedMembership: Models.Membership;
let showDelete = false;
+ const region = page.params.region;
const project = page.params.project;
@@ -37,7 +38,7 @@
{#each data.memberships.memberships as membership}
+ href={`${base}/project-${region}-${project}/auth/teams/team-${membership.teamId}`}>
diff --git a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/table.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/table.svelte
index fcff7933c..88bb909a5 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/table.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/targets/table.svelte
@@ -98,7 +98,7 @@
- {selectedIds.length > 1 ? 'subscribers' : 'subscriber'}
+ {selectedIds.length > 1 ? 'targets' : 'target'}
selected
@@ -109,7 +109,7 @@
{/if}
-
+
Are you sure you want to delete {selectedIds.length}
{selectedIds.length > 1 ? 'targets' : 'target'}?
diff --git a/src/routes/(console)/project-[region]-[project]/databases/+page.ts b/src/routes/(console)/project-[region]-[project]/databases/+page.ts
index 6abcffdc5..35841ef15 100644
--- a/src/routes/(console)/project-[region]-[project]/databases/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/databases/+page.ts
@@ -28,7 +28,6 @@ export const load: PageLoad = async ({ url, route, depends, params, parent }) =>
search,
currentPlan
);
-
return {
offset,
limit,
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.ts
index b8eee5361..03283b967 100644
--- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.ts
@@ -1,6 +1,5 @@
import { sdk } from '$lib/stores/sdk';
import { Dependencies } from '$lib/constants';
-import { error } from '@sveltejs/kit';
import type { LayoutLoad } from './$types';
import Breadcrumbs from './breadcrumbs.svelte';
import Header from './header.svelte';
@@ -8,15 +7,9 @@ import Header from './header.svelte';
export const load: LayoutLoad = async ({ params, depends }) => {
depends(Dependencies.DATABASE);
- try {
- return {
- header: Header,
- breadcrumbs: Breadcrumbs,
- database: await sdk
- .forProject(params.region, params.project)
- .databases.get(params.database)
- };
- } catch (e) {
- error(e.code, e.message);
- }
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs,
+ database: await sdk.forProject(params.region, params.project).databases.get(params.database)
+ };
};
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+layout.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+layout.ts
index fb946c011..01b7a47ca 100644
--- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+layout.ts
@@ -3,30 +3,26 @@ import { Dependencies } from '$lib/constants';
import type { LayoutLoad } from './$types';
import Breadcrumbs from './breadcrumbs.svelte';
import Header from './header.svelte';
-import { error } from '@sveltejs/kit';
import SubNavigation from './subNavigation.svelte';
import { Query } from '@appwrite.io/console';
export const load: LayoutLoad = async ({ params, depends }) => {
depends(Dependencies.COLLECTION);
- try {
- const [collection, allCollections] = await Promise.all([
- sdk
- .forProject(params.region, params.project)
- .databases.getCollection(params.database, params.collection),
- sdk
- .forProject(params.region, params.project)
- .databases.listCollections(params.database, [Query.orderDesc(''), Query.limit(100)])
- ]);
- return {
- header: Header,
- breadcrumbs: Breadcrumbs,
- subNavigation: SubNavigation,
- collection,
- allCollections
- };
- } catch (e) {
- error(e.code, e.message);
- }
+ const [collection, allCollections] = await Promise.all([
+ sdk
+ .forProject(params.region, params.project)
+ .databases.getCollection(params.database, params.collection),
+ sdk
+ .forProject(params.region, params.project)
+ .databases.listCollections(params.database, [Query.orderDesc(''), Query.limit(100)])
+ ]);
+
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs,
+ subNavigation: SubNavigation,
+ collection,
+ allCollections
+ };
};
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte
index 98627a228..289cb6368 100644
--- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte
@@ -24,8 +24,7 @@
import { base } from '$app/paths';
import { IconPlus } from '@appwrite.io/pink-icons-svelte';
import type { Models } from '@appwrite.io/console';
- import { organization } from '$lib/stores/organization';
- import { APPWRITE_OFFICIALS_ORG, isCloud } from '$lib/system';
+ import { flags } from '$lib/flags';
export let data: PageData;
@@ -88,14 +87,6 @@
$isCsvImportInProgress = false;
}
}
-
- /**
- * Controls visibility of CSV Imports feature:
- * - Shown if running on self-hosted
- * - Shown on cloud only if the organization is Appwrite's.
- * - Hidden on cloud for any non-Appwrite organization.
- */
- $: showCsvImports = !isCloud || $organization.$id === APPWRITE_OFFICIALS_ORG;
{#key page.params.collection}
@@ -109,7 +100,7 @@
analyticsSource="database_documents" />
- {#if showCsvImports}
+ {#if flags.showCsvImport(data)}
{/if}
@@ -249,8 +246,7 @@ ${prefix}APPWRITE_PUBLIC_ENDPOINT = "${sdk.forProject(page.params.region, page.p
Create platformCreate platform
{/if}
{:else}
@@ -264,12 +260,12 @@ ${prefix}APPWRITE_PUBLIC_ENDPOINT = "${sdk.forProject(page.params.region, page.p
{selectedFramework.label}
- {
isChangingFramework = true;
- }}>Change
+ }}>Change
{/if}
@@ -338,15 +334,15 @@ ${prefix}APPWRITE_PUBLIC_ENDPOINT = "${sdk.forProject(page.params.region, page.p
color="--fgcolor-neutral-primary">
Demo app runs on http://localhost:{selectedFramework.portNumber}
-
Open
{/if}
@@ -394,10 +390,12 @@ ${prefix}APPWRITE_PUBLIC_ENDPOINT = "${sdk.forProject(page.params.region, page.p
{#if isPlatformCreated}
- Go to dashboard
+ disabled={isCreatingPlatform}>Go to dashboard
{/if}
diff --git a/src/routes/(console)/project-[region]-[project]/settings/changeOrganization.svelte b/src/routes/(console)/project-[region]-[project]/settings/changeOrganization.svelte
index 848b718db..eb3fb4a20 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/changeOrganization.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/changeOrganization.svelte
@@ -30,7 +30,7 @@
(showTransfer = true)}>Move
diff --git a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte
index 8d6d13661..f38c106d6 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte
@@ -2,29 +2,32 @@
import { goto } from '$app/navigation';
import { base } from '$app/paths';
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
- import { BoxAvatar, CardGrid } from '$lib/components';
+ import { BoxAvatar, Confirm, CardGrid } from '$lib/components';
import { Button, InputText } from '$lib/elements/forms';
import { toLocaleDateTime } from '$lib/helpers/date';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
import { isCloud } from '$lib/system';
- import Confirm from '$lib/components/confirm.svelte';
import { project, projectRegion } from '../store';
+ import { organization } from '$lib/stores/organization';
+ let error: string;
let showDelete = false;
let name: string = null;
- let error: string;
const handleDelete = async () => {
try {
- await sdk.forConsole.projects.delete($project.$id);
+ // send the project to correct region pool for deletion!
+ await sdk.forConsoleIn($project.region).projects.delete($project.$id);
showDelete = false;
addNotification({
type: 'success',
message: `${$project.name} has been deleted`
});
trackEvent(Submit.ProjectDelete);
- await goto(base);
+ await goto(`${base}/organization-${$organization.$id}`, {
+ replaceState: true
+ });
} catch (e) {
error = e.message;
trackError(e, Submit.ProjectDelete);
diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.svelte
index 781c68bb2..b9e50a3e8 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.svelte
@@ -52,7 +52,9 @@
await goto(routeBase);
await invalidate(Dependencies.DOMAINS);
} else {
- await goto(`${routeBase}/add-domain/verify-${domainName}?rule=${rule.$id}`);
+ await goto(
+ `${routeBase}/add-domain/verify-${domainName}?rule=${rule.$id}&domain=${domain.$id}`
+ );
await invalidate(Dependencies.DOMAINS);
}
} catch (error) {
diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.ts b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.ts
index a5408d22d..5226f40dc 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/+page.ts
@@ -4,7 +4,8 @@ import { RuleTrigger, RuleType } from '$lib/stores/sdk';
import { Dependencies } from '$lib/constants.js';
import { isCloud } from '$lib/system';
-export const load = async ({ depends, params }) => {
+export const load = async ({ depends, params, parent }) => {
+ const { organization } = await parent();
depends(Dependencies.DOMAINS);
const [rules, domains] = await Promise.all([
@@ -14,7 +15,9 @@ export const load = async ({ depends, params }) => {
Query.equal('type', RuleType.API),
Query.equal('trigger', RuleTrigger.MANUAL)
]),
- isCloud ? sdk.forConsole.domains.list() : Promise.resolve(null)
+ isCloud
+ ? sdk.forConsole.domains.list([Query.equal('teamId', organization.$id)])
+ : Promise.resolve(null)
]);
return {
diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte
index dc9946534..594c4f4e2 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte
@@ -21,23 +21,27 @@
import { base } from '$app/paths';
import { writable } from 'svelte/store';
import { isASubdomain } from '$lib/helpers/tlds';
- import { consoleVariables } from '$routes/(console)/store';
import NameserverTable from '$lib/components/domains/nameserverTable.svelte';
import RecordTable from '$lib/components/domains/recordTable.svelte';
+ import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
let { data } = $props();
const ruleId = page.url.searchParams.get('rule');
+ const domainId = page.url.searchParams.get('domain');
const isSubDomain = $derived.by(() => isASubdomain(page.params.domain));
let selectedTab = $state<'cname' | 'nameserver' | 'a' | 'aaaa'>('nameserver');
+
$effect(() => {
- if ($consoleVariables._APP_DOMAIN_TARGET_CNAME && isSubDomain) {
+ if ($regionalConsoleVariables._APP_DOMAIN_TARGET_CNAME && isSubDomain) {
selectedTab = 'cname';
- } else if ($consoleVariables._APP_DOMAIN_TARGET_A) {
+ } else if (!isCloud && $regionalConsoleVariables._APP_DOMAIN_TARGET_A) {
selectedTab = 'a';
- } else if ($consoleVariables._APP_DOMAIN_TARGET_AAAA) {
+ } else if (!isCloud && $regionalConsoleVariables._APP_DOMAIN_TARGET_AAAA) {
selectedTab = 'aaaa';
+ } else {
+ selectedTab = 'nameserver';
}
});
let verified = $state(false);
@@ -47,7 +51,8 @@
async function verify() {
const isNewDomain =
- data.domainsList.domains.findIndex((rule) => rule.domain === page.params.domain) === -1;
+ data.domainsList.domains.find((rule) => rule.domain === page.params.domain) ===
+ undefined;
try {
if (selectedTab !== 'nameserver') {
const ruleData = await sdk
@@ -59,7 +64,14 @@
$organization.$id,
page.params.domain
);
- verified = domainData.nameservers.toLocaleLowerCase() === 'appwrite';
+ verified = domainData.nameservers.toLowerCase() === 'appwrite';
+ } else if (!isNewDomain && isCloud) {
+ const domain = await sdk.forConsole.domains.updateNameservers(domainId);
+ verified = domain.nameservers.toLowerCase() === 'appwrite';
+ if (!verified)
+ throw new Error(
+ 'Domain verification failed. Please check your domain settings or try again later'
+ );
}
addNotification({
@@ -110,7 +122,7 @@
- {#if isSubDomain && !!$consoleVariables._APP_DOMAIN_TARGET_CNAME && $consoleVariables._APP_DOMAIN_TARGET_CNAME !== 'localhost'}
+ {#if isSubDomain && !!$regionalConsoleVariables._APP_DOMAIN_TARGET_CNAME && $regionalConsoleVariables._APP_DOMAIN_TARGET_CNAME !== 'localhost'}
(selectedTab = 'cname')}
@@ -126,7 +138,7 @@
Nameservers
{/if}
- {#if !isCloud && !!$consoleVariables._APP_DOMAIN_TARGET_A && $consoleVariables._APP_DOMAIN_TARGET_A !== '127.0.0.1'}
+ {#if !isCloud && !!$regionalConsoleVariables._APP_DOMAIN_TARGET_A && $regionalConsoleVariables._APP_DOMAIN_TARGET_A !== '127.0.0.1'}
(selectedTab = 'a')}
@@ -134,7 +146,7 @@
A
{/if}
- {#if !isCloud && !!$consoleVariables._APP_DOMAIN_TARGET_AAAA && $consoleVariables._APP_DOMAIN_TARGET_AAAA !== '::1'}
+ {#if !isCloud && !!$regionalConsoleVariables._APP_DOMAIN_TARGET_AAAA && $regionalConsoleVariables._APP_DOMAIN_TARGET_AAAA !== '::1'}
(selectedTab = 'aaaa')}
diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.ts b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.ts
index a5f6b1910..8f49a7343 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.ts
@@ -1,14 +1,15 @@
import { sdk } from '$lib/stores/sdk';
import { isCloud } from '$lib/system';
import { Dependencies } from '$lib/constants.js';
-import type { DomainsList } from '$lib/sdk/domains.js';
+import { type Models, Query } from '@appwrite.io/console';
-export const load = async ({ depends }) => {
+export const load = async ({ depends, parent }) => {
+ const { organization } = await parent();
depends(Dependencies.DOMAINS);
- let domainsList: DomainsList;
+ let domainsList: Models.DomainsList;
if (isCloud) {
- domainsList = await sdk.forConsole.domains.list();
+ domainsList = await sdk.forConsole.domains.list([Query.equal('teamId', organization.$id)]);
}
return {
diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/retryDomainModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/domains/retryDomainModal.svelte
index d0bf3861b..2cd8c7a51 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/domains/retryDomainModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/domains/retryDomainModal.svelte
@@ -32,7 +32,7 @@
});
trackEvent(Submit.DomainUpdateVerification);
} catch (e) {
- error = e;
+ error = e.message;
trackError(e, Submit.DomainUpdateVerification);
}
}
diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/table.svelte b/src/routes/(console)/project-[region]-[project]/settings/domains/table.svelte
index de4ebd50c..70b5b62bf 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/domains/table.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/domains/table.svelte
@@ -2,7 +2,6 @@
import { Click, trackEvent } from '$lib/actions/analytics';
import { Link } from '$lib/elements';
import { Button } from '$lib/elements/forms';
- import { protocol } from '$routes/(console)/store';
import type { Models } from '@appwrite.io/console';
import { IconDotsHorizontal, IconRefresh, IconTrash } from '@appwrite.io/pink-icons-svelte';
import {
@@ -17,6 +16,7 @@
import DeleteDomainModal from './deleteDomainModal.svelte';
import RetryDomainModal from './retryDomainModal.svelte';
import { columns } from './store';
+ import { regionalProtocol } from '../../store';
let {
domains
@@ -44,7 +44,10 @@
{#if column.id === 'domain'}
-
+
{domain.domain}
@@ -81,7 +84,7 @@
- {#if domain.status !== 'verified'}
+ {#if domain.status !== 'verified' && domain.status !== 'verifiying'}
{
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/credentials.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/credentials.svelte
new file mode 100644
index 000000000..fb61190f4
--- /dev/null
+++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/credentials.svelte
@@ -0,0 +1,165 @@
+
+
+
+ {#if $provider.provider === 'appwrite'}
+
+
+
+
+
+ {:else if $provider.provider === 'firebase'}
+
+
+
+ {:else if $provider.provider === 'supabase'}
+
+ Postgres credentials
+
+
+
+
+
+
+
+
+
+ Supabase credentials
+
+
+
+
+
+ {:else if $provider.provider === 'nhost'}
+
+
+
+
+
+
+
+
+ {/if}
+
+
+ {
+ formSubmitted = true;
+ }}>Next
+
+
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte
new file mode 100644
index 000000000..e86559bae
--- /dev/null
+++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte
@@ -0,0 +1,112 @@
+
+
+{#if !formGroupChildren.length}
+
+ (formGroup.root = !formGroup.root)}>
+
+
+
+
+
+ {labelMap[groupKey]?.root ?? groupKey}
+
+
+
+ {#if reportValue !== undefined}
+
+ {:else if isLoading}
+
+ {/if}
+
+
+
+{:else}
+
+
+ {#each formGroupChildren as key}
+
+
+
+ {/each}
+
+
+{/if}
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step1.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step1.svelte
deleted file mode 100644
index badd138cf..000000000
--- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step1.svelte
+++ /dev/null
@@ -1,141 +0,0 @@
-
-
-
- Source
-
- Select a source platform with the project you want to migrate.
- Learn about which platforms are supported.
-
-
-
- {#if $provider.provider === 'appwrite'}
-
-
-
- {:else if $provider.provider === 'firebase'}
-
-
-
- {:else if $provider.provider === 'supabase'}
- Postgres credentials
-
-
-
-
-
- Supabase credentials
-
-
-
- {:else if $provider.provider === 'nhost'}
-
-
-
-
-
-
- {/if}
-
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step2.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step2.svelte
deleted file mode 100644
index 726792087..000000000
--- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step2.svelte
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
- Resources
-
- Select the resources you need to migrate to Appwrite. Some resources can be migrated, but
- with limitations.
- Learn about which resources are supported.
-
-
-
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte
index 38c8f84a3..46aeae3ed 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte
@@ -1,18 +1,35 @@
-
+
+
+
+
+
+ {#if showResources}
+
+ {/if}
+
+
+
+
+
+
+ Good to know
+
+
+
+
+
+
+
+ Project settings are not imported
+ You will need to set service and project settings manually.
+
+
+
+
+
+
+
+
+
+ Keep your organization plan's limits in mind
+ Make sure to have enough storage in your organization plan when importing files.
+
+
+
+
+
+ {@const isFirebase = $provider.provider === 'firebase'}
+
+
+
+
+
+ {isFirebase
+ ? 'Possible charges by Firebase'
+ : 'Transfer is free of charge'}
+
+
+ {#if isFirebase}
+ Appwrite does not impose charges for importing data, but please note
+ that Firebase may have its own pricing for this service
+ {:else}
+ You won't be charged for Appwrite bandwidth usage for importing data
+ {/if}
+
+
+
+
+
+
+
+ {
+ showExitModal = true;
+ }}>Cancel
+
+ Create
+
+
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte
index 87490b4f7..1b885de3e 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte
@@ -33,21 +33,9 @@
import { page } from '$app/state';
export let data;
- let migration: Models.Migration = null;
let showExport = false;
let showMigration = false;
-
- const getStatus = (status: string) => {
- if (status === 'failed') {
- return 'failed';
- } else if (status === 'completed') {
- return 'complete';
- } else if (status === 'processing') {
- return 'processing';
- }
-
- return 'pending';
- };
+ let migration: Models.Migration = null;
onMount(() => {
return realtime
@@ -134,8 +122,25 @@
};
function showDetails(m: Models.Migration) {
- showMigration = true;
migration = m;
+ showMigration = true;
+ }
+
+ function getTypedStatus(entry: Models.Migration) {
+ // migration > pending, processing, failed, completed
+ // status component = waiting, ready, processing, pending, failed, complete
+ switch (entry.status) {
+ case 'completed':
+ return 'complete';
+ case 'processing':
+ return 'processing';
+ case 'failed':
+ return 'failed';
+ case 'pending':
+ return 'pending';
+ default:
+ return 'waiting';
+ }
}
@@ -165,7 +170,7 @@
{#each data.migrations as entry}
- {@const status = getStatus(entry.status)}
+ {@const status = getTypedStatus(entry)}
{#if isSameDay(new Date(), new Date(entry.$createdAt))}
Today
@@ -240,7 +245,7 @@
Export data from your project to a self-hosted instance.
Learn more
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/details.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/details.svelte
index d26f39209..1add18f03 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/migrations/details.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/details.svelte
@@ -1,13 +1,24 @@
{#if tab === 'logs'}
-
+
{:else if tab === 'details'}
@@ -76,82 +88,64 @@
{#if Object.values(statusCounters).some(hasError)}
-
+
There was an error migrating some of the project's entities.
-
+ (tab = 'logs')}
+ >View logs
+
{/if}
{#if Object.keys(statusCounters).length}
-
- {#each Object.keys(statusCounters) as entity}
- {@const entityCounter = statusCounters[entity]}
-
-
- {#if hasError(entityCounter)}
-
- {:else if isLoading(entityCounter)}
-
-
-
- {:else if hasSucceeded(entityCounter)}
-
- {:else}
-
- {/if}
-
+
+
+ {#each Object.keys(statusCounters) as entity}
+ {@const entityCounter = statusCounters[entity]}
+
+
+ {#if hasError(entityCounter)}
+
+ {:else if isLoading(entityCounter)}
+
+ {:else if hasSucceeded(entityCounter)}
+
+ {:else}
+
+ {/if}
+
-
- {total(Object.values(entityCounter)) > 1
- ? ResourcesFriendly[entity].plural
- : ResourcesFriendly[entity].singular}
- {totalItems(entityCounter)}
-
-
- {/each}
-
+
+ {total(Object.values(entityCounter)) > 1
+ ? ResourcesFriendly[entity].plural
+ : ResourcesFriendly[entity].singular}
+
+ {totalItems(entityCounter)}
+
+
+ {/each}
+
+
{/if}
{/if}
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte
index 0f4658324..bbb1ebda7 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte
@@ -1,16 +1,20 @@
-
- API key creation
- By initiating the transfer, an API key will be automatically generated in the background, which
- you can delete after completion
-
+
+
+ API key creation
+ By initiating the transfer, an API key will be automatically generated in the background,
+ which you can delete after completion
+
- {
- if (!submitted) return;
- handleInvalid(e);
- }} />
+
-
- Share your feedback: why our self-hosted solution works better for you
-
- We appreciate your continued support and we understand that our self-hosted solution
- might better fit your needs. To help us improve our Cloud solution, please share why it
- works better for you. Your feedback is important to us and we'll use it to make our
- services better.
-
-
-
-
-
+
+
+
+ Share your feedback: why our self-hosted solution works better for you
+
-
- You will be redirected to your self-hosted instance
+ We appreciate your continued support and we understand that our self-hosted solution
+ might better fit your needs. To help us improve our Cloud solution, please share why
+ it works better for you. Your feedback is important to us and we'll use it to make
+ our services better.
- Continue
-
+
+
+
+
+
+
+ You will be redirected to your self-hosted instance
+
+
+ Continue
+
+
diff --git a/src/routes/(console)/project-[region]-[project]/settings/updateInstallations.svelte b/src/routes/(console)/project-[region]-[project]/settings/updateInstallations.svelte
index aadcb6a02..62aa81c07 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/updateInstallations.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/updateInstallations.svelte
@@ -7,7 +7,6 @@
import type { Models } from '@appwrite.io/console';
import GitDisconnectModal from './GitDisconnectModal.svelte';
import { isSelfHosted } from '$lib/system';
- import { consoleVariables } from '$routes/(console)/store';
import {
ActionMenu,
Alert,
@@ -28,6 +27,7 @@
import { Click, trackEvent } from '$lib/actions/analytics';
import type { ComponentType } from 'svelte';
import { Link } from '$lib/elements';
+ import { regionalConsoleVariables } from '../store';
export let total: number;
export let limit: number;
@@ -37,7 +37,7 @@
let showGitDisconnect = false;
let showInstallationDropdown: boolean[] = [];
let selectedInstallation: Models.Installation;
- const isVcsEnabled = $consoleVariables?._APP_VCS_ENABLED === true;
+ const isVcsEnabled = $regionalConsoleVariables?._APP_VCS_ENABLED === true;
function getInstallationLink(installation: Models.Installation) {
switch (installation.provider) {
diff --git a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/+layout.ts b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/+layout.ts
index 940fbeef8..a38c24efb 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/+layout.ts
@@ -3,18 +3,13 @@ import { sdk } from '$lib/stores/sdk';
import Breadcrumbs from './breadcrumbs.svelte';
import Header from './header.svelte';
import type { LayoutLoad } from './$types';
-import { error } from '@sveltejs/kit';
export const load: LayoutLoad = async ({ params, depends }) => {
depends(Dependencies.WEBHOOK);
- try {
- return {
- header: Header,
- breadcrumbs: Breadcrumbs,
- webhook: await sdk.forConsole.projects.getWebhook(params.project, params.webhook)
- };
- } catch (e) {
- error(e.code, e.message);
- }
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs,
+ webhook: await sdk.forConsole.projects.getWebhook(params.project, params.webhook)
+ };
};
diff --git a/src/routes/(console)/project-[region]-[project]/sites/(components)/deploymentActionMenu.svelte b/src/routes/(console)/project-[region]-[project]/sites/(components)/deploymentActionMenu.svelte
index b30bd56ae..3c127f1eb 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/(components)/deploymentActionMenu.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/(components)/deploymentActionMenu.svelte
@@ -55,7 +55,7 @@
- {#if !inCard}
+ {#if !inCard && selectedDeployment?.sourceSize !== 0}
{
diff --git a/src/routes/(console)/project-[region]-[project]/sites/(components)/openOnMobileModal.svelte b/src/routes/(console)/project-[region]-[project]/sites/(components)/openOnMobileModal.svelte
index 97021ef42..928694053 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/(components)/openOnMobileModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/(components)/openOnMobileModal.svelte
@@ -5,10 +5,10 @@
import { Button, InputSelect } from '$lib/elements/forms';
import { copy } from '$lib/helpers/copy';
import { sdk } from '$lib/stores/sdk';
- import { protocol } from '$routes/(console)/store';
import type { Models } from '@appwrite.io/console';
import { IconDuplicate } from '@appwrite.io/pink-icons-svelte';
import { Icon, Image, Layout, Tooltip } from '@appwrite.io/pink-svelte';
+ import { regionalProtocol } from '$routes/(console)/project-[region]-[project]/store';
let {
show = $bindable(),
@@ -24,12 +24,12 @@
? proxyRuleList.rules.map((rule) => {
return {
label: rule.domain,
- value: $protocol + rule.domain
+ value: $regionalProtocol + rule.domain
};
})
: [];
- let url = $state(selectedUrl ? $protocol + selectedUrl : (options[0]?.value ?? ''));
+ let url = $state(selectedUrl ? $regionalProtocol + selectedUrl : (options[0]?.value ?? ''));
let tooltipMessage = $state('Copy');
function getImage(url: string) {
diff --git a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte
index f01665e55..2ad1fb86b 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte
@@ -22,6 +22,7 @@
import { isCloud } from '$lib/system';
import { getApiEndpoint } from '$lib/stores/sdk';
import { capitalize } from '$lib/helpers/string';
+ import { page } from '$app/state';
export let deployment: Models.Deployment;
export let proxyRuleList: Models.ProxyRuleList;
@@ -46,7 +47,7 @@
function getFilePreview(fileId: string) {
// TODO: @Meldiron use sdk.forConsole.storage.getFilePreview
- const endpoint = getApiEndpoint();
+ const endpoint = getApiEndpoint(page.params.region);
return endpoint + `/storage/buckets/screenshots/files/${fileId}/view?project=console`;
}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/(images)/empty-sites-dark-mobile.svg b/src/routes/(console)/project-[region]-[project]/sites/(images)/empty-sites-dark-mobile.svg
new file mode 100644
index 000000000..39c7917cf
--- /dev/null
+++ b/src/routes/(console)/project-[region]-[project]/sites/(images)/empty-sites-dark-mobile.svg
@@ -0,0 +1,119 @@
+
diff --git a/src/routes/(console)/project-[region]-[project]/sites/(images)/empty-sites-light-mobile.svg b/src/routes/(console)/project-[region]-[project]/sites/(images)/empty-sites-light-mobile.svg
new file mode 100644
index 000000000..8bd4b239e
--- /dev/null
+++ b/src/routes/(console)/project-[region]-[project]/sites/(images)/empty-sites-light-mobile.svg
@@ -0,0 +1,157 @@
+
diff --git a/src/routes/(console)/project-[region]-[project]/sites/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/+page.svelte
index 855274fa4..2f2069920 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/+page.svelte
@@ -11,12 +11,14 @@
import { isServiceLimited } from '$lib/stores/billing';
import { organization } from '$lib/stores/organization';
import { canWriteSites } from '$lib/stores/roles.js';
- import { Icon, Layout } from '@appwrite.io/pink-svelte';
+ import { Card, Icon, Layout, Typography } from '@appwrite.io/pink-svelte';
import { Button } from '$lib/elements/forms';
import { app } from '$lib/stores/app';
import CreateSiteModal from './createSiteModal.svelte';
import EmptyLight from './(images)/empty-sites-light.svg';
import EmptyDark from './(images)/empty-sites-dark.svg';
+ import EmptyLightMobile from './(images)/empty-sites-light-mobile.svg';
+ import EmptyDarkMobile from './(images)/empty-sites-dark-mobile.svg';
import Grid from './grid.svelte';
import { IconPlus } from '@appwrite.io/pink-icons-svelte';
import { columns } from './store';
@@ -26,7 +28,10 @@
import { invalidate } from '$app/navigation';
import { Dependencies } from '$lib/constants';
import { sdk } from '$lib/stores/sdk';
+ import { isSmallViewport } from '$lib/stores/viewport';
+
export let data;
+
let show = false;
$: $registerCommands([
@@ -53,46 +58,83 @@
}
});
});
+
+ $: isDark = $app.themeInUse === 'dark';
+ $: imgSrc = isDark
+ ? $isSmallViewport
+ ? EmptyDarkMobile
+ : EmptyDark
+ : $isSmallViewport
+ ? EmptyLightMobile
+ : EmptyLight;
+ $: imgClass = $isSmallViewport ? 'mobile' : 'desktop';
-
-
-
+ {#if data.sitesLive}
+
+
+
+
+
+
+ {#if $canWriteSites}
+ (show = true)} event="create_site" size="s">
+
+ Create site
+
+ {/if}
+
-
-
- {#if $canWriteSites}
- (show = true)} event="create_site" size="s">
-
- Create site
-
+ {#if data.siteList.total}
+ {#if data.view === View.Grid}
+
+ {:else}
+
{/if}
-
-
- {#if data.siteList.total}
- {#if data.view === View.Grid}
-
+
+ {:else if data.search}
+
{:else}
-
+ (show = true)}>
+
{/if}
-
- {:else if data.search}
-
{:else}
- (show = true)}>
-
+
+
+
+
+
+
+
+ Appwrite Sites is in high demand
+
+
+
+
+ To ensure a smooth experience for everyone, we’re rolling out access
+ gradually.
+
+
+
+
+
+
{/if}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/+page.ts
index 62eeb026a..63289aaa4 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/+page.ts
@@ -1,29 +1,44 @@
-import { Query } from '@appwrite.io/console';
+import { Query, type Models } from '@appwrite.io/console';
import { sdk } from '$lib/stores/sdk';
import { getLimit, getPage, getSearch, getView, pageToOffset, View } from '$lib/helpers/load';
import { CARD_LIMIT, Dependencies } from '$lib/constants';
+import { flags } from '$lib/flags';
+
+export const load = async ({ url, depends, route, params, parent }) => {
+ const data = await parent();
-export const load = async ({ url, depends, route, params }) => {
depends(Dependencies.SITES);
-
const page = getPage(url);
const search = getSearch(url);
const limit = getLimit(url, route, CARD_LIMIT);
const offset = pageToOffset(page, limit);
const view = getView(url, route, View.Grid, View.Grid);
- const siteList = await sdk
- .forProject(params.region, params.project)
- .sites.list(
- [Query.limit(limit), Query.offset(offset), Query.orderDesc('')],
- search || undefined
- );
+ if (!flags.showSites(data)) {
+ return {
+ sitesLive: false,
+ offset,
+ limit,
+ search,
+ view,
+ siteList: {
+ total: 0,
+ sites: []
+ } as Models.SiteList
+ };
+ }
return {
+ sitesLive: true,
offset,
limit,
search,
- siteList,
+ siteList: await sdk
+ .forProject(params.region, params.project)
+ .sites.list(
+ [Query.limit(limit), Query.offset(offset), Query.orderDesc('')],
+ search || undefined
+ ),
view
};
};
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/aside.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/aside.svelte
index 3e3d32978..96294b630 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/aside.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/aside.svelte
@@ -2,9 +2,9 @@
import { Card, SvgIcon, Trim } from '$lib/components';
import { Icon, Layout, Typography } from '@appwrite.io/pink-svelte';
import { IconGithub, IconGitBranch } from '@appwrite.io/pink-icons-svelte';
- import { consoleVariables } from '$routes/(console)/store';
import type { Models } from '@appwrite.io/console';
import { getFrameworkIcon } from '$lib/stores/sites';
+ import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
export let framework: Partial;
export let repositoryName: string;
@@ -71,7 +71,7 @@
{#key domain}
- {$consoleVariables._APP_OPTIONS_FORCE_HTTPS
+ {$regionalConsoleVariables._APP_OPTIONS_FORCE_HTTPS
? 'https://'
: 'http://'}{domain}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/domain.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/domain.svelte
index 397fdeeb1..0a6bcf5ed 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/domain.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/domain.svelte
@@ -3,10 +3,10 @@
import Button from '$lib/elements/forms/button.svelte';
import { debounce } from '$lib/helpers/debounce';
import { sdk } from '$lib/stores/sdk';
- import { consoleVariables } from '$routes/(console)/store';
import { ConsoleResourceType } from '@appwrite.io/console';
import { Fieldset, Layout, Status, Typography } from '@appwrite.io/pink-svelte';
import { onMount } from 'svelte';
+ import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
export let domain: string;
export let domainIsValid = true;
@@ -35,7 +35,7 @@
}
try {
await sdk.forConsole.console.getResource(
- `${value}.${$consoleVariables._APP_DOMAIN_SITES}`,
+ `${value}.${$regionalConsoleVariables._APP_DOMAIN_SITES}`,
ConsoleResourceType.Rules
);
domainStatus = 'complete';
@@ -60,7 +60,7 @@
- .{$consoleVariables._APP_DOMAIN_SITES}
+ .{$regionalConsoleVariables._APP_DOMAIN_SITES}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/finish/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/finish/+page.svelte
index 152a41aa2..871611f73 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/finish/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/finish/+page.svelte
@@ -10,18 +10,18 @@
import SiteCard from '../../(components)/siteCard.svelte';
import { onMount } from 'svelte';
import AddCollaboratorModal from '../../(components)/addCollaboratorModal.svelte';
- import { protocol } from '$routes/(console)/store';
import { Click, trackEvent } from '$lib/actions/analytics';
import { invalidate } from '$app/navigation';
import { sdk } from '$lib/stores/sdk';
import type { Adapter, BuildRuntime, Framework } from '@appwrite.io/console';
import { Dependencies } from '$lib/constants';
import { ConnectRepoModal } from '$lib/components/git';
+ import { regionalProtocol } from '$routes/(console)/project-[region]-[project]/store';
export let data;
- let showConnectRepositry = false;
let showOpenOnMobile = false;
+ let showConnectRepository = false;
let showInviteCollaborator = false;
const siteURL = data.proxyRuleList.rules[0].domain;
@@ -31,7 +31,7 @@
page.url.searchParams.has('connectRepo') &&
page.url.searchParams.get('connectRepo') === 'true'
) {
- showConnectRepositry = true;
+ showConnectRepository = true;
}
});
@@ -89,7 +89,7 @@
proxyRuleList={data.proxyRuleList}
hideQRCode>
- Visit site
+ Visit site
@@ -106,7 +106,7 @@
(showConnectRepositry = true)}>
+ on:click={() => (showConnectRepository = true)}>
-{#if showConnectRepositry}
+{#if showConnectRepository}
{/if}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/manual/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/manual/+page.svelte
index eaea81678..0d9f1b58b 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/manual/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/manual/+page.svelte
@@ -15,9 +15,11 @@
import type { Models } from '@appwrite.io/console';
import Configuration from '../configuration.svelte';
import { buildVerboseDomain } from '../store';
- import { project } from '$routes/(console)/project-[region]-[project]/store';
+ import {
+ project,
+ regionalConsoleVariables
+ } from '$routes/(console)/project-[region]-[project]/store';
import { organization } from '$lib/stores/organization';
- import { consoleVariables } from '$routes/(console)/store';
import { IconInfo } from '@appwrite.io/pink-icons-svelte';
import { InvalidFileType, removeFile } from '$lib/helpers/files';
import { humanFileSize } from '$lib/helpers/sizeConvertion';
@@ -32,7 +34,7 @@
let name = 'My website';
let id = ID.unique();
- let domain = `${id}.${$consoleVariables._APP_DOMAIN_SITES}`;
+ let domain = `${id}.${$regionalConsoleVariables._APP_DOMAIN_SITES}`;
let framework: Models.Framework =
data.frameworks.frameworks?.find((f) => f.key === 'other') ??
data.frameworks.frameworks?.[0];
@@ -46,14 +48,14 @@
$: maxSize =
isCloud && $currentPlan
? $currentPlan.deploymentSize * 1000000
- : $consoleVariables._APP_COMPUTE_SIZE_LIMIT; // already in MB
+ : $regionalConsoleVariables._APP_COMPUTE_SIZE_LIMIT; // already in MB
$: readableMaxSize = humanFileSize(maxSize);
async function create() {
try {
domain = await buildVerboseDomain(
- $consoleVariables._APP_DOMAIN_SITES,
+ $regionalConsoleVariables._APP_DOMAIN_SITES,
name,
$organization.name,
$project.name,
@@ -89,7 +91,10 @@
// Add domain
await sdk
.forProject(page.params.region, page.params.project)
- .proxy.createSiteRule(`${domain}.${$consoleVariables._APP_DOMAIN_SITES}`, site.$id);
+ .proxy.createSiteRule(
+ `${domain}.${$regionalConsoleVariables._APP_DOMAIN_SITES}`,
+ site.$id
+ );
//Add variables
const promises = variables.map((variable) =>
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte
index 1def9713b..a061a490f 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte
@@ -25,8 +25,8 @@
import type { Models } from '@appwrite.io/console';
import { onMount } from 'svelte';
import Configuration from '../../configuration.svelte';
- import { consoleVariables } from '$routes/(console)/store';
import Domain from '../../domain.svelte';
+ import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
export let data;
let showExitModal = false;
@@ -119,7 +119,10 @@
// Add domain
await sdk
.forProject(page.params.region, page.params.project)
- .proxy.createSiteRule(`${domain}.${$consoleVariables._APP_DOMAIN_SITES}`, site.$id);
+ .proxy.createSiteRule(
+ `${domain}.${$regionalConsoleVariables._APP_DOMAIN_SITES}`,
+ site.$id
+ );
//Add variables
const promises = variables.map((variable) =>
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.ts
index 4287ee29f..f5607d122 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.ts
@@ -3,7 +3,8 @@ import { ID } from '@appwrite.io/console';
import { buildVerboseDomain } from '../../store';
export const load = async ({ parent, params, url }) => {
- const { installations, frameworks, project, organization, consoleVariables } = await parent();
+ const { installations, frameworks, project, organization, regionalConsoleVariables } =
+ await parent();
const [repository] = await Promise.all([
sdk
.forProject(params.region, params.project)
@@ -11,7 +12,7 @@ export const load = async ({ parent, params, url }) => {
]);
const domain = await buildVerboseDomain(
- consoleVariables._APP_DOMAIN_SITES,
+ regionalConsoleVariables._APP_DOMAIN_SITES,
repository.name,
organization.name,
project.name,
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/+page.svelte
index 6f9c0359c..a3fc998a2 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/+page.svelte
@@ -34,7 +34,9 @@
}
target.searchParams.delete('page');
offset = 0;
- goto(target.toString());
+ goto(target.toString(), {
+ noScroll: true
+ });
}
let searchText = page.url.searchParams.get('search') ?? '';
@@ -52,7 +54,7 @@
url.searchParams.delete('page');
offset = 0;
- goto(url.toString(), { keepFocus: true });
+ goto(url.toString(), { keepFocus: true, noScroll: true });
}, 250);
function applySearch(event: CustomEvent) {
@@ -64,7 +66,9 @@
searchText = '';
const target = new URL(page.url);
target.search = '';
- goto(target.toString());
+ goto(target.toString(), {
+ noScroll: true
+ });
}
const isChecked = (useCase: string) => {
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.svelte
index 294fdce16..4ad7bd998 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.svelte
@@ -32,11 +32,11 @@
Repositories,
RepositoryBehaviour
} from '$lib/components/git';
- import { app, iconPath } from '$lib/stores/app';
- import { consoleVariables } from '$routes/(console)/store';
- import { connectGitHub } from '$lib/stores/git';
import Domain from '../../domain.svelte';
+ import { app, iconPath } from '$lib/stores/app';
+ import { connectGitHub } from '$lib/stores/git';
import { getFrameworkIcon } from '$lib/stores/sites';
+ import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
export let data;
@@ -137,7 +137,7 @@
await sdk
.forProject(page.params.region, page.params.project)
.proxy.createSiteRule(
- `${domain}.${$consoleVariables._APP_DOMAIN_SITES}`,
+ `${domain}.${$regionalConsoleVariables._APP_DOMAIN_SITES}`,
site.$id
);
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.ts
index 2f22a6337..d8fd8c41a 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.ts
@@ -1,14 +1,15 @@
import { sdk } from '$lib/stores/sdk';
-import { buildVerboseDomain } from '../../store.js';
import { ID } from '@appwrite.io/console';
+import { buildVerboseDomain } from '../../store.js';
export const load = async ({ parent, params }) => {
- const { installations, frameworks, project, organization, consoleVariables } = await parent();
+ const { installations, frameworks, project, organization, regionalConsoleVariables } =
+ await parent();
const template = await sdk
.forProject(params.region, params.project)
.sites.getTemplate(params.template);
const domain = await buildVerboseDomain(
- consoleVariables._APP_DOMAIN_SITES,
+ regionalConsoleVariables._APP_DOMAIN_SITES,
template.name,
organization.name,
project.name,
diff --git a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte
index 59effbc6d..5873133fc 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte
@@ -34,7 +34,7 @@
function getFilePreview(fileId: string) {
// TODO: @Meldiron use sdk.forConsole.storage.getFilePreview
- const endpoint = getApiEndpoint();
+ const endpoint = getApiEndpoint(page.params.region);
return endpoint + `/storage/buckets/screenshots/files/${fileId}/view?project=console`;
}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/+layout.ts b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/+layout.ts
index 491697969..b05c763f8 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/+layout.ts
@@ -2,21 +2,16 @@ import Breadcrumbs from './breadcrumbs.svelte';
import Header from './header.svelte';
import { Dependencies } from '$lib/constants';
import { sdk } from '$lib/stores/sdk';
-import { error } from '@sveltejs/kit';
export const load = async ({ depends, params }) => {
depends(Dependencies.SITE);
- try {
- const [site] = await Promise.all([
- sdk.forProject(params.region, params.project).sites.get(params.site)
- ]);
+ const [site] = await Promise.all([
+ sdk.forProject(params.region, params.project).sites.get(params.site)
+ ]);
- return {
- site,
- header: Header,
- breadcrumbs: Breadcrumbs
- };
- } catch (e) {
- error(e.code, e.message);
- }
+ return {
+ site,
+ header: Header,
+ breadcrumbs: Breadcrumbs
+ };
};
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/+page.svelte
index 46894e8d4..97ea0bf4c 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/+page.svelte
@@ -5,7 +5,6 @@
import DomainsOverview from './domainsOverview.svelte';
import DeploymentsOverview from './deploymentsOverview.svelte';
import { Button } from '$lib/elements/forms';
- import { protocol } from '$routes/(console)/store';
import InstantRollbackDomain from './instantRollbackModal.svelte';
import { app } from '$lib/stores/app';
import { sdk } from '$lib/stores/sdk';
@@ -14,6 +13,7 @@
import { onMount } from 'svelte';
import { page } from '$app/state';
import { base } from '$app/paths';
+ import { regionalProtocol } from '$routes/(console)/project-[region]-[project]/store';
export let data;
let showRollback = false;
@@ -35,7 +35,7 @@
{#if data.proxyRuleList.total}
+ href={`${$regionalProtocol}${data.proxyRuleList.rules[0]?.domain}`}>
Visit
{/if}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createGitDeploymentModal.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createGitDeploymentModal.svelte
index 98984359a..099f9dcdb 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createGitDeploymentModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createGitDeploymentModal.svelte
@@ -197,7 +197,6 @@
id="branch"
label="Production branch"
placeholder="Select branch"
- isSearchable
bind:value={branch}
on:select={(event) => {
branch = event.detail.value;
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/deployment-[deployment]/+layout.ts b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/deployment-[deployment]/+layout.ts
index 282ea4dc1..f531ddd3b 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/deployment-[deployment]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/deployment-[deployment]/+layout.ts
@@ -1,16 +1,12 @@
import { Dependencies } from '$lib/constants';
-import { error } from '@sveltejs/kit';
import Breadcrumbs from './breadcrumbs.svelte';
import Header from './header.svelte';
export const load = async ({ depends }) => {
depends(Dependencies.SITE);
- try {
- return {
- header: Header,
- breadcrumbs: Breadcrumbs
- };
- } catch (e) {
- error(e.code, e.message);
- }
+
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs
+ };
};
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/deployment-[deployment]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/deployment-[deployment]/+page.svelte
index 541b3c00e..82db52688 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/deployment-[deployment]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/deployment-[deployment]/+page.svelte
@@ -12,13 +12,13 @@
import CancelDeploymentModal from '../cancelDeploymentModal.svelte';
import RedeployModal from '../../../redeployModal.svelte';
import ActivateDeploymentModal from '../../../activateDeploymentModal.svelte';
- import { protocol } from '$routes/(console)/store';
import { Accordion } from '@appwrite.io/pink-svelte';
import { capitalize } from '$lib/helpers/string';
import LogsTimer from '../../../(components)/logsTimer.svelte';
import { invalidate } from '$app/navigation';
import { Dependencies } from '$lib/constants';
import { page } from '$app/state';
+ import { regionalProtocol } from '$routes/(console)/project-[region]-[project]/store';
let { data } = $props();
@@ -49,7 +49,9 @@
{#if deployment?.status === 'ready' && data.proxyRuleList?.total}
-
+
Visit
{/if}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/+page.ts
index 88ec63f09..ebe497444 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/+page.ts
@@ -27,12 +27,17 @@ export const load = async ({ params, depends, url, route }) => {
.proxy.listRules(
[
Query.or([
- Query.equal('type', RuleType.DEPLOYMENT),
- Query.equal('type', RuleType.REDIRECT)
+ Query.and([
+ Query.equal('type', RuleType.REDIRECT),
+ Query.equal('trigger', RuleTrigger.MANUAL)
+ ]),
+ Query.and([
+ Query.equal('type', RuleType.DEPLOYMENT),
+ Query.equal('trigger', RuleTrigger.MANUAL),
+ Query.equal('deploymentResourceType', DeploymentResourceType.SITE),
+ Query.equal('deploymentResourceId', params.site)
+ ])
]),
- Query.equal('deploymentResourceType', DeploymentResourceType.SITE),
- Query.equal('deploymentResourceId', params.site),
- Query.equal('trigger', RuleTrigger.MANUAL),
Query.limit(limit),
Query.offset(offset),
Query.orderDesc(''),
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.svelte
index 941c1d563..ea8388747 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.svelte
@@ -9,7 +9,6 @@
import { goto, invalidate } from '$app/navigation';
import { Dependencies } from '$lib/constants';
import { sortBranches } from '$lib/stores/vcs';
- import { protocol } from '$routes/(console)/store';
import { IconInfo } from '@appwrite.io/pink-icons-svelte';
import { LabelCard } from '$lib/components';
import {
@@ -77,7 +76,7 @@
} else if (behaviour === 'REDIRECT') {
rule = await sdk
.forProject(page.params.region, page.params.project)
- .proxy.createRedirectRule(domainName, $protocol + redirect, statusCode);
+ .proxy.createRedirectRule(domainName, redirect, statusCode);
} else if (behaviour === 'ACTIVE') {
rule = await sdk
.forProject(page.params.region, page.params.project)
@@ -179,7 +178,6 @@
id="branch"
label="Production branch"
placeholder="Select branch"
- isSearchable
bind:value={branch}
on:select={(event) => {
branch = event.detail.value;
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.ts
index d49b1c737..ef6239640 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.ts
@@ -5,7 +5,7 @@ import { Dependencies } from '$lib/constants.js';
import { isCloud } from '$lib/system';
export const load = async ({ parent, depends, params }) => {
- const { site } = await parent();
+ const { site, organization } = await parent();
depends(Dependencies.DOMAINS, Dependencies.SITES_DOMAINS);
const [rules, installations, domains] = await Promise.all([
@@ -16,7 +16,9 @@ export const load = async ({ parent, depends, params }) => {
Query.equal('trigger', RuleTrigger.MANUAL)
]),
sdk.forProject(params.region, params.project).vcs.listInstallations(),
- isCloud ? sdk.forConsole.domains.list() : Promise.resolve(null)
+ isCloud
+ ? sdk.forConsole.domains.list([Query.equal('teamId', organization.$id)])
+ : Promise.resolve(null)
]);
return {
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte
index 9e30d8a05..51ebc1552 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte
@@ -21,9 +21,9 @@
import { base } from '$app/paths';
import { writable } from 'svelte/store';
import { isASubdomain } from '$lib/helpers/tlds';
- import { consoleVariables } from '$routes/(console)/store';
- import NameserverTable from '$lib/components/domains/nameserverTable.svelte';
import RecordTable from '$lib/components/domains/recordTable.svelte';
+ import NameserverTable from '$lib/components/domains/nameserverTable.svelte';
+ import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
let { data } = $props();
@@ -33,12 +33,14 @@
let selectedTab = $state<'cname' | 'nameserver' | 'a' | 'aaaa'>('nameserver');
$effect(() => {
- if ($consoleVariables._APP_DOMAIN_TARGET_CNAME && isSubDomain) {
+ if ($regionalConsoleVariables._APP_DOMAIN_TARGET_CNAME && isSubDomain) {
selectedTab = 'cname';
- } else if ($consoleVariables._APP_DOMAIN_TARGET_A) {
+ } else if (!isCloud && $regionalConsoleVariables._APP_DOMAIN_TARGET_A) {
selectedTab = 'a';
- } else if ($consoleVariables._APP_DOMAIN_TARGET_AAAA) {
+ } else if (!isCloud && $regionalConsoleVariables._APP_DOMAIN_TARGET_AAAA) {
selectedTab = 'aaaa';
+ } else {
+ selectedTab = 'nameserver';
}
});
@@ -56,12 +58,18 @@
.forProject(page.params.region, page.params.project)
.proxy.updateRuleVerification(ruleId);
verified = ruleData.status === 'verified';
+ throw new Error(
+ 'Domain verification failed. Please check your domain settings or try again later'
+ );
} else if (isNewDomain && isCloud) {
const domainData = await sdk.forConsole.domains.create(
$organization.$id,
page.params.domain
);
- verified = domainData.nameservers.toLocaleLowerCase() === 'appwrite';
+ verified = domainData.nameservers.toLowerCase() === 'appwrite';
+ throw new Error(
+ 'Domain verification failed. Please check your domain settings or try again later'
+ );
}
addNotification({
@@ -113,7 +121,7 @@
- {#if isSubDomain && !!$consoleVariables._APP_DOMAIN_TARGET_CNAME && $consoleVariables._APP_DOMAIN_TARGET_CNAME !== 'localhost'}
+ {#if isSubDomain && !!$regionalConsoleVariables._APP_DOMAIN_TARGET_CNAME && $regionalConsoleVariables._APP_DOMAIN_TARGET_CNAME !== 'localhost'}
(selectedTab = 'cname')}
@@ -129,7 +137,7 @@
Nameservers
{/if}
- {#if !isCloud && !!$consoleVariables._APP_DOMAIN_TARGET_A && $consoleVariables._APP_DOMAIN_TARGET_A !== '127.0.0.1'}
+ {#if !isCloud && !!$regionalConsoleVariables._APP_DOMAIN_TARGET_A && $regionalConsoleVariables._APP_DOMAIN_TARGET_A !== '127.0.0.1'}
(selectedTab = 'a')}
@@ -137,7 +145,7 @@
A
{/if}
- {#if !isCloud && !!$consoleVariables._APP_DOMAIN_TARGET_AAAA && $consoleVariables._APP_DOMAIN_TARGET_AAAA !== '::1'}
+ {#if !isCloud && !!$regionalConsoleVariables._APP_DOMAIN_TARGET_AAAA && $regionalConsoleVariables._APP_DOMAIN_TARGET_AAAA !== '::1'}
(selectedTab = 'aaaa')}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.ts
index cea7e4b71..e56bf02b9 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.ts
@@ -1,16 +1,15 @@
import { sdk } from '$lib/stores/sdk';
import { isCloud } from '$lib/system';
import { Dependencies } from '$lib/constants.js';
-import type { DomainsList } from '$lib/sdk/domains';
+import { type Models, Query } from '@appwrite.io/console';
export const load = async ({ parent, depends }) => {
- const { site } = await parent();
+ const { site, organization } = await parent();
depends(Dependencies.SITES_DOMAINS);
- let domainsList: DomainsList;
-
+ let domainsList: Models.DomainsList;
if (isCloud) {
- domainsList = await sdk.forConsole.domains.list();
+ domainsList = await sdk.forConsole.domains.list([Query.equal('teamId', organization.$id)]);
}
return {
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/createPreviewDomainModal.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/createPreviewDomainModal.svelte
index 3cfc0d6ad..fa23726b0 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/createPreviewDomainModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/createPreviewDomainModal.svelte
@@ -6,11 +6,11 @@
import { invalidate } from '$app/navigation';
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import { Dependencies } from '$lib/constants';
- import { consoleVariables } from '$routes/(console)/store';
import { page } from '$app/state';
import { Layout, Status, Typography } from '@appwrite.io/pink-svelte';
import { ConsoleResourceType, ID } from '@appwrite.io/console';
import { debounce } from '$lib/helpers/debounce';
+ import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
export let show = false;
@@ -24,7 +24,7 @@
await sdk
.forProject(page.params.region, page.params.project)
.proxy.createSiteRule(
- `${domain}.${$consoleVariables._APP_DOMAIN_SITES}`,
+ `${domain}.${$regionalConsoleVariables._APP_DOMAIN_SITES}`,
page.params.site
);
@@ -36,7 +36,7 @@
});
trackEvent(Submit.DomainCreate);
} catch (e) {
- error = e;
+ error = e.message;
trackError(e, Submit.DomainCreate);
}
}
@@ -59,7 +59,7 @@
}
try {
await sdk.forConsole.console.getResource(
- `${value}.${$consoleVariables._APP_DOMAIN_SITES}`,
+ `${value}.${$regionalConsoleVariables._APP_DOMAIN_SITES}`,
ConsoleResourceType.Rules
);
domainStatus = 'complete';
@@ -91,7 +91,7 @@
- .{$consoleVariables._APP_DOMAIN_SITES}
+ .{$regionalConsoleVariables._APP_DOMAIN_SITES}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte
index 9c0191b22..3fb1ea07a 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte
@@ -8,12 +8,12 @@
import { Dependencies } from '$lib/constants';
import type { Models } from '@appwrite.io/console';
import { Divider, Tabs } from '@appwrite.io/pink-svelte';
- import { consoleVariables } from '$routes/(console)/store';
import { isCloud } from '$lib/system';
import { page } from '$app/state';
import { isASubdomain } from '$lib/helpers/tlds';
import NameserverTable from '$lib/components/domains/nameserverTable.svelte';
import RecordTable from '$lib/components/domains/recordTable.svelte';
+ import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
let {
show = $bindable(false),
@@ -26,19 +26,21 @@
const isSubDomain = $derived.by(() => isASubdomain(selectedProxyRule?.domain));
let selectedTab = $state<'cname' | 'nameserver' | 'a' | 'aaaa'>('nameserver');
+
$effect(() => {
- if ($consoleVariables._APP_DOMAIN_SITES && isSubDomain) {
+ if ($regionalConsoleVariables._APP_DOMAIN_TARGET_CNAME && isSubDomain) {
selectedTab = 'cname';
- } else if ($consoleVariables._APP_DOMAIN_TARGET_A) {
+ } else if (!isCloud && $regionalConsoleVariables._APP_DOMAIN_TARGET_A) {
selectedTab = 'a';
- } else if ($consoleVariables._APP_DOMAIN_TARGET_AAAA) {
+ } else if (!isCloud && $regionalConsoleVariables._APP_DOMAIN_TARGET_AAAA) {
selectedTab = 'aaaa';
+ } else {
+ selectedTab = 'nameserver';
}
});
let verified = $state(false);
- let error = $state(null);
async function retryDomain() {
try {
const domain = await sdk
@@ -53,22 +55,20 @@
});
trackEvent(Submit.DomainUpdateVerification);
} catch (e) {
- error = e;
+ addNotification({
+ type: 'error',
+ message:
+ 'Domain verification failed. Please check your domain settings or try again later'
+ });
trackError(e, Submit.DomainUpdateVerification);
}
}
-
- $effect(() => {
- if (!show) {
- error = null;
- }
- });
-
+
- {#if isSubDomain && !!$consoleVariables._APP_DOMAIN_SITES && $consoleVariables._APP_DOMAIN_SITES !== 'localhost'}
+ {#if isSubDomain && !!$regionalConsoleVariables._APP_DOMAIN_TARGET_CNAME && $regionalConsoleVariables._APP_DOMAIN_TARGET_CNAME !== 'localhost'}
(selectedTab = 'cname')}
@@ -84,7 +84,7 @@
Nameservers
{/if}
- {#if !!$consoleVariables._APP_DOMAIN_TARGET_A && $consoleVariables._APP_DOMAIN_TARGET_A !== '127.0.0.1'}
+ {#if !isCloud && !!$regionalConsoleVariables._APP_DOMAIN_TARGET_A && $regionalConsoleVariables._APP_DOMAIN_TARGET_A !== '127.0.0.1'}
(selectedTab = 'a')}
@@ -92,7 +92,7 @@
A
{/if}
- {#if !!$consoleVariables._APP_DOMAIN_TARGET_AAAA && $consoleVariables._APP_DOMAIN_TARGET_AAAA !== '::1'}
+ {#if !isCloud && !!$regionalConsoleVariables._APP_DOMAIN_TARGET_AAAA && $regionalConsoleVariables._APP_DOMAIN_TARGET_AAAA !== '::1'}
(selectedTab = 'aaaa')}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/table.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/table.svelte
index e8dde4d2d..6e0c889f4 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/table.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/table.svelte
@@ -2,7 +2,6 @@
import { Click, trackEvent } from '$lib/actions/analytics';
import { Link } from '$lib/elements';
import { Button } from '$lib/elements/forms';
- import { protocol } from '$routes/(console)/store';
import type { Models } from '@appwrite.io/console';
import { IconDotsHorizontal, IconRefresh, IconTrash } from '@appwrite.io/pink-icons-svelte';
import {
@@ -17,6 +16,7 @@
import DeleteDomainModal from './deleteDomainModal.svelte';
import RetryDomainModal from './retryDomainModal.svelte';
import { columns } from './store';
+ import { regionalProtocol } from '$routes/(console)/project-[region]-[project]/store';
let {
proxyRules
@@ -32,7 +32,7 @@
return proxy?.redirectUrl
? 'Redirect to ' + proxy.redirectUrl
: proxy?.deploymentVcsProviderBranch
- ? 'Deployed from' + proxy.deploymentVcsProviderBranch
+ ? 'Deployed from ' + proxy.deploymentVcsProviderBranch
: 'Active deployment';
};
@@ -52,7 +52,10 @@
{#if column.id === 'domain'}
-
+
{rule.domain}
@@ -92,7 +95,7 @@
- {#if rule.status !== 'verified'}
+ {#if rule.status !== 'verified' && rule.status !== 'verifying'}
{
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domainsOverview.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domainsOverview.svelte
index 7cca03506..550052aa3 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domainsOverview.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domainsOverview.svelte
@@ -5,13 +5,13 @@
import OpenOnMobileModal from '../(components)/openOnMobileModal.svelte';
import { timeFromNow } from '$lib/helpers/date';
import { IconQrcode } from '@appwrite.io/pink-icons-svelte';
- import { protocol } from '$routes/(console)/store';
import { type Models } from '@appwrite.io/console';
import { Link } from '$lib/elements';
import { Button } from '$lib/elements/forms';
import { Card, Trim } from '$lib/components';
import { Click, trackEvent } from '$lib/actions/analytics';
import { RuleTrigger } from '$lib/stores/sdk';
+ import { regionalProtocol } from '$routes/(console)/project-[region]-[project]/store';
export let proxyRuleList: Models.ProxyRuleList;
@@ -75,7 +75,7 @@
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts
index db813ddf3..f63696403 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts
@@ -2,15 +2,11 @@ import { isValueOfStringEnum } from '$lib/helpers/types';
import { sdk } from '$lib/stores/sdk';
import { SiteUsageRange } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-import { error } from '@sveltejs/kit';
export const load: PageLoad = async ({ params }) => {
const period = isValueOfStringEnum(SiteUsageRange, params.period)
? params.period
: SiteUsageRange.ThirtyDays;
- try {
- return sdk.forProject(params.region, params.project).sites.getUsage(params.site, period);
- } catch (e) {
- error(e.code, e.message);
- }
+
+ return sdk.forProject(params.region, params.project).sites.getUsage(params.site, period);
};
diff --git a/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.ts
index 1aa27edd8..b38896918 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.ts
@@ -2,15 +2,10 @@ import { isValueOfStringEnum } from '$lib/helpers/types';
import { sdk } from '$lib/stores/sdk';
import { SiteUsageRange } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-import { error } from '@sveltejs/kit';
export const load: PageLoad = async ({ params }) => {
const period = isValueOfStringEnum(SiteUsageRange, params.period)
? params.period
: SiteUsageRange.ThirtyDays;
- try {
- return sdk.forProject(params.region, params.project).sites.listUsage(period);
- } catch (e) {
- error(e.code, e.message);
- }
+ return sdk.forProject(params.region, params.project).sites.listUsage(period);
};
diff --git a/src/routes/(console)/project-[region]-[project]/storage/+page.ts b/src/routes/(console)/project-[region]-[project]/storage/+page.ts
index 61cb3d856..b68f763af 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/storage/+page.ts
@@ -10,17 +10,18 @@ export const load: PageLoad = async ({ url, route, params }) => {
const view = getView(url, route, View.Grid);
const limit = getLimit(url, route, CARD_LIMIT);
const offset = pageToOffset(page, limit);
+ const buckets = await sdk
+ .forProject(params.region, params.project)
+ .storage.listBuckets(
+ [Query.limit(limit), Query.offset(offset), Query.orderDesc('')],
+ search || undefined
+ );
return {
offset,
limit,
view,
search,
- buckets: await sdk
- .forProject(params.region, params.project)
- .storage.listBuckets(
- [Query.limit(limit), Query.offset(offset), Query.orderDesc('')],
- search || undefined
- )
+ buckets
};
};
diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+layout.ts b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+layout.ts
index 3de7dc104..776b5506f 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+layout.ts
@@ -3,20 +3,13 @@ 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.BUCKET);
- try {
- return {
- header: Header,
- breadcrumbs: Breadcrumbs,
- bucket: await sdk
- .forProject(params.region, params.project)
- .storage.getBucket(params.bucket)
- };
- } catch (e) {
- error(e.code, e.message);
- }
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs,
+ bucket: await sdk.forProject(params.region, params.project).storage.getBucket(params.bucket)
+ };
};
diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+layout.ts b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+layout.ts
index e198256ae..78eb76daf 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+layout.ts
@@ -3,24 +3,19 @@ import Header from './header.svelte';
import { sdk } from '$lib/stores/sdk';
import { Dependencies } from '$lib/constants';
import type { LayoutLoad } from './$types';
-import { error } from '@sveltejs/kit';
export const load: LayoutLoad = async ({ params, depends }) => {
depends(Dependencies.FILE);
depends(Dependencies.FILE_TOKENS);
- try {
- return {
- header: Header,
- breadcrumbs: Breadcrumbs,
- file: await sdk
- .forProject(params.region, params.project)
- .storage.getFile(params.bucket, params.file),
- tokens: await sdk
- .forProject(params.region, params.project)
- .tokens.list(params.bucket, params.file)
- };
- } catch (e) {
- error(e.code, e.message);
- }
+ return {
+ header: Header,
+ breadcrumbs: Breadcrumbs,
+ file: await sdk
+ .forProject(params.region, params.project)
+ .storage.getFile(params.bucket, params.file),
+ tokens: await sdk
+ .forProject(params.region, params.project)
+ .tokens.list(params.bucket, params.file)
+ };
};
diff --git a/src/routes/(console)/project-[region]-[project]/storage/grid.svelte b/src/routes/(console)/project-[region]-[project]/storage/grid.svelte
index 6d6fffae5..dbdc549a3 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/grid.svelte
+++ b/src/routes/(console)/project-[region]-[project]/storage/grid.svelte
@@ -9,6 +9,7 @@
export let data: PageData;
export let showCreate = false;
+ const region = page.params.region;
const project = page.params.project;
@@ -20,7 +21,7 @@
service="buckets"
on:click={() => (showCreate = true)}>
{#each data.buckets.buckets as bucket}
-
+
{bucket.name}
{#if !bucket.enabled}
diff --git a/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.ts
index e51803966..b54be8165 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.ts
@@ -2,15 +2,10 @@ import { isValueOfStringEnum } from '$lib/helpers/types';
import { sdk } from '$lib/stores/sdk';
import { StorageUsageRange } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-import { error } from '@sveltejs/kit';
export const load: PageLoad = async ({ params }) => {
- try {
- const period = isValueOfStringEnum(StorageUsageRange, params.period)
- ? params.period
- : StorageUsageRange.ThirtyDays;
- return sdk.forProject(params.region, params.project).storage.getUsage(period);
- } catch (e) {
- error(e.code, e.message);
- }
+ const period = isValueOfStringEnum(StorageUsageRange, params.period)
+ ? params.period
+ : StorageUsageRange.ThirtyDays;
+ return sdk.forProject(params.region, params.project).storage.getUsage(period);
};
diff --git a/src/routes/(console)/project-[region]-[project]/store.ts b/src/routes/(console)/project-[region]-[project]/store.ts
index e2836f1a5..ce2f876e9 100644
--- a/src/routes/(console)/project-[region]-[project]/store.ts
+++ b/src/routes/(console)/project-[region]-[project]/store.ts
@@ -25,6 +25,25 @@ export const onboarding = derived(
($project) => $project?.platforms?.length === 0 && $project?.keys?.length === 0
);
+/**
+ * Region-aware version of `consoleVariables`, scoped to the project's assigned region.
+ *
+ * Falls back to the default `consoleVariables` if regional data is unavailable, just `edge-case` things.
+ */
+export const regionalConsoleVariables = derived(
+ page,
+ ($page) =>
+ ($page.data.regionalConsoleVariables ??
+ $page.data.consoleVariables) as Models.ConsoleVariables
+);
+
+/**
+ * Protocol based on regional console variables.
+ */
+export const regionalProtocol = derived(regionalConsoleVariables, ($vars) =>
+ $vars?._APP_OPTIONS_FORCE_HTTPS === 'enabled' ? 'https://' : 'http://'
+);
+
function createStats() {
const { subscribe, set, update } = writable