import {setLoadAction, setProductCartAction, setTokenAction, setUserAction} from "../store/actions";
import {ActionType, ProductType, StateType, TokenType, UserType} from "../types/types";
import axios, {AxiosRequestConfig, AxiosResponse} from 'axios'
import store from "../store/store";
import LOCATION from "../vars/LOCATION";
import Message from "../config/Message";
import formatPhone from "../config/formatPhone";
const server = axios.create({
baseURL: LOCATION,
})
type IResult<T = {}> = {
data: {
result: boolean
} & T
}
interface IStatus {
status?: number
}
type SuccessResponse<T = {}> = IResult<T> & IStatus
type FailRespone = IResult
//API AUTOMATICLY SET STORE APPLICATION STATE
class API {
constructor() {
//INITIAL REQ AND RES SUBSCRIBE OBSERVE
server.interceptors.request.use((req: AxiosRequestConfig) => {
this.setLoader(true)
if (req?.data?.phone) {
const {phone} = req.data
req.data.phone = formatPhone(phone)
}
return req
})
server.interceptors.response.use((res: AxiosResponse) => {
this.setLoader(false)
return res
})
}
private dispatch(action: ActionType) {
store.dispatch<ActionType>(action)
}
private FailResult: FailRespone = {data: {result: false}}
private getState(): StateType {
return store.getState()
}
private getUserToken(): TokenType {
return this.getState().token || ''
}
private setLoader(load: boolean) {
this.dispatch(setLoadAction(load))
return load
}
private setUserTokenToStore({token}: { token: TokenType }): void {
this.dispatch(setTokenAction(token))
}
private setError(e: Error): IResult {
this.setLoader(false)
Message('Ошибка соединения')
console.warn(e, 'ERR')
return this.FailResult
}
private getHeaderWithToken(): { headers: { token: TokenType } } {
return {headers: {token: this.getUserToken()}}
}
async getSmsCodeByPhone({phone}: { phone: string }): Promise<SuccessResponse> {
return (await server.post<{ phone: string }, any>('/user/code', {phone})
.catch((e) => this.setError(e)))
}
async verifyUserLoginByCodeAndSetToken({phone, code}: { phone: string, code: string }): Promise<SuccessResponse<{ is_registered?: boolean, token?: string }>> {
const result: SuccessResponse<{ is_registered?: boolean, token?: string }> = (await server.post<{ phone: string, code: string }, any>('/user/verify', {phone, code})
.catch((e) => this.setError(e)))
if (result?.data?.token) {
this.dispatch(setTokenAction(result.data.token))
}
return result
}
async registrationUserIfToken({username, email, phone}: { username: string, email: string, phone: string }): Promise<SuccessResponse> {
if (!this.getUserToken()) {
console.warn('TOKEN NOT EXIST IN STORE')
return this.FailResult
}
return (await server.post<{ username: string, email: string, phone: string }, any>(
'/user/registration', {username, email, phone}, this.getHeaderWithToken())
.catch((e) => this.setError(e)))
}
async scanProductByScanner({code}: { code: string }): Promise<SuccessResponse<{ exists?: boolean, product?: ProductType, cart?: ProductType[], total?: string }>> {
const result: SuccessResponse<{ exists?: boolean, product?: ProductType, cart?: ProductType[], total?: string }> = (await server.post<{ code: string }, any>(
'/product/add', {code}, this.getHeaderWithToken())
.catch((e) => this.setError(e)))
if (result?.data?.result && result?.data?.cart && result?.data?.total) {
this.dispatch(setProductCartAction(result.data.cart, result.data.total))
return result
}
console.warn('CART NONE OR RESULT FALSE')
return this.FailResult
}
}
export default new API()
Степ, пости такое лучше на хабр, тутошний народ гораздо больше любит когда кого-то Яндекс еда обманула на гамбургер
Я извиняюсь как человек, пишущий в ооп стиле и пользующийся мобиксом, вот этот трэш, подписанный как "CLASSIC OLD", его реально пишут? Его там тимлиды смотрят на код ревью, говорят что все норм и аппрувят? Просто мне казалось, в редаксе запросы к сервисам принято хотя бы в экшены прятать.
привет,
Пример с использованием экшенов я особо не упоминал, тк это в большей степени напоминает сагу, где происходит практически то же самое , но через прослойку эффектов.
Если посмотреть ≈90% гайдов с ютуба, все они рекомендуют именно такой способ "classic".
Сам я рекомендую использовать данный способ из статьи только при не большом количестве эндпоинтов, когда выгоднее отказаться от включения библиотеки
Привет, дай наводку, где мы с тобой виделись)
Возможно, это мой первый опыт,
появился повод попробовать для конкурса
🖐️
А есть пример проекта на GitHub? Хотелось бы посмотреть это в действии.