···
import { ComAtprotoLabelDefs } from "@atcute/atproto";
import { Client, CredentialManager } from "@atcute/client";
3
-
import { A, useParams, useSearchParams } from "@solidjs/router";
4
-
import { createResource, createSignal, For, onMount, Show } from "solid-js";
3
+
import { A, useSearchParams } from "@solidjs/router";
4
+
import { createSignal, For, onMount, Show } from "solid-js";
import { Button } from "../components/button.jsx";
import { StickyOverlay } from "../components/sticky.jsx";
import { TextInput } from "../components/text-input.jsx";
import { labelerCache, resolvePDS } from "../utils/api.js";
import { localDateFromTimestamp } from "../utils/date.js";
11
-
const LabelView = () => {
12
-
const params = useParams();
11
+
export const LabelView = () => {
const [searchParams, setSearchParams] = useSearchParams();
const [cursor, setCursor] = createSignal<string>();
const [labels, setLabels] = createSignal<ComAtprotoLabelDefs.Label[]>([]);
const [filter, setFilter] = createSignal<string>();
const [labelCount, setLabelCount] = createSignal(0);
18
-
const did = params.repo;
17
+
const [loading, setLoading] = createSignal(false);
19
+
let formRef!: HTMLFormElement;
22
+
const formData = new FormData();
23
+
if (searchParams.did) formData.append("did", searchParams.did.toString());
24
+
if (searchParams.did) fetchLabels(formData);
27
+
const fetchLabels = async (formData: FormData, reset?: boolean) => {
30
+
setCursor(undefined);
33
+
const did = formData.get("did")?.toString();
handler: new CredentialManager({ service: labelerCache[did] }),
29
-
const fetchLabels = async () => {
30
-
const uriPatterns = (document.getElementById("patterns") as HTMLInputElement).value;
40
+
const uriPatterns = formData.get("uriPatterns")?.toString();
if (!uriPatterns) return;
44
+
did: formData.get("did")?.toString(),
45
+
uriPatterns: formData.get("uriPatterns")?.toString(),
const res = await rpc.get("com.atproto.label.queryLabels", {
uriPatterns: uriPatterns.toString().trim().split(","),
···
if (!res.ok) throw new Error(res.data.error);
setCursor(res.data.labels.length < 50 ? undefined : res.data.cursor);
setLabels(labels().concat(res.data.labels) ?? res.data.labels);
45
-
const [response, { refetch }] = createResource(fetchLabels);
47
-
const initQuery = async () => {
51
-
uriPatterns: (document.getElementById("patterns") as HTMLInputElement).value,
const filterLabels = () => {
const newFilter = labels().filter((label) => (filter() ? filter() === label.val : true));
setLabelCount(newFilter.length);
···
<div class="flex w-full flex-col items-center">
65
-
class="flex w-full flex-col items-center gap-y-1 px-2"
71
-
<label for="patterns" class="ml-2 w-full text-sm">
71
+
<form ref={formRef} class="flex w-full flex-col items-center gap-y-1 px-2">
72
+
<label class="flex w-full items-center gap-x-2 px-1">
73
+
<span class="">DID</span>
74
+
<TextInput name="did" value={searchParams.did ?? ""} class="grow" />
76
+
<label for="uriPatterns" class="ml-2 w-full text-sm">
URI Patterns (comma-separated)
<div class="flex w-full items-center gap-x-1 px-1">
value={searchParams.uriPatterns ?? "*"}
class="dark:bg-dark-100 dark:shadow-dark-700 grow rounded-lg border-[0.5px] border-neutral-300 bg-white px-2 py-1 text-sm shadow-xs focus:outline-[1px] focus:outline-neutral-600 dark:border-neutral-600 dark:focus:outline-neutral-400"
<div class="flex justify-center">
84
-
<Show when={!response.loading}>
89
+
<Show when={!loading()}>
92
+
onClick={() => fetchLabels(new FormData(formRef), true)}
class="flex items-center rounded-lg p-1 hover:bg-neutral-200 active:bg-neutral-300 dark:hover:bg-neutral-700 dark:active:bg-neutral-600"
<span class="iconify lucide--search text-lg"></span>
92
-
<Show when={response.loading}>
98
+
<Show when={loading()}>
<div class="m-1 flex items-center">
<span class="iconify lucide--loader-circle animate-spin text-lg"></span>
···
<div class="flex h-8 w-22 items-center justify-center text-nowrap">
117
-
<Show when={!response.loading}>
118
-
<Button onClick={() => refetch()}>Load More</Button>
123
+
<Show when={!loading()}>
124
+
<Button onClick={() => fetchLabels(new FormData(formRef))}>Load More</Button>
120
-
<Show when={response.loading}>
126
+
<Show when={loading()}>
<div class="iconify lucide--loader-circle animate-spin text-xl" />
···
173
-
<Show when={!labels().length && !response.loading && searchParams.uriPatterns}>
179
+
<Show when={!labels().length && !loading() && searchParams.uriPatterns}>
<div class="mt-2">No results</div>
180
-
export { LabelView };