Skip to content

Commit 8acff74

Browse files
refactor: remove useRef
1 parent 4701afa commit 8acff74

File tree

1 file changed

+65
-65
lines changed

1 file changed

+65
-65
lines changed

packages/@react-stately/datepicker/src/useDateFieldState.ts

Lines changed: 65 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,7 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
171171
let v: DateValue | null = props.value || props.defaultValue || props.placeholderValue || null;
172172
let [granularity, defaultTimeZone] = useDefaultProps(v, props.granularity);
173173
let timeZone = defaultTimeZone || 'UTC';
174-
const isValueConfirmed = useRef(props.value || props.defaultValue ? true : false)
175-
const [shouldValidate, setShouldValidate] = useState(false)
174+
const [shouldValidate, setShouldValidate] = useState(false);
176175

177176
// props.granularity must actually exist in the value if one is provided.
178177
if (v && !(granularity in v)) {
@@ -188,7 +187,10 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
188187
props.onChange
189188
);
190189

191-
const previousValue = useRef(value)
190+
const [isValueConfirmed, setIsValueConfirmed] = useState(!!(value));
191+
192+
193+
const previousValue = useRef(value);
192194

193195
let [initialValue] = useState(value);
194196
let calendarValue = useMemo(() => convertValue(value, calendar) ?? null, [value, calendar]);
@@ -248,24 +250,23 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
248250
if (value !== previousValue.current && value && Object.keys(validSegments).length <= Object.keys(allSegments).length) {
249251
validSegments = {...allSegments};
250252
setValidSegments(validSegments);
251-
setPlaceholderDate(value)
252-
previousValue.current = value
253-
isValueConfirmed.current = true
253+
setPlaceholderDate(value);
254+
previousValue.current = value;
255+
setIsValueConfirmed(true);
254256
}
255257

256258

257-
258259
// If the value is set to null and all segments are valid, reset the placeholder.
259260
if (value !== previousValue.current && value == null && Object.keys(validSegments).length === Object.keys(allSegments).length) {
260261
validSegments = {};
261-
setValidSegments(validSegments); //reason
262+
setValidSegments(validSegments); // reason
262263
setPlaceholderDate(createPlaceholderDate(props.placeholderValue, granularity, calendar, defaultTimeZone));
263-
previousValue.current = value
264-
isValueConfirmed.current = true
264+
previousValue.current = value;
265+
setIsValueConfirmed(true);
265266
}
266267
// If all segments are valid, use the date from state, otherwise use the placeholder date.
267-
let displayValue = isValueConfirmed.current && value ? value: placeholderDate ;
268-
const currentValue = useRef(displayValue)
268+
let displayValue = isValueConfirmed && value ? value : placeholderDate ;
269+
const currentValue = useRef(displayValue);
269270
let setValue = (newValue: DateValue) => {
270271
if (props.isDisabled || props.isReadOnly) {
271272
return;
@@ -294,27 +295,28 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
294295
// Emit dates in the same calendar as the original value, if any, otherwise gregorian.
295296
const value = toCalendar(newValue, v?.calendar || new GregorianCalendar());
296297
setDate(value);
297-
previousValue.current = value
298-
setPlaceholderDate(value)
298+
setIsValueConfirmed(true);
299+
previousValue.current = value;
300+
setPlaceholderDate(value);
299301
}
300-
};
302+
};
301303

302304
let constrainDate = (value: DateValue) => {
303-
const day = Math.max(1, Math.min(value.calendar.getDaysInMonth(value), value.day));
304-
return setSegment(value, "day", day, resolvedOptions)
305-
}
305+
const day = Math.max(1, Math.min(value.calendar.getDaysInMonth(value), value.day));
306+
return setSegment(value, 'day', day, resolvedOptions);
307+
};
306308

307309
let updatePlaceholder = (newValue: DateValue) => {
308310
if (props.isDisabled || props.isReadOnly) {
309311
return;
310312
}
311-
currentValue.current = newValue
313+
currentValue.current = newValue;
312314
setPlaceholderDate(newValue);
313315
};
314316

315317
let dateValue = useMemo(() => displayValue.toDate(timeZone), [displayValue, timeZone]);
316318
let segments = useMemo(() =>
317-
processSegments(dateValue, validSegments, dateFormatter, resolvedOptions, displayValue, calendar, locale, granularity, isValueConfirmed.current),
319+
processSegments(dateValue, validSegments, dateFormatter, resolvedOptions, displayValue, calendar, locale, granularity, isValueConfirmed),
318320
[dateValue, validSegments, dateFormatter, resolvedOptions, displayValue, calendar, locale, granularity]);
319321

320322
// When the era field appears, mark it valid if the year field is already valid.
@@ -336,31 +338,29 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
336338
};
337339

338340
let adjustSegment = (type: Intl.DateTimeFormatPartTypes, amount: number) => {
339-
isValueConfirmed.current = false
340-
setShouldValidate(true)
341-
341+
setShouldValidate(true);
342+
setIsValueConfirmed(false);
343+
342344
if (!validSegments[type]) {
343345
markValid(type);
344346
let validKeys = Object.keys(validSegments);
345347
let allKeys = Object.keys(allSegments);
346348
if (validKeys.length >= allKeys.length || (validKeys.length === allKeys.length - 1 && allSegments.dayPeriod && !validSegments.dayPeriod)) {
347-
currentValue.current = displayValue
348-
setValue(constrainDate(displayValue))
349-
}else updatePlaceholder(displayValue)
349+
currentValue.current = displayValue;
350+
setValue(constrainDate(displayValue));
351+
} else {updatePlaceholder(displayValue);}
350352
} else {
351353
let validKeys = Object.keys(validSegments);
352354
let allKeys = Object.keys(allSegments);
353-
const v = addSegment(displayValue, type, amount, resolvedOptions)
355+
const v = addSegment(displayValue, type, amount, resolvedOptions);
354356
if (validKeys.length >= allKeys.length || (validKeys.length === allKeys.length - 1 && allSegments.dayPeriod && !validSegments.dayPeriod)) {
355-
currentValue.current = v
356-
setValue(constrainDate(v))
357-
}else {
358-
updatePlaceholder(v)
357+
currentValue.current = v;
358+
setValue(constrainDate(v));
359+
} else {
360+
updatePlaceholder(v);
359361
}
360362
}
361363
};
362-
363-
364364

365365

366366
let builtinValidation = useMemo(() => getValidationResult(
@@ -411,25 +411,25 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
411411
adjustSegment(part, -(PAGE_STEP[part] || 1));
412412
},
413413
setSegment(part, v: string | number) {
414-
isValueConfirmed.current = false
415-
setShouldValidate(true)
414+
setIsValueConfirmed(false);
415+
setShouldValidate(true);
416416
markValid(part);
417417
updatePlaceholder(setSegment(displayValue, part, v, resolvedOptions));
418418
},
419419
incrementToMinMax(part, v: string | number) {
420-
isValueConfirmed.current = false
421-
setShouldValidate(true)
422-
markValid(part)
423-
let validKeys = Object.keys(validSegments);
424-
let allKeys = Object.keys(allSegments);
425-
const value = setSegment(displayValue, part, v, resolvedOptions)
426-
currentValue.current = value
427-
if (validKeys.length >= allKeys.length || (validKeys.length === allKeys.length - 1 && allSegments.dayPeriod && !validSegments.dayPeriod)) {
428-
setValue(constrainDate(value))
429-
}else {
430-
updatePlaceholder(value)
431-
}
432-
},
420+
setIsValueConfirmed(false);
421+
setShouldValidate(true);
422+
markValid(part);
423+
let validKeys = Object.keys(validSegments);
424+
let allKeys = Object.keys(allSegments);
425+
const value = setSegment(displayValue, part, v, resolvedOptions);
426+
currentValue.current = value;
427+
if (validKeys.length >= allKeys.length || (validKeys.length === allKeys.length - 1 && allSegments.dayPeriod && !validSegments.dayPeriod)) {
428+
setValue(constrainDate(value));
429+
} else {
430+
updatePlaceholder(value);
431+
}
432+
},
433433
confirmPlaceholder() {
434434
if (props.isDisabled || props.isReadOnly) {
435435
return;
@@ -441,15 +441,15 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
441441
(validKeys.length === allKeys.length - 1 && allSegments.dayPeriod && !validSegments.dayPeriod && clearedSegment.current !== 'dayPeriod')) {
442442
validSegments = {...allSegments};
443443
setValidSegments(validSegments);
444-
setValue(constrainDate(currentValue.current))
445-
}else {
446-
setDate(null)
447-
previousValue.current = null
444+
setValue(constrainDate(currentValue.current));
445+
} else {
446+
setDate(null);
447+
setIsValueConfirmed(true);
448+
previousValue.current = null;
448449
}
449-
isValueConfirmed.current = true
450450
},
451451
clearSegment(part) {
452-
isValueConfirmed.current = false
452+
setIsValueConfirmed(false);
453453
delete validSegments[part];
454454
clearedSegment.current = part;
455455
setValidSegments({...validSegments});
@@ -504,20 +504,20 @@ function processSegments(dateValue, validSegments, dateFormatter, resolvedOption
504504
let isPlaceholder = EDITABLE_SEGMENTS[type] && !validSegments[type];
505505
let placeholder = EDITABLE_SEGMENTS[type] ? getPlaceholder(type, segment.value, locale) : null;
506506

507-
let value = segment.value
507+
let value = segment.value;
508508

509-
if(!isConfirmed && ['day', 'month', 'year'].includes(segment.type)) {
510-
let numberFormatter = new Intl.NumberFormat(locale, {
511-
useGrouping: false
512-
});
509+
if (!isConfirmed && ['day', 'month', 'year'].includes(segment.type)) {
510+
let numberFormatter = new Intl.NumberFormat(locale, {
511+
useGrouping: false
512+
});
513513

514-
let twoDigitFormatter = new Intl.NumberFormat(locale, {
515-
useGrouping: false,
516-
minimumIntegerDigits: 2
517-
})
514+
let twoDigitFormatter = new Intl.NumberFormat(locale, {
515+
useGrouping: false,
516+
minimumIntegerDigits: 2
517+
});
518518

519-
let f = dateFormatter.resolvedOptions()[segment.type] === '2-digit' ? twoDigitFormatter : numberFormatter;
520-
value = f.format(displayValue[segment.type]);
519+
let f = dateFormatter.resolvedOptions()[segment.type] === '2-digit' ? twoDigitFormatter : numberFormatter;
520+
value = f.format(displayValue[segment.type]);
521521
}
522522

523523
let dateSegment = {

0 commit comments

Comments
 (0)