atmosphere explorer
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

resolve handle in car explorer navigation

Juliet d023a025 41d3312d

+37 -4
+37 -4
src/views/car/explore.tsx
··· 1 1 import * as CAR from "@atcute/car"; 2 2 import * as CBOR from "@atcute/cbor"; 3 3 import * as CID from "@atcute/cid"; 4 + import { Did } from "@atcute/lexicons"; 4 5 import { fromStream, isCommit } from "@atcute/repo"; 5 6 import * as TID from "@atcute/tid"; 6 7 import { Title } from "@solidjs/meta"; ··· 10 11 import { JSONValue } from "../../components/json.jsx"; 11 12 import { TextInput } from "../../components/text-input.jsx"; 12 13 import { isTouchDevice } from "../../layout.jsx"; 14 + import { didDocCache, resolveDidDoc } from "../../utils/api.js"; 13 15 import { localDateFromTimestamp } from "../../utils/date.js"; 14 16 import { createDropHandler, createFileChangeHandler, handleDragOver } from "./file-handlers.js"; 15 17 import { ··· 39 41 const car = CAR.fromUint8Array(buffer); 40 42 41 43 // Get DID from commit block 42 - let did = ""; 44 + let did = "Repository"; 43 45 const rootCid = car.roots[0]?.$link; 44 46 if (rootCid) { 45 47 for (const entry of car) { ··· 98 100 await repo.dispose(); 99 101 } 100 102 103 + // Resolve DID document to populate handle in cache 104 + if (did !== "Repository") { 105 + try { 106 + const doc = await resolveDidDoc(did as Did); 107 + didDocCache[did] = doc; 108 + } catch (err) { 109 + console.error("Failed to resolve DID document:", err); 110 + } 111 + } 112 + 101 113 setArchive(result); 102 114 setView({ type: "repo" }); 103 115 } catch (err) { ··· 147 159 setView: (view: View) => void; 148 160 onClose: () => void; 149 161 }) => { 162 + const handle = 163 + didDocCache[props.archive.did]?.alsoKnownAs 164 + ?.filter((alias) => alias.startsWith("at://"))[0] 165 + ?.split("at://")[1] ?? props.archive.did; 166 + 150 167 return ( 151 168 <div class="flex w-full flex-col"> 152 169 <nav class="flex w-full flex-col text-sm wrap-anywhere sm:text-base"> ··· 157 174 fallback={ 158 175 <div class="flex min-h-6 min-w-0 basis-full items-center gap-2 px-2 sm:min-h-7"> 159 176 <span class="iconify lucide--book-user shrink-0 text-neutral-500 transition-colors duration-200 group-hover:text-neutral-700 dark:text-neutral-400 dark:group-hover:text-neutral-200" /> 160 - <span class="truncate py-0.5 font-medium">{props.archive.did || "Repository"}</span> 177 + <span class="flex min-w-0 gap-1 py-0.5 font-medium"> 178 + <Show 179 + when={handle !== props.archive.did} 180 + fallback={<span class="truncate">{props.archive.did}</span>} 181 + > 182 + <span class="shrink-0">{handle}</span> 183 + <span class="truncate text-neutral-500 dark:text-neutral-400"> 184 + ({props.archive.did}) 185 + </span> 186 + </Show> 187 + </span> 161 188 </div> 162 189 } 163 190 > ··· 167 194 class="flex min-h-6 min-w-0 basis-full items-center gap-2 px-2 sm:min-h-7" 168 195 > 169 196 <span class="iconify lucide--book-user shrink-0 text-neutral-500 transition-colors duration-200 group-hover:text-neutral-700 dark:text-neutral-400 dark:group-hover:text-neutral-200" /> 170 - <span class="truncate py-0.5 font-medium text-blue-500 transition-colors duration-150 group-hover:text-blue-600 dark:text-blue-400 dark:group-hover:text-blue-300"> 171 - {props.archive.did || "Repository"} 197 + <span class="flex min-w-0 gap-1 py-0.5 font-medium text-blue-500 transition-colors duration-150 group-hover:text-blue-600 dark:text-blue-400 dark:group-hover:text-blue-300"> 198 + <Show 199 + when={handle !== props.archive.did} 200 + fallback={<span class="truncate">{props.archive.did}</span>} 201 + > 202 + <span class="shrink-0">{handle}</span> 203 + <span class="truncate">({props.archive.did})</span> 204 + </Show> 172 205 </span> 173 206 </button> 174 207 </Show>