//app.js
var server = 'https://yy.dlsmk.cn/payapi/mobileapi';

wx.$doCountdown=function(that){
  var inter = setInterval(function () {
    that.setData({
      smsFlag: false,
      sendColor: '#cccccc',
      sendTime: that.data.snsMsgWait + 's后重发',
      snsMsgWait: that.data.snsMsgWait - 1
    });
    if (that.data.snsMsgWait < 0) {
      clearInterval(inter)
      that.setData({
        smsFlag: true,
        sendColor: 'rgb(124, 255, 112)',
        sendTime: '获取验证码',
        snsMsgWait: 30

      });
    }
  }.bind(that), 1000);
}


wx.$checkBankcard=function() {
  var userid = wx.getStorageSync("userid");
  if (wx.$isEmpty(userid)) {
    wx.showModal({
      title: '提示',
      content: '使用该功能前请先绑卡',
    })
    return false;
  }
  return true;
}

wx.$doPost = function(url, param, callback) {
  var token = wx.getStorageSync("token") || '';
  var tenantid = wx.getStorageSync("tenantid") || '';
  var auth = 'Bearer ' + token;
  var tenantid = tenantid;
  wx.request({
    url: server + url,
    timeout: 10000,
    method: 'POST',
    header: {
      'content-type': 'application/x-www-form-urlencoded',
      'Authorization': auth,
      'X-TENANT-ID': tenantid
    },
    data: param,
    success: function(result) {
      console.log(result);
      if (callback) {
        callback(true, result)
      }
    },
    fail: function(result) {
      console.log(result);
      var status=result.status;
      
      if (status && status == 401) {
        wx.redirectTo({
          url: '../wxlogin/wxlogin'
        })
      } else {
        if (callback) {
          callback(false, result)
        }
      }
    }
  })
}

wx.$isEmpty = function(str) {
  if (!str || str == 'undefined' || str == null || str == '') {
    return true;
  }
  return false;
}

wx.$getUUID = function(str) {
  var d = new Date().getTime();
  if (window.performance && typeof window.performance.now === "function") {
    d += performance.now(); //use high-precision timer if available
  }
  var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    var r = (d + Math.random() * 16) % 16 | 0;
    d = Math.floor(d / 16);
    return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
  });
  return uuid;
}

App({

  onLaunch: function() {
    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权，可以直接调用 getUserInfo 获取头像昵称，不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo

              // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
  },
  globalData: {
    userInfo: null
  }

})