UNPKG

rn-nepali-datepicker

Version:
514 lines (483 loc) 16.3 kB
import { calendarData } from './CalenderData' export const validationFunctions = { validateRequiredParameters: function (requiredParameters) { for (let key in requiredParameters) { const value = requiredParameters[key] if (typeof value === 'undefined' || value === null) { throw new ReferenceError( 'Missing required parameters: ' + Object.keys(requiredParameters).join(', ') ) } } }, validateBsYear: function (bsYear) { if (typeof bsYear !== 'number' || bsYear === null) { throw new TypeError('Invalid parameter bsYear value') } else if ( bsYear < calendarData.minBsYear || bsYear > calendarData.maxBsYear ) { throw new RangeError( 'Parameter bsYear value should be in range of ' + calendarData.minBsYear + ' to ' + calendarData.maxBsYear ) } }, validateAdYear: function (adYear) { if (typeof adYear !== 'number' || adYear === null) { throw new TypeError('Invalid parameter adYear value') } else if ( adYear < calendarData.minBsYear - 57 || adYear > calendarData.maxBsYear - 57 ) { throw new RangeError( 'Parameter adYear value should be in range of ' + (calendarData.minBsYear - 57) + ' to ' + (calendarData.maxBsYear - 57) ) } }, validateBsMonth: function (bsMonth) { if (typeof bsMonth !== 'number' || bsMonth === null) { throw new TypeError('Invalid parameter bsMonth value') } else if (bsMonth < 1 || bsMonth > 12) { throw new RangeError( 'Parameter bsMonth value should be in range of 1 to 12' ) } }, validateAdMonth: function (adMonth) { if (typeof adMonth !== 'number' || adMonth === null) { throw new TypeError('Invalid parameter adMonth value') } else if (adMonth < 1 || adMonth > 12) { throw new RangeError( 'Parameter adMonth value should be in range of 1 to 12' ) } }, validateBsDate: function (bsDate) { if (typeof bsDate !== 'number' || bsDate === null) { throw new TypeError('Invalid parameter bsDate value') } else if (bsDate < 1 || bsDate > 32) { throw new RangeError( 'Parameter bsDate value should be in range of 1 to 32' ) } }, validateAdDate: function (adDate) { if (typeof adDate !== 'number' || adDate === null) { throw new TypeError('Invalid parameter adDate value') } else if (adDate < 1 || adDate > 31) { throw new RangeError( 'Parameter adDate value should be in range of 1 to 31' ) } }, validatePositiveNumber: function (numberParameters) { for (let key in numberParameters) { const value = numberParameters[key] if (typeof value !== 'number' || value === null || value < 0) { throw new ReferenceError( 'Invalid parameters: ' + Object.keys(numberParameters).join(', ') ) } else if ( key === 'yearDiff' && value > calendarData.maxBsYear - calendarData.minBsYear + 1 ) { throw new RangeError( 'Parameter yearDiff value should be in range of 0 to ' + (calendarData.maxBsYear - calendarData.minBsYear + 1) ) } } } } export const calendarFunctions = { getBsMonthDays: function (bsYear, bsMonth) { validationFunctions.validateRequiredParameters({ bsYear: bsYear, bsMonth: bsMonth }) validationFunctions.validateBsYear(bsYear) validationFunctions.validateBsMonth(bsMonth) var yearCount = 0 var totalYears = bsYear + 1 - calendarData.minBsYear var bsMonthData = calendarData.extractedBsMonthData[bsMonth - 1] for (var i = 0; i < bsMonthData.length; i++) { if (bsMonthData[i] === 0) { continue } var bsMonthUpperDaysIndex = i % 2 yearCount += bsMonthData[i] if (totalYears <= yearCount) { if ( (bsYear === 2085 && bsMonth === 5) || (bsYear === 2088 && bsMonth === 5) ) { return ( calendarData.bsMonthUpperDays[bsMonth - 1][bsMonthUpperDaysIndex] - 2 ) } else { return calendarData.bsMonthUpperDays[bsMonth - 1][ bsMonthUpperDaysIndex ] } } } return null }, getMonthDaysNumFormMinBsYear: function (bsMonth, yearDiff) { validationFunctions.validateRequiredParameters({ bsMonth: bsMonth, yearDiff: yearDiff }) validationFunctions.validateBsMonth(bsMonth) validationFunctions.validatePositiveNumber({ yearDiff: yearDiff }) var yearCount = 0 var monthDaysFromMinBsYear = 0 if (yearDiff === 0) { return 0 } var bsMonthData = calendarData.extractedBsMonthData[bsMonth - 1] for (var i = 0; i < bsMonthData.length; i++) { if (bsMonthData[i] === 0) { continue } var bsMonthUpperDaysIndex = i % 2 if (yearDiff > yearCount + bsMonthData[i]) { yearCount += bsMonthData[i] monthDaysFromMinBsYear += calendarData.bsMonthUpperDays[bsMonth - 1][bsMonthUpperDaysIndex] * bsMonthData[i] } else { monthDaysFromMinBsYear += calendarData.bsMonthUpperDays[bsMonth - 1][bsMonthUpperDaysIndex] * (yearDiff - yearCount) yearCount = yearDiff - yearCount break } } return monthDaysFromMinBsYear }, getTotalDaysNumFromMinBsYear: function ( bsYear, bsMonth, bsDate ) { validationFunctions.validateRequiredParameters({ bsYear: bsYear, bsMonth: bsMonth, bsDate: bsDate }) validationFunctions.validateBsYear(bsYear) validationFunctions.validateBsMonth(bsMonth) validationFunctions.validateBsDate(bsDate) if (bsYear < calendarData.minBsYear || bsYear > calendarData.maxBsYear) { return null } var daysNumFromMinBsYear = 0 var diffYears = bsYear - calendarData.minBsYear for (var month = 1; month <= 12; month++) { if (month < bsMonth) { daysNumFromMinBsYear += calendarFunctions.getMonthDaysNumFormMinBsYear( month, diffYears + 1 ) } else { daysNumFromMinBsYear += calendarFunctions.getMonthDaysNumFormMinBsYear( month, diffYears ) } } if (bsYear > 2085 && bsYear < 2088) { daysNumFromMinBsYear += bsDate - 2 } else if (bsYear === 2085 && bsMonth > 5) { daysNumFromMinBsYear += bsDate - 2 } else if (bsYear > 2088) { daysNumFromMinBsYear += bsDate - 4 } else if (bsYear === 2088 && bsMonth > 5) { daysNumFromMinBsYear += bsDate - 4 } else { daysNumFromMinBsYear += bsDate } return daysNumFromMinBsYear }, getAdDateByBsDate: function (bsYear, bsMonth, bsDate) { validationFunctions.validateRequiredParameters({ bsYear: bsYear, bsMonth: bsMonth, bsDate: bsDate }) validationFunctions.validateBsYear(bsYear) validationFunctions.validateBsMonth(bsMonth) validationFunctions.validateBsDate(bsDate) var daysNumFromMinBsYear = calendarFunctions.getTotalDaysNumFromMinBsYear(bsYear, bsMonth, bsDate) || 0 var adDate = new Date( calendarData.minAdDateEqBsDate.ad.year, calendarData.minAdDateEqBsDate.ad.month, calendarData.minAdDateEqBsDate.ad.date - 1 ) adDate.setDate(adDate.getDate() + daysNumFromMinBsYear) return adDate }, getBsDateByAdDate: function (adYear, adMonth, adDate) { validationFunctions.validateRequiredParameters({ adYear: adYear, adMonth: adMonth, adDate: adDate }) validationFunctions.validateAdYear(adYear) validationFunctions.validateAdMonth(adMonth) validationFunctions.validateAdDate(adDate) var bsYear = adYear + 57 var bsMonth = (adMonth + 9) % 12 bsMonth = bsMonth === 0 ? 12 : bsMonth var bsDate = 1 if (adMonth < 4) { bsYear -= 1 } else if (adMonth === 4) { var bsYearFirstAdDate = calendarFunctions.getAdDateByBsDate(bsYear, 1, 1) if (adDate < bsYearFirstAdDate.getDate()) { bsYear -= 1 } } var bsMonthFirstAdDate = calendarFunctions.getAdDateByBsDate( bsYear, bsMonth, 1 ) if (adDate >= 1 && adDate < bsMonthFirstAdDate.getDate()) { bsMonth = bsMonth !== 1 ? bsMonth - 1 : 12 var bsMonthDays = calendarFunctions.getBsMonthDays(bsYear, bsMonth) || 0 bsDate = bsMonthDays - (bsMonthFirstAdDate.getDate() - adDate) + 1 || 0 } else { bsDate = adDate - bsMonthFirstAdDate.getDate() + 1 } return { bsYear: bsYear, bsMonth: bsMonth, bsDate: bsDate } }, getNepaliNumber: function (number) { var prefixNum = Math.floor(number / 10) var suffixNum = number % 10 if (prefixNum !== 0) { const value = calendarFunctions.getNepaliNumber(prefixNum) + calendarData.nepaliNumbers[suffixNum] return value } else { const value = calendarData.nepaliNumbers[suffixNum] return value } return null }, /** * Return equivalent number from nepaliNumber * @param {String} nepaliNumber * @returns {Number} number */ getNumberByNepaliNumber: function (nepaliNumber) { if (typeof nepaliNumber === 'undefined') { throw new Error('Parameter nepaliNumber is required') } else if (typeof nepaliNumber !== 'string') { throw new Error('Parameter nepaliNumber should be in string') } var number = 0 for (var i = 0; i < nepaliNumber.length; i++) { var numIndex = calendarData.nepaliNumbers.indexOf(nepaliNumber.charAt(i)) if (numIndex === -1) { throw new Error('Invalid nepali number') } number = number * 10 + numIndex } return number }, getBsMonthInfoByBsDate: function ( bsYear, bsMonth, bsDate, dateFormatPattern ) { validationFunctions.validateRequiredParameters({ bsYear: bsYear, bsMonth: bsMonth, bsDate: bsDate }) validationFunctions.validateBsYear(bsYear) validationFunctions.validateBsMonth(bsMonth) validationFunctions.validateBsDate(bsDate) if (dateFormatPattern === null || dateFormatPattern === undefined) { dateFormatPattern = '%D, %M %d, %y' } else if (typeof dateFormatPattern !== 'string') { throw new TypeError('Invalid parameter dateFormatPattern value') } var daysNumFromMinBsYear = calendarFunctions.getTotalDaysNumFromMinBsYear(bsYear, bsMonth, bsDate) || 0 var adDate = new Date( calendarData.minAdDateEqBsDate.ad.year, calendarData.minAdDateEqBsDate.ad.month, calendarData.minAdDateEqBsDate.ad.date - 1 ) adDate.setDate(adDate.getDate() + daysNumFromMinBsYear) var bsMonthFirstAdDate = calendarFunctions.getAdDateByBsDate( bsYear, bsMonth, 1 ) var bsMonthDays = calendarFunctions.getBsMonthDays(bsYear, bsMonth) || 0 bsDate = bsDate > bsMonthDays ? bsMonthDays : bsDate var eqAdDate = calendarFunctions.getAdDateByBsDate(bsYear, bsMonth, bsDate) var weekDay = eqAdDate.getDay() + 1 var formattedDate = calendarFunctions.bsDateFormat( dateFormatPattern, bsYear, bsMonth, bsDate ) return { bsYear: bsYear, bsMonth: bsMonth, bsDate: bsDate, weekDay: weekDay, formattedDate: formattedDate, adDate: eqAdDate, bsMonthFirstAdDate: bsMonthFirstAdDate, bsMonthDays: bsMonthDays } }, getBsYearByAdDate: function (adYear, adMonth, adDate) { validationFunctions.validateRequiredParameters({ adYear: adYear, adMonth: adMonth, adDate: adDate }) validationFunctions.validateAdYear(adYear) validationFunctions.validateAdMonth(adMonth) validationFunctions.validateAdDate(adDate) var bsDate = calendarFunctions.getBsDateByAdDate(adYear, adMonth, adDate) return bsDate.bsYear }, getBsMonthByAdDate: function (adYear, adMonth, adDate) { validationFunctions.validateRequiredParameters({ adYear: adYear, adMonth: adMonth, adDate: adDate }) validationFunctions.validateAdYear(adYear) validationFunctions.validateAdMonth(adMonth) validationFunctions.validateAdDate(adDate) var bsDate = calendarFunctions.getBsDateByAdDate(adYear, adMonth, adDate) return bsDate.bsMonth }, bsDateFormat: function ( dateFormatPattern, bsYear, bsMonth, bsDate ) { validationFunctions.validateRequiredParameters({ dateFormatPattern: dateFormatPattern, bsYear: bsYear, bsMonth: bsMonth, bsDate: bsDate }) validationFunctions.validateBsYear(bsYear) validationFunctions.validateBsMonth(bsMonth) validationFunctions.validateBsDate(bsDate) var eqAdDate = calendarFunctions.getAdDateByBsDate(bsYear, bsMonth, bsDate) var weekDay = eqAdDate.getDay() + 1 var formattedDate = dateFormatPattern formattedDate = formattedDate.replace( /%d/g, calendarFunctions.getNepaliNumber(bsDate) ) formattedDate = formattedDate.replace( /%y/g, calendarFunctions.getNepaliNumber(bsYear) ) formattedDate = formattedDate.replace( /%m/g, calendarFunctions.getNepaliNumber(bsMonth) ) formattedDate = formattedDate.replace( /%M/g, calendarData.bsMonths[bsMonth - 1] ) formattedDate = formattedDate.replace( /%D/g, calendarData.bsDays[weekDay - 1] ) return formattedDate }, parseFormattedBsDate: function (dateFormat, dateFormattedText) { validationFunctions.validateRequiredParameters({ dateFormat: dateFormat, dateFormattedText: dateFormattedText }) var diffTextNum = 0 var extractedFormattedBsDate = { bsYear: null, bsMonth: null, bsDate: null, bsDay: null } for (var i = 0; i < dateFormat.length; i++) { if (dateFormat.charAt(i) === '%') { var valueOf = dateFormat.substring(i, i + 2) var endChar = dateFormat.charAt(i + 2) var tempText = dateFormattedText.substring(i + diffTextNum) var endIndex = endChar !== '' ? tempText.indexOf(endChar) : tempText.length var value = tempText.substring(0, endIndex) if (valueOf === '%y') { extractedFormattedBsDate.bsYear = calendarFunctions.getNumberByNepaliNumber( value ) diffTextNum += value.length - 2 } else if (valueOf === '%d') { extractedFormattedBsDate.bsDate = calendarFunctions.getNumberByNepaliNumber( value ) diffTextNum += value.length - 2 } else if (valueOf === '%D') { extractedFormattedBsDate.bsDay = calendarData.bsDays.indexOf(value) + 1 diffTextNum += value.length - 2 } else if (valueOf === '%m') { extractedFormattedBsDate.bsMonth = calendarFunctions.getNumberByNepaliNumber( value ) diffTextNum += value.length - 2 } else if (valueOf === '%M') { extractedFormattedBsDate.bsMonth = calendarData.bsMonths.indexOf(value) + 1 diffTextNum += value.length - 2 } } } if (!extractedFormattedBsDate.bsDay) { var eqAdDate = calendarFunctions.getAdDateByBsDate( extractedFormattedBsDate.bsYear, extractedFormattedBsDate.bsMonth, extractedFormattedBsDate.bsDate ) extractedFormattedBsDate.bsDay = eqAdDate.getDay() + 1 } return extractedFormattedBsDate }, isValidDate: (dateString) => { var regEx = /^\d{4}-\d{2}-\d{2}$/ return dateString.match(regEx) != null } }