ipink-util
Version:
util.js
243 lines (240 loc) • 7.55 kB
JavaScript
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 };