reactredux/src/ClientApp/src/store/reducers/ShopFeatured.ts

107 lines
2.7 KiB
TypeScript

import { Action, Reducer } from 'redux'
import { AppThunkAction } from '../'
// Interfaces
import { IParams, IRequest, IResponse } from '../../interfaces'
import { IRelatedProduct } from '../../pages/Shop/Item/RelatedProducts'
import { Get } from '../../restClient'
// Request
interface IGetShopFeaturedSearchParams extends IParams { }
interface IGetShopFeaturedPathParams extends IParams { }
interface IGetShopFeaturedRequestModel extends IRequest<IGetShopFeaturedSearchParams, IGetShopFeaturedPathParams> { }
// Response
interface IGetShopFeaturedResponseModel extends IResponse {
items: IRelatedProduct []
}
export interface ShopFeaturedState extends IGetShopFeaturedResponseModel {
isLoading: boolean
}
interface RequestAction extends IGetShopFeaturedRequestModel {
type: 'REQUEST_SHOP_FEATURED'
}
interface ReceiveAction extends IGetShopFeaturedResponseModel {
type: 'RECEIVE_SHOP_FEATURED'
}
type KnownAction = RequestAction | ReceiveAction
export const actionCreators = {
requestShopFeatured: (props?: IGetShopFeaturedRequestModel): AppThunkAction<KnownAction> => (dispatch, getState) => {
if(process.env.REACT_APP_LOCAL_ONLY == 'Y')
return
Get<Promise<IGetShopFeaturedResponseModel>>('https://localhost:7151/api/ShopFeatured', props?.pathParams, props?.searchParams)
.then(response => response)
.then(data => {
if(data)
dispatch({ type: 'RECEIVE_SHOP_FEATURED', ...data })
})
dispatch({ type: 'REQUEST_SHOP_FEATURED' })
}
}
const unloadedState: ShopFeaturedState = {
items: [
{
id: '',
slug: "shop-catalog-item",
sku: "SKU-0",
image: { src: `${process.env.REACT_APP_FRONTEND}/Image/450x300/dee2e6/6c757d`, alt: "..." },
badges: [ "sale" ],
title: "Shop item title",
brandName: "Brand & Name",
shortText: "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Eaque fugit ratione dicta mollitia. Officiis ad...",
text: "",
author: {
id: '',
image: { src: `${process.env.REACT_APP_FRONTEND}/Image/40x40/ced4da/6c757d`, alt: "..." },
nickName: "Admin"
},
created: (new Date).toString(),
tags: [ "react", "redux", "webapi" ],
rating: 4.5,
price: 20,
newPrice: 10
}
],
isLoading: false
}
export const reducer: Reducer<ShopFeaturedState> = (state: ShopFeaturedState | undefined, incomingAction: Action): ShopFeaturedState => {
if (state === undefined) {
return unloadedState
}
const action = incomingAction as KnownAction
switch (action.type) {
case 'REQUEST_SHOP_FEATURED':
return {
...state,
isLoading: true
}
case 'RECEIVE_SHOP_FEATURED':
return {
...action,
isLoading: false
}
}
return state
}