UNPKG

6.85 kBJavaScriptView Raw
1import { View, CSSType } from '../core/view';
2import { Property } from '../core/properties';
3const dateComparer = (x, y) => x <= y && x >= y;
4export function getValidTime(picker, hour, minute) {
5 if (picker.minuteInterval > 1) {
6 const minuteFloor = minute - (minute % picker.minuteInterval);
7 minute = minuteFloor + (minute === minuteFloor + 1 ? picker.minuteInterval : 0);
8 if (minute === 60) {
9 hour++;
10 minute = 0;
11 }
12 }
13 let time = { hour: hour, minute: minute };
14 if (!isLessThanMaxTime(picker, hour, minute)) {
15 time = { hour: picker.maxHour, minute: picker.maxMinute };
16 }
17 if (!isGreaterThanMinTime(picker, hour, minute)) {
18 time = { hour: picker.minHour, minute: picker.minMinute };
19 }
20 return time;
21}
22function isValidTime(picker) {
23 return isGreaterThanMinTime(picker) && isLessThanMaxTime(picker);
24}
25function isHourValid(value) {
26 return typeof value === 'number' && value >= 0 && value <= 23;
27}
28function isMinuteValid(value) {
29 return typeof value === 'number' && value >= 0 && value <= 59;
30}
31function isMinuteIntervalValid(value) {
32 return typeof value === 'number' && value >= 1 && value <= 30 && 60 % value === 0;
33}
34function getMinutes(hour) {
35 return hour * 60;
36}
37export function isDefined(value) {
38 return value !== undefined;
39}
40function isGreaterThanMinTime(picker, hour, minute) {
41 if (picker.minHour === undefined || picker.minMinute === undefined) {
42 return true;
43 }
44 return getMinutes(hour !== undefined ? hour : picker.hour) + (minute !== undefined ? minute : picker.minute) >= getMinutes(picker.minHour) + picker.minMinute;
45}
46function isLessThanMaxTime(picker, hour, minute) {
47 if (!isDefined(picker.maxHour) || !isDefined(picker.maxMinute)) {
48 return true;
49 }
50 return getMinutes(isDefined(hour) ? hour : picker.hour) + (isDefined(minute) ? minute : picker.minute) <= getMinutes(picker.maxHour) + picker.maxMinute;
51}
52function toString(value) {
53 if (value instanceof Date) {
54 return value + '';
55 }
56 return value < 10 ? `0${value}` : `${value}`;
57}
58function getMinMaxTimeErrorMessage(picker) {
59 return `Min time: (${toString(picker.minHour)}:${toString(picker.minMinute)}), max time: (${toString(picker.maxHour)}:${toString(picker.maxMinute)})`;
60}
61function getErrorMessage(picker, propertyName, newValue) {
62 return `${propertyName} property value (${toString(newValue)}:${toString(picker.minute)}) is not valid. ${getMinMaxTimeErrorMessage(picker)}.`;
63}
64let TimePickerBase = class TimePickerBase extends View {
65};
66TimePickerBase = __decorate([
67 CSSType('TimePicker')
68], TimePickerBase);
69export { TimePickerBase };
70TimePickerBase.prototype.recycleNativeView = 'auto';
71export const minHourProperty = new Property({
72 name: 'minHour',
73 defaultValue: 0,
74 valueChanged: (picker, oldValue, newValue) => {
75 if (!isHourValid(newValue) || !isValidTime(picker)) {
76 throw new Error(getErrorMessage(picker, 'minHour', newValue));
77 }
78 },
79 valueConverter: (v) => parseInt(v),
80});
81minHourProperty.register(TimePickerBase);
82export const maxHourProperty = new Property({
83 name: 'maxHour',
84 defaultValue: 23,
85 valueChanged: (picker, oldValue, newValue) => {
86 if (!isHourValid(newValue) || !isValidTime(picker)) {
87 throw new Error(getErrorMessage(picker, 'maxHour', newValue));
88 }
89 },
90 valueConverter: (v) => parseInt(v),
91});
92maxHourProperty.register(TimePickerBase);
93export const minMinuteProperty = new Property({
94 name: 'minMinute',
95 defaultValue: 0,
96 valueChanged: (picker, oldValue, newValue) => {
97 if (!isMinuteValid(newValue) || !isValidTime(picker)) {
98 throw new Error(getErrorMessage(picker, 'minMinute', newValue));
99 }
100 },
101 valueConverter: (v) => parseInt(v),
102});
103minMinuteProperty.register(TimePickerBase);
104export const maxMinuteProperty = new Property({
105 name: 'maxMinute',
106 defaultValue: 59,
107 valueChanged: (picker, oldValue, newValue) => {
108 if (!isMinuteValid(newValue) || !isValidTime(picker)) {
109 throw new Error(getErrorMessage(picker, 'maxMinute', newValue));
110 }
111 },
112 valueConverter: (v) => parseInt(v),
113});
114maxMinuteProperty.register(TimePickerBase);
115export const minuteIntervalProperty = new Property({
116 name: 'minuteInterval',
117 defaultValue: 1,
118 valueChanged: (picker, oldValue, newValue) => {
119 if (!isMinuteIntervalValid(newValue)) {
120 throw new Error(getErrorMessage(picker, 'minuteInterval', newValue));
121 }
122 },
123 valueConverter: (v) => parseInt(v),
124});
125minuteIntervalProperty.register(TimePickerBase);
126export const minuteProperty = new Property({
127 name: 'minute',
128 // avoid defaultValue of 0 because it will prevent valueChanged from firing to initialize value due to it already matching defaultValue to start
129 // sometimes user needs to set 0: https://github.com/NativeScript/NativeScript/issues/10457
130 defaultValue: null,
131 valueChanged: (picker, oldValue, newValue) => {
132 newValue = newValue || 0;
133 if (!isMinuteValid(newValue) || !isValidTime(picker)) {
134 throw new Error(getErrorMessage(picker, 'minute', newValue));
135 }
136 picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
137 },
138 valueConverter: (v) => parseInt(v),
139});
140minuteProperty.register(TimePickerBase);
141export const hourProperty = new Property({
142 name: 'hour',
143 // avoid defaultValue of 0 because it will prevent valueChanged from firing to initialize value due to it already matching defaultValue to start
144 // sometimes user needs to set 0: https://github.com/NativeScript/NativeScript/issues/10457
145 defaultValue: null,
146 valueChanged: (picker, oldValue, newValue) => {
147 newValue = newValue || 0;
148 if (!isHourValid(newValue) || !isValidTime(picker)) {
149 throw new Error(getErrorMessage(picker, 'Hour', newValue));
150 }
151 picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
152 },
153 valueConverter: (v) => parseInt(v),
154});
155hourProperty.register(TimePickerBase);
156export const timeProperty = new Property({
157 name: 'time',
158 defaultValue: new Date(),
159 equalityComparer: dateComparer,
160 valueChanged: (picker, oldValue, newValue) => {
161 if (!isValidTime(picker)) {
162 throw new Error(getErrorMessage(picker, 'time', newValue));
163 }
164 picker.hour = newValue.getHours();
165 picker.minute = newValue.getMinutes();
166 },
167});
168timeProperty.register(TimePickerBase);
169export const iosPreferredDatePickerStyleProperty = new Property({
170 name: 'iosPreferredDatePickerStyle',
171 defaultValue: 0,
172 valueConverter: (v) => parseInt(v),
173});
174iosPreferredDatePickerStyleProperty.register(TimePickerBase);
175//# sourceMappingURL=time-picker-common.js.map
\No newline at end of file