///
import { DocumentNode } from 'graphql';
import { MutationTuple, QueryResult } from 'react-apollo';
import { CustomerProductListResult, MutationAddToCustomerProductListArgs, MutationRemoveFromCustomerProductListArgs, MutationUpdateCustomerProductListItemArgs, Product, ProductVariant, QueryCustomerProductListArgs, QueryProductsArgs } from '../../types';
import { ThunkAction } from '../useThunkReducer';
import { Action } from './product-list-reducer';
export { useProductList } from './useProductList';
export { useProductListItems } from './useProductListItems';
export interface UpdateListOptions {
quantity?: number;
description?: string;
productName?: string;
}
export interface ProductListContextOptions {
state: ProductListState;
dispatch: React.Dispatch>;
usingLocalList: boolean;
queries: ProductListQueries;
}
export interface ProductListState {
loggedIn: boolean;
list: NormalizedProductList;
requestIdRef: React.MutableRefObject;
}
export interface ProductListQueries {
/** Products query, used for retrieving products from localList */
productsQuery: DocumentNode;
/** The customerProductList query */
query: DocumentNode;
/** The addToCustomerProductList mutation */
add: DocumentNode;
/** An addToCustomerProductList mutation that returns the full list */
login: DocumentNode;
/** The removeToCustomerProductList mutation */
remove: DocumentNode;
/** The updateCustomerProductListItem mutation */
update: DocumentNode;
}
export interface UpdateListInput extends UpdateListOptions {
variantArticleNumber?: string;
}
export interface ProductListDetail {
/** Whether a query is in flight for the products in the list */
loading: boolean;
/** An array containing the product data */
products: ProductListProduct[];
}
export interface NormalizedProductList {
[articleNumber: string]: {
options: ProductListItemOptions;
variants: ProductListItemVariants | null;
};
}
export interface FlattenedProductListItem {
articleNumber: string;
parentArticleNumber?: string;
options: ProductListItemOptions;
}
export interface ProductListItemOptions {
quantity?: number;
description?: string;
}
export interface ProductListItemVariants {
[articleNumber: string]: {
options: ProductListItemOptions;
/** TODO: change to baseArticleNumber ? */
parentArticleNumber: string;
};
}
export interface ProductListProduct extends Product {
quantity: number;
isVariant: boolean;
variant: ProductVariant;
validation: ProductListProductValidation;
}
export declare type ProductListProductValidation = {
status: 'valid' | 'outOfStock' | 'configurations' | 'missingVariant' | 'preOrder' | 'package';
message: string;
};
export declare type AddToListMutation = MutationTuple<{
addToCustomerProductList: CustomerProductListResult;
}, MutationAddToCustomerProductListArgs>;
export declare type RemoveFromListMutation = MutationTuple<{
removeFromCustomerProductList: CustomerProductListResult;
}, MutationRemoveFromCustomerProductListArgs>;
export declare type UpdateListItemMutation = MutationTuple<{
updateCustomerProductListItem: CustomerProductListResult;
}, MutationUpdateCustomerProductListItemArgs>;
export declare type ListProductsQuery = QueryResult;
export declare type ProductsQuery = QueryResult<{
products: Product[];
}, QueryProductsArgs>;