/*
 * @Author: PoJun
 * @Date: 2023-05-14 18:26:45
 * @LastEditors: PoJun
 * @LastEditTime: 2023-10-06 16:03:35
 * @Message: Nothing
 */

module.exports = vm => {
    // 初始化请求配置
    uni.$uv.http.setConfig(config => {
        // #ifdef MP-WEIXIN
        config.baseURL = process.env.VUE_APP_BASE_API; /* 根域名 */
        // #endif

        // #ifdef H5
        config.baseURL = process.env.NODE_ENV == "development" ? "/api" : process.env.VUE_APP_BASE_API;
        // #endif

        return config;
    });

    // 请求拦截
    uni.$uv.http.interceptors.request.use(
        config => {
            // 可使用async await 做异步操作
            // 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
            config.data = config.data || {};
            // 根据custom参数中配置的是否需要token，默认需要, 添加对应的请求头
            const { custom } = config;

            if (!custom?.noAuth) {
                // 可以在此通过vm引用vuex中的变量，具体值在vm.$store.state中
                config.header.satoken = vm.$store.state.vuex_JWT;
            }
            return config;
        },
        config => {
            // 可使用async await 做异步操作
            return Promise.reject(config);
        }
    );

    // 响应拦截
    uni.$uv.http.interceptors.response.use(
        response => {
            /* 对响应成功做点什么 可使用async await 做异步操作*/
            const data = response.data;

            // 自定义参数
            const custom = response.config?.custom;
            if (data.code !== 200) {
                // 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
                if (custom.toast !== false) {
                    uni.$uv.toast(data.message);
                }

                // 如果需要catch返回，则进行reject
                if (custom?.catch) {
                    return Promise.reject(data);
                } else {
                    // 否则返回一个pending中的promise，请求不会进入catch中
                    return new Promise(() => {});
                }
            }
            return data.data === undefined ? {} : data.data;
        },
        response => {
            // 对响应错误做点什么 （statusCode !== 200）
            return Promise.reject(response);
        }
    );
};
