extremely wip tangled spa

skibivi

aylac.top c7941b02 648f1941

verified
Changed files
+34 -45
src
routes
util
+2 -1
biome.json
···
"enabled": true,
"rules": {
"recommended": true,
-
"nursery": { "useSortedClasses": "warn" }
+
"nursery": { "useSortedClasses": "warn" },
+
"style": { "noNonNullAssertion": "off" }
},
"domains": {
"solid": "recommended"
+10 -14
src/routes/repo/blob.tsx
···
useNavigate,
useParams,
} from "@solidjs/router";
-
import { Show, Suspense } from "solid-js";
+
import { Show } from "solid-js";
import { CodeBlock } from "../../elements/code_block";
import { getLanguage } from "../../util/get_language";
+
import { figureOutDid } from "../../util/handle";
import { useDid } from "./context";
import { Header } from "./main";
import { getRepoBlob } from "./main.data";
-
import { figureOutDid } from "../../util/handle";
export async function preloadRepoBlob({ params }: { params: Params }) {
-
const did = await figureOutDid(params.user)
+
const did = await figureOutDid(params.user);
if (!did) return;
getRepoBlob(did, params.repo, params.ref, params.path);
}
···
return (
<div class="mx-auto max-w-5xl">
-
<Show when={did()}>
-
{(did) => <Header did={did()} user={params.user} repo={params.repo} />}
-
</Show>
-
<Suspense>
+
<Header user={params.user} repo={params.repo} />
+
<div class="flex flex-col rounded bg-white dark:bg-gray-800">
<Show when={blob()} keyed>
{(data) => (
-
<div class="flex flex-col rounded bg-white dark:bg-gray-800">
-
<CodeBlock
-
code={data.content}
-
language={getLanguage(data.path.split("/").pop()) || "text"}
-
/>
-
</div>
+
<CodeBlock
+
code={data.content}
+
language={getLanguage(data.path.split("/").pop()) || "text"}
+
/>
)}
</Show>
-
</Suspense>
+
</div>
</div>
);
}
+4 -8
src/routes/repo/commit/commit.tsx
···
}
function CommitHeader(props: {
-
did: DID;
user: string;
repo: string;
message: { title: string; content: string };
···
}) {
return (
<div>
-
<Header did={props.did} user={props.user} repo={props.repo} />
+
<Header user={props.user} repo={props.repo} />
<div class="mx-1 flex flex-col gap-2 rounded bg-white p-4 dark:bg-gray-800">
<div>{props.message.title}</div>
<Show when={props.message.content}>
···
const headerData = createMemo(() => {
const c = commit();
-
const d = did();
-
-
if (!(c && d)) return;
+
if (!c) return;
const titleEnd = c.diff.commit.message.indexOf("\n");
const message = {
···
content: c.diff.commit.message.slice(titleEnd + 1),
};
-
return [c, d, message] as const;
+
return [c, message] as const;
});
onMount(() => {
···
<div class="mx-auto max-w-10xl">
<Suspense>
<Show when={headerData()} keyed>
-
{([commit, did, message]) => (
+
{([commit, message]) => (
<CommitHeader
-
did={did}
user={params.user}
repo={params.repo}
message={message}
+1 -2
src/routes/repo/main.tsx
···
import { type Accessor, createMemo, Show } from "solid-js";
-
import type { DID } from "../../util/types";
import { useRepoInfo } from "./context";
function HeaderItem(props: {
···
);
}
-
export function Header(props: { did: DID; user: string; repo: string }) {
+
export function Header(props: { user: string; repo: string }) {
const repoInfo = useRepoInfo();
const path = createMemo(() => {
const path = window.location.pathname.split("/")[3];
+4 -8
src/routes/repo/tree.tsx
···
const [filesInOrder] = createResource(tree, (tree) => {
if (!tree.files) return;
return tree.files.sort((a, b) => {
-
// Directories before files
if (!a.is_file === b.is_file) return !a.is_file ? -1 : 1;
-
// Dotfiles first
const aDot = a.name.startsWith(".");
const bDot = b.name.startsWith(".");
if (aDot !== bDot) return aDot ? -1 : 1;
-
// Name sorting (natural order)
return a.name.localeCompare(b.name, undefined, { numeric: true });
});
});
···
const repoData = createMemo(() => {
const db = defaultBranch();
const l = languages();
-
const d = did();
-
if (!(db && l && d)) return;
-
return [db, l, d] as const;
+
if (!(db && l)) return;
+
return [db, l] as const;
});
const pathData = createMemo(() => {
···
return (
<div class="mx-auto max-w-5xl">
<Show when={repoData()} keyed>
-
{([defaultBranch, languages, did]) => (
+
{([defaultBranch, languages]) => (
<Show when={pathData()} keyed>
{([tree, files, readme, logs]) => (
<div>
-
<Header did={did} user={params.user} repo={params.repo} />
+
<Header user={params.user} repo={params.repo} />
<div class="mb-4 flex flex-col rounded bg-white dark:bg-gray-800">
<LanguageLine languages={languages} />
<div class="flex flex-row">
+13 -12
src/util/handle.ts
···
export const figureOutDid = query(async (user: string): Promise<DID> => {
const isDid = user.startsWith("did:");
if (!isDid && user.includes(".")) {
-
let res = didMap.get(user);
-
if (!res && useSlingshot)
-
res = (
-
await (
-
await fetch(
-
`${slingshotUrl}/xrpc/com.atproto.identity.resolveHandle?handle=${user}`,
-
)
-
).json()
-
).did;
-
if (!res) res = await handleResolver.resolve(user as `${string}.${string}`);
-
didMap.set(user, res);
-
return res;
+
let did = didMap.get(user);
+
if (!did && useSlingshot) {
+
const res = await fetch(
+
`${slingshotUrl}/xrpc/com.atproto.identity.resolveHandle?handle=${user}`,
+
);
+
if (res.ok) {
+
const json = await res.json();
+
if ("did" in json && typeof json.did === "string") did = json.did;
+
}
+
}
+
if (!did) did = await handleResolver.resolve(user as `${string}.${string}`);
+
didMap.set(user, did);
+
return did;
}
return user as DID;
}, "handles");