atproto explorer pdsls.dev
atproto tool

rework search shortcut behavior

juli.ee fe4c5de3 0b3fef3f

verified
Changed files
+26 -8
src
components
+25 -5
src/components/search.tsx
···
import { Client, simpleFetchHandler } from "@atcute/client";
import { Nsid } from "@atcute/lexicons";
-
import { A, useLocation, useNavigate } from "@solidjs/router";
-
import { createResource, createSignal, For, onCleanup, onMount, Show } from "solid-js";
+
import { A, useNavigate } from "@solidjs/router";
+
import {
+
createEffect,
+
createResource,
+
createSignal,
+
For,
+
onCleanup,
+
onMount,
+
Show,
+
} from "solid-js";
import { isTouchDevice } from "../layout";
import { resolveLexiconAuthority } from "../utils/api";
import { appHandleLink, appList, appName, AppUrl } from "../utils/app-urls";
···
if ((ev.ctrlKey || ev.metaKey) && ev.key == "k") {
ev.preventDefault();
-
setShowSearch(!showSearch());
+
+
if (showSearch()) {
+
const searchInput = document.querySelector("#input") as HTMLInputElement;
+
if (searchInput && document.activeElement !== searchInput) {
+
searchInput.focus();
+
} else {
+
setShowSearch(false);
+
}
+
} else {
+
setShowSearch(true);
+
}
} else if (ev.key == "Escape") {
ev.preventDefault();
setShowSearch(false);
···
});
onMount(() => {
-
if (useLocation().pathname !== "/") searchInput.focus();
-
const handlePaste = (e: ClipboardEvent) => {
if (e.target === searchInput) return;
if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;
···
window.addEventListener("paste", handlePaste);
onCleanup(() => window.removeEventListener("paste", handlePaste));
+
});
+
+
createEffect(() => {
+
if (showSearch()) searchInput.focus();
});
const fetchTypeahead = async (input: string) => {
+1 -3
src/layout.tsx
···
<span>PDSls</span>
</A>
<div class="dark:bg-dark-300/60 relative flex items-center gap-0.5 rounded-lg bg-neutral-50/60 px-1 py-0.5">
-
<Show when={location.pathname !== "/"}>
-
<SearchButton />
-
</Show>
+
<SearchButton />
<Show when={hasUserScope("create")}>
<RecordEditor create={true} />
</Show>