@codecademy/gamut
68.6.268.6.3-alpha.92d8ae.0
dist/DatePicker/DatePickerInput/Segment/utils.js~
dist/DatePicker/DatePickerInput/Segment/utils.jsModified+71
Index: package/dist/DatePicker/DatePickerInput/Segment/utils.js
===================================================================
--- package/dist/DatePicker/DatePickerInput/Segment/utils.js
+++ package/dist/DatePicker/DatePickerInput/Segment/utils.js
@@ -41,8 +41,23 @@
year
} = strictSegments;
return year.length === 4 && month.length === 2 && day.length === 2;
};
+
+/** Year is full length and both month and day have digits (e.g. 2/30/2026). */
+export const isCompleteDateEntryAttempt = strictSegments => {
+ const {
+ month,
+ day,
+ year
+ } = strictSegments;
+ return year.length === 4 && month.length > 0 && day.length > 0;
+};
+export const padSegmentDigitsForParse = strictSegments => ({
+ month: strictSegments.month.padStart(2, '0'),
+ day: strictSegments.day.padStart(2, '0'),
+ year: strictSegments.year
+});
export const normalizeSegmentValues = segments => {
const strictSegments = getStrictSegmentDigits(segments);
if (isStrictlyCompleteDateEntry(strictSegments)) {
const parsed = parseSegmentsToDate(strictSegments);
@@ -77,8 +92,64 @@
day,
year
};
};
+export const getSegmentValidationState = segments => {
+ const strictSegments = getStrictSegmentDigits(segments);
+ if (isStrictlyCompleteDateEntry(strictSegments)) {
+ const parsed = parseSegmentsToDate(strictSegments);
+ return {
+ isInvalid: parsed === null,
+ parsedDate: parsed,
+ segments: parsed ? getDateSegmentsFromDate(parsed) : strictSegments
+ };
+ }
+ if (isCompleteDateEntryAttempt(strictSegments)) {
+ const paddedSegments = padSegmentDigitsForParse(strictSegments);
+ const parsed = parseSegmentsToDate(paddedSegments);
+ return {
+ isInvalid: parsed === null,
+ parsedDate: parsed,
+ segments: parsed ? getDateSegmentsFromDate(parsed) : paddedSegments
+ };
+ }
+ return null;
+};
+export const resolveSegmentsOnBlur = (segments, boundDate) => {
+ const validation = getSegmentValidationState(segments);
+ if (validation) {
+ return {
+ isInvalid: validation.isInvalid,
+ parsedDate: validation.parsedDate,
+ segments: validation.segments,
+ shouldClear: false
+ };
+ }
+ const normalized = normalizeSegmentValues(segments);
+ const parsed = parseSegmentsToDate(normalized);
+ if (parsed) {
+ return {
+ isInvalid: false,
+ parsedDate: parsed,
+ segments: normalized,
+ shouldClear: false
+ };
+ }
+ if (!normalized.month && !normalized.day && !normalized.year) {
+ return {
+ isInvalid: false,
+ parsedDate: null,
+ segments: getDateSegmentsFromDate(null),
+ shouldClear: true
+ };
+ }
+ return {
+ isInvalid: false,
+ parsedDate: null,
+ segments: getDateSegmentsFromDate(boundDate),
+ shouldClear: false
+ };
+};
export const getSegmentPlaceholder = field => field === 'year' ? 'YYYY' : field === 'month' ? 'MM' : 'DD';
export const segmentMaxLength = field => field === 'year' ? 4 : 2;
export const getSegmentSpinBounds = ({
field,