import { BaseUnsetState } from '#typings/index' ; import { Price } from '@commercelayer/sdk' ; import { Dispatch } from 'react' ; import baseReducer from '#utils/baseReducer' ; import { SkuInventory } from './AvailabilityReducer' ; export interface Items { [ skuCode ] : SkuInventory ; } export interface ItemPrices { [ skuCode ] : Price ; } export interface ItemQuantity { [ skuCode ] : number ; } export interface ItemOption { [ key ] : { skuOptionId : string ; options : { [ key ] : string ; } ; } ; } export interface ItemOptions { [ skuCode ] : ItemOption ; } export type CustomLineItem = { name ? : string ; imageUrl ? : string | null ; } ; export interface CustomLineItems { [ skuCode ] : CustomLineItem ; } type ItemParams = { type : ItemActionType ; key : 'items' | 'item' | 'quantity' | 'option' | 'prices' | 'lineItem' | 'lineItems' | 'skuCode' ; } ; type DataType = Items | ItemQuantity | ItemOptions | ItemPrices | CustomLineItems | CustomLineItem | string ; export interface SetItemState { ( data , params , dispatch ) : void ; } export const setItemState = ( data , params , dispatch ) => { dispatch ( { type : params . type , payload : { [ `${ params . key }` ] : data , } , } ) ; } ; export const unsetItemState = ( dispatch ) => { dispatch ( { type : 'setItem' , payload : { item : { } , } , } ) ; dispatch ( { type : 'setItems' , payload : { items : { } , } , } ) ; dispatch ( { type : 'setQuantity' , payload : { quantity : { } , } , } ) ; dispatch ( { type : 'setOption' , payload : { option : { } , } , } ) ; dispatch ( { type : 'setCustomLineItems' , payload : { lineItems : { } , } , } ) ; dispatch ( { type : 'setCustomLineItem' , payload : { lineItem : { } , } , } ) ; } ; export type SetCustomLineItems = ( lineItems : CustomLineItems ) => void ; export type SetCustomLineItem = ( lineItem : CustomLineItem ) => void ; export interface ItemState { skuCode ? : string ; items ? : Items ; item ? : Items ; lineItems ? : CustomLineItems ; lineItem ? : CustomLineItem ; quantity ? : ItemQuantity ; option ? : ItemOptions ; prices ? : ItemPrices ; setItems ? : ( items : Items ) => void ; setItem ? : ( item : Items ) => void ; setQuantity ? : ( quantity : ItemQuantity ) => void ; setOption ? : ( option : ItemOptions ) => void ; setPrices ? : ( prices : ItemPrices ) => void ; setSkuCode ? : ( skuCode : string ) => void ; setCustomLineItems : SetCustomLineItems ; setCustomLineItem ? : SetCustomLineItem ; } type ItemActionType = 'setItem' | 'setItems' | 'setQuantity' | 'setOption' | 'setPrices' | 'setCustomLineItems' | 'setCustomLineItem' | 'setSkuCode' ; const actionType = [ 'setItem' , 'setItems' , 'setQuantity' , 'setOption' , 'setPrices' , 'setCustomLineItems' , 'setCustomLineItem' , 'setSkuCode' , ] ; export interface ItemAction { type : ItemActionType ; payload : Partial < ItemState > ; } export const itemInitialState = { items : { } , item : { } , quantity : { } , option : { } , prices : { } , lineItems : { } , lineItem : { } , skuCode : '' , } ; const itemReducer = ( state , reducer ) : Partial < ItemState > => baseReducer < Partial < ItemState > , ItemAction , ItemActionType [ ] > ( state , reducer , actionType ) ; export default itemReducer ;