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