diff --git a/src/lib/commandCenter/searchers/buckets.ts b/src/lib/commandCenter/searchers/buckets.ts index a3ede978cb..f49aa531f1 100644 --- a/src/lib/commandCenter/searchers/buckets.ts +++ b/src/lib/commandCenter/searchers/buckets.ts @@ -1,12 +1,9 @@ import { goto } from '$app/navigation'; import { sdk } from '$lib/stores/sdk'; -import { project } from '$routes/(console)/project-[region]-[project]/store'; import { Query, type Models } from '@appwrite.io/console'; -import { get } from 'svelte/store'; import type { Command, Searcher } from '../commands'; import { addSubPanel } from '../subPanels'; import { FilesPanel } from '../panels'; -import { base } from '$app/paths'; import { IconFolder, IconKey, @@ -15,21 +12,19 @@ import { IconSearch } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; +import { getProjectRoute } from '$lib/helpers/project'; const getBucketCommand = (bucket: Models.Bucket, region: string, projectId: string) => { return { label: `${bucket.name}`, - callback() { - goto(`${base}/project-${region}-${projectId}/storage/bucket-${bucket.$id}`); - }, + callback: () => + goto(getProjectRoute({ $id: projectId, region }, `/storage/bucket-${bucket.$id}`)), group: 'buckets', icon: IconFolder } satisfies Command; }; export const bucketSearcher = (async (query: string) => { - const $project = get(project); - const region = page.params.region; const { buckets } = await sdk .forProject(page.params.region, page.params.project) .storage.listBuckets([Query.orderDesc('$createdAt')]); @@ -39,13 +34,11 @@ export const bucketSearcher = (async (query: string) => { if (filtered.length === 1) { const bucket = filtered[0]; return [ - getBucketCommand(bucket, region, $project.$id), + getBucketCommand(bucket, page.params.region, page.params.project), { label: 'Find files', async callback() { - await goto( - `${base}/project-${$project.region}-${$project.$id}/storage/bucket-${bucket.$id}` - ); + await goto(getProjectRoute(`/storage/bucket-${bucket.$id}`)); addSubPanel(FilesPanel); }, group: 'buckets', @@ -57,7 +50,7 @@ export const bucketSearcher = (async (query: string) => { label: 'Permissions', async callback() { await goto( - `${base}/project-${$project.region}-${$project.$id}/storage/bucket-${bucket.$id}/settings#permissions` + getProjectRoute(`/storage/bucket-${bucket.$id}/settings#permissions`) ); scrollBy({ top: -100 }); }, @@ -69,7 +62,7 @@ export const bucketSearcher = (async (query: string) => { label: 'Extensions', async callback() { await goto( - `${base}/project-${$project.region}-${$project.$id}/storage/bucket-${bucket.$id}/settings#extensions` + getProjectRoute(`/storage/bucket-${bucket.$id}/settings#extensions`) ); }, group: 'buckets', @@ -80,7 +73,7 @@ export const bucketSearcher = (async (query: string) => { label: 'File Security', async callback() { await goto( - `${base}/project-${$project.region}-${$project.$id}/storage/bucket-${bucket.$id}/settings#file-security` + getProjectRoute(`/storage/bucket-${bucket.$id}/settings#file-security`) ); scrollBy({ top: -100 }); }, @@ -91,5 +84,7 @@ export const bucketSearcher = (async (query: string) => { ]; } - return filtered.map((bucket) => getBucketCommand(bucket, $project.region, $project.$id)); + return filtered.map((bucket) => + getBucketCommand(bucket, page.params.region, page.params.project) + ); }) satisfies Searcher; diff --git a/src/lib/commandCenter/searchers/collections.ts b/src/lib/commandCenter/searchers/collections.ts index c3ffaebe9e..7faf02ca5e 100644 --- a/src/lib/commandCenter/searchers/collections.ts +++ b/src/lib/commandCenter/searchers/collections.ts @@ -3,8 +3,8 @@ import { database } from '$routes/(console)/project-[region]-[project]/databases import { get } from 'svelte/store'; import type { Searcher } from '../commands'; import { sdk } from '$lib/stores/sdk'; -import { base } from '$app/paths'; import { page } from '$app/state'; +import { getProjectRoute } from '$lib/helpers/project'; export const collectionsSearcher = (async (query: string) => { const databaseId = get(database).$id; @@ -19,11 +19,12 @@ export const collectionsSearcher = (async (query: string) => { ({ group: 'collections', label: col.name, - callback: () => { + callback: () => goto( - `${base}/project-${page.params.region}-${page.params.project}/databases/database-${databaseId}/collection-${col.$id}` - ); - } + getProjectRoute( + `/databases/database-${databaseId}/collection-${col.$id}` + ) + ) }) as const ); }) satisfies Searcher; diff --git a/src/lib/commandCenter/searchers/databases.ts b/src/lib/commandCenter/searchers/databases.ts index f50a1474d6..356f7b5e81 100644 --- a/src/lib/commandCenter/searchers/databases.ts +++ b/src/lib/commandCenter/searchers/databases.ts @@ -1,9 +1,9 @@ import { goto } from '$app/navigation'; import type { Searcher } from '../commands'; import { sdk } from '$lib/stores/sdk'; -import { base } from '$app/paths'; import { IconDatabase } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; +import { getProjectRoute } from '$lib/helpers/project'; export const dbSearcher = (async (query: string) => { const { databases } = await sdk @@ -17,11 +17,7 @@ export const dbSearcher = (async (query: string) => { ({ group: 'databases', label: db.name, - callback: () => { - goto( - `${base}/project-${page.params.region}-${page.params.project}/databases/database-${db.$id}` - ); - }, + callback: () => goto(getProjectRoute(`/databases/database-${db.$id}`)), icon: IconDatabase }) as const ); diff --git a/src/lib/commandCenter/searchers/files.ts b/src/lib/commandCenter/searchers/files.ts index 8584417403..e6ae65b2fc 100644 --- a/src/lib/commandCenter/searchers/files.ts +++ b/src/lib/commandCenter/searchers/files.ts @@ -4,14 +4,12 @@ import type { Searcher } from '../commands'; import { bucket } from '$routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/store'; import { Query } from '@appwrite.io/console'; import { goto } from '$app/navigation'; -import { project } from '$routes/(console)/project-[region]-[project]/store'; -import { base } from '$app/paths'; import { IconDocument } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; +import { getProjectRoute } from '$lib/helpers/project'; export const fileSearcher = (async (query: string) => { const $bucket = get(bucket); - const $project = get(project); const { files } = await sdk .forProject(page.params.region, page.params.project) @@ -19,11 +17,7 @@ export const fileSearcher = (async (query: string) => { return files.map((file) => ({ label: file.name, - callback: () => { - goto( - `${base}/project-${$project.region}-${$project.$id}/storage/bucket-${$bucket.$id}/file-${file.$id}` - ); - }, + callback: () => goto(getProjectRoute(`/storage/bucket-${$bucket.$id}/file-${file.$id}`)), icon: IconDocument, group: 'files' })); diff --git a/src/lib/commandCenter/searchers/functions.ts b/src/lib/commandCenter/searchers/functions.ts index d28992964e..8ba19959fe 100644 --- a/src/lib/commandCenter/searchers/functions.ts +++ b/src/lib/commandCenter/searchers/functions.ts @@ -1,27 +1,23 @@ import { goto } from '$app/navigation'; import { sdk } from '$lib/stores/sdk'; -import { project } from '$routes/(console)/project-[region]-[project]/store'; -import { get } from 'svelte/store'; import type { Searcher } from '../commands'; import type { Models } from '@appwrite.io/console'; import { page } from '$app/state'; -import { showCreateDeployment } from '$routes/(console)/project-[region]-[project]/functions/function-[function]/store'; -import { base } from '$app/paths'; import { IconLightningBolt, IconPlus } from '@appwrite.io/pink-icons-svelte'; +import { getProjectRoute } from '$lib/helpers/project'; +import { showCreateDeployment } from '$routes/(console)/project-[region]-[project]/functions/function-[function]/store'; const getFunctionCommand = (fn: Models.Function, region: string, projectId: string) => { return { label: fn.name, - callback: () => { - goto(`${base}/project-${region}-${projectId}/functions/function-${fn.$id}`); - }, + callback: () => + goto(getProjectRoute({ $id: projectId, region }, `/functions/function-${fn.$id}`)), group: 'functions', icon: IconLightningBolt } as const; }; export const functionsSearcher = (async (query: string) => { - const projectId = get(project).$id; const { functions } = await sdk .forProject(page.params.region, page.params.project) .functions.list(); @@ -31,15 +27,13 @@ export const functionsSearcher = (async (query: string) => { if (filtered.length === 1) { const func = filtered[0]; return [ - getFunctionCommand(func, page.params.region, projectId), + getFunctionCommand(func, page.params.region, page.params.project), { label: 'Create deployment', nested: true, async callback() { if (!page.url.pathname.endsWith(func.$id)) { - await goto( - `${base}/project-${page.params.region}-${projectId}/functions/function-${func.$id}` - ); + await goto(getProjectRoute(`/functions/function-${func.$id}`)); } showCreateDeployment.set(true); }, @@ -50,9 +44,7 @@ export const functionsSearcher = (async (query: string) => { label: 'Go to deployments', nested: true, callback() { - goto( - `${base}/project-${page.params.region}-${projectId}/functions/function-${func.$id}` - ); + goto(getProjectRoute(`/functions/function-${func.$id}`)); }, group: 'functions' }, @@ -60,9 +52,7 @@ export const functionsSearcher = (async (query: string) => { label: 'Go to usage', nested: true, callback() { - goto( - `${base}/project-${page.params.region}-${projectId}/functions/function-${func.$id}/usage` - ); + goto(getProjectRoute(`/functions/function-${func.$id}/usage`)); }, group: 'functions' }, @@ -70,9 +60,7 @@ export const functionsSearcher = (async (query: string) => { label: 'Go to executions', nested: true, callback() { - goto( - `${base}/project-${page.params.region}-${projectId}/functions/function-${func.$id}/executions` - ); + goto(getProjectRoute(`/functions/function-${func.$id}/executions`)); }, group: 'functions' }, @@ -80,14 +68,12 @@ export const functionsSearcher = (async (query: string) => { label: 'Go to settings', nested: true, callback() { - goto( - `${base}/project-${page.params.region}-${projectId}/functions/function-${func.$id}/settings` - ); + goto(getProjectRoute(`/functions/function-${func.$id}/settings`)); }, group: 'functions' } ]; } - return filtered.map((fn) => getFunctionCommand(fn, page.params.region, projectId)); + return filtered.map((fn) => getFunctionCommand(fn, page.params.region, page.params.project)); }) satisfies Searcher; diff --git a/src/lib/commandCenter/searchers/messages.ts b/src/lib/commandCenter/searchers/messages.ts index e90db994bc..e553570bab 100644 --- a/src/lib/commandCenter/searchers/messages.ts +++ b/src/lib/commandCenter/searchers/messages.ts @@ -2,9 +2,9 @@ import { goto } from '$app/navigation'; import { type Searcher } from '../commands'; import { sdk } from '$lib/stores/sdk'; import { MessagingProviderType, type Models } from '@appwrite.io/console'; -import { base } from '$app/paths'; import { IconAnnotation, IconDeviceMobile, IconMail } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; +import { getProjectRoute } from '$lib/helpers/project'; const getLabel = (message: Models.Message) => { switch (message.providerType) { @@ -44,11 +44,7 @@ export const messagesSearcher = (async (query: string) => { ({ group: 'messages', label: getLabel(message), - callback: () => { - goto( - `${base}/project-${page.params.region}-${page.params.project}/messaging/message-${message.$id}` - ); - }, + callback: () => goto(getProjectRoute(`/messaging/message-${message.$id}`)), icon: getIcon(message) }) as const ); diff --git a/src/lib/commandCenter/searchers/projects.ts b/src/lib/commandCenter/searchers/projects.ts index 5787da93ca..ab51fc479f 100644 --- a/src/lib/commandCenter/searchers/projects.ts +++ b/src/lib/commandCenter/searchers/projects.ts @@ -4,7 +4,7 @@ import { sdk } from '$lib/stores/sdk'; import { Query } from '@appwrite.io/console'; import { get } from 'svelte/store'; import type { Searcher } from '../commands'; -import { base } from '$app/paths'; +import { getProjectRoute } from '$lib/helpers/project'; export const projectsSearcher = (async (query: string) => { const { projects } = await sdk.forConsole.projects.list([ @@ -17,9 +17,7 @@ export const projectsSearcher = (async (query: string) => { .map((project) => { return { label: project.name, - callback: () => { - goto(`${base}/project-${project.region}-${project.$id}`); - }, + callback: () => goto(getProjectRoute(project)), group: 'projects' } as const; }); diff --git a/src/lib/commandCenter/searchers/providers.ts b/src/lib/commandCenter/searchers/providers.ts index f2c154c45f..6ad18d160e 100644 --- a/src/lib/commandCenter/searchers/providers.ts +++ b/src/lib/commandCenter/searchers/providers.ts @@ -2,8 +2,8 @@ import { goto } from '$app/navigation'; import type { Searcher } from '../commands'; import { sdk } from '$lib/stores/sdk'; import { getProviderDisplayNameAndIcon } from '$routes/(console)/project-[region]-[project]/messaging/provider.svelte'; -import { base } from '$app/paths'; import { page } from '$app/state'; +import { getProjectRoute } from '$lib/helpers/project'; const getIcon = (provider: string) => { const { icon } = getProviderDisplayNameAndIcon(provider); @@ -22,11 +22,8 @@ export const providersSearcher = (async (query: string) => { ({ group: 'providers', label: provider.name, - callback: () => { - goto( - `${base}/project-${page.params.region}-${page.params.project}/messaging/providers/provider-${provider.$id}` - ); - }, + callback: () => + goto(getProjectRoute(`/messaging/providers/provider-${provider.$id}`)), image: getIcon(provider.provider) }) as const ); diff --git a/src/lib/commandCenter/searchers/teams.ts b/src/lib/commandCenter/searchers/teams.ts index ba8d76ca9f..526bf52a13 100644 --- a/src/lib/commandCenter/searchers/teams.ts +++ b/src/lib/commandCenter/searchers/teams.ts @@ -2,16 +2,15 @@ import { goto } from '$app/navigation'; import { sdk } from '$lib/stores/sdk'; import type { Command, Searcher } from '../commands'; import type { Models } from '@appwrite.io/console'; -import { base } from '$app/paths'; import { IconUserCircle } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; +import { getProjectRoute } from '$lib/helpers/project'; const getTeamCommand = (team: Models.Team, region: string, projectId: string) => ({ label: team.name, - callback: () => { - goto(`${base}/project-${region}-${projectId}/auth/teams/team-${team.$id}`); - }, + callback: () => + goto(getProjectRoute({ $id: projectId, region }, `/auth/teams/team-${team.$id}`)), group: 'teams', icon: IconUserCircle }) satisfies Command; @@ -26,22 +25,14 @@ export const teamSearcher = (async (query: string) => { getTeamCommand(teams[0], page.params.region, page.params.project), { label: 'Go to members', - callback: () => { - goto( - `${base}/project-${page.params.region}-${page.params.project}/auth/teams/team-${teams[0].$id}/members` - ); - }, + callback: () => goto(getProjectRoute(`/auth/teams/team-${teams[0].$id}/members`)), group: 'teams', nested: true }, { label: 'Go to activity', - callback: () => { - goto( - `${base}/project-${page.params.region}-${page.params.project}/auth/teams/team-${teams[0].$id}/activity` - ); - }, + callback: () => goto(getProjectRoute(`/auth/teams/team-${teams[0].$id}/activity`)), group: 'teams', nested: true } diff --git a/src/lib/commandCenter/searchers/topics.ts b/src/lib/commandCenter/searchers/topics.ts index a2407c39a0..3646a33a8b 100644 --- a/src/lib/commandCenter/searchers/topics.ts +++ b/src/lib/commandCenter/searchers/topics.ts @@ -1,9 +1,9 @@ import { goto } from '$app/navigation'; import type { Searcher } from '../commands'; import { sdk } from '$lib/stores/sdk'; -import { base } from '$app/paths'; import { IconChevronRight } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; +import { getProjectRoute } from '$lib/helpers/project'; export const topicsSearcher = (async (query: string) => { const { topics } = await sdk @@ -17,11 +17,7 @@ export const topicsSearcher = (async (query: string) => { ({ group: 'topics', label: topic.name, - callback: () => { - goto( - `${base}/project-${page.params.region}-${page.params.project}/messaging/topics/topic-${topic.$id}` - ); - }, + callback: () => goto(getProjectRoute(`/messaging/topics/topic-${topic.$id}`)), icon: IconChevronRight // TODO: @itznotabug - 'send' no replacement yet. }) as const ); diff --git a/src/lib/commandCenter/searchers/users.ts b/src/lib/commandCenter/searchers/users.ts index 197b15e890..d9cbf055ab 100644 --- a/src/lib/commandCenter/searchers/users.ts +++ b/src/lib/commandCenter/searchers/users.ts @@ -3,16 +3,14 @@ import { sdk } from '$lib/stores/sdk'; import type { Command, Searcher } from '../commands'; import type { Models } from '@appwrite.io/console'; import { promptDeleteUser } from '$routes/(console)/project-[region]-[project]/auth/user-[user]/dangerZone.svelte'; -import { base } from '$app/paths'; import { IconTrash, IconUserCircle } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; +import { getProjectRoute } from '$lib/helpers/project'; const getUserCommand = (user: Models.User, region: string, projectId: string) => ({ label: user.name, - callback: () => { - goto(`${base}/project-${region}-${projectId}/auth/user-${user.$id}`); - }, + callback: () => goto(getProjectRoute({ region, $id: projectId }, `/auth/user-${user.$id}`)), group: 'users', icon: IconUserCircle }) satisfies Command; @@ -36,31 +34,19 @@ export const userSearcher = (async (query: string) => { }, { label: 'Go to activity', - callback: () => { - goto( - `${base}/project-${page.params.region}-${page.params.project}/auth/user-${users[0].$id}/activity` - ); - }, + callback: () => goto(getProjectRoute(`/auth/user-${users[0].$id}/activity`)), group: 'users', nested: true }, { label: 'Go to sessions', - callback: () => { - goto( - `${base}/project-${page.params.region}-${page.params.project}/auth/user-${users[0].$id}/sessions` - ); - }, + callback: () => goto(getProjectRoute(`/auth/user-${users[0].$id}/sessions`)), group: 'users', nested: true }, { label: 'Go to memberships', - callback: () => { - goto( - `${base}/project-${page.params.region}-${page.params.project}/auth/user-${users[0].$id}/memberships` - ); - }, + callback: () => goto(getProjectRoute(`/auth/user-${users[0].$id}/memberships`)), group: 'users', nested: true } diff --git a/src/lib/components/backupRestoreBox.svelte b/src/lib/components/backupRestoreBox.svelte index 1598341f79..716bfba12f 100644 --- a/src/lib/components/backupRestoreBox.svelte +++ b/src/lib/components/backupRestoreBox.svelte @@ -9,8 +9,7 @@ import { goto, invalidate } from '$app/navigation'; import { page } from '$app/state'; import { addNotification } from '$lib/stores/notifications'; - import { base } from '$app/paths'; - import { getProjectId } from '$lib/helpers/project'; + import { getProjectId, getProjectRoute } from '$lib/helpers/project'; import { toLocaleDate } from '$lib/helpers/date'; import { Typography } from '@appwrite.io/pink-svelte'; @@ -34,8 +33,6 @@ function showRestoreNotification(newDatabaseId: string, newDatabaseName: string) { if (newDatabaseId && newDatabaseName && lastDatabaseRestorationId !== newDatabaseId) { - const region = page.params.region; - const project = page.params.project; lastDatabaseRestorationId = newDatabaseId; addNotification({ @@ -46,9 +43,7 @@ { name: 'View restored data', method: () => { - goto( - `${base}/project-${region}-${project}/databases/database-${newDatabaseId}` - ); + goto(getProjectRoute(`/databases/database-${newDatabaseId}`)); } } ] diff --git a/src/lib/components/breadcrumbs.svelte b/src/lib/components/breadcrumbs.svelte index 01f8c72a22..fd632f295a 100644 --- a/src/lib/components/breadcrumbs.svelte +++ b/src/lib/components/breadcrumbs.svelte @@ -15,6 +15,7 @@ import { currentPlan, newOrgModal } from '$lib/stores/organization'; import { Click, trackEvent } from '$lib/actions/analytics'; import { page } from '$app/stores'; + import { getProjectRoute } from '$lib/helpers/project'; type Project = { name: string; @@ -141,7 +142,7 @@ if (index < 4) { return { name: project.name, - href: `${base}/project-${project.region}-${project.$id}/overview` + href: getProjectRoute(project, '/overview') }; } else if (index === 4) { return { @@ -325,8 +326,7 @@ {#if index < 4}
- + {project.name} diff --git a/src/lib/components/columnSelector.svelte b/src/lib/components/columnSelector.svelte index c113d5e9ca..07c5973fde 100644 --- a/src/lib/components/columnSelector.svelte +++ b/src/lib/components/columnSelector.svelte @@ -19,7 +19,7 @@ } = $props(); let maxHeight = $state('none'); - let containerRef; + let containerRef = $state(null); const calcMaxHeight = () => { if (containerRef) { diff --git a/src/lib/components/csvImportBox.svelte b/src/lib/components/csvImportBox.svelte index 8c0e48b8a3..5726bdeaee 100644 --- a/src/lib/components/csvImportBox.svelte +++ b/src/lib/components/csvImportBox.svelte @@ -1,11 +1,10 @@ @@ -10,16 +10,14 @@ {#if product === 'site'} To view logs and errors, enable them in your - + site settings. {:else if product === 'function'} To view execution logs and errors, enable them in your - + function settings. diff --git a/src/lib/components/navbar.svelte b/src/lib/components/navbar.svelte index 8764b58cc1..49215d7e43 100644 --- a/src/lib/components/navbar.svelte +++ b/src/lib/components/navbar.svelte @@ -55,6 +55,7 @@ import { Click, trackEvent } from '$lib/actions/analytics'; import type { HTMLAttributes } from 'svelte/elements'; import { beforeNavigate } from '$app/navigation'; + import { getProjectRoute } from '$lib/helpers/project'; let showSupport = false; @@ -138,9 +139,9 @@ {#if selectedProject && selectedProject.pingCount === 0}
Connect + href={getProjectRoute(selectedProject, '/get-started')}>Connect
{/if}
diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte index 31a6fd4db5..840541803c 100644 --- a/src/lib/components/permissions/row.svelte +++ b/src/lib/components/permissions/row.svelte @@ -14,8 +14,8 @@ } from '@appwrite.io/pink-svelte'; import Avatar from '../avatar.svelte'; import { IconAnonymous, IconExternalLink, IconMinusSm } from '@appwrite.io/pink-icons-svelte'; - import { base } from '$app/paths'; import { page } from '$app/state'; + import { getProjectRoute } from '$lib/helpers/project'; export let role: string; @@ -88,7 +88,7 @@ {/if}
@@ -100,7 +100,7 @@ Members: {data?.total}
diff --git a/src/lib/helpers/project.ts b/src/lib/helpers/project.ts index 58cfe7bcc5..77d4716c21 100644 --- a/src/lib/helpers/project.ts +++ b/src/lib/helpers/project.ts @@ -1,6 +1,8 @@ +import { base } from '$app/paths'; import { page } from '$app/state'; import { get } from 'svelte/store'; import { sdk } from '$lib/stores/sdk'; +import type { Models } from '@appwrite.io/console'; import { projectRegion } from '$routes/(console)/project-[region]-[project]/store'; /** @@ -42,3 +44,48 @@ export function getProjectEndpoint(): string { return currentProjectRegion ? `${protocol}//${currentProjectRegion.$id}.${hostname}/v1` : href; } + +/** + * A minimal project shape with - + * 1. `$id` and + * 2. optional `region`. + * + * Compatible with full `Models.Project`. + */ +type CompatibleProjectInstance = + | Models.Project + | { + $id: string; + region?: string; + }; + +/** + * Generates the project route URL, optionally using a custom project and/or path. + * Falls back to the current route's project and region if not provided. + * + * @param projectOrPath Either a project object or a path string (e.g., "/databases"). + * @param maybePath Optional path string if the first argument is a project. + * + * @returns Project route URL (e.g., "/project-fra-console/databases"). + */ +export function getProjectRoute( + projectOrPath?: string | CompatibleProjectInstance, + maybePath?: string +): string { + let withPath: string | undefined; + let projectInstance: CompatibleProjectInstance | undefined; + + if (typeof projectOrPath === 'string') { + withPath = projectOrPath; + projectInstance = undefined; + } else { + withPath = maybePath; + projectInstance = projectOrPath; + } + + const projectId = projectInstance?.$id ?? page?.params?.project; + const projectRegion = projectInstance?.region ?? page?.params?.region ?? 'default'; + const suffix = withPath?.trim() ? (withPath.startsWith('/') ? withPath : `/${withPath}`) : ''; + + return `${base}/project-${projectRegion}-${projectId}${suffix}`; +} diff --git a/src/routes/(console)/(migration-wizard)/wizard.svelte b/src/routes/(console)/(migration-wizard)/wizard.svelte index 99c23b7d24..03f5364c70 100644 --- a/src/routes/(console)/(migration-wizard)/wizard.svelte +++ b/src/routes/(console)/(migration-wizard)/wizard.svelte @@ -23,7 +23,6 @@ import { regions } from '$lib/stores/organization'; import { addNotification } from '$lib/stores/notifications'; import { goto, invalidate } from '$app/navigation'; - import { base } from '$app/paths'; import { migrationFormToResources } from '$lib/stores/migration'; import { EyebrowHeading } from '$lib/components'; import { @@ -35,6 +34,7 @@ } from '@appwrite.io/pink-icons-svelte'; import { Dependencies } from '$lib/constants'; import { filterRegions } from '$lib/helpers/regions'; + import { getProjectRoute } from '$lib/helpers/project'; const onExit = () => { formData.reset(); @@ -123,9 +123,7 @@ }); onExit(); await invalidate(Dependencies.PROJECTS); - await goto( - `${base}/project-${currentSelectedProject.region}-${currentSelectedProject.$id}/settings/migrations` - ); + await goto(`${getProjectRoute(currentSelectedProject, '/settings/migrations')}`); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/(console)/+layout.svelte b/src/routes/(console)/+layout.svelte index dcdbf20111..7762e1fc52 100644 --- a/src/routes/(console)/+layout.svelte +++ b/src/routes/(console)/+layout.svelte @@ -55,6 +55,7 @@ } from '@appwrite.io/pink-icons-svelte'; import type { LayoutData } from './$types'; import type { NavbarProject } from '$lib/components/navbar.svelte'; + import { getProjectRoute } from '$lib/helpers/project'; function kebabToSentenceCase(str: string) { return str @@ -176,9 +177,7 @@ ({ label: kebabToSentenceCase(heading), async callback() { - await goto( - `${base}/project-${$project.region}-${$project.$id}/auth/security#${heading}` - ); + await goto(getProjectRoute($project, `/auth/security#${heading}`)); scrollBy({ top: -100 }); }, disabled: !$project?.$id, @@ -192,7 +191,7 @@ keys: isOnSettingsLayout ? ['g', 'o'] : undefined, callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/settings`); + goto(getProjectRoute('/settings')); }, disabled: !$project?.$id || (isOnSettingsLayout && page.url.pathname.endsWith('settings')), @@ -204,7 +203,7 @@ keys: isOnSettingsLayout ? ['g', 'd'] : undefined, callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/settings/domains`); + goto(getProjectRoute('/settings/domains')); }, disabled: !$project?.$id || (isOnSettingsLayout && page.url.pathname.includes('domains')), @@ -215,7 +214,7 @@ label: 'Go to webhooks', keys: isOnSettingsLayout ? ['g', 'w'] : undefined, callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/settings/webhooks`); + goto(getProjectRoute('/settings/webhooks')); }, disabled: !$project?.$id || (isOnSettingsLayout && page.url.pathname.includes('webhooks')), @@ -227,7 +226,7 @@ label: 'Go to migrations', keys: isOnSettingsLayout ? ['g', 'm'] : undefined, callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/settings/migrations`); + goto(getProjectRoute('/settings/migrations')); }, disabled: !$project?.$id || (isOnSettingsLayout && page.url.pathname.includes('migrations')), @@ -239,7 +238,7 @@ label: 'Go to SMTP settings', keys: isOnSettingsLayout ? ['g', 's'] : undefined, callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/settings/smtp`); + goto(getProjectRoute('/settings/smtp')); }, disabled: !$project?.$id || (isOnSettingsLayout && page.url.pathname.includes('smtp')), group: isOnSettingsLayout ? 'navigation' : 'settings', diff --git a/src/routes/(console)/onboarding/create-project/+page.svelte b/src/routes/(console)/onboarding/create-project/+page.svelte index a2ff8844c5..8ac07ab2cf 100644 --- a/src/routes/(console)/onboarding/create-project/+page.svelte +++ b/src/routes/(console)/onboarding/create-project/+page.svelte @@ -7,12 +7,12 @@ import { Dependencies } from '$lib/constants'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { goto, invalidate } from '$app/navigation'; - import { base } from '$app/paths'; import { addNotification } from '$lib/stores/notifications'; import CreateProject from '$lib/layout/createProject.svelte'; import { loadAvailableRegions } from '$routes/(console)/regions'; import { regions as regionsStore } from '$lib/stores/organization'; import { user } from '$lib/stores/user'; + import { getProjectRoute } from '$lib/helpers/project'; let isLoading = false; let id: string; @@ -56,7 +56,7 @@ setTimeout(async () => { await invalidate(Dependencies.ACCOUNT); - goto(`${base}/project-${project.region ?? 'default'}-${project.$id}`); + goto(getProjectRoute(project)); }, 3000); } catch (e) { trackError(e, Submit.ProjectCreate); diff --git a/src/routes/(console)/organization-[organization]/+page.svelte b/src/routes/(console)/organization-[organization]/+page.svelte index c8ff1fa844..1a77143651 100644 --- a/src/routes/(console)/organization-[organization]/+page.svelte +++ b/src/routes/(console)/organization-[organization]/+page.svelte @@ -1,5 +1,4 @@ diff --git a/src/routes/(console)/organization-[organization]/usage/[[invoice]]/ProjectBreakdown.svelte b/src/routes/(console)/organization-[organization]/usage/[[invoice]]/ProjectBreakdown.svelte index 36be4abcc8..7df4389666 100644 --- a/src/routes/(console)/organization-[organization]/usage/[[invoice]]/ProjectBreakdown.svelte +++ b/src/routes/(console)/organization-[organization]/usage/[[invoice]]/ProjectBreakdown.svelte @@ -5,8 +5,8 @@ import { canSeeProjects } from '$lib/stores/roles'; import { onMount } from 'svelte'; import { Accordion, Table } from '@appwrite.io/pink-svelte'; - import { base } from '$app/paths'; import type { PageData } from './$types'; + import { getProjectRoute } from '$lib/helpers/project'; type Metric = | 'users' @@ -39,7 +39,7 @@ function getProjectUsageLink(projectId: string): string { const region = data.projects[projectId]?.region ?? 'fra'; - return `${base}/project-${region}-${projectId}/settings/usage`; + return getProjectRoute({ region, $id: projectId }, '/settings/usage'); } // function getProjectName(projectId: string): string { diff --git a/src/routes/(console)/project-[region]-[project]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/+layout.svelte index 0254a8cdc2..540f17a446 100644 --- a/src/routes/(console)/project-[region]-[project]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/+layout.svelte @@ -2,7 +2,7 @@ import { BackupRestoreBox, MigrationBox, UploadBox } from '$lib/components'; import { realtime } from '$lib/stores/sdk'; import { onMount } from 'svelte'; - import { project, stats } from './store'; + import { stats } from './store'; import { goto } from '$app/navigation'; import { registerCommands, registerSearchers } from '$lib/commandCenter'; @@ -15,7 +15,6 @@ userSearcher } from '$lib/commandCenter/searchers'; import { page } from '$app/state'; - import { base } from '$app/paths'; import { canSeeBuckets, canSeeDatabases, @@ -25,6 +24,7 @@ canWriteSites } from '$lib/stores/roles'; import CsvImportBox from '$lib/components/csvImportBox.svelte'; + import { getProjectRoute } from '$lib/helpers/project'; onMount(() => { return realtime @@ -42,7 +42,7 @@ { label: 'Go to Auth', callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/auth`); + goto(getProjectRoute('/auth')); }, keys: ['g', 'a'], group: 'navigation' @@ -50,7 +50,7 @@ { label: 'Go to Databases', callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/databases`); + goto(getProjectRoute('/databases')); }, keys: ['g', 'd'], group: 'navigation', @@ -59,7 +59,7 @@ { label: 'Go to Functions', callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/functions`); + goto(getProjectRoute('/functions')); }, keys: ['g', 'f'], group: 'navigation', @@ -68,7 +68,7 @@ { label: 'Go to Messaging', callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/messaging`); + goto(getProjectRoute('/messaging')); }, keys: ['g', 'm'], disabled: page.url.pathname.endsWith('messaging') || !$canSeeMessages, @@ -77,7 +77,7 @@ { label: 'Go to Storage', callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/storage`); + goto(getProjectRoute('/storage')); }, keys: ['g', 's'], group: 'navigation', @@ -86,7 +86,7 @@ { label: 'Go to Settings', callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/settings`); + goto(getProjectRoute('/settings')); }, keys: ['g', 'e'], group: 'navigation', @@ -95,7 +95,7 @@ { label: 'Go to Sites', callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}/sites`); + goto(getProjectRoute('/sites')); }, keys: ['g', 'i'], group: 'navigation', @@ -104,7 +104,7 @@ { label: 'Go to Overview', callback: () => { - goto(`${base}/project-${$project.region}-${$project.$id}`); + goto(getProjectRoute()); }, keys: ['g', 'o'], group: 'navigation' diff --git a/src/routes/(console)/project-[region]-[project]/+page.ts b/src/routes/(console)/project-[region]-[project]/+page.ts index 9aaf5f0796..bfbc4906a3 100644 --- a/src/routes/(console)/project-[region]-[project]/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/+page.ts @@ -1,11 +1,13 @@ import { redirect } from '@sveltejs/kit'; -import { base } from '$app/paths'; import type { PageLoad } from './$types'; import { hasOnboardingDismissed } from '$lib/helpers/onboarding'; +import { getProjectRoute } from '$lib/helpers/project'; export const load: PageLoad = async ({ params }) => { + const projectInstance = { $id: params.project, region: params.region }; + if (hasOnboardingDismissed(params.project)) { - redirect(302, `${base}/project-${params.region}-${params.project}/overview`); + redirect(302, getProjectRoute(projectInstance, '/overview')); } - redirect(302, `${base}/project-${params.region}-${params.project}/get-started`); + redirect(302, getProjectRoute(projectInstance, '/get-started')); }; diff --git a/src/routes/(console)/project-[region]-[project]/auth/+layout.svelte b/src/routes/(console)/project-[region]-[project]/auth/+layout.svelte index 674167aa30..6aee41a31d 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/+layout.svelte @@ -1,23 +1,22 @@ @@ -75,9 +72,7 @@ {/each} {#each data.users.users as user} - + {#each $columns as { id } (id)} {#if id === '$id'} @@ -162,10 +157,7 @@ total={data.users.total} /> {:else if data.search} - + {:else} - import { base } from '$app/paths'; import { page } from '$app/state'; import { Tab, Tabs } from '$lib/components'; import { isTabSelected } from '$lib/helpers/load'; import { Cover } from '$lib/layout'; import { canWriteProjects } from '$lib/stores/roles'; import { Typography } from '@appwrite.io/pink-svelte'; + import { getProjectRoute } from '$lib/helpers/project'; - const path = `${base}/project-${page.params.region}-${page.params.project}/auth`; + const path = getProjectRoute('/auth'); const tabs = [ { href: path, diff --git a/src/routes/(console)/project-[region]-[project]/auth/teams/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/+page.svelte index cbefb02fb1..800579a172 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/teams/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/+page.svelte @@ -3,7 +3,6 @@ @@ -53,9 +50,7 @@ Created {#each data.teams.teams as team} - + @@ -79,9 +74,7 @@ total={data.teams.total} /> {:else if data.search} - + {:else} import { base } from '$app/paths'; - import { page } from '$app/state'; import { Breadcrumbs } from '$lib/layout'; import { organization } from '$lib/stores/organization'; import { project } from '../../../store'; import { team } from './store'; + import { getProjectRoute } from '$lib/helpers/project'; $: breadcrumbs = [ { @@ -12,15 +12,15 @@ title: $organization?.name }, { - href: `${base}/project-${page.params.region}-${page.params.project}`, + href: getProjectRoute(), title: $project?.name }, { - href: `${base}/project-${page.params.region}-${page.params.project}/auth`, + href: getProjectRoute('/auth'), title: 'Auth' }, { - href: `${base}/project-${page.params.region}-${page.params.project}/auth/teams/team-${$team?.$id}`, + href: getProjectRoute(`/auth/teams/team-${$team?.$id}`), title: $team?.name } ]; diff --git a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/deleteMembership.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/deleteMembership.svelte index 9aa4e66854..8c7804ff2b 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/deleteMembership.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/deleteMembership.svelte @@ -1,6 +1,5 @@ diff --git a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/deleteMembership.svelte b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/deleteMembership.svelte index 88d2ebc1bb..1337ed7c57 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/user-[user]/deleteMembership.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/user-[user]/deleteMembership.svelte @@ -1,6 +1,5 @@ @@ -38,7 +34,7 @@ {#each data.memberships.memberships as membership} + href={getProjectRoute(`/auth/teams/team-${membership.teamId}`)}> diff --git a/src/routes/(console)/project-[region]-[project]/createVariableModal.svelte b/src/routes/(console)/project-[region]-[project]/createVariableModal.svelte index 0cf5fa2135..73fac40201 100644 --- a/src/routes/(console)/project-[region]-[project]/createVariableModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/createVariableModal.svelte @@ -4,11 +4,10 @@ import { InputText } from '$lib/elements/forms'; import { createEventDispatcher } from 'svelte'; import type { Models } from '@appwrite.io/console'; - import { project } from './store'; - import { base } from '$app/paths'; import { Alert, Layout, Selector, Button as PinkButton, Icon } from '@appwrite.io/pink-svelte'; import { Link } from '$lib/elements'; import { IconPlus, IconX } from '@appwrite.io/pink-icons-svelte'; + import { getProjectRoute } from '$lib/helpers/project'; export let isGlobal: boolean; export let product: 'function' | 'site' = 'function'; @@ -61,7 +60,7 @@ {#if !isGlobal} When there is a naming conflict with a global variable in your + href={getProjectRoute('/settings/variables')}> project settings and a {product} environment variable, the global variable will be ignored. diff --git a/src/routes/(console)/project-[region]-[project]/databases/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/+layout.svelte index 7e8347e4da..3d1799a48d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/+layout.svelte @@ -1,16 +1,15 @@ @@ -18,7 +19,9 @@ event="collection"> {#each data.collections.collections as collection} + href={getProjectRoute( + `/databases/database-${databaseId}/collection-${collection.$id}` + )}> {collection.name} {#if !collection.enabled} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte index e220dba394..654f762903 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte @@ -1,15 +1,14 @@ {#each data.databases.databases as database} - + {database.name} {#if data.lastBackups && data.lastBackups[database.$id]} diff --git a/src/routes/(console)/project-[region]-[project]/databases/header.svelte b/src/routes/(console)/project-[region]-[project]/databases/header.svelte index 796c86d09f..6f5d1c9443 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/header.svelte @@ -1,13 +1,12 @@ @@ -17,10 +16,6 @@ {repository?.organization}/{repository?.name} - + diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte index 39646b9062..bac001147c 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte @@ -1,6 +1,5 @@ - + Deployment {$deployment.$id} diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/+page.svelte index 3e30d3a86f..7305c6533e 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/+page.svelte @@ -13,6 +13,7 @@ import { app } from '$lib/stores/app'; import { Click, trackEvent } from '$lib/actions/analytics'; import Table from './table.svelte'; + import { getProjectRoute } from '$lib/helpers/project'; let { data } = $props(); @@ -25,7 +26,7 @@ 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 66faf1e8dc..b5d835a242 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 @@ -1,5 +1,4 @@ @@ -41,7 +40,7 @@ diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte index fdfdfdb145..5435ccbe97 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/table.svelte @@ -13,7 +13,6 @@ import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import Cancel from './(modals)/cancelDeploymentModal.svelte'; - import { base } from '$app/paths'; import { ActionMenu, Badge, @@ -39,6 +38,7 @@ import { Menu } from '$lib/components/menu'; import { sdk } from '$lib/stores/sdk'; import { addNotification } from '$lib/stores/notifications'; + import { getProjectRoute } from '$lib/helpers/project'; export let columns: Column[]; export let data: PageData; @@ -103,7 +103,9 @@ + href={getProjectRoute( + `/functions/function-${page.params.function}/deployment-${deployment.$id}` + )}> {#each columns as column} {#if column.id === '$id'} diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte index 30c05dd10d..cae354000a 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte @@ -1,21 +1,21 @@ {#if count} - import { base } from '$app/paths'; import { page } from '$app/state'; import { Tab, Tabs } from '$lib/components'; import { isTabSelected } from '$lib/helpers/load'; import { Cover } from '$lib/layout'; import { Typography } from '@appwrite.io/pink-svelte'; + import { getProjectRoute } from '$lib/helpers/project'; - $: projectId = page.params.project; - $: path = `${base}/project-${page.params.region}-${projectId}/functions`; + $: path = getProjectRoute('/functions'); $: tabs = [ { href: path, diff --git a/src/routes/(console)/project-[region]-[project]/functions/templates/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/templates/+page.svelte index de53032daf..6e711a96a8 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/templates/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/templates/+page.svelte @@ -1,6 +1,5 @@ - + {$template.name} {$template.id} diff --git a/src/routes/(console)/project-[region]-[project]/functions/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/usage/[[period]]/+page.svelte index a91d5a6f3f..f2e6d11ec6 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/usage/[[period]]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/usage/[[period]]/+page.svelte @@ -1,7 +1,6 @@ @@ -18,7 +17,7 @@ {#each Object.entries(providers) as [type, option]} + href={getProjectRoute(`/messaging/create-${type}`)}> {option.name} {/each} diff --git a/src/routes/(console)/project-[region]-[project]/messaging/header.svelte b/src/routes/(console)/project-[region]-[project]/messaging/header.svelte index d0e5082cf1..c8d9545393 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/header.svelte @@ -1,12 +1,12 @@ - + {$message.data.title ?? $message.data.subject ?? $message.data.content ?? 'Message'} {$message.$id} diff --git a/src/routes/(console)/project-[region]-[project]/messaging/providers/+page.svelte b/src/routes/(console)/project-[region]-[project]/messaging/providers/+page.svelte index 8aed8a13be..047a775ce4 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/providers/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/providers/+page.svelte @@ -1,5 +1,4 @@ @@ -57,11 +56,7 @@ Sorry, we couldn't find '{data.search}'

There are no providers that match your search.

- + {:else} diff --git a/src/routes/(console)/project-[region]-[project]/messaging/providers/create.svelte b/src/routes/(console)/project-[region]-[project]/messaging/providers/create.svelte index 5b8cef881f..4dd11ce2fa 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/providers/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/providers/create.svelte @@ -5,8 +5,6 @@ import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { addNotification } from '$lib/stores/notifications'; import { goto } from '$app/navigation'; - import { base } from '$app/paths'; - import { project } from '../../store'; import { wizard } from '$lib/stores/wizard'; import { provider, providerParams, providerType } from './wizard/store'; import { ID, MessagingProviderType, type Models } from '@appwrite.io/console'; @@ -20,6 +18,7 @@ import { getProviderText } from '../helper'; import { providers } from './store'; import CreateMember from '$routes/(console)/organization-[organization]/createMember.svelte'; + import { getProjectRoute } from '$lib/helpers/project'; async function create() { try { @@ -169,9 +168,7 @@ trackEvent(Submit.MessagingProviderCreate, { provider: $provider }); - await goto( - `${base}/project-${$project.region}-${$project.$id}/messaging/providers/provider-${response.$id}` - ); + await goto(getProjectRoute(`/messaging/providers/provider-${response.$id}`)); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/breadcrumbs.svelte b/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/breadcrumbs.svelte index 09e63d399a..02de2832cc 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/breadcrumbs.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/breadcrumbs.svelte @@ -4,6 +4,7 @@ import { organization } from '$lib/stores/organization'; import { project } from '$routes/(console)/project-[region]-[project]/store'; import { provider } from './store'; + import { getProjectRoute } from '$lib/helpers/project'; $: breadcrumbs = [ { @@ -11,15 +12,15 @@ title: $organization.name }, { - href: `${base}/project-${$project.region}-${$project.$id}`, + href: getProjectRoute(), title: $project.name }, { - href: `${base}/project-${$project.region}-${$project.$id}/messaging`, + href: getProjectRoute('/messaging'), title: 'Messaging' }, { - href: `${base}/project-${$project.region}-${$project.$id}/messaging/providers/provider-${$provider?.$id}`, + href: getProjectRoute(`/messaging/providers/provider-${$provider?.$id}`), title: $provider?.name } ]; diff --git a/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/dangerZone.svelte b/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/dangerZone.svelte index a5f725ed59..4d39f78f77 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/dangerZone.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/dangerZone.svelte @@ -1,25 +1,22 @@ diff --git a/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte b/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte index cb0eb24a81..75f8e2fcf8 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/providers/provider-[provider]/deleteProvider.svelte @@ -1,6 +1,5 @@ - + {$provider?.name ? $provider?.name : '-'} {$provider?.$id} diff --git a/src/routes/(console)/project-[region]-[project]/messaging/providers/table.svelte b/src/routes/(console)/project-[region]-[project]/messaging/providers/table.svelte index 47f1b776e1..9e47ee2037 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/providers/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/providers/table.svelte @@ -1,12 +1,10 @@ @@ -102,11 +97,7 @@ Sorry, we couldn't find '{data.search}'

There are no topics that match your search.

- + {:else} - import { base } from '$app/paths'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { Id } from '$lib/components'; import { Button } from '$lib/elements/forms'; @@ -14,6 +13,7 @@ import { canWriteTopics } from '$lib/stores/roles'; import { Badge, FloatingActionBar, Table, Typography } from '@appwrite.io/pink-svelte'; import Confirm from '$lib/components/confirm.svelte'; + import { getProjectRoute } from '$lib/helpers/project'; export let columns: Column[]; export let data: PageData; @@ -62,7 +62,7 @@ + href={getProjectRoute(`/messaging/topics/topic-${topic.$id}`)}> {#each columns as column (column.id)} {#if column.id === '$id'} diff --git a/src/routes/(console)/project-[region]-[project]/messaging/topics/topic-[topic]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/messaging/topics/topic-[topic]/+layout.svelte index 015c066ee2..8bf5c1329d 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/topics/topic-[topic]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/topics/topic-[topic]/+layout.svelte @@ -1,9 +1,8 @@ - + {$devKey?.name} diff --git a/src/routes/(console)/project-[region]-[project]/overview/dev-keys/action.svelte b/src/routes/(console)/project-[region]-[project]/overview/dev-keys/action.svelte index cf9287ef75..ef33b68e42 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/dev-keys/action.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/dev-keys/action.svelte @@ -8,10 +8,10 @@ import { sdk } from '$lib/stores/sdk'; import { goto } from '$app/navigation'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { base } from '$app/paths'; import { addNotification } from '$lib/stores/notifications'; import { page } from '$app/state'; import { showDevKeysCreateModal } from '$routes/(console)/project-[region]-[project]/overview/store'; + import { getProjectRoute } from '$lib/helpers/project'; let isSubmitting = false; let name = '', @@ -30,9 +30,7 @@ $showDevKeysCreateModal = false; trackEvent(Submit.DevKeyCreate); - await goto( - `${base}/project-${page.params.region}-${page.params.project}/overview/dev-keys/${$id}` - ); + await goto(getProjectRoute(`/overview/dev-keys/${$id}`)); addNotification({ message: `Dev key has been created`, type: 'success' diff --git a/src/routes/(console)/project-[region]-[project]/overview/header.svelte b/src/routes/(console)/project-[region]-[project]/overview/header.svelte index a59b86d80a..0c6a48ad74 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/header.svelte @@ -5,12 +5,12 @@ import { project } from '../store'; import { hasOnboardingDismissed, setHasOnboardingDismissed } from '$lib/helpers/onboarding'; import { goto, invalidate } from '$app/navigation'; - import { base } from '$app/paths'; import { Layout, Button, Typography } from '@appwrite.io/pink-svelte'; import { user } from '$lib/stores/user'; import { isSmallViewport } from '$lib/stores/viewport'; import { Dependencies } from '$lib/constants'; import { trackEvent } from '$lib/actions/analytics'; + import { getProjectRoute } from '$lib/helpers/project'; {#if !page.url.pathname.includes('get-started')} @@ -52,7 +52,7 @@ trackEvent('onboarding_hub_platform_dismiss'); await setHasOnboardingDismissed($project.$id); await invalidate(Dependencies.ORGANIZATION); - goto(`${base}/project-${$project.region}-${$project.$id}/overview`); + goto(getProjectRoute('/overview')); }}>Dismiss this page {/if} diff --git a/src/routes/(console)/project-[region]-[project]/overview/keys/[key]/breadcrumbs.svelte b/src/routes/(console)/project-[region]-[project]/overview/keys/[key]/breadcrumbs.svelte index 00fa0e8f7e..cc3384b336 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/keys/[key]/breadcrumbs.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/keys/[key]/breadcrumbs.svelte @@ -1,10 +1,10 @@ - + {$key?.name} diff --git a/src/routes/(console)/project-[region]-[project]/overview/keys/action.svelte b/src/routes/(console)/project-[region]-[project]/overview/keys/action.svelte index ba746e54af..8c3a0ad26a 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/keys/action.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/keys/action.svelte @@ -3,13 +3,11 @@ import { canWriteKeys } from '$lib/stores/roles'; import { Icon } from '@appwrite.io/pink-svelte'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; - import { base } from '$app/paths'; - import { page } from '$app/state'; + import { getProjectRoute } from '$lib/helpers/project.js'; {#if $canWriteKeys} - diff --git a/src/routes/(console)/project-[region]-[project]/overview/onboard.svelte b/src/routes/(console)/project-[region]-[project]/overview/onboard.svelte index 3a7d7d5a5e..432a9ae798 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/onboard.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/onboard.svelte @@ -30,20 +30,19 @@ import PlatformAndroidImgSourceDark from './assets/platform-android-dark.svg'; import PlatformFlutterImgSource from './assets/platform-flutter.svg'; import PlatformFlutterImgSourceDark from './assets/platform-flutter-dark.svg'; - import { base } from '$app/paths'; import { isSmallViewport } from '$lib/stores/viewport'; import { AvatarGroup } from '$lib/components'; import type { Models } from '@appwrite.io/console'; import { getPlatformInfo } from '$lib/helpers/platform'; import { Click, trackEvent } from '$lib/actions/analytics'; import { goto } from '$app/navigation'; - import { page } from '$app/state'; + import { getProjectRoute } from '$lib/helpers/project'; function createKey() { trackEvent(Click.KeyCreateClick, { source: 'onboarding' }); - goto(`${base}/project-${page.params.region}-${page.params.project}/overview/keys/create`, { + goto(getProjectRoute('/overview/keys/create'), { replaceState: true }); } @@ -393,9 +392,7 @@ { trackEvent(Click.OnboardingSetupDatabaseClick); - goto( - `${base}/project-${page.params.region}-${page.params.project}/databases` - ); + goto(getProjectRoute('/databases')); }} padding="s" > { trackEvent( Click.OnboardingAuthEmailPasswordClick @@ -498,7 +497,9 @@ { trackEvent( Click.OnboardingAuthOauth2Click @@ -506,7 +507,9 @@ }}>OAuth 2 { trackEvent( Click.OnboardingAuthAllMethodsClick diff --git a/src/routes/(console)/project-[region]-[project]/overview/platforms/+page.svelte b/src/routes/(console)/project-[region]-[project]/overview/platforms/+page.svelte index ff85cf31a5..d405f1a33d 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/platforms/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/platforms/+page.svelte @@ -59,8 +59,6 @@ - + {$platform?.name} diff --git a/src/routes/(console)/project-[region]-[project]/settings/+layout.svelte b/src/routes/(console)/project-[region]-[project]/settings/+layout.svelte index fbe135724f..072330b436 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/+layout.svelte @@ -1,21 +1,17 @@ @@ -21,7 +21,7 @@ searchPlaceholder="Search by domain" analyticsSource="settings_domain_overview"> 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 ad574bf264..c537228532 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 @@ -1,5 +1,4 @@ - + {$webhook?.name} {$webhook?.$id} diff --git a/src/routes/(console)/project-[region]-[project]/settings/webhooks/create/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/webhooks/create/+page.svelte index 4b21c88480..953bab3afc 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/webhooks/create/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/webhooks/create/+page.svelte @@ -1,6 +1,4 @@ - + @@ -84,7 +79,7 @@ size="s" fullWidthMobile secondary - href={`${base}/project-${page.params.region}-${page.params.project}/sites/site-${data.site.$id}`}> + href={getProjectRoute(`/sites/site-${data.site.$id}`)}> Go to dashboard 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 871611f734..3e4615e3cb 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 @@ -1,5 +1,4 @@ - +
@@ -132,7 +130,7 @@ source: 'sites_create_finish' }); }} - href={`${base}/project-${page.params.region}-${page.params.project}/sites/site-${data.site.$id}/domains`}> + href={getProjectRoute(`/sites/site-${data.site.$id}/domains`)}> + href={getProjectRoute(`/sites/site-${data.site.$id}`)}> Go to dashboard 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 0d9f1b58b1..08e4ccd128 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 @@ -1,6 +1,5 @@ - + {#if !!data?.installations?.total}
- + {:else} 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 f08f635a1e..86933e122e 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 @@ -1,6 +1,5 @@ @@ -20,7 +19,7 @@ variant="secondary" padding="xs" radius="s" - href={`${base}/project-${page.params.region}-${page.params.project}/sites/create-site/templates`}> + href={getProjectRoute('/sites/create-site/templates')}> repositories + href={getProjectRoute('/sites/create-site/repositories')}> repositories Or simply drag and drop your files to create a site + href={getProjectRoute('/sites/create-site/manual')}> manually. diff --git a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte index 3e740b3595..6c9ba91236 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte @@ -1,6 +1,5 @@ - + Deployment {$deployment.$id} diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/table.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/table.svelte index fc380e6848..73cfffa022 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/table.svelte @@ -10,7 +10,6 @@ import Delete from './deleteDeploymentModal.svelte'; import RedeployModal from '../../redeployModal.svelte'; import Cancel from './cancelDeploymentModal.svelte'; - import { base } from '$app/paths'; import { Badge, FloatingActionBar, Layout, Status, Table } from '@appwrite.io/pink-svelte'; import { columns } from './store'; import ActivateDeploymentModal from '../../activateDeploymentModal.svelte'; @@ -24,6 +23,7 @@ import { Dependencies } from '$lib/constants'; import { Button } from '$lib/elements/forms'; import { site } from '$routes/(console)/project-[region]-[project]/sites/site-[site]/store'; + import { getProjectRoute } from '$lib/helpers/project'; export let data: PageData; @@ -81,7 +81,9 @@ + href={getProjectRoute( + `/sites/site-${page.params.site}/deployments/deployment-${deployment.$id}` + )}> {#each $columns as column} {#if column.id === '$id'} diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deploymentsOverview.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deploymentsOverview.svelte index 96a5091eb9..05c1a89a08 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deploymentsOverview.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deploymentsOverview.svelte @@ -1,7 +1,6 @@ @@ -18,7 +19,7 @@ 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 af66889d3c..1a09451de8 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 @@ -1,5 +1,4 @@