* wip: add spotlight * feat: add spotlight with registration hook and group chips * chore: address pull request feedback * docs: add documentation for usage of spotlight actions * fix: deepsource issue JS-0415 * feat: add support for dependencies of spotlight actions * fix: lockfile broken * feat: add hover effect for spotlight action * docs: Add documentation about dependency array * refactor: remove test spotlight actions, disallow all as group for actions * fix: type issues * chore: address pull request feedback
46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
"use client";
|
|
|
|
import { clamp } from "@mantine/hooks";
|
|
import type { SpotlightStore } from "@mantine/spotlight";
|
|
import { createSpotlight } from "@mantine/spotlight";
|
|
|
|
export const [spotlightStore, spotlightActions] = createSpotlight();
|
|
|
|
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();
|
|
};
|