import type { ApiResponse, HttpMethod, RequestOptions } from './types' export type { ApiResponse, RequestOptions } const BASE_URL = 'https://device.shuziweidao.com/gateway/' let _loadingCount = 0 const _showLoading = (title: string): void => { if (_loadingCount === 0) wx.showLoading({ title, mask: true }) _loadingCount++ } const _hideLoading = (): void => { if (_loadingCount > 0) _loadingCount-- if (_loadingCount === 0) wx.hideLoading() } const request = ( url: string, data?: Record, method: HttpMethod = 'GET', options: RequestOptions = {}, ): Promise> => { const { loading = true, loadingTitle = '加载中...', contentType = 'application/json' } = options if (loading) _showLoading(loadingTitle) const header: Record = { 'content-type': contentType } const token = wx.getStorageSync('token') as string if (token) header['X-Access-Token'] = token return new Promise((resolve, reject) => { wx.request({ url: BASE_URL + url, data, method, header, success: (res) => { if (loading) _hideLoading() const body = res.data as ApiResponse if (body.code === 200) { resolve(body) } else if (body.code === 401) { wx.clearStorageSync() wx.reLaunch({ url: '/pages/login/login' }) reject(body) } else { wx.showToast({ title: body.message || '请求失败', icon: 'none' }) reject(body) } }, fail: (err) => { if (loading) _hideLoading() wx.showToast({ title: '网络异常,请重试', icon: 'none' }) reject(err) }, }) }) } export const get = ( url: string, data?: Record, options?: RequestOptions, ): Promise> => request(url, data, 'GET', options) export const post = ( url: string, data?: Record, options?: RequestOptions, ): Promise> => request(url, data, 'POST', options) export const put = ( url: string, data?: Record, options?: RequestOptions, ): Promise> => request(url, data, 'PUT', options) export const del = ( url: string, data?: Record, options?: RequestOptions, ): Promise> => request(url, data, 'DELETE', { contentType: 'application/x-www-form-urlencoded', ...options, })