Skip to content

Commit 6858a08

Browse files
committed
chore(RelativeDatrePicker): export component, small fixes
1 parent 965e416 commit 6858a08

File tree

4 files changed

+41
-28
lines changed

4 files changed

+41
-28
lines changed

src/components/RelativeDatePicker/RelativeDatePicker.tsx

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
22

33
import {Calendar as CalendarIcon, Function as FunctionIcon} from '@gravity-ui/icons';
4-
import {Button, Icon, Popup, TextInput, useFocusWithin, useMobile} from '@gravity-ui/uikit';
4+
import {Button, Icon, Popup, TextInput, useMobile} from '@gravity-ui/uikit';
55

66
import {block} from '../../utils/cn';
77
import {Calendar} from '../Calendar';
@@ -33,7 +33,7 @@ export interface RelativeDatePickerProps
3333
StyleProps,
3434
AccessibilityProps {}
3535

36-
export function RelativeDatePicker({onFocus, onBlur, ...props}: RelativeDatePickerProps) {
36+
export function RelativeDatePicker(props: RelativeDatePickerProps) {
3737
const state = useRelativeDatePickerState(props);
3838

3939
const {
@@ -48,23 +48,10 @@ export function RelativeDatePicker({onFocus, onBlur, ...props}: RelativeDatePick
4848

4949
const anchorRef = React.useRef<HTMLDivElement>(null);
5050

51-
const {focusWithinProps} = useFocusWithin({
52-
onFocusWithin: onFocus,
53-
onBlurWithin: onBlur,
54-
onFocusWithinChange(isFocusWithin) {
55-
state.setActive(isFocusWithin);
56-
},
57-
});
58-
5951
const [isMobile] = useMobile();
6052

6153
return (
62-
<div
63-
ref={anchorRef}
64-
className={b(null, props.className)}
65-
{...groupProps}
66-
{...focusWithinProps}
67-
>
54+
<div ref={anchorRef} className={b(null, props.className)} {...groupProps}>
6855
{isMobile && state.mode === 'absolute' && (
6956
<MobileCalendar
7057
state={state.datePickerState}

src/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.ts

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
import React from 'react';
22

3-
import {
4-
type ButtonProps,
5-
type PopupProps,
6-
type TextInputProps,
7-
useForkRef,
8-
} from '@gravity-ui/uikit';
9-
10-
import type {CalendarProps} from '../../Calendar';
11-
import {type DateFieldProps, useDateFieldProps} from '../../DateField';
3+
import {useFocusWithin, useForkRef} from '@gravity-ui/uikit';
4+
import type {ButtonProps, PopupProps, TextInputProps} from '@gravity-ui/uikit';
5+
6+
import type {Calendar, CalendarInstance} from '../../Calendar';
7+
import {useDateFieldProps} from '../../DateField';
8+
import type {DateFieldProps} from '../../DateField';
129
import {getButtonSizeForInput} from '../../utils/getButtonSizeForInput';
1310
import {mergeProps} from '../../utils/mergeProps';
1411
import type {RelativeDatePickerProps} from '../RelativeDatePicker';
@@ -22,13 +19,13 @@ interface InnerRelativeDatePickerProps {
2219
modeSwitcherProps: ButtonProps;
2320
calendarButtonProps: ButtonProps;
2421
popupProps: PopupProps;
25-
calendarProps: CalendarProps;
22+
calendarProps: React.ComponentProps<typeof Calendar>;
2623
timeInputProps: DateFieldProps;
2724
}
2825

2926
export function useRelativeDatePickerProps(
3027
state: RelativeDatePickerState,
31-
props: RelativeDatePickerProps,
28+
{onFocus, onBlur, ...props}: RelativeDatePickerProps,
3229
): InnerRelativeDatePickerProps {
3330
const {mode, setMode, datePickerState, dateFieldState, relativeDateState} = state;
3431

@@ -47,6 +44,15 @@ export function useRelativeDatePickerProps(
4744
setFocusedDate(datePickerState.dateValue);
4845
}
4946
}
47+
const {focusWithinProps} = useFocusWithin({
48+
onFocusWithin: onFocus,
49+
onBlurWithin: onBlur,
50+
onFocusWithinChange(isFocusWithin) {
51+
if (!isFocusWithin) {
52+
state.setActive(isFocusWithin);
53+
}
54+
},
55+
});
5056

5157
const [isOpen, setOpen] = React.useState(false);
5258
if (!state.isActive && isOpen) {
@@ -61,7 +67,11 @@ export function useRelativeDatePickerProps(
6167
}
6268
}
6369

64-
const commonInputProps: TextInputProps = {};
70+
const commonInputProps: TextInputProps = {
71+
onFocus: () => {
72+
state.setActive(true);
73+
},
74+
};
6575

6676
const {inputProps} = useDateFieldProps(dateFieldState, {
6777
...props,
@@ -98,9 +108,12 @@ export function useRelativeDatePickerProps(
98108
mode === 'relative' ? relativeDateProps.controlRef : inputProps.controlRef,
99109
);
100110

111+
const calendarRef = React.useRef<CalendarInstance>(null);
112+
101113
return {
102114
groupProps: {
103115
role: 'group',
116+
...focusWithinProps,
104117
},
105118
fieldProps: mergeProps(
106119
commonInputProps,
@@ -142,8 +155,14 @@ export function useRelativeDatePickerProps(
142155
wasActiveBeforeClickRef.current = state.isActive;
143156
},
144157
onClick: () => {
158+
state.setActive(true);
145159
if (wasActiveBeforeClickRef.current) {
146160
setOpen(!isOpen);
161+
if (!isOpen) {
162+
setTimeout(() => {
163+
calendarRef.current?.focus();
164+
});
165+
}
147166
}
148167
wasActiveBeforeClickRef.current = state.isActive;
149168
},
@@ -156,6 +175,7 @@ export function useRelativeDatePickerProps(
156175
restoreFocus: true,
157176
},
158177
calendarProps: {
178+
ref: calendarRef,
159179
size: props.size === 's' ? 'm' : props.size,
160180
readOnly: props.readOnly,
161181
value: state.selectedDate,
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from './RelativeDatePicker';
2+
3+
export * from './hooks/useRelativeDatePickerState';
4+
export * from './hooks/useRelativeDatePickerProps';

src/components/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
export * from './Calendar';
22
export * from './DateField';
33
export * from './DatePicker';
4+
export * from './RelativeDateField';
5+
export * from './RelativeDatePicker';

0 commit comments

Comments
 (0)