Skip to content

Commit e6cf5c2

Browse files
committed
fix(ffe-datepicker-react): Fix bug with reacecondition with calendar input
1 parent 03be3e4 commit e6cf5c2

File tree

5 files changed

+33
-17
lines changed

5 files changed

+33
-17
lines changed

packages/ffe-datepicker-react/src/datelogic/simpledate.ts

+4
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ export class SimpleDate {
107107
: normalizedMonthNumber;
108108
return `${day}.${month}.${this.year}`;
109109
}
110+
111+
public toString() {
112+
return this.format();
113+
}
110114
}
111115

112116
export const getSimpleDateToday = (): SimpleDate => new SimpleDate();

packages/ffe-datepicker-react/src/datepicker/DatepickerComp.tsx

+20-6
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,16 @@ export const DatepickerComp: React.FC<DatepickerCompProps> = ({
7777
const monthRef = useRef<HTMLSpanElement>(null);
7878
const yearRef = useRef<HTMLSpanElement>(null);
7979

80+
const formatDate = useCallback(() => {
81+
return `${padZero(day ?? 0)}.${padZero(month ?? 0)}.${year}`;
82+
}, [day, month, year]);
83+
8084
const getFieldMessageId = () => {
8185
return fieldMessage ? `${datepickerId}-fieldmessage` : undefined;
8286
};
8387

8488
const fieldMessageId = getFieldMessageId();
89+
// eslint-disable-next-line react-hooks/exhaustive-deps
8590
const debounceCalendar = useCallback(
8691
debounce((newValue: any) => {
8792
if (newValue !== lastValidDate && validateDate(newValue)) {
@@ -100,8 +105,8 @@ export const DatepickerComp: React.FC<DatepickerCompProps> = ({
100105
};
101106
}, [debounceCalendar]);
102107

103-
const validateDateIntervals = () => {
104-
const dateString = `${day}.${month}.${year}`;
108+
const validateDateIntervals = useCallback(() => {
109+
const dateString = formatDate();
105110
getSimpleDateFromString(dateString, date => {
106111
const maxDateValidated = maxDateProp
107112
? getSimpleDateFromString(maxDateProp)
@@ -124,16 +129,24 @@ export const DatepickerComp: React.FC<DatepickerCompProps> = ({
124129
}
125130
setLastValidDate(formattedDate);
126131
});
127-
};
132+
}, [formatDate, maxDateProp, onChange, setDay, setMonth, setYear]);
128133

129134
useEffect(() => {
130135
if (minDateProp !== minDate || maxDateProp !== maxDate) {
131136
setMinDate(minDateProp);
132137
setMaxDate(maxDateProp);
133138
validateDateIntervals();
134139
}
135-
debounceCalendar(`${day}.${month}.${year}`);
136-
}, [minDateProp, maxDateProp, day, month, year, debounceCalendar]);
140+
debounceCalendar(formatDate());
141+
}, [
142+
minDateProp,
143+
maxDateProp,
144+
formatDate,
145+
debounceCalendar,
146+
minDate,
147+
maxDate,
148+
validateDateIntervals,
149+
]);
137150

138151
const closeCalendarSetInputFocus = () => {
139152
setDisplayDatePicker(false);
@@ -172,6 +185,7 @@ export const DatepickerComp: React.FC<DatepickerCompProps> = ({
172185
return () => {
173186
removeGlobalEventListeners();
174187
};
188+
// eslint-disable-next-line react-hooks/exhaustive-deps
175189
}, [displayDatePicker]);
176190

177191
const calendarButtonClickHandler = () => {
@@ -238,7 +252,7 @@ export const DatepickerComp: React.FC<DatepickerCompProps> = ({
238252
setDay([date.date]);
239253
setMonth([date.month + 1]);
240254
setYear([date.year]);
241-
onChange(`${day}.${month}.${year}`);
255+
onChange(formatDate());
242256
}
243257
};
244258

packages/ffe-datepicker-react/src/datepicker/DatepickerContext.tsx

+8-4
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,14 @@ export const DatepickerProvider: React.FC<Props> = ({
5858
);
5959

6060
useEffect(() => {
61-
setDay(newDate ? newDate.date : null);
62-
setMonth(newDate ? newDate.month + 1 : null);
63-
setYear(newDate ? newDate.year : null);
64-
setCalendarActiveDate(newDate?.toString() ?? '');
61+
const newActiveDate = newDate?.toString() ?? '';
62+
if (calendarActiveDate !== newActiveDate) {
63+
setDay(newDate ? newDate.date : null);
64+
setMonth(newDate ? newDate.month + 1 : null);
65+
setYear(newDate ? newDate.year : null);
66+
setCalendarActiveDate(newDate?.toString() ?? '');
67+
}
68+
// eslint-disable-next-line react-hooks/exhaustive-deps
6569
}, [newDate]);
6670

6771
return (

packages/ffe-datepicker-react/src/datepicker/DatepickerInContext.spec.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ describe('<InputGroup><Datepicker /></InputGroup>', () => {
3737
expect(datepicker.getValue()).toStrictEqual('01.02.2024');
3838
});
3939

40-
it.skip('datepicker can be updated by testing functions', async () => {
40+
it('datepicker can be updated by testing functions', async () => {
4141
renderDatePicker({ value: '01.01.2024' });
4242

4343
const datepicker = getDatepickerByLabelText('Datovelger');

packages/ffe-datepicker-react/src/datepicker/testHelper.ts

-6
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,6 @@ async function simulateTyping(element: Element, text: string, delay = 100) {
1717
element.dispatchEvent(
1818
new KeyboardEvent('keydown', eventOptions),
1919
);
20-
element.dispatchEvent(
21-
new Event('input', { bubbles: true }),
22-
);
23-
element.dispatchEvent(
24-
new KeyboardEvent('keyup', eventOptions),
25-
);
2620
});
2721

2822
index++;

0 commit comments

Comments
 (0)