diff --git a/package.json b/package.json
index 1462d9839..0fe8f5a25 100644
--- a/package.json
+++ b/package.json
@@ -22,11 +22,11 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19",
+ "@appwrite.io/console": "https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@a5e5564",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "^2.0.0-RC.1",
"@appwrite.io/pink-legacy": "^1.0.3",
- "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@4e03f34",
+ "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@40bae6b",
"@popperjs/core": "^2.11.8",
"@sentry/sveltekit": "^8.38.0",
"@stripe/stripe-js": "^3.5.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f0c7936b0..cac4e0adc 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,8 +12,8 @@ importers:
specifier: ^1.1.24
version: 1.1.24(svelte@5.25.3)(zod@3.24.3)
'@appwrite.io/console':
- specifier: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19
- version: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19
+ specifier: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@a5e5564
+ version: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@a5e5564
'@appwrite.io/pink-icons':
specifier: 0.25.0
version: 0.25.0
@@ -24,8 +24,8 @@ importers:
specifier: ^1.0.3
version: 1.0.3
'@appwrite.io/pink-svelte':
- specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@4e03f34
- version: https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@4e03f34(svelte@5.25.3)
+ specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@40bae6b
+ version: https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@40bae6b(svelte@5.25.3)
'@popperjs/core':
specifier: ^2.11.8
version: 2.11.8
@@ -257,8 +257,8 @@ packages:
'@analytics/type-utils@0.6.2':
resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==}
- '@appwrite.io/console@https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19':
- resolution: {tarball: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19}
+ '@appwrite.io/console@https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@a5e5564':
+ resolution: {tarball: https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@a5e5564}
version: 1.8.0
'@appwrite.io/pink-icons-svelte@2.0.0-RC.1':
@@ -281,8 +281,8 @@ packages:
'@appwrite.io/pink-legacy@1.0.3':
resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==}
- '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@4e03f34':
- resolution: {tarball: https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@4e03f34}
+ '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@40bae6b':
+ resolution: {tarball: https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@40bae6b}
version: 2.0.0-RC.2
peerDependencies:
svelte: ^4.0.0
@@ -3635,7 +3635,7 @@ snapshots:
'@analytics/type-utils@0.6.2': {}
- '@appwrite.io/console@https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@e190a19': {}
+ '@appwrite.io/console@https://pkg.pr.new/appwrite-labs/cloud/@appwrite.io/console@a5e5564': {}
'@appwrite.io/pink-icons-svelte@2.0.0-RC.1(svelte@5.25.3)':
dependencies:
@@ -3654,7 +3654,7 @@ snapshots:
'@appwrite.io/pink-icons': 1.0.0
the-new-css-reset: 1.11.3
- '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@4e03f34(svelte@5.25.3)':
+ '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/%40appwrite.io%2Fpink-svelte@40bae6b(svelte@5.25.3)':
dependencies:
'@appwrite.io/pink-icons-svelte': 2.0.0-RC.1(svelte@5.25.3)
'@floating-ui/dom': 1.6.13
diff --git a/src/lib/commandCenter/panels/ai.svelte b/src/lib/commandCenter/panels/ai.svelte
index 9bda77da8..e44d0e28e 100644
--- a/src/lib/commandCenter/panels/ai.svelte
+++ b/src/lib/commandCenter/panels/ai.svelte
@@ -167,13 +167,10 @@
{
$preferences.hideAiDisclaimer = true;
- }}>
-
- We collect user responses to refine our experimental AI feature.
-
-
+ }} />
{/if}
@@ -229,8 +226,11 @@
- {
- showAccountMenu = !showAccountMenu;
- shouldAnimateThemeToggle = false;
- if (showAccountMenu) {
- trackEvent(Click.MenuDropDownClick);
- }
- }}>
-
+
+
-
- {#if showAccountMenu}
-
-
+
+
+
-
-
-
-
- {$user.email}
-
-
-
- Account
+
+
+ {$user.email}
+
+
+
+ Account
- logout()}>Sign out
-
-
- Theme
-
- {
- setTimeout(() => {
- shouldAnimateThemeToggle = true;
- }, 150);
- }}
- buttons={[
- {
- id: 'light',
- label: 'Light',
- icon: IconSun
- },
- {
- id: 'dark',
- label: 'Dark',
- icon: IconMoon
- },
- {
- id: 'auto',
- label: 'System',
- icon: IconMode
- }
- ]}>
-
-
+
logout()}>Sign out
+
+
+ Theme
+
+ {
+ setTimeout(() => {
+ shouldAnimateThemeToggle = true;
+ }, 150);
+ }}
+ buttons={[
+ {
+ id: 'light',
+ label: 'Light',
+ icon: IconSun
+ },
+ {
+ id: 'dark',
+ label: 'Dark',
+ icon: IconMoon
+ },
+ {
+ id: 'auto',
+ label: 'System',
+ icon: IconMode
+ }
+ ]}>
-
+
-
-
-
- {/if}
+
+
+
@@ -405,24 +392,6 @@
}
}
- .account-container {
- position: absolute;
- right: var(--space-7);
- top: var(--base-44);
- width: 244px;
- display: flex;
- z-index: 1;
- }
-
- .account-backdrop {
- position: absolute;
- left: 0;
- top: 0;
- width: 100vw;
- height: 100vh;
- background-color: transparent;
- }
-
/* The default drop list has a max-inline width of 280px, which squeezes the support modal. */
:global(.extended-width) {
max-inline-size: none;
diff --git a/src/lib/stores/billing.ts b/src/lib/stores/billing.ts
index 5719023c0..c68f336c1 100644
--- a/src/lib/stores/billing.ts
+++ b/src/lib/stores/billing.ts
@@ -275,6 +275,7 @@ export function isServiceLimited(serviceId: PlanServices, plan: Tier, total: num
}
export function checkForEnterpriseTrial(org: Organization) {
+ if (!org || !org.billingNextInvoiceDate) return;
if (calculateEnterpriseTrial(org) > 0) {
headerAlert.add({
id: 'teamEnterpriseTrial',
diff --git a/src/routes/(console)/organization-[organization]/createProject.svelte b/src/routes/(console)/organization-[organization]/createProject.svelte
index 2e45d77c2..5e70a1acd 100644
--- a/src/routes/(console)/organization-[organization]/createProject.svelte
+++ b/src/routes/(console)/organization-[organization]/createProject.svelte
@@ -20,7 +20,7 @@
let error: string;
let showCustomId = false;
let disabled: boolean = false;
- let name: string = 'Appwrite project';
+ let name: string = 'New project';
async function create() {
try {
diff --git a/src/routes/(console)/organization-[organization]/createProjectCloud.svelte b/src/routes/(console)/organization-[organization]/createProjectCloud.svelte
index fa8dd9975..075f3d4c0 100644
--- a/src/routes/(console)/organization-[organization]/createProjectCloud.svelte
+++ b/src/routes/(console)/organization-[organization]/createProjectCloud.svelte
@@ -17,7 +17,7 @@
export let showCreateProjectCloud: boolean;
let id: string = null;
- let name: string = 'Appwrite project';
+ let name: string = 'New project';
let region: string = Region.Fra;
let error: string = null;
diff --git a/src/routes/(console)/organization-[organization]/header.svelte b/src/routes/(console)/organization-[organization]/header.svelte
index 86fe4a0c9..d4b2d16c9 100644
--- a/src/routes/(console)/organization-[organization]/header.svelte
+++ b/src/routes/(console)/organization-[organization]/header.svelte
@@ -8,7 +8,7 @@
import { isTabSelected } from '$lib/helpers/load';
import { Cover } from '$lib/layout';
import { daysLeftInTrial, getServiceLimit, plansInfo, readOnly } from '$lib/stores/billing';
- import { members, newMemberModal, organization } from '$lib/stores/organization';
+ import { members, newMemberModal, type Organization } from '$lib/stores/organization';
import {
canSeeBilling,
canSeeProjects,
@@ -18,20 +18,21 @@
} from '$lib/stores/roles';
import { GRACE_PERIOD_OVERRIDE, isCloud } from '$lib/system';
import { IconGithub, IconPlus } from '@appwrite.io/pink-icons-svelte';
- import { Icon, Tooltip, Typography, Layout, Badge } from '@appwrite.io/pink-svelte';
+ import { Badge, Icon, Layout, Tooltip, Typography } from '@appwrite.io/pink-svelte';
let areMembersLimited: boolean;
- $: organization.subscribe(() => {
+
+ $: {
const limit = getServiceLimit('members') || Infinity;
const isLimited = limit !== 0 && limit < Infinity;
areMembersLimited =
isCloud &&
(($readOnly && !GRACE_PERIOD_OVERRIDE) || (isLimited && $members?.total >= limit));
- });
+ }
+ $: organization = page.data.organization as Organization;
$: avatars = $members.memberships?.map((m) => m.userName || m.userEmail) ?? [];
- $: organizationId = $organization?.$id ?? page.params.organization;
- $: path = `${base}/organization-${organizationId}`;
+ $: path = `${base}/organization-${organization.$id}`;
$: tabs = [
{
href: path,
@@ -75,26 +76,26 @@
].filter((tab) => !tab.disabled);
-{#if $organization.$id}
+{#if organization?.$id}
- {$organization.name}
+ {organization.name}
- {#if isCloud && $organization?.billingPlan === BillingPlan.GITHUB_EDUCATION}
+ {#if isCloud && organization?.billingPlan === BillingPlan.GITHUB_EDUCATION}
- {:else if isCloud && $organization?.billingPlan === BillingPlan.FREE}
+ {:else if isCloud && organization?.billingPlan === BillingPlan.FREE}
{/if}
- {#if isCloud && $organization?.billingTrialStartDate && $daysLeftInTrial > 0 && $organization.billingPlan !== BillingPlan.FREE && $plansInfo.get($organization.billingPlan)?.trialDays}
+ {#if isCloud && organization?.billingTrialStartDate && $daysLeftInTrial > 0 && organization.billingPlan !== BillingPlan.FREE && $plansInfo.get(organization.billingPlan)?.trialDays}
{`Your trial ends on ${toLocaleDate(
- $organization.billingStartDate
+ organization.billingStartDate
)}. ${$daysLeftInTrial} days remaining.`}
diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte
index 3af8bb2e4..66faf1e8d 100644
--- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte
@@ -11,7 +11,7 @@
import { sortBranches } from '$lib/stores/vcs';
import { IconInfo } from '@appwrite.io/pink-icons-svelte';
import { LabelCard } from '$lib/components';
- import { Runtime, StatusCode, type Models } from '@appwrite.io/console';
+ import { type Models, ProxyResourceType, Runtime, StatusCode } from '@appwrite.io/console';
import { statusCodeOptions } from '$lib/stores/domains';
import { writable } from 'svelte/store';
import { onMount } from 'svelte';
@@ -48,18 +48,21 @@
async function addDomain() {
const apexDomain = getApexDomain(domainName);
- let domain = data.domains?.domains.find((d) => d.domain === apexDomain);
+ let domain = data.domains?.domains.find((d: Models.Domain) => d.domain === apexDomain);
if (apexDomain && !domain && isCloud) {
try {
domain = await sdk.forConsole.domains.create($project.teamId, apexDomain);
} catch (error) {
- addNotification({
- type: 'error',
- message: error.message
- });
-
- return;
+ // apex might already be added on organization level, skip.
+ const alreadyAdded = error?.type === 'domain_already_exists';
+ if (!alreadyAdded) {
+ addNotification({
+ type: 'error',
+ message: error.message
+ });
+ return;
+ }
}
}
@@ -72,7 +75,13 @@
} else if (behaviour === 'REDIRECT') {
rule = await sdk
.forProject(page.params.region, page.params.project)
- .proxy.createRedirectRule(domainName, redirect, statusCode);
+ .proxy.createRedirectRule(
+ domainName,
+ redirect,
+ statusCode,
+ page.params.function,
+ ProxyResourceType.Function
+ );
} else if (behaviour === 'ACTIVE') {
rule = await sdk
.forProject(page.params.region, page.params.project)
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 b9e50a3e8..ad574bf26 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
@@ -12,6 +12,7 @@
import { isCloud } from '$lib/system';
import { project } from '$routes/(console)/project-[region]-[project]/store';
import { getApexDomain } from '$lib/helpers/tlds';
+ import type { Models } from '@appwrite.io/console';
const routeBase = `${base}/project-${page.params.region}-${page.params.project}/settings/domains`;
@@ -29,18 +30,21 @@
async function addDomain() {
const apexDomain = getApexDomain(domainName);
- let domain = data.domains?.domains.find((d) => d.domain === apexDomain);
+ let domain = data.domains?.domains.find((d: Models.Domain) => d.domain === apexDomain);
if (apexDomain && !domain && isCloud) {
try {
domain = await sdk.forConsole.domains.create($project.teamId, apexDomain);
} catch (error) {
- addNotification({
- type: 'error',
- message: error.message
- });
-
- return;
+ // apex might already be added on organization level, skip.
+ const alreadyAdded = error?.type === 'domain_already_exists';
+ if (!alreadyAdded) {
+ addNotification({
+ type: 'error',
+ message: error.message
+ });
+ return;
+ }
}
}
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 ebe497444..a00f0c4b8 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
@@ -26,18 +26,10 @@ export const load = async ({ params, depends, url, route }) => {
.forProject(params.region, params.project)
.proxy.listRules(
[
- Query.or([
- 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('type', [RuleType.DEPLOYMENT, RuleType.REDIRECT]),
+ 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 ea8388747..af66889d3 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
@@ -16,13 +16,17 @@
BuildRuntime,
Framework,
type Models,
+ ProxyResourceType,
StatusCode
} from '@appwrite.io/console';
import { statusCodeOptions } from '$lib/stores/domains';
import { writable } from 'svelte/store';
import { onMount } from 'svelte';
import { ConnectRepoModal } from '$lib/components/git/index.js';
- import { project } from '$routes/(console)/project-[region]-[project]/store';
+ import {
+ project,
+ regionalConsoleVariables
+ } from '$routes/(console)/project-[region]-[project]/store';
import { isCloud } from '$lib/system';
import { getApexDomain } from '$lib/helpers/tlds';
@@ -53,17 +57,23 @@
async function addDomain() {
const apexDomain = getApexDomain(domainName);
- let domain = data.domains?.domains.find((d) => d.domain === apexDomain);
+ let domain = data.domains?.domains.find((d: Models.Domain) => d.domain === apexDomain);
- if (apexDomain && !domain && isCloud) {
+ const isSiteDomain = domainName.endsWith($regionalConsoleVariables._APP_DOMAIN_SITES);
+
+ if (isCloud && apexDomain && !domain && !isSiteDomain) {
try {
domain = await sdk.forConsole.domains.create($project.teamId, apexDomain);
} catch (error) {
- addNotification({
- type: 'error',
- message: error.message
- });
- return;
+ // apex might already be added on organization level, skip.
+ const alreadyAdded = error?.type === 'domain_already_exists';
+ if (!alreadyAdded) {
+ addNotification({
+ type: 'error',
+ message: error.message
+ });
+ return;
+ }
}
}
@@ -76,7 +86,13 @@
} else if (behaviour === 'REDIRECT') {
rule = await sdk
.forProject(page.params.region, page.params.project)
- .proxy.createRedirectRule(domainName, redirect, statusCode);
+ .proxy.createRedirectRule(
+ domainName,
+ redirect,
+ statusCode,
+ page.params.site,
+ ProxyResourceType.Site
+ );
} else if (behaviour === 'ACTIVE') {
rule = await sdk
.forProject(page.params.region, page.params.project)
diff --git a/src/routes/(public)/(guest)/register/+page.svelte b/src/routes/(public)/(guest)/register/+page.svelte
index 494918d8c..e166d5ffd 100644
--- a/src/routes/(public)/(guest)/register/+page.svelte
+++ b/src/routes/(public)/(guest)/register/+page.svelte
@@ -107,7 +107,7 @@
helper="Password must be at least 8 characters long"
required
bind:value={pass} />
-
+
By registering, you agree that you have read, understand, and acknowledge our General Terms of Use.
-
+
+
+
{#if isCloud}
or
-