From 98f27e9b26c3d6f16a6a21b0b1b2d995414a665c Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Mon, 26 Jan 2026 15:04:29 +0530 Subject: [PATCH 1/4] Improve UX for repositories modal --- src/lib/components/git/repositories.svelte | 25 +++++++++++++------ .../functions/create-function/+page.svelte | 15 ++++++----- .../create-site/repositories/+page.svelte | 9 ++++--- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/lib/components/git/repositories.svelte b/src/lib/components/git/repositories.svelte index d0dbaf8003..e277e45ad9 100644 --- a/src/lib/components/git/repositories.svelte +++ b/src/lib/components/git/repositories.svelte @@ -49,9 +49,12 @@ let isLoadingRepositories = $state(null); let installationsMap = $state(null); let offset = $state(0); + let connectingRepositoryId = $state(null); + let loadRepositoriesRequestId = 0; const limit = 5; onMount(() => { + isLoadingRepositories = true; loadInstallations(); }); @@ -115,6 +118,8 @@ } async function loadRepositories(installationId: string, search: string) { + const requestId = ++loadRepositoriesRequestId; + const result = await sdk .forProject(page.params.region, page.params.project) .vcs.listRepositories({ @@ -125,6 +130,11 @@ queries: [Query.limit(limit), Query.offset(offset)] }); + // Stale request + if (requestId !== loadRepositoriesRequestId) { + return; + } + $repositories.repositories = product === 'functions' ? (result as unknown as Models.ProviderRepositoryRuntimeList) @@ -186,10 +196,7 @@ debouncedLoadRepositories.cancel(); }} bind:value={selectedInstallation} /> - + {/if} @@ -266,7 +273,11 @@ size="xs" variant="secondary" style="flex-shrink: 0;" - on:click={() => connect(repo)}> + disabled={!!connectingRepositoryId} + on:click={() => { + connectingRepositoryId = repo.id; + connect(repo); + }}> Connect {/if} @@ -300,12 +311,12 @@ alignItems="center" wrap="wrap"> - Total results: {$repositories.total} + Total results: {isLoadingRepositories ? 0 : $repositories.total} diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/+page.svelte index e902c28569..7a5351a2a3 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/+page.svelte @@ -5,7 +5,7 @@ import { Click, trackEvent } from '$lib/actions/analytics'; import type { Models } from '@appwrite.io/console'; import { isSelfHosted } from '$lib/system'; - import { afterNavigate, goto } from '$app/navigation'; + import { goto } from '$app/navigation'; import { installation, repository } from '$lib/stores/vcs'; import { Repositories } from '$lib/components/git'; import { @@ -27,10 +27,6 @@ const isVcsEnabled = $regionalConsoleVariables?._APP_VCS_ENABLED === true; const wizardBase = `${base}/project-${page.params.region}-${page.params.project}/functions`; - let previousPage: string = wizardBase; - afterNavigate(({ from }) => { - previousPage = from?.url?.pathname || previousPage; - }); let selectedRepository: string; @@ -60,7 +56,7 @@ } - + @@ -105,10 +101,13 @@ }} {connect} /> - {#if data.installations.total} + {#if $installation} - + Missing a repository? check your permissions diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/+page.svelte index 2e15b0b3a0..a445811269 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/+page.svelte @@ -70,9 +70,12 @@ href="https://appwrite.io/docs/products/sites/deploy-from-git" external secondary>Docs - + {#if $installation} + + {/if} {/if} From e7996e838f03656b142bd20796946e397e4d5375 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Fri, 30 Jan 2026 10:34:06 +0530 Subject: [PATCH 2/4] use resolveRoute --- src/lib/components/git/repositories.svelte | 4 +- .../functions/create-function/+page.svelte | 55 ++++++++++++++++--- .../create-site/repositories/+page.svelte | 25 +++++++-- 3 files changed, 71 insertions(+), 13 deletions(-) diff --git a/src/lib/components/git/repositories.svelte b/src/lib/components/git/repositories.svelte index e277e45ad9..225e391863 100644 --- a/src/lib/components/git/repositories.svelte +++ b/src/lib/components/git/repositories.svelte @@ -310,8 +310,8 @@ justifyContent="space-between" alignItems="center" wrap="wrap"> - - Total results: {isLoadingRepositories ? 0 : $repositories.total} + + Total results: {$repositories.total} - import { base } from '$app/paths'; import { SvgIcon } from '$lib/components'; import { page } from '$app/state'; import { Click, trackEvent } from '$lib/actions/analytics'; @@ -25,8 +24,13 @@ export let data; + import { resolveRoute } from '$lib/stores/navigation'; + const isVcsEnabled = $regionalConsoleVariables?._APP_VCS_ENABLED === true; - const wizardBase = `${base}/project-${page.params.region}-${page.params.project}/functions`; + const wizardBase = resolveRoute('/(console)/project-[region]-[project]/functions', { + region: page.params.region, + project: page.params.project + }); let selectedRepository: string; @@ -52,7 +56,16 @@ function connect(e: Models.ProviderRepository) { trackEvent(Click.ConnectRepositoryClick, { from: 'cover' }); repository.set(e); - goto(`${wizardBase}/create-function/repository-${e.id}?installation=${$installation.$id}`); + goto( + resolveRoute( + '/(console)/project-[region]-[project]/functions/create-function/repository-[repository]', + { + region: page.params.region, + project: page.params.project, + repository: e.id + } + ) + `?installation=${$installation.$id}` + ); } @@ -139,7 +152,14 @@ runtime: template.name }); }} - href={`${wizardBase}/create-function/template-${starterTemplate.id}?runtime=${runtimeDetail.$id}`}> + href={resolveRoute( + '/(console)/project-[region]-[project]/functions/create-function/template-[template]', + { + region: page.params.region, + project: page.params.project, + template: starterTemplate.id + } + ) + `?runtime=${runtimeDetail.$id}`}> @@ -167,7 +187,14 @@ { trackEvent('click_connect_template', { from: 'cover', @@ -197,7 +224,15 @@ {/each} - + Browse all templates @@ -211,7 +246,13 @@ on:click={() => { trackEvent('click_create_function_manual', { from: 'cover' }); }} - href={`${wizardBase}/create-function/manual`}>manually + href={resolveRoute( + '/(console)/project-[region]-[project]/functions/create-function/manual', + { + region: page.params.region, + project: page.params.project + } + )}>manually or using the CLI. Learn more import { goto } from '$app/navigation'; - import { base } from '$app/paths'; import { page } from '$app/state'; import { Click, trackEvent } from '$lib/actions/analytics.js'; import Card from '$lib/components/card.svelte'; import { Repositories } from '$lib/components/git/index.js'; import Button from '$lib/elements/forms/button.svelte'; import { Wizard } from '$lib/layout'; + import { resolveRoute } from '$lib/stores/navigation.js'; import { installation, repository } from '$lib/stores/vcs.js'; import type { Models } from '@appwrite.io/console'; import { Fieldset, Layout, Typography } from '@appwrite.io/pink-svelte'; @@ -20,14 +20,25 @@ from: 'cover' }); repository.set(e); - const target = `${base}/project-${page.params.region}-${page.params.project}/sites/create-site/repositories/repository-${e.id}?installation=${$installation.$id}`; + const target = + resolveRoute( + '/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]', + { + region: page.params.region, + project: page.params.project, + repository: e.id + } + ) + `?installation=${$installation.$id}`; goto(target); } {#if !!data?.installations?.total}
@@ -52,7 +63,13 @@ {:else} From ddc1a4392ed39ca37e958b8d5fae5903c0218dd9 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Fri, 30 Jan 2026 10:35:03 +0530 Subject: [PATCH 3/4] color --- src/lib/components/git/repositories.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/git/repositories.svelte b/src/lib/components/git/repositories.svelte index 225e391863..105ed8fb14 100644 --- a/src/lib/components/git/repositories.svelte +++ b/src/lib/components/git/repositories.svelte @@ -310,7 +310,7 @@ justifyContent="space-between" alignItems="center" wrap="wrap"> - + Total results: {$repositories.total} Date: Fri, 30 Jan 2026 10:43:56 +0530 Subject: [PATCH 4/4] use page.params --- .../functions/create-function/+page.svelte | 27 +++++-------------- .../create-site/repositories/+page.svelte | 13 +++------ 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/+page.svelte index 2b5ab2a542..42be5ca748 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/+page.svelte @@ -5,6 +5,7 @@ import type { Models } from '@appwrite.io/console'; import { isSelfHosted } from '$lib/system'; import { goto } from '$app/navigation'; + import { resolveRoute } from '$lib/stores/navigation'; import { installation, repository } from '$lib/stores/vcs'; import { Repositories } from '$lib/components/git'; import { @@ -24,13 +25,8 @@ export let data; - import { resolveRoute } from '$lib/stores/navigation'; - const isVcsEnabled = $regionalConsoleVariables?._APP_VCS_ENABLED === true; - const wizardBase = resolveRoute('/(console)/project-[region]-[project]/functions', { - region: page.params.region, - project: page.params.project - }); + const wizardBase = resolveRoute('/(console)/project-[region]-[project]/functions', page.params); let selectedRepository: string; @@ -60,8 +56,7 @@ resolveRoute( '/(console)/project-[region]-[project]/functions/create-function/repository-[repository]', { - region: page.params.region, - project: page.params.project, + ...page.params, repository: e.id } ) + `?installation=${$installation.$id}` @@ -155,8 +150,7 @@ href={resolveRoute( '/(console)/project-[region]-[project]/functions/create-function/template-[template]', { - region: page.params.region, - project: page.params.project, + ...page.params, template: starterTemplate.id } ) + `?runtime=${runtimeDetail.$id}`}> @@ -190,8 +184,7 @@ href={resolveRoute( '/(console)/project-[region]-[project]/functions/create-function/template-[template]', { - region: page.params.region, - project: page.params.project, + ...page.params, template: template.id } )} @@ -228,10 +221,7 @@ variant="quiet" href={resolveRoute( '/(console)/project-[region]-[project]/functions/templates', - { - region: page.params.region, - project: page.params.project - } + page.params )}> Browse all templates @@ -248,10 +238,7 @@ }} href={resolveRoute( '/(console)/project-[region]-[project]/functions/create-function/manual', - { - region: page.params.region, - project: page.params.project - } + page.params )}>manually or using the CLI. {#if !!data?.installations?.total}
@@ -65,10 +61,7 @@ {:else}