UNPKG

ipink-util

Version:

util.js

243 lines (240 loc) 7.55 kB
import { getPageUrl } from './get.mjs'; import { isString } from './is.mjs'; import { ENV_TYPE, getEnv } from './env.mjs'; import { getSdk, win, Config } from './config.mjs'; import { toast } from './toast.mjs'; import { navigateToMiniProgram } from './navigation.mjs'; const encodeReserveRE = /[!'()*]/g; const encodeReserveReplacer = (c) => "%" + c.charCodeAt(0).toString(16); const commaRE = /%2C/g; const encode = (str) => encodeURIComponent(str).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ","); function decode(str) { try { return decodeURIComponent(str); } catch (err) { } return str; } function parseQuery(query) { const res = {}; query = query.trim().replace(/^(\?|#|&)/, ""); if (!query) { return res; } query.split("&").forEach((param) => { const parts = param.replace(/\+/g, " ").split("=") || []; const key = decode(parts.shift() || ""); const val = parts.length > 0 ? parts.join("=") : null; if (res[key] === void 0) { res[key] = val; } else if (Array.isArray(res[key])) { res[key].push(val); } else { res[key] = [res[key], val]; } }); return res; } function stringifyQuery(obj) { const res = obj ? Object.keys(obj).map((key) => { const val = obj[key]; if (val === void 0) return ""; if (val === null) return encode(key); if (Array.isArray(val)) { const result = []; val.forEach((val2) => { if (val2 === void 0) return; if (val2 === null) result.push(encode(key)); else if (typeof val2 === "object") { result.push(encode(key) + "=" + JSON.stringify(val2)); } else result.push(encode(key) + "=" + val2); }); return result.join("&"); } return encode(key) + "=" + val; }).filter((x) => x.length > 0).join("&") : ""; return res ? `?${res}` : ""; } const getUrlByQuery = stringifyQuery; const getQueryByUrl = (url) => { url = url || getPageUrl() || ""; return parseQuery(url.split("?")[1] || ""); }; function delUrlParams(url, names = []) { const urlArr = url.split("?"); const search = urlArr[1]; if (!search) return url; const query = {}; const arr = search.split("&"); for (let i = 0; i < arr.length; i++) { let [key, value] = arr[i].split("="); query[key] = value; } if (isString(names)) names = [names]; for (let i = 0; i < names.length; i++) { delete query[names[i]]; } let queryStr = JSON.stringify(query).replace(/[\"\{\}]/g, "").replace(/\:/g, "=").replace(/\,/g, "&"); let prefix = urlArr[0]; return prefix + "?" + queryStr; } const deleteQuery = delUrlParams; function getQueryMember(queryName, url) { url = url || getPageUrl() || ""; const query = parseQuery(url.split("?")[1] || ""); return query[queryName]; } const getParamsByScheme = (scheme, env) => { const len = { [ENV_TYPE.MY]: 16, [ENV_TYPE.WX]: 18 }; const start = { [ENV_TYPE.MY]: "alipays:", [ENV_TYPE.WX]: "wx:" }; let message; let params = {}; if (scheme.startsWith(start[env])) { var parseQuery2 = (str) => { return str.replace(/^.*?\?/, "").split("&").map((s) => { var p = s.includes("=") ? s.indexOf("=") : s.length; return [s.slice(0, p), s.slice(p + 1)].map(decodeURIComponent); }); }; for (var [k, v] of parseQuery2(scheme)) { if (k == "appId") { if (v.length != len[env]) { message = `! 非 ${len[env]} 位 appId '${v}'`; return; } } else if (k == "page") { k = "path"; } else if (k == "query" && env === ENV_TYPE.MY) { var o = {}; for (var [x, y] of parseQuery2(v)) { o[x] = y; } v = o; } else { message = `! 不支持参数 '${k}' `; continue; } params[k] = v; } } else { message = `! 非 ${start[env]} 开头`; } if (message) { try { toast(message); } catch (e) { } } return params.appId ? params : ""; }; const jump = (url, navigateType = 1) => { let sdk = getSdk(); let status = false; let _jump; if (sdk) { if (typeof uni !== "undefined") { _jump = navigateType == 2 ? uni.redirectTo : navigateType == 3 ? uni.switchTab : navigateType == 4 ? uni.reLaunch : uni.navigateTo; } else { _jump = navigateType == 2 ? wx.redirectTo : navigateType == 3 ? wx.switchTab : navigateType == 4 ? wx.reLaunch : wx.navigateTo; } } if (sdk && url.startsWith("/")) { _jump({ url }); status = true; } else if (sdk && url.startsWith("tel://")) { const [protocol, content] = url.split("//"); let phoneNumber = content || protocol; if (phoneNumber.indexOf("?") > -1) { phoneNumber = phoneNumber.split("?")[0]; } typeof uni !== "undefined" ? uni.makePhoneCall({ phoneNumber }) : wx.makePhoneCall({ phoneNumber }); status = true; } else { if (win && typeof document !== "undefined") { const env = getEnv(); if (url.startsWith("http://") || url.startsWith("https://")) { if (navigateType == 4) { window.location.replace(url); window.location.reload(); } win.location.href = url; status = true; } else if (url.startsWith("alipays://")) { if (ENV_TYPE.MY === env) { const params = getParamsByScheme(url, ENV_TYPE.MY); if (!params || !Object.keys(params).length) status = false; else { navigateToMiniProgram({ ...params, fail: (e) => { console.log("Navigation.navigateToMiniProgram.ERROR.alipays: ", e); } }); status = true; } } else if (win && window.AlipayJSBridge) { window.location.href = url; status = true; } } else if (url.startsWith("wx://")) { if (ENV_TYPE.WX === env || ENV_TYPE.WXMINI === env) { const params = getParamsByScheme(url, ENV_TYPE.WX); if (!params || !Object.keys(params).length) status = false; else { navigateToMiniProgram({ ...params, fail: (e) => { console.log("Navigation.navigateToMiniProgram.ERROR.alipays: ", e); } }); status = true; } } } else if (url.startsWith("weixin://")) { if (ENV_TYPE.WX === env || ENV_TYPE.WXMINI === env) { window.location.href = url; status = true; } } else { status = false; } return status; } if (sdk) { if (url.startsWith("https://") || url.startsWith("http://")) { _jump({ url: Config.webview_path + "?url=" + encodeURIComponent(url), fail: () => { if (typeof plus !== "undefined") { plus.runtime.openURL(url); } } }); status = true; } else status = false; } } return status; }; const addNextUrl = (url, options) => { options = options || {}; let callbackUrl = ""; callbackUrl = getPageUrl(); if (options.delParamArr) { callbackUrl = encodeURIComponent(deleteQuery(callbackUrl, options.delParamArr)); } let key = options.key || "nextUrl"; if (url.indexOf(key) == -1) { url = `${url}${url.indexOf("?") > -1 ? "&" : "?"}${key}=${callbackUrl}`; } return url; }; export { addNextUrl, decode, delUrlParams, deleteQuery, getParamsByScheme, getQueryByUrl, getQueryMember, getUrlByQuery, jump, parseQuery, stringifyQuery };