From 7c660ea15c4f8daf970aaafd60f69c036c915216 Mon Sep 17 00:00:00 2001 From: Vojtech Simetka Date: Wed, 5 Apr 2023 18:57:17 +0200 Subject: [PATCH] feat: display loading state and correctly wait for the content when opening persona, posts or chats (#403) --- .../ui/src/lib/adapters/firebase/index.ts | 10 ++++ packages/ui/src/lib/stores/chat.ts | 1 + packages/ui/src/lib/stores/persona.ts | 1 + packages/ui/src/lib/stores/post.ts | 2 +- .../(home)/chat/(chats)/[chatId]/+page.svelte | 48 +++++++++++++++---- .../ui/src/routes/persona/[id]/+page.svelte | 20 ++++++-- .../routes/persona/[id]/pending/+page.svelte | 20 ++++++-- .../[id]/pending/[postId]/+page.svelte | 22 +++++++-- .../persona/[id]/post/[postId]/+page.svelte | 20 ++++++-- 9 files changed, 117 insertions(+), 27 deletions(-) diff --git a/packages/ui/src/lib/adapters/firebase/index.ts b/packages/ui/src/lib/adapters/firebase/index.ts index 9ff6f9e..3e4aa17 100644 --- a/packages/ui/src/lib/adapters/firebase/index.ts +++ b/packages/ui/src/lib/adapters/firebase/index.ts @@ -352,6 +352,16 @@ export class Firebase implements Adapter { } async subscribePersonaPosts(groupId: string): Promise<() => unknown> { + // Sets loading to true if the data is not yet retrieved + posts.update(({ data }) => { + const personaPostData = data.get(groupId) + if (!personaPostData) { + data.set(groupId, { approved: [], pending: [], loading: true, error: undefined }) + } + + return { data } + }) + const pendingCollection = collection(db, `personas/${groupId}/pending`) const postsCollection = collection(db, `personas/${groupId}/posts`) diff --git a/packages/ui/src/lib/stores/chat.ts b/packages/ui/src/lib/stores/chat.ts index dbaaf1c..39c55ca 100644 --- a/packages/ui/src/lib/stores/chat.ts +++ b/packages/ui/src/lib/stores/chat.ts @@ -25,6 +25,7 @@ interface ChatData { loading: boolean unread: number chats: Map + error?: Error } export type ChatStore = Writable diff --git a/packages/ui/src/lib/stores/persona.ts b/packages/ui/src/lib/stores/persona.ts index 13275b1..3872ce8 100644 --- a/packages/ui/src/lib/stores/persona.ts +++ b/packages/ui/src/lib/stores/persona.ts @@ -27,6 +27,7 @@ type PersonaStore = { favorite: string[] all: Map loading: boolean + error?: Error } function createPersonaStore(): Writable { diff --git a/packages/ui/src/lib/stores/post.ts b/packages/ui/src/lib/stores/post.ts index a939b9c..ca6e539 100644 --- a/packages/ui/src/lib/stores/post.ts +++ b/packages/ui/src/lib/stores/post.ts @@ -16,7 +16,7 @@ export interface PostPending extends Post { } interface PostData { - data: Map + data: Map } export interface PostStore extends Writable { diff --git a/packages/ui/src/routes/(home)/chat/(chats)/[chatId]/+page.svelte b/packages/ui/src/routes/(home)/chat/(chats)/[chatId]/+page.svelte index 1229e9f..25b2604 100644 --- a/packages/ui/src/routes/(home)/chat/(chats)/[chatId]/+page.svelte +++ b/packages/ui/src/routes/(home)/chat/(chats)/[chatId]/+page.svelte @@ -5,13 +5,19 @@ import adapter from '$lib/adapters' import ChatScreen from '$lib/components/chat-screen.svelte' + import Container from '$lib/components/container.svelte' + import InfoBox from '$lib/components/info-box.svelte' + import Wallet from '$lib/components/icons/wallet.svelte' import { ROUTES } from '$lib/routes' - import { chats, type Chat } from '$lib/stores/chat' + import { chats } from '$lib/stores/chat' + import { profile } from '$lib/stores/profile' import { onDestroy, onMount } from 'svelte' + import Button from '$lib/components/button.svelte' + import { canConnectWallet } from '$lib/services' const chatId = $page.params.chatId - let chat: Chat | undefined + $: chat = $chats.chats.get(chatId) let unsubscribe: undefined | (() => unknown) onMount(async () => { @@ -25,11 +31,40 @@ function sendMessage(text: string) { adapter.sendChatMessage(chatId, text) } - - $: chat = $chats.chats.get(chatId) -{#if chat === undefined} +{#if $profile.signer === undefined} + + +