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.
275 lines
7.3 KiB
275 lines
7.3 KiB
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, |
|
);
|
|
|