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

136 lines
3.6 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";
2019-11-25 11:29:07 +00:00
import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
2019-11-20 15:58:17 +00:00
import { ChangeEvent, FormChange } from "@saleor/hooks/useForm";
import useModalDialogOpen from "@saleor/hooks/useModalDialogOpen";
2019-11-22 15:39:20 +00:00
import useNavigator from "@saleor/hooks/useNavigator";
2019-11-21 17:47:06 +00:00
import { maybe } from "@saleor/misc";
2019-11-22 15:39:20 +00:00
import { useOrderDraftCreateMutation } from "@saleor/orders/mutations";
import { orderUrl } from "@saleor/orders/urls";
2019-11-25 11:29:07 +00:00
import useCustomerSearch from "@saleor/searches/useCustomerSearch";
2019-11-21 12:13:41 +00:00
import getModeActions from "./modes";
2019-11-21 17:47:06 +00:00
import { getGqlOrderId, isQueryValidOrderNumber } from "./modes/orders";
2019-11-25 14:32:10 +00:00
import useSearchCatalog from "./queries/useCatalogSearch";
2019-11-21 17:47:06 +00:00
import useCheckIfOrderExists from "./queries/useCheckIfOrderExists";
2019-11-21 12:13:41 +00:00
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();
2019-11-22 15:39:20 +00:00
const navigate = useNavigator();
2019-11-21 17:47:06 +00:00
const [{ data: orderData }, getOrderData] = useCheckIfOrderExists();
2019-11-25 11:29:07 +00:00
const { result: customers, search: searchCustomers } = useCustomerSearch({
variables: {
...DEFAULT_INITIAL_SEARCH_DATA,
first: 5
}
});
2019-11-25 14:32:10 +00:00
const [{ data: catalog }, searchCatalog] = useSearchCatalog(5);
2019-11-22 15:39:20 +00:00
const [createOrder] = useOrderDraftCreateMutation({
onCompleted: result => {
if (result.draftOrderCreate.errors.length === 0) {
navigate(orderUrl(result.draftOrderCreate.order.id));
}
}
});
2019-11-20 15:58:17 +00:00
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) {
2019-11-22 15:39:20 +00:00
case "> ":
setMode("commands");
break;
2019-11-25 11:29:07 +00:00
case "@ ":
setMode("customers");
break;
2019-11-21 12:13:41 +00:00
case "# ":
setMode("orders");
2019-11-22 15:39:20 +00:00
break;
2019-11-25 14:32:10 +00:00
case "$ ":
setMode("catalog");
break;
2019-11-21 12:13:41 +00:00
default:
setQuery(value);
}
} else {
2019-11-21 17:47:06 +00:00
if (mode === "orders" && isQueryValidOrderNumber(value)) {
getOrderData(getGqlOrderId(value));
}
2019-11-25 14:32:10 +00:00
if (mode === "catalog") {
searchCatalog(value);
}
2019-11-25 15:51:28 +00:00
if (mode === "customers") {
searchCustomers(value);
}
2019-11-21 12:13:41 +00:00
setQuery(value);
}
2019-11-20 15:58:17 +00:00
};
2019-11-21 17:47:06 +00:00
return [
query,
mode,
change,
2019-11-22 15:39:20 +00:00
getModeActions(
mode,
query,
intl,
{
2019-11-25 14:32:10 +00:00
catalog,
2019-11-25 11:29:07 +00:00
customers: maybe(
() => customers.data.search.edges.map(edge => edge.node),
[]
),
2019-11-22 15:39:20 +00:00
order: maybe(() => orderData.order)
},
{
createOrder,
navigate
}
)
2019-11-21 17:47:06 +00:00
];
2019-11-20 15:58:17 +00:00
}
export default useQuickSearch;