/// 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>;