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
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,
|
||
|
);
|