165 lines
5.1 KiB
TypeScript
165 lines
5.1 KiB
TypeScript
import { EnumSaleMode } from '@/common/Enumerate'
|
|
import React, { Dispatch } from 'react'
|
|
import { useContext } from 'react'
|
|
import { ShoppingStore } from './shoppingStore'
|
|
|
|
/**
|
|
* 456: {
|
|
* purchaserId: 456,
|
|
* colorKind: {
|
|
* 4562: {
|
|
* id: 4562,
|
|
* ...
|
|
* }
|
|
* },
|
|
* multipleSelection: {
|
|
* 4562: {
|
|
* id: 4562,
|
|
* ...
|
|
* }
|
|
* }
|
|
* },
|
|
* 457: {
|
|
* purchaserId: 457,
|
|
* colorKind: {
|
|
* 4562: {
|
|
* id: 4562,
|
|
* ...
|
|
* }
|
|
* }
|
|
* }
|
|
*/
|
|
export type ColorStore = {
|
|
[purchaserId: GoodsMeta['purchaserId']]: GoodsMeta
|
|
}
|
|
|
|
export type Goods = {
|
|
id: number
|
|
product_code: number // 面料编号
|
|
product_color_code: number // 颜色编号
|
|
estimate_amount: number // 预估金额
|
|
count: number // 已选的条数或米数
|
|
sale_mode: EnumSaleMode
|
|
}
|
|
// 分组
|
|
export interface GoodsMeta {
|
|
purchaserId: number
|
|
goodsKind?: {
|
|
[id: Goods['id']]: Goods
|
|
}
|
|
multipleSelection?: GoodsMeta['goodsKind']
|
|
}
|
|
|
|
export interface ShoppingStateContextValue {
|
|
isManageStatus: boolean // 管理按钮的状态
|
|
isMultipleSelection: boolean // 全选按钮的状态
|
|
currentCheckedPurchaserId: number // 当前高亮的客户ID
|
|
currentCheckedSaleMode: EnumSaleMode
|
|
colorStore: ColorStore
|
|
selectedAmount: number
|
|
Observer: ShoppingStore
|
|
}
|
|
|
|
export enum ShoppingDispatchType {
|
|
UPDATE_MANAGE_STATUS = 'UPDATE_MANAGE_STATUS',
|
|
UPDATE_MULTIPLE_SELECTION = 'UPDATE_MULTIPLE_SELECTION',
|
|
UPDATE_CURRENT_CHECKED_PURCHASERID = 'UPDATE_CURRENT_CHECKED_PURCHASERID',
|
|
UPDATE_CURRENT_CHECKED_SALEMODE = 'UPDATE_CURRENT_CHECKED_SALEMODE',
|
|
UPDATE_COLOR_STORE = 'UPDATE_COLOR_STORE',
|
|
UPDATE_SELECTED_AMOUNT = 'UPDATE_SELECTED_AMOUNT',
|
|
UPDATE_CHANGED_CHECKBOX = 'UPDATE_CHANGED_CHECKBOX',
|
|
}
|
|
|
|
export interface ShoppingDispatchContextValue {
|
|
[ShoppingDispatchType.UPDATE_MANAGE_STATUS]: (isManageStatus: ShoppingStateContextValue['isManageStatus']) => void
|
|
[ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION]: (isMultipleSelection: ShoppingStateContextValue['isMultipleSelection']) => void
|
|
[ShoppingDispatchType.UPDATE_CURRENT_CHECKED_PURCHASERID]: (purchaserId: ShoppingStateContextValue['currentCheckedPurchaserId']) => void
|
|
[ShoppingDispatchType.UPDATE_CURRENT_CHECKED_SALEMODE]: (saleMode: ShoppingStateContextValue['currentCheckedSaleMode']) => void
|
|
[ShoppingDispatchType.UPDATE_COLOR_STORE]: (colorStore: React.SetStateAction<ColorStore>) => void
|
|
[ShoppingDispatchType.UPDATE_SELECTED_AMOUNT]: (amount: React.SetStateAction<ShoppingStateContextValue['selectedAmount']>) => void
|
|
[ShoppingDispatchType.UPDATE_CHANGED_CHECKBOX]: (amount: React.SetStateAction<ShoppingStateContextValue['selectedAmount']>) => void
|
|
}
|
|
|
|
|
|
export type ShoppingAction = {
|
|
type: ShoppingDispatchType
|
|
data?: any
|
|
}
|
|
|
|
export function shoppingReducer(state: ShoppingStateContextValue, action: ShoppingAction) {
|
|
const { type, data } = action
|
|
switch (type) {
|
|
case ShoppingDispatchType.UPDATE_MANAGE_STATUS: {
|
|
return { ...state, isManageStatus: data }
|
|
}
|
|
case ShoppingDispatchType.UPDATE_MULTIPLE_SELECTION: {
|
|
return { ...state, isMultipleSelection: data }
|
|
}
|
|
case ShoppingDispatchType.UPDATE_CURRENT_CHECKED_PURCHASERID: {
|
|
return { ...state, currentCheckedPurchaserId: data }
|
|
}
|
|
case ShoppingDispatchType.UPDATE_CURRENT_CHECKED_SALEMODE: {
|
|
return { ...state, currentCheckedSaleMode: data }
|
|
}
|
|
case ShoppingDispatchType.UPDATE_COLOR_STORE: {
|
|
return { ...state, colorStore: data }
|
|
}
|
|
case ShoppingDispatchType.UPDATE_SELECTED_AMOUNT: {
|
|
return { ...state, selectedAmount: data }
|
|
}
|
|
case ShoppingDispatchType.UPDATE_CHANGED_CHECKBOX: {
|
|
return {
|
|
...state,
|
|
colorStore: {
|
|
...state.colorStore,
|
|
[data.purchaserId as number]: {
|
|
purchaserId: data.purchaserId,
|
|
goodsKind: { ...state.colorStore[data.purchaserId]?.goodsKind, ...data.goodsKind },
|
|
multipleSelection: data?.multipleSelection ? data.multipleSelection : state.colorStore[data.purchaserId]?.multipleSelection,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
default:
|
|
throwError()
|
|
}
|
|
}
|
|
|
|
export const ShoppingStateContext = React.createContext<ShoppingStateContextValue | null>(null)
|
|
|
|
export const ShoppingDispatchContext = React.createContext<Dispatch<ShoppingAction> | null>(null)
|
|
|
|
export function useShoppingState() {
|
|
const ctx = useContext(ShoppingStateContext)
|
|
if (!ctx) {
|
|
throw new Error('没有获取到shopping context')
|
|
}
|
|
return ctx
|
|
}
|
|
|
|
export function useShoppingDispatch() {
|
|
const ctx = useContext(ShoppingDispatchContext)
|
|
if (!ctx) {
|
|
throw new Error('没有获取到shopping dispatch')
|
|
}
|
|
return ctx
|
|
}
|
|
|
|
export function useWatch(purchaserId: GoodsMeta['purchaserId'], id: number) {
|
|
const { colorStore } = useShoppingState()
|
|
return id ? colorStore[purchaserId]['goodsKind']![id] : colorStore[purchaserId]['goodsKind']
|
|
}
|
|
|
|
export interface ShoppingCartAction {
|
|
setManageStatus: (manageStatus: boolean) => void
|
|
getManageStatus: () => boolean
|
|
}
|
|
|
|
export interface InternalShoppingCartAction extends ShoppingCartAction {
|
|
__INTERNAL__: React.MutableRefObject<ShoppingCartAction | null>
|
|
}
|
|
|
|
function throwError(): never {
|
|
throw new Error('没有这个action.type')
|
|
}
|