107 lines
2.7 KiB
TypeScript
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
|
|
}
|