atproto explorer pdsls.dev
atproto tool

add nsid redirect in records

juli.ee 3d3ca0fc f2c5de3b

verified
Changed files
+28 -8
src
components
utils
types
+27 -7
src/components/json.tsx
···
-
import { A, useParams } from "@solidjs/router";
+
import { isDid, isNsid, Nsid } from "@atcute/lexicons/syntax";
+
import { A, useNavigate, useParams } from "@solidjs/router";
import { createEffect, createSignal, ErrorBoundary, For, Show } from "solid-js";
+
import { resolveLexiconAuthority } from "../utils/api";
+
import { ATURI_RE } from "../utils/types/at-uri";
import { hideMedia } from "../views/settings";
import { pds } from "./navbar";
import Tooltip from "./tooltip";
···
mimeType: string;
}
-
const ATURI_RE =
-
/^at:\/\/([a-zA-Z0-9._:%-]+)(?:\/([a-zA-Z0-9-.]+)(?:\/([a-zA-Z0-9._~:@!$&%')(*+,;=-]+))?)?(?:#(\/[a-zA-Z0-9._~:@!$&%')(*+,;=\-[\]/\\]*))?$/;
+
const JSONString = ({ data }: { data: string }) => {
+
const navigate = useNavigate();
-
const DID_RE = /^did:[a-z]+:[a-zA-Z0-9._:%-]*[a-zA-Z0-9._-]$/;
-
-
const JSONString = ({ data }: { data: string }) => {
const isURL =
URL.canParse ??
((url, base) => {
···
}
});
+
const handleClick = async (lex: string) => {
+
try {
+
const [nsid, anchor] = lex.split("#");
+
const authority = await resolveLexiconAuthority(nsid as Nsid);
+
+
const hash = anchor ? `#schema:${anchor}` : "#schema";
+
navigate(`/at://${authority}/com.atproto.lexicon.schema/${nsid}${hash}`);
+
} catch (err) {
+
console.error("Failed to resolve lexicon authority:", err);
+
}
+
};
+
return (
<span>
"
···
<A class="text-blue-400 hover:underline active:underline" href={`/${part}`}>
{part}
</A>
-
: DID_RE.test(part) ?
+
: isDid(part) ?
<A class="text-blue-400 hover:underline active:underline" href={`/at://${part}`}>
{part}
</A>
+
: isNsid(part.split("#")[0]) ?
+
<button
+
type="button"
+
onClick={() => handleClick(part)}
+
class="cursor-pointer text-blue-400 hover:underline active:underline"
+
>
+
{part}
+
</button>
: (
isURL(part) &&
["http:", "https:", "web+at:"].includes(new URL(part).protocol) &&
+1 -1
src/utils/types/at-uri.ts
···
const RECORD_KEY_RE = /^(?!\.{1,2}$)[a-zA-Z0-9_~.:-]{1,512}$/;
-
const ATURI_RE =
+
export const ATURI_RE =
/^at:\/\/([a-zA-Z0-9._:%-]+)(?:\/([a-zA-Z0-9-.]+)(?:\/([a-zA-Z0-9._~:@!$&%')(*+,;=-]+))?)?(?:#(\/[a-zA-Z0-9._~:@!$&%')(*+,;=\-[\]/\\]*))?$/;
const isDid = (input: unknown): input is Did => {