Debounce order search

This commit is contained in:
dominik-zeglen 2019-11-21 18:47:06 +01:00
parent 2c0e3bb4bf
commit 564aab26f7
11 changed files with 149 additions and 60 deletions

View file

@ -1,17 +1,23 @@
import { IntlShape } from "react-intl"; import { IntlShape } from "react-intl";
import {
CheckIfOrderExists,
CheckIfOrderExistsVariables
} from "../queries/types/CheckIfOrderExists";
import { QuickSearchAction, QuickSearchMode } from "../types"; import { QuickSearchAction, QuickSearchMode } from "../types";
import getDefaultModeActions from "./default"; import getDefaultModeActions from "./default";
import getOrdersModeActions from "./orders"; import getOrdersModeActions from "./orders";
import { ActionQueries } from "./types";
function getModeActions( function getModeActions(
mode: QuickSearchMode, mode: QuickSearchMode,
query: string, query: string,
intl: IntlShape intl: IntlShape,
queries: ActionQueries
): QuickSearchAction[] { ): QuickSearchAction[] {
switch (mode) { switch (mode) {
case "orders": case "orders":
return getOrdersModeActions(query, intl); return getOrdersModeActions(query, intl, queries.order);
default: default:
return getDefaultModeActions(query, intl); return getDefaultModeActions(query, intl);
} }

View file

@ -1,14 +1,27 @@
import { IntlShape } from "react-intl"; import { IntlShape } from "react-intl";
import { maybe } from "@saleor/misc";
import { orderUrl } from "@saleor/orders/urls"; import { orderUrl } from "@saleor/orders/urls";
import { CheckIfOrderExists_order } from "../queries/types/CheckIfOrderExists";
import { QuickSearchAction } from "../types"; import { QuickSearchAction } from "../types";
import messages from "./messages"; import messages from "./messages";
export function isQueryValidOrderNumber(query: string): boolean {
return query === parseInt(query, 0).toString();
}
export function getGqlOrderId(orderNumber: string): string {
return btoa(`Order:${orderNumber}`);
}
function getOrdersModeActions( function getOrdersModeActions(
query: string, query: string,
intl: IntlShape intl: IntlShape,
order: CheckIfOrderExists_order
): QuickSearchAction[] { ): QuickSearchAction[] {
if (query === parseInt(query, 0).toString()) { const gqlId = getGqlOrderId(query);
if (isQueryValidOrderNumber(query) && maybe(() => order.id === gqlId)) {
return [ return [
{ {
label: intl.formatMessage(messages.goToOrder, { label: intl.formatMessage(messages.goToOrder, {
@ -16,7 +29,7 @@ function getOrdersModeActions(
}), }),
score: 1, score: 1,
type: "action", type: "action",
url: orderUrl(btoa(`Order:${query}`)) url: orderUrl(gqlId)
} }
]; ];
} }

View file

@ -0,0 +1,5 @@
import { CheckIfOrderExists_order } from "../queries/types/CheckIfOrderExists";
export interface ActionQueries {
order: CheckIfOrderExists_order;
}

View file

@ -0,0 +1,23 @@
/* tslint:disable */
/* eslint-disable */
// This file was automatically generated and should not be edited.
import { OrderStatus } from "./../../../../types/globalTypes";
// ====================================================
// GraphQL query operation: CheckIfOrderExists
// ====================================================
export interface CheckIfOrderExists_order {
__typename: "Order";
id: string;
status: OrderStatus;
}
export interface CheckIfOrderExists {
order: CheckIfOrderExists_order | null;
}
export interface CheckIfOrderExistsVariables {
id: string;
}

View file

@ -0,0 +1,41 @@
import gql from "graphql-tag";
import { useState } from "react";
import makeQuery, { UseQueryResult } from "@saleor/hooks/makeQuery";
import useDebounce from "@saleor/hooks/useDebounce";
import {
CheckIfOrderExists,
CheckIfOrderExistsVariables
} from "./types/CheckIfOrderExists";
const checkIfOrderExists = gql`
query CheckIfOrderExists($id: ID!) {
order(id: $id) {
id
status
}
}
`;
const useCheckIfOrderExistsQuery = makeQuery<
CheckIfOrderExists,
CheckIfOrderExistsVariables
>(checkIfOrderExists);
type UseCheckIfOrderExists = [
UseQueryResult<CheckIfOrderExists, CheckIfOrderExistsVariables>,
(query: string) => void
];
function useCheckIfOrderExists(): UseCheckIfOrderExists {
const [id, setId] = useState("");
const setIdDebounced = useDebounce(setId);
const result = useCheckIfOrderExistsQuery({
skip: id === "",
variables: {
id
}
});
return [result, setIdDebounced];
}
export default useCheckIfOrderExists;

View file

@ -3,7 +3,10 @@ import { useIntl } from "react-intl";
import { ChangeEvent, FormChange } from "@saleor/hooks/useForm"; import { ChangeEvent, FormChange } from "@saleor/hooks/useForm";
import useModalDialogOpen from "@saleor/hooks/useModalDialogOpen"; import useModalDialogOpen from "@saleor/hooks/useModalDialogOpen";
import { maybe } from "@saleor/misc";
import getModeActions from "./modes"; import getModeActions from "./modes";
import { getGqlOrderId, isQueryValidOrderNumber } from "./modes/orders";
import useCheckIfOrderExists from "./queries/useCheckIfOrderExists";
import { QuickSearchAction, QuickSearchMode } from "./types"; import { QuickSearchAction, QuickSearchMode } from "./types";
type UseQuickSearch = [ type UseQuickSearch = [
@ -19,6 +22,7 @@ function useQuickSearch(
const [query, setQuery] = useState(""); const [query, setQuery] = useState("");
const [mode, setMode] = useState<QuickSearchMode>("default"); const [mode, setMode] = useState<QuickSearchMode>("default");
const intl = useIntl(); const intl = useIntl();
const [{ data: orderData }, getOrderData] = useCheckIfOrderExists();
useModalDialogOpen(open, { useModalDialogOpen(open, {
onClose: () => { onClose: () => {
@ -60,11 +64,21 @@ function useQuickSearch(
setQuery(value); setQuery(value);
} }
} else { } else {
if (mode === "orders" && isQueryValidOrderNumber(value)) {
getOrderData(getGqlOrderId(value));
}
setQuery(value); setQuery(value);
} }
}; };
return [query, mode, change, getModeActions(mode, query, intl)]; return [
query,
mode,
change,
getModeActions(mode, query, intl, {
order: maybe(() => orderData.order)
})
];
} }
export default useQuickSearch; export default useQuickSearch;

View file

@ -6,12 +6,13 @@ function useDebounce<T>(
time = 200 time = 200
): UseDebounceFn<T> { ): UseDebounceFn<T> {
const timer = useRef(null); const timer = useRef(null);
useEffect(() => () => clearTimeout(timer.current)); useEffect(() => () => clearTimeout(timer.current), []);
return (...args: T[]) => { return (...args: T[]) => {
if (timer.current) { if (timer.current) {
clearTimeout(timer.current); clearTimeout(timer.current);
} }
timer.current = setTimeout(() => debounceFn(...args), time); timer.current = setTimeout(() => debounceFn(...args), time);
}; };
} }

View file

@ -2,10 +2,7 @@
/* eslint-disable */ /* eslint-disable */
// This file was automatically generated and should not be edited. // This file was automatically generated and should not be edited.
import { import { PluginUpdateInput, ConfigurationTypeFieldEnum } from "./../../types/globalTypes";
PluginUpdateInput,
ConfigurationTypeFieldEnum
} from "./../../types/globalTypes";
// ==================================================== // ====================================================
// GraphQL mutation operation: PluginUpdate // GraphQL mutation operation: PluginUpdate
@ -32,9 +29,7 @@ export interface PluginUpdate_pluginUpdate_plugin {
name: string; name: string;
description: string; description: string;
active: boolean; active: boolean;
configuration: configuration: (PluginUpdate_pluginUpdate_plugin_configuration | null)[] | null;
| (PluginUpdate_pluginUpdate_plugin_configuration | null)[]
| null;
} }
export interface PluginUpdate_pluginUpdate { export interface PluginUpdate_pluginUpdate {

View file

@ -22,9 +22,7 @@ export interface SearchProductTypes_search_edges_node_productAttributes {
slug: string | null; slug: string | null;
name: string | null; name: string | null;
valueRequired: boolean; valueRequired: boolean;
values: values: (SearchProductTypes_search_edges_node_productAttributes_values | null)[] | null;
| (SearchProductTypes_search_edges_node_productAttributes_values | null)[]
| null;
} }
export interface SearchProductTypes_search_edges_node { export interface SearchProductTypes_search_edges_node {
@ -32,9 +30,7 @@ export interface SearchProductTypes_search_edges_node {
id: string; id: string;
name: string; name: string;
hasVariants: boolean; hasVariants: boolean;
productAttributes: productAttributes: (SearchProductTypes_search_edges_node_productAttributes | null)[] | null;
| (SearchProductTypes_search_edges_node_productAttributes | null)[]
| null;
} }
export interface SearchProductTypes_search_edges { export interface SearchProductTypes_search_edges {

View file

@ -2,12 +2,7 @@
/* eslint-disable */ /* eslint-disable */
// This file was automatically generated and should not be edited. // This file was automatically generated and should not be edited.
import { import { SiteDomainInput, ShopSettingsInput, AddressInput, AuthorizationKeyType } from "./../../types/globalTypes";
SiteDomainInput,
ShopSettingsInput,
AddressInput,
AuthorizationKeyType
} from "./../../types/globalTypes";
// ==================================================== // ====================================================
// GraphQL mutation operation: ShopSettingsUpdate // GraphQL mutation operation: ShopSettingsUpdate

View file

@ -8,41 +8,41 @@
export enum AddressTypeEnum { export enum AddressTypeEnum {
BILLING = "BILLING", BILLING = "BILLING",
SHIPPING = "SHIPPING" SHIPPING = "SHIPPING",
} }
export enum AttributeInputTypeEnum { export enum AttributeInputTypeEnum {
DROPDOWN = "DROPDOWN", DROPDOWN = "DROPDOWN",
MULTISELECT = "MULTISELECT" MULTISELECT = "MULTISELECT",
} }
export enum AttributeTypeEnum { export enum AttributeTypeEnum {
PRODUCT = "PRODUCT", PRODUCT = "PRODUCT",
VARIANT = "VARIANT" VARIANT = "VARIANT",
} }
export enum AttributeValueType { export enum AttributeValueType {
COLOR = "COLOR", COLOR = "COLOR",
GRADIENT = "GRADIENT", GRADIENT = "GRADIENT",
STRING = "STRING", STRING = "STRING",
URL = "URL" URL = "URL",
} }
export enum AuthorizationKeyType { export enum AuthorizationKeyType {
FACEBOOK = "FACEBOOK", FACEBOOK = "FACEBOOK",
GOOGLE_OAUTH2 = "GOOGLE_OAUTH2" GOOGLE_OAUTH2 = "GOOGLE_OAUTH2",
} }
export enum CollectionPublished { export enum CollectionPublished {
HIDDEN = "HIDDEN", HIDDEN = "HIDDEN",
PUBLISHED = "PUBLISHED" PUBLISHED = "PUBLISHED",
} }
export enum ConfigurationTypeFieldEnum { export enum ConfigurationTypeFieldEnum {
BOOLEAN = "BOOLEAN", BOOLEAN = "BOOLEAN",
PASSWORD = "PASSWORD", PASSWORD = "PASSWORD",
SECRET = "SECRET", SECRET = "SECRET",
STRING = "STRING" STRING = "STRING",
} }
export enum CountryCode { export enum CountryCode {
@ -295,23 +295,23 @@ export enum CountryCode {
YT = "YT", YT = "YT",
ZA = "ZA", ZA = "ZA",
ZM = "ZM", ZM = "ZM",
ZW = "ZW" ZW = "ZW",
} }
export enum DiscountStatusEnum { export enum DiscountStatusEnum {
ACTIVE = "ACTIVE", ACTIVE = "ACTIVE",
EXPIRED = "EXPIRED", EXPIRED = "EXPIRED",
SCHEDULED = "SCHEDULED" SCHEDULED = "SCHEDULED",
} }
export enum DiscountValueTypeEnum { export enum DiscountValueTypeEnum {
FIXED = "FIXED", FIXED = "FIXED",
PERCENTAGE = "PERCENTAGE" PERCENTAGE = "PERCENTAGE",
} }
export enum FulfillmentStatus { export enum FulfillmentStatus {
CANCELED = "CANCELED", CANCELED = "CANCELED",
FULFILLED = "FULFILLED" FULFILLED = "FULFILLED",
} }
export enum LanguageCodeEnum { export enum LanguageCodeEnum {
@ -357,19 +357,19 @@ export enum LanguageCodeEnum {
UK = "UK", UK = "UK",
VI = "VI", VI = "VI",
ZH_HANS = "ZH_HANS", ZH_HANS = "ZH_HANS",
ZH_HANT = "ZH_HANT" ZH_HANT = "ZH_HANT",
} }
export enum OrderAction { export enum OrderAction {
CAPTURE = "CAPTURE", CAPTURE = "CAPTURE",
MARK_AS_PAID = "MARK_AS_PAID", MARK_AS_PAID = "MARK_AS_PAID",
REFUND = "REFUND", REFUND = "REFUND",
VOID = "VOID" VOID = "VOID",
} }
export enum OrderDirection { export enum OrderDirection {
ASC = "ASC", ASC = "ASC",
DESC = "DESC" DESC = "DESC",
} }
export enum OrderEventsEmailsEnum { export enum OrderEventsEmailsEnum {
@ -378,7 +378,7 @@ export enum OrderEventsEmailsEnum {
ORDER_CONFIRMATION = "ORDER_CONFIRMATION", ORDER_CONFIRMATION = "ORDER_CONFIRMATION",
PAYMENT_CONFIRMATION = "PAYMENT_CONFIRMATION", PAYMENT_CONFIRMATION = "PAYMENT_CONFIRMATION",
SHIPPING_CONFIRMATION = "SHIPPING_CONFIRMATION", SHIPPING_CONFIRMATION = "SHIPPING_CONFIRMATION",
TRACKING_UPDATED = "TRACKING_UPDATED" TRACKING_UPDATED = "TRACKING_UPDATED",
} }
export enum OrderEventsEnum { export enum OrderEventsEnum {
@ -402,7 +402,7 @@ export enum OrderEventsEnum {
PLACED = "PLACED", PLACED = "PLACED",
PLACED_FROM_DRAFT = "PLACED_FROM_DRAFT", PLACED_FROM_DRAFT = "PLACED_FROM_DRAFT",
TRACKING_UPDATED = "TRACKING_UPDATED", TRACKING_UPDATED = "TRACKING_UPDATED",
UPDATED_ADDRESS = "UPDATED_ADDRESS" UPDATED_ADDRESS = "UPDATED_ADDRESS",
} }
export enum OrderStatus { export enum OrderStatus {
@ -410,7 +410,7 @@ export enum OrderStatus {
DRAFT = "DRAFT", DRAFT = "DRAFT",
FULFILLED = "FULFILLED", FULFILLED = "FULFILLED",
PARTIALLY_FULFILLED = "PARTIALLY_FULFILLED", PARTIALLY_FULFILLED = "PARTIALLY_FULFILLED",
UNFULFILLED = "UNFULFILLED" UNFULFILLED = "UNFULFILLED",
} }
export enum OrderStatusFilter { export enum OrderStatusFilter {
@ -419,7 +419,7 @@ export enum OrderStatusFilter {
PARTIALLY_FULFILLED = "PARTIALLY_FULFILLED", PARTIALLY_FULFILLED = "PARTIALLY_FULFILLED",
READY_TO_CAPTURE = "READY_TO_CAPTURE", READY_TO_CAPTURE = "READY_TO_CAPTURE",
READY_TO_FULFILL = "READY_TO_FULFILL", READY_TO_FULFILL = "READY_TO_FULFILL",
UNFULFILLED = "UNFULFILLED" UNFULFILLED = "UNFULFILLED",
} }
export enum PaymentChargeStatusEnum { export enum PaymentChargeStatusEnum {
@ -427,7 +427,7 @@ export enum PaymentChargeStatusEnum {
FULLY_REFUNDED = "FULLY_REFUNDED", FULLY_REFUNDED = "FULLY_REFUNDED",
NOT_CHARGED = "NOT_CHARGED", NOT_CHARGED = "NOT_CHARGED",
PARTIALLY_CHARGED = "PARTIALLY_CHARGED", PARTIALLY_CHARGED = "PARTIALLY_CHARGED",
PARTIALLY_REFUNDED = "PARTIALLY_REFUNDED" PARTIALLY_REFUNDED = "PARTIALLY_REFUNDED",
} }
export enum PermissionEnum { export enum PermissionEnum {
@ -445,7 +445,7 @@ export enum PermissionEnum {
MANAGE_STAFF = "MANAGE_STAFF", MANAGE_STAFF = "MANAGE_STAFF",
MANAGE_TRANSLATIONS = "MANAGE_TRANSLATIONS", MANAGE_TRANSLATIONS = "MANAGE_TRANSLATIONS",
MANAGE_USERS = "MANAGE_USERS", MANAGE_USERS = "MANAGE_USERS",
MANAGE_WEBHOOKS = "MANAGE_WEBHOOKS" MANAGE_WEBHOOKS = "MANAGE_WEBHOOKS",
} }
export enum ProductErrorCode { export enum ProductErrorCode {
@ -459,7 +459,7 @@ export enum ProductErrorCode {
NOT_PRODUCTS_IMAGE = "NOT_PRODUCTS_IMAGE", NOT_PRODUCTS_IMAGE = "NOT_PRODUCTS_IMAGE",
REQUIRED = "REQUIRED", REQUIRED = "REQUIRED",
UNIQUE = "UNIQUE", UNIQUE = "UNIQUE",
VARIANT_NO_DIGITAL_CONTENT = "VARIANT_NO_DIGITAL_CONTENT" VARIANT_NO_DIGITAL_CONTENT = "VARIANT_NO_DIGITAL_CONTENT",
} }
export enum ProductOrderField { export enum ProductOrderField {
@ -468,37 +468,37 @@ export enum ProductOrderField {
NAME = "NAME", NAME = "NAME",
PRICE = "PRICE", PRICE = "PRICE",
PUBLISHED = "PUBLISHED", PUBLISHED = "PUBLISHED",
TYPE = "TYPE" TYPE = "TYPE",
} }
export enum ProductTypeConfigurable { export enum ProductTypeConfigurable {
CONFIGURABLE = "CONFIGURABLE", CONFIGURABLE = "CONFIGURABLE",
SIMPLE = "SIMPLE" SIMPLE = "SIMPLE",
} }
export enum ProductTypeEnum { export enum ProductTypeEnum {
DIGITAL = "DIGITAL", DIGITAL = "DIGITAL",
SHIPPABLE = "SHIPPABLE" SHIPPABLE = "SHIPPABLE",
} }
export enum SaleType { export enum SaleType {
FIXED = "FIXED", FIXED = "FIXED",
PERCENTAGE = "PERCENTAGE" PERCENTAGE = "PERCENTAGE",
} }
export enum ShippingMethodTypeEnum { export enum ShippingMethodTypeEnum {
PRICE = "PRICE", PRICE = "PRICE",
WEIGHT = "WEIGHT" WEIGHT = "WEIGHT",
} }
export enum StaffMemberStatus { export enum StaffMemberStatus {
ACTIVE = "ACTIVE", ACTIVE = "ACTIVE",
DEACTIVATED = "DEACTIVATED" DEACTIVATED = "DEACTIVATED",
} }
export enum StockAvailability { export enum StockAvailability {
IN_STOCK = "IN_STOCK", IN_STOCK = "IN_STOCK",
OUT_OF_STOCK = "OUT_OF_STOCK" OUT_OF_STOCK = "OUT_OF_STOCK",
} }
export enum TaxRateType { export enum TaxRateType {
@ -526,19 +526,19 @@ export enum TaxRateType {
SOCIAL_HOUSING = "SOCIAL_HOUSING", SOCIAL_HOUSING = "SOCIAL_HOUSING",
STANDARD = "STANDARD", STANDARD = "STANDARD",
WATER = "WATER", WATER = "WATER",
WINE = "WINE" WINE = "WINE",
} }
export enum VoucherDiscountType { export enum VoucherDiscountType {
FIXED = "FIXED", FIXED = "FIXED",
PERCENTAGE = "PERCENTAGE", PERCENTAGE = "PERCENTAGE",
SHIPPING = "SHIPPING" SHIPPING = "SHIPPING",
} }
export enum VoucherTypeEnum { export enum VoucherTypeEnum {
ENTIRE_ORDER = "ENTIRE_ORDER", ENTIRE_ORDER = "ENTIRE_ORDER",
SHIPPING = "SHIPPING", SHIPPING = "SHIPPING",
SPECIFIC_PRODUCT = "SPECIFIC_PRODUCT" SPECIFIC_PRODUCT = "SPECIFIC_PRODUCT",
} }
export enum WebhookErrorCode { export enum WebhookErrorCode {
@ -546,7 +546,7 @@ export enum WebhookErrorCode {
INVALID = "INVALID", INVALID = "INVALID",
NOT_FOUND = "NOT_FOUND", NOT_FOUND = "NOT_FOUND",
REQUIRED = "REQUIRED", REQUIRED = "REQUIRED",
UNIQUE = "UNIQUE" UNIQUE = "UNIQUE",
} }
export enum WebhookEventTypeEnum { export enum WebhookEventTypeEnum {
@ -557,14 +557,14 @@ export enum WebhookEventTypeEnum {
ORDER_FULFILLED = "ORDER_FULFILLED", ORDER_FULFILLED = "ORDER_FULFILLED",
ORDER_FULLY_PAID = "ORDER_FULLY_PAID", ORDER_FULLY_PAID = "ORDER_FULLY_PAID",
ORDER_UPDATED = "ORDER_UPDATED", ORDER_UPDATED = "ORDER_UPDATED",
PRODUCT_CREATED = "PRODUCT_CREATED" PRODUCT_CREATED = "PRODUCT_CREATED",
} }
export enum WeightUnitsEnum { export enum WeightUnitsEnum {
G = "G", G = "G",
KG = "KG", KG = "KG",
LB = "LB", LB = "LB",
OZ = "OZ" OZ = "OZ",
} }
export interface AddressInput { export interface AddressInput {