From d4773717367000928e1b1de74066ac79191f43be Mon Sep 17 00:00:00 2001 From: Caleb Owens Date: Fri, 13 Dec 2024 17:30:26 +0100 Subject: [PATCH] Convert project over to loadable data --- .../lib/backend/projectCloudSync.svelte.ts | 7 +- apps/desktop/src/lib/feeds/CreatePost.svelte | 8 +-- .../CloudProjectSettings.svelte | 69 +++++++++++-------- .../ProjectConnectModal.svelte | 67 ++++++++++-------- .../src/routes/[projectId]/feed/+page.svelte | 17 +++-- .../web/src/routes/organizations/+page.svelte | 41 ++++++----- packages/shared/src/lib/network/loadable.ts | 66 ++++++++++++++++-- .../organizations/OrganizationModal.svelte | 6 +- .../lib/organizations/organizationService.ts | 38 +++++----- .../lib/organizations/organizationsSlice.ts | 5 +- .../src/lib/organizations/projectService.ts | 26 +++++-- .../organizations/projectsPreview.svelte.ts | 39 ++++++++--- .../src/lib/organizations/projectsSlice.ts | 12 ++-- .../shared/src/lib/organizations/types.ts | 4 +- 14 files changed, 267 insertions(+), 138 deletions(-) diff --git a/apps/desktop/src/lib/backend/projectCloudSync.svelte.ts b/apps/desktop/src/lib/backend/projectCloudSync.svelte.ts index 4513aecc92..7d5663571b 100644 --- a/apps/desktop/src/lib/backend/projectCloudSync.svelte.ts +++ b/apps/desktop/src/lib/backend/projectCloudSync.svelte.ts @@ -25,14 +25,17 @@ export function projectCloudSync( registerInterest(cloudProjectInterest); }); - const cloudProject = $derived( + const loadableCloudProject = $derived( project.current?.api ? projectsSelectors.selectById(appState.projects, project.current.api.repository_id) : undefined ); $effect(() => { - if (!project.current?.api || !cloudProject) return; + if (!project.current?.api || !loadableCloudProject || loadableCloudProject.type !== 'found') + return; + + const cloudProject = loadableCloudProject.value; const persistedProjectUpdatedAt = new Date(project.current.api.updated_at).getTime(); const cloudProjectUpdatedAt = new Date(cloudProject.updatedAt).getTime(); if (persistedProjectUpdatedAt >= cloudProjectUpdatedAt) return; diff --git a/apps/desktop/src/lib/feeds/CreatePost.svelte b/apps/desktop/src/lib/feeds/CreatePost.svelte index dd16578fde..d9abb15e92 100644 --- a/apps/desktop/src/lib/feeds/CreatePost.svelte +++ b/apps/desktop/src/lib/feeds/CreatePost.svelte @@ -73,13 +73,13 @@ // Post creation let newPostContent = $derived(persisted('', `postContent--${feedIdentity}--${replyTo}`)); function createPost() { - if (!feedIdentity?.current) return; - if (!parentProject?.current) return; + if (feedIdentity?.current.type !== 'found') return; + if (parentProject?.current?.type !== 'found') return; feedService.createPost( $newPostContent, - parentProject.current.repositoryId, - feedIdentity.current, + parentProject.current.value.repositoryId, + feedIdentity.current.value, replyTo, picture ); diff --git a/apps/desktop/src/lib/settings/userPreferences/CloudProjectSettings.svelte b/apps/desktop/src/lib/settings/userPreferences/CloudProjectSettings.svelte index c36d0f684c..c7094b547a 100644 --- a/apps/desktop/src/lib/settings/userPreferences/CloudProjectSettings.svelte +++ b/apps/desktop/src/lib/settings/userPreferences/CloudProjectSettings.svelte @@ -7,6 +7,7 @@ import * as toasts from '$lib/utils/toasts'; import { getContext, getContextStore } from '@gitbutler/shared/context'; import RegisterInterest from '@gitbutler/shared/interest/RegisterInterest.svelte'; + import Loading from '@gitbutler/shared/network/Loading.svelte'; import { OrganizationService } from '@gitbutler/shared/organizations/organizationService'; import { organizationsSelectors } from '@gitbutler/shared/organizations/organizationsSlice'; import { ProjectService as CloudProjectService } from '@gitbutler/shared/organizations/projectService'; @@ -138,36 +139,44 @@ {/snippet} - {#if !cloudProject?.parentProjectRepositoryId} -
- {#snippet title()} - Link your project with an organization - {/snippet} - - - -
- {#each usersOrganizations as organization, index} - - {#snippet children()} -
{organization.name || organization.slug}
- {/snippet} - {#snippet actions()} - - {/snippet} -
- {/each} -
-
- {/if} + + {#snippet children(cloudProject)} +
+ {#snippet title()} + Link your project with an organization + {/snippet} + + + +
+ {#each usersOrganizations as loadableOrganization, index} + + {#snippet children()} + + {#snippet children(organization)} +
+ {organization.name || organization.slug} +
+ {/snippet} +
+ {/snippet} + {#snippet actions()} + + {/snippet} +
+ {/each} +
+
+ {/snippet} +
{:else if !$project?.api?.repository_id}
diff --git a/apps/desktop/src/lib/settings/userPreferences/ProjectConnectModal.svelte b/apps/desktop/src/lib/settings/userPreferences/ProjectConnectModal.svelte index ad3b64c091..c0ccf2ee21 100644 --- a/apps/desktop/src/lib/settings/userPreferences/ProjectConnectModal.svelte +++ b/apps/desktop/src/lib/settings/userPreferences/ProjectConnectModal.svelte @@ -1,6 +1,7 @@ - + - {#if organization} - {#each organizationProjects as { project, projectInterest }, index} - - - - {#if project} -
{project.name}
- - - {:else} -

Loading...

- {/if} -
- {/each} - {/if} + {#each organizationProjects as { project: organizationProject, interest }, index} + + + + + {#snippet children(organizationProject)} +
{organizationProject.name}
+ + + {/snippet} +
+
+ {/each}
diff --git a/apps/desktop/src/routes/[projectId]/feed/+page.svelte b/apps/desktop/src/routes/[projectId]/feed/+page.svelte index 9a35090ef7..bc3e7f1b62 100644 --- a/apps/desktop/src/routes/[projectId]/feed/+page.svelte +++ b/apps/desktop/src/routes/[projectId]/feed/+page.svelte @@ -22,18 +22,25 @@ : undefined ); - const feed = $derived(getFeed(appState, feedService, feedIdentity?.current)); + const feed = $derived.by(() => { + if (feedIdentity?.current.type !== 'found') return; + return getFeed(appState, feedService, feedIdentity?.current.value); + }); // Infinite scrolling - const lastPost = $derived(getFeedLastPost(appState, feedService, feed.current)); + const lastPost = $derived(getFeedLastPost(appState, feedService, feed?.current)); let lastElement = $state(); $effect(() => { if (!lastElement) return; const observer = new IntersectionObserver((entries) => { - if (entries[0]?.isIntersecting && lastPost.current?.createdAt && feedIdentity?.current) { - feedService.getFeedPage(feedIdentity.current, lastPost.current.createdAt); + if ( + entries[0]?.isIntersecting && + lastPost.current?.createdAt && + feedIdentity?.current.type === 'found' + ) { + feedService.getFeedPage(feedIdentity.current.value, lastPost.current.createdAt); } }); @@ -51,7 +58,7 @@
- {#if feed.current} + {#if feed?.current} {#each feed.current.postIds as postId, index (postId)}
{#if index < feed.current.postIds.length - 1 && lastPost.current && feedIdentity?.current} diff --git a/apps/web/src/routes/organizations/+page.svelte b/apps/web/src/routes/organizations/+page.svelte index 3853805c61..8fa7e4ce0f 100644 --- a/apps/web/src/routes/organizations/+page.svelte +++ b/apps/web/src/routes/organizations/+page.svelte @@ -1,7 +1,8 @@