@redocly/theme
Version:
Shared UI components lib
44 lines (35 loc) • 1.35 kB
text/typescript
import { useEffect, useCallback, useState } from 'react';
import { useLocation } from 'react-router-dom';
import hotkeys from 'hotkeys-js';
import { useThemeHooks, useThemeConfig } from '@redocly/theme/core/hooks';
export function useSearchDialog() {
const [isOpen, setIsOpen] = useState(false);
const themeSettings = useThemeConfig();
const location = useLocation();
const { useOtelTelemetry } = useThemeHooks();
const otelTelemetry = useOtelTelemetry();
const keyShortcuts = themeSettings?.search?.shortcuts ?? ['/'];
const hotKeys = keyShortcuts?.join(',');
useEffect(() => {
if (hotKeys) {
hotkeys(hotKeys, (ev) => {
setIsOpen(true);
otelTelemetry.send({ type: 'search.opened', payload: { method: 'shortcut' } });
ev.preventDefault();
});
return () => hotkeys.unbind(hotKeys);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [hotKeys]);
const onOpen = useCallback(function () {
otelTelemetry.send({ type: 'search.opened', payload: { method: 'click' } });
setIsOpen(true);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const onClose = useCallback(() => {
setIsOpen(false);
}, []);
// eslint-disable-next-line react-hooks/exhaustive-deps
useEffect(onClose, [location]);
return { isOpen, onOpen, onClose };
}