信达小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

276 lines
7.3 KiB

4 weeks ago
import Logger from "./logger";
import WxData from "./wxData";
let systemInfo;
export function getSystemInfo() {
if (systemInfo) return systemInfo;
systemInfo = wx.getSystemInfoSync();
return systemInfo;
}
export function isIos() {
const sys = getSystemInfo();
return /iphone|ios/i.test(sys.platform);
}
class Gesture {
/**
* 左滑
* @param {object} e 事件对象
* @returns {boolean} 布尔值
*/
isLeft(gesture = {}, touche = {}) {
const { startX, startY } = gesture;
const deltaX = touche.clientX - startX;
const deltaY = touche.clientY - startY;
if (deltaX < -60 && deltaY < 20 && deltaY > -20) {
return true;
} else {
return false;
}
}
/**
* 右滑
* @param {object} e 事件对象
* @returns {boolean} 布尔值
*/
isRight(gesture = {}, touche = {}) {
const { startX, startY } = gesture;
const deltaX = touche.clientX - startX;
const deltaY = touche.clientY - startY;
if (deltaX > 60 && deltaY < 20 && deltaY > -20) {
return true;
} else {
return false;
}
}
}
class DateUtil {
newDate(year, month, date) {
let cur = `${+year}-${+month}-${+date}`;
if (isIos()) {
cur = `${+year}/${+month}/${+date}`;
}
return new Date(cur);
}
/**
* 计算指定日期时间戳
* @param {object} date
*/
getTimeStamp(dateInfo) {
if (typeof dateInfo === "string") {
dateInfo = this.transformDateRow2Dict(dateInfo);
}
if (Object.prototype.toString.call(dateInfo) !== "[object Object]") return;
const dateUtil = new DateUtil();
return dateUtil.newDate(dateInfo.year, dateInfo.month, dateInfo.date).getTime();
}
/**
* 计算指定月份共多少天
* @param {number} year 年份
* @param {number} month 月份
*/
getDatesCountOfMonth(year, month) {
return new Date(Date.UTC(year, month, 0)).getUTCDate();
}
/**
* 计算指定月份第一天星期几
* @param {number} year 年份
* @param {number} month 月份
*/
firstDayOfWeek(year, month) {
return new Date(Date.UTC(year, month - 1, 1)).getUTCDay();
}
/**
* 计算指定日期星期几
* @param {number} year 年份
* @param {number} month 月份
* @param {number} date 日期
*/
getDayOfWeek(year, month, date) {
return new Date(Date.UTC(year, month - 1, date)).getUTCDay();
}
todayFMD() {
const _date = new Date();
const year = _date.getFullYear();
const month = _date.getMonth() + 1;
const date = _date.getDate();
return {
year: +year,
month: +month,
date: +date,
};
}
todayTimestamp() {
const { year, month, date } = this.todayFMD();
const timestamp = this.newDate(year, month, date).getTime();
return timestamp;
}
toTimeStr(dateInfo = {}) {
return `${+dateInfo.year}-${+dateInfo.month}-${+dateInfo.date}`;
}
transformDateRow2Dict(dateStr) {
if (typeof dateStr === "string" && dateStr.includes("-")) {
const [year, month, date] = dateStr.split("-");
return this.tranformStr2NumOfDate({
year,
month,
date,
});
}
return {};
}
tranformStr2NumOfDate(date = {}) {
const target = { ...date };
// 可能传入字符串
target.year = +target.year;
target.month = +target.month;
target.date = +target.date;
return target;
}
sortDatesByTime(dates = [], sortType) {
return dates.sort((a, b) => {
const at = this.getTimeStamp(a);
const bt = this.getTimeStamp(b);
if (at < bt && sortType !== "desc") {
return -1;
} else {
return 1;
}
});
}
getPrevMonthInfo(date = {}) {
const prevMonthInfo =
Number(date.month) > 1
? {
year: +date.year,
month: Number(date.month) - 1,
}
: {
year: Number(date.year) - 1,
month: 12,
};
return prevMonthInfo;
}
getNextMonthInfo(date = {}) {
const nextMonthInfo =
Number(date.month) < 12
? {
year: +date.year,
month: Number(date.month) + 1,
}
: {
year: Number(date.year) + 1,
month: 1,
};
return nextMonthInfo;
}
getPrevYearInfo(date = {}) {
return {
year: Number(date.year) - 1,
month: +date.month,
};
}
getNextYearInfo(date = {}) {
return {
year: Number(date.year) + 1,
month: +date.month,
};
}
findDateIndexInArray(target, dates) {
return dates.findIndex((item) => dateUtil.toTimeStr(item) === dateUtil.toTimeStr(target));
}
calcDates(year, month) {
const datesCount = this.getDatesCountOfMonth(year, month);
const dates = [];
const today = dateUtil.todayFMD();
for (let i = 1; i <= datesCount; i++) {
const week = dateUtil.getDayOfWeek(+year, +month, i);
const date = {
year: +year,
id: i - 1,
month: +month,
date: i,
week,
isToday: +today.year === +year && +today.month === +month && i === +today.date,
};
dates.push(date);
}
return dates;
}
/**
* 日期数组根据日期去重
* @param {array} array 数组
*/
uniqueArrayByDate(array = []) {
let uniqueObject = {};
let uniqueArray = [];
array.forEach((item) => {
uniqueObject[dateUtil.toTimeStr(item)] = item;
});
for (let i in uniqueObject) {
uniqueArray.push(uniqueObject[i]);
}
return uniqueArray;
}
/**
* 筛选指定年月日期
* @param {object} target 指定年月
* @param {array} dates 待筛选日期
*/
filterDatesByYM(target, dates) {
if (target) {
const { year, month } = target;
const _dates = dates.filter((item) => +item.year === +year && +item.month === +month);
return _dates;
}
return dates;
}
getWeekHeader(firstDayOfWeek) {
let weeksCh = ["日", "一", "二", "三", "四", "五", "六"];
if (firstDayOfWeek === "Mon") {
weeksCh = ["一", "二", "三", "四", "五", "六", "日"];
}
return weeksCh;
}
}
/**
* 获取当前页面实例
*/
export function getCurrentPage() {
const pages = getCurrentPages() || [];
const last = pages.length - 1;
return pages[last] || {};
}
export function getComponentById(componentId) {
const logger = new Logger();
let page = getCurrentPage() || {};
if (page.selectComponent && typeof page.selectComponent === "function") {
if (componentId) {
return page.selectComponent(componentId);
} else {
logger.warn("请传入组件ID");
}
} else {
logger.warn("该基础库暂不支持多个小程序日历组件");
}
}
export const logger = new Logger();
export const calendarGesture = new Gesture();
export const dateUtil = new DateUtil();
export const getCalendarData = (key, component) => new WxData(component).getData(key);
export const setCalendarData = (data, component) => new WxData(component).setData(data);
export const getCalendarConfig = (component) => getCalendarData("config", component);
export const setCalendarConfig = (config, component) =>
setCalendarData(
{
config,
},
component,
);