saleor-dashboard/src/components/Navigator/useQuickSearch.ts

71 lines
1.8 KiB
TypeScript
Raw Normal View History

2019-11-21 12:13:41 +00:00
import { RefObject, useEffect, useState } from "react";
2019-11-20 15:58:17 +00:00
import { useIntl } from "react-intl";
import { ChangeEvent, FormChange } from "@saleor/hooks/useForm";
import useModalDialogOpen from "@saleor/hooks/useModalDialogOpen";
2019-11-21 12:13:41 +00:00
import getModeActions from "./modes";
import { QuickSearchAction, QuickSearchMode } from "./types";
2019-11-20 15:58:17 +00:00
2019-11-21 12:13:41 +00:00
type UseQuickSearch = [
string,
QuickSearchMode,
FormChange,
QuickSearchAction[]
];
function useQuickSearch(
open: boolean,
input: RefObject<HTMLInputElement>
): UseQuickSearch {
2019-11-20 15:58:17 +00:00
const [query, setQuery] = useState("");
const [mode, setMode] = useState<QuickSearchMode>("default");
const intl = useIntl();
useModalDialogOpen(open, {
2019-11-21 12:13:41 +00:00
onClose: () => {
setMode("default");
setQuery("");
}
2019-11-20 15:58:17 +00:00
});
2019-11-21 12:13:41 +00:00
const handleBack = (event: KeyboardEvent) => {
// `any` type because of poorly typed `KeyboardEvent.EventTarget` which
// has no `value` key. Which it would have if `KeyboardEvent` and
// `EventTarget` would be generic types accepting HTMLDOM element types.
if ((event.target as any).value === "" && event.keyCode === 8) {
setMode("default");
}
};
useEffect(() => {
setQuery("");
if (mode !== "default" && input.current) {
input.current.addEventListener("keyup", handleBack);
return () => {
if (input.current) {
input.current.removeEventListener("keyup", handleBack);
}
};
}
}, [mode, open]);
2019-11-20 15:58:17 +00:00
const change = (event: ChangeEvent) => {
const value = event.target.value;
2019-11-21 12:13:41 +00:00
if (mode === "default") {
switch (value) {
case "# ":
setMode("orders");
default:
setQuery(value);
}
} else {
setQuery(value);
}
2019-11-20 15:58:17 +00:00
};
2019-11-21 12:13:41 +00:00
return [query, mode, change, getModeActions(mode, query, intl)];
2019-11-20 15:58:17 +00:00
}
export default useQuickSearch;