+12








fcd7c979df
Co-authored-by: Artur <145776561+arturict@users.noreply.github.com> Co-authored-by: arturict <arturict@users.noreply.github.com> Co-authored-by: Thomas <thomas@ajnart.fr> Co-authored-by: Afonso Jorge Ramos <afonsojorgeramos@gmail.com> Co-authored-by: Danura30082 <danura30082+github@gmail.com> Co-authored-by: Kushie <122986913+kushiemoon-dev@users.noreply.github.com> Co-authored-by: ajnart <thomas@ajnart.fr> Co-authored-by: ajnart <thomas@ajnart.dev> Co-authored-by: chenjun <chenjun@foxmail.com> Co-authored-by: Wikibear <wikibear@users.noreply.github.com> Co-authored-by: Bergasha <bergasha@gmail.com> Co-authored-by: leafyelin <43306196+leafyelin@users.noreply.github.com> Co-authored-by: Lucas Araujo <lucas.lra@gmail.com> Co-authored-by: GreenMonito <86085570+GreenMonito@users.noreply.github.com> Co-authored-by: Nerdy-Technician <roffo@nerdy-technician.social> Co-authored-by: Jun <34545896+jcstrong@users.noreply.github.com> Co-authored-by: Edmond Abraham <54119952+gitedmond@users.noreply.github.com> Co-authored-by: thrawnx <tight.bulb9384@fastmail.com> Co-authored-by: Chris <58918656+nordada@users.noreply.github.com> Co-authored-by: yi111 <153097222+Yi-111-a@users.noreply.github.com> Co-authored-by: Yanis <naamaneyanis@gmail.com> Co-authored-by: Wikibear <me@sej.de> Co-authored-by: alessiottavo <93441886+alessiottavo@users.noreply.github.com>
49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
"use client";
|
|
|
|
import { clamp } from "@mantine/hooks";
|
|
import type { SpotlightStore } from "@mantine/spotlight";
|
|
import { createSpotlight } from "@mantine/spotlight";
|
|
import { atom } from "jotai";
|
|
|
|
export const [spotlightStore, spotlightActions] = createSpotlight();
|
|
export const closeSpotlight = spotlightActions.close;
|
|
|
|
export interface MediaRequestSearchScope {
|
|
integrationIds?: string[];
|
|
}
|
|
|
|
export const mediaRequestSearchScopeAtom = atom<MediaRequestSearchScope>({});
|
|
|
|
export const setSelectedAction = (index: number, store: SpotlightStore) => {
|
|
store.updateState((state) => ({ ...state, selected: index }));
|
|
};
|
|
|
|
export const selectAction = (index: number, store: SpotlightStore): number => {
|
|
const state = store.getState();
|
|
const actionsList = document.getElementById(state.listId);
|
|
const selected = actionsList?.querySelector<HTMLButtonElement>("[data-selected]");
|
|
const actions = actionsList?.querySelectorAll<HTMLButtonElement>("[data-action]") ?? [];
|
|
const nextIndex = index === -1 ? actions.length - 1 : index === actions.length ? 0 : index;
|
|
|
|
const selectedIndex = clamp(nextIndex, 0, actions.length - 1);
|
|
selected?.removeAttribute("data-selected");
|
|
actions[selectedIndex]?.scrollIntoView({ block: "nearest" });
|
|
actions[selectedIndex]?.setAttribute("data-selected", "true");
|
|
setSelectedAction(selectedIndex, store);
|
|
|
|
return selectedIndex;
|
|
};
|
|
|
|
export const selectNextAction = (store: SpotlightStore) => {
|
|
return selectAction(store.getState().selected + 1, store);
|
|
};
|
|
|
|
export const selectPreviousAction = (store: SpotlightStore) => {
|
|
return selectAction(store.getState().selected - 1, store);
|
|
};
|
|
export const triggerSelectedAction = (store: SpotlightStore) => {
|
|
const state = store.getState();
|
|
const selected = document.querySelector<HTMLButtonElement>(`#${state.listId} [data-selected]`);
|
|
selected?.click();
|
|
};
|