From c348ed5d46a0d95422ea6f4925420be8ff3ce8f0 Mon Sep 17 00:00:00 2001
From: Astra <me@astrra.space>
Date: Fri, 30 May 2025 03:05:05 +0000
Subject: [PATCH] Fix users with no profile record not being shown (#7)

Co-authored-by: Casey <hatkidchan@gmail.com>
Co-authored-by: Ari <ariadna@hey.com>
Reviewed-on: https://git.witchcraft.systems/scientific-witchery/pds-dash/pulls/7
Reviewed-by: Ariadna <ariadna@hey.com>
---
 src/lib/AccountComponent.svelte | 10 +++++++---
 src/lib/pdsfetch.ts             | 27 +++++++++++++++++----------
 themes/express/theme.css        |  5 +++++
 themes/witchcraft/theme.css     |  6 ++++++
 4 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/src/lib/AccountComponent.svelte b/src/lib/AccountComponent.svelte
index 3f12cf7..faf6251 100644
--- a/src/lib/AccountComponent.svelte
+++ b/src/lib/AccountComponent.svelte
@@ -12,10 +12,14 @@
         alt="avatar of {account.displayName}"
         src="{Config.PDS_URL}/xrpc/com.atproto.sync.getBlob?did={account.did}&cid={account.avatarCid}"
       />
+      <div id="accountName">
+        {account.displayName || account.handle || account.did}
+      </div>
+    {:else}
+      <div id="accountName" class="no-avatar">
+        {account.displayName || account.handle || account.did}
+      </div>
     {/if}
-    <div id="accountName">
-      {account.displayName || account.handle || account.did}
-    </div>
   </div>
 </a>
 
diff --git a/src/lib/pdsfetch.ts b/src/lib/pdsfetch.ts
index 20120fb..d57aff4 100644
--- a/src/lib/pdsfetch.ts
+++ b/src/lib/pdsfetch.ts
@@ -132,7 +132,13 @@ const getDidsFromPDS = async (): Promise<At.Did[]> => {
 const getAccountMetadata = async (
   did: `did:${string}:${string}`,
 ) => {
-  // gonna assume self exists in the app.bsky.actor.profile
+  const account: AccountMetadata = {
+    did: did,
+    handle: "", // Guaranteed to be filled out later
+    displayName: "",
+    avatarCid: null,
+  };
+
   try {
     const { data } = await rpc.get("com.atproto.repo.getRecord", {
       params: {
@@ -142,21 +148,22 @@ const getAccountMetadata = async (
       },
     });
     const value = data.value as AppBskyActorProfile.Record;
-    const handle = await blueskyHandleFromDid(did);
-    const account: AccountMetadata = {
-      did: did,
-      handle: handle,
-      displayName: value.displayName || "",
-      avatarCid: null,
-    };
+    account.displayName = value.displayName || "";
     if (value.avatar) {
       account.avatarCid = value.avatar.ref["$link"];
     }
-    return account;
   } catch (e) {
-    console.error(`Error fetching metadata for ${did}:`, e);
+    console.warn(`Error fetching profile for ${did}:`, e);
+  }
+
+  try {
+    account.handle = await blueskyHandleFromDid(did);
+  } catch (e) {
+    console.error(`Error fetching handle for ${did}:`, e);
     return null;
   }
+
+  return account;
 };
 
 const getAllMetadataFromPds = async (): Promise<AccountMetadata[]> => {
diff --git a/themes/express/theme.css b/themes/express/theme.css
index cbc2336..58c399e 100644
--- a/themes/express/theme.css
+++ b/themes/express/theme.css
@@ -237,6 +237,7 @@ a:hover {
   margin-right: 4px;
   border: 4px solid var(--border-color);
   box-shadow: var(--border-color) 10px 10px;
+  min-height: 30px;
 }
 #accountName {
   margin-left: 10px;
@@ -249,6 +250,10 @@ a:hover {
   white-space: nowrap;
 }
 
+.no-avatar {
+    margin-left: 40px !important;
+}
+
 /* App.Svelte */
 /* desktop style */
 
diff --git a/themes/witchcraft/theme.css b/themes/witchcraft/theme.css
index cd15805..8ad63d4 100644
--- a/themes/witchcraft/theme.css
+++ b/themes/witchcraft/theme.css
@@ -235,6 +235,7 @@ a:hover {
   padding: 0px;
   margin-bottom: 15px;
   border: 1px solid var(--border-color);
+  min-height: 30px;
 }
 #accountName {
   margin-left: 10px;
@@ -247,6 +248,11 @@ a:hover {
   white-space: nowrap;
 }
 
+
+.no-avatar {
+    margin-left: 70px !important;
+}
+
 /* App.Svelte */
 /* desktop style */